summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore16
-rw-r--r--AUTHORS6
-rw-r--r--ChangeLog62
-rw-r--r--PORTABLE_VERSION2
-rw-r--r--README12
-rw-r--r--about.txt9
-rwxr-xr-xautogen.sh12
-rw-r--r--common.h7
-rw-r--r--conf.c33
-rwxr-xr-xconfig.rpath672
-rw-r--r--configure.ac50
-rw-r--r--deadbeef.desktop.in2
-rw-r--r--deadbeef.h29
-rw-r--r--help.txt8
-rw-r--r--junklib.c207
-rw-r--r--junklib.h47
-rw-r--r--main.c317
-rw-r--r--pixmaps/Makefile.am2
-rw-r--r--pixmaps/noartwork.jpgbin3670 -> 0 bytes
-rw-r--r--pixmaps/noartwork.pngbin0 -> 157827 bytes
-rw-r--r--playlist.c138
-rw-r--r--playlist.h15
-rw-r--r--plmeta.c55
-rw-r--r--pltmeta.c26
-rw-r--r--plugins.c19
-rw-r--r--plugins/aac/Makefile.am20
-rw-r--r--plugins/aac/aac.c929
-rw-r--r--plugins/adplug/adplug-db.cpp2
-rw-r--r--plugins/adplug/adplug/adl.cpp2
-rw-r--r--plugins/alac/Makefile.am22
-rw-r--r--plugins/alac/README43
-rw-r--r--plugins/alac/alac.c1198
-rw-r--r--plugins/alac/alac_plugin.c663
-rw-r--r--plugins/alac/decomp.h17
-rw-r--r--plugins/alac/demux.c673
-rw-r--r--plugins/alac/demux.h64
-rw-r--r--plugins/alac/stdint_win.h14
-rw-r--r--plugins/alac/stream.c186
-rw-r--r--plugins/alac/stream.h39
-rw-r--r--plugins/alsa/alsa.c73
-rw-r--r--plugins/ao/Makefile.am4
-rw-r--r--plugins/ao/plugin.c6
-rw-r--r--plugins/artwork/artwork.c128
-rw-r--r--plugins/cdda/cdda.c51
-rw-r--r--plugins/converter/Makefile.am2
-rw-r--r--plugins/converter/converter.c73
-rw-r--r--plugins/converter/convgui.c134
-rw-r--r--plugins/converter/support.c4
-rw-r--r--plugins/converter/support.h6
-rw-r--r--plugins/dca/dcaplug.c2
-rw-r--r--plugins/dsp_libsrc/src.c7
-rw-r--r--plugins/dumb/cdumb.c41
-rw-r--r--plugins/dumb/dumb-kode54/src/it/itread.c26
-rw-r--r--plugins/dumb/dumb-kode54/src/it/itrender.c8
-rw-r--r--plugins/ffap/ffap.c4
-rw-r--r--plugins/ffmpeg/ffmpeg.c143
-rw-r--r--plugins/flac/flac.c58
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/Makefile.am3
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/changes.txt218
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.cpp182
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.h73
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/basics.c57
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/cpp_basics.cpp67
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/demo/features.c149
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/design.txt194
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme.txt464
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.h107
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.cpp1665
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.h92
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.cpp404
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h70
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.cpp446
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.h485
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.h127
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.h50
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.cpp529
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.h86
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.cpp199
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.h171
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.cpp306
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.cpp1056
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.h93
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.cpp288
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.h88
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.h145
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.cpp379
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.h82
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.cpp315
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.h66
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.h125
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.cpp529
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.h94
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.h124
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.cpp414
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.h96
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.h106
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Makefile.am66
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.cpp232
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.h156
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.cpp410
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.h211
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.h179
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.cpp1084
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.h114
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.cpp557
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.h106
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.h77
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.cpp1011
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.h83
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.h69
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.cpp489
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.h121
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.cpp1062
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.h57
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.cpp666
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.h152
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.h77
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.cpp412
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.h84
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.cpp314
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.h71
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.cpp21
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.cpp1319
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.h38
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_source.h78
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/gb_cpu_io.h72
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/gme.cpp256
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/gme.h222
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/hes_cpu_io.h101
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/nes_cpu_io.h83
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/gme/sap_cpu_io.h26
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.cpp198
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.h36
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.cpp231
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.h69
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/player/player.cpp213
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/readme.txt205
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/test.m3u2
-rw-r--r--plugins/gme/Game_Music_Emu-0.5.2/test.nsfbin749 -> 0 bytes
-rw-r--r--plugins/gme/Makefile.am373
-rw-r--r--plugins/gme/cgme.c63
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.orig446
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.rej11
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.orig488
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.rej23
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.cpp133
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.h90
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.cpp336
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.h83
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.cpp330
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.h75
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Sms_Oscs.h49
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.cpp489
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.h121
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.cpp1062
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.h57
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.cpp666
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.h152
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/blargg_common.h175
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/blargg_config.h29
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/blargg_endian.h158
-rw-r--r--plugins/gme/game-music-emu-0.5.5/gme/gme_types.h15
-rw-r--r--plugins/gme/game-music-emu-0.5.5/license.txt504
-rw-r--r--plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.cpp198
-rw-r--r--plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.h36
-rw-r--r--plugins/gme/game-music-emu-0.5.5/player/Music_Player.cpp231
-rw-r--r--plugins/gme/game-music-emu-0.5.5/player/Music_Player.h69
-rw-r--r--plugins/gme/game-music-emu-0.5.5/player/player.cpp213
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.cpp)5
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp)34
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/CMakeLists.txt163
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.cpp)2
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.cpp)6
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gme_File.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gme_File.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gme_File.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gme_File.h)18
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.cpp)4
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.cpp)1
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.h)11
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.cpp)2
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Sms_Oscs.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Oscs.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.cpp380
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.h287
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.cpp565
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.h1220
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.cpp703
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.h212
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.cpp)36
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.h)5
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.cpp83
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.h53
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/blargg_common.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_common.h)45
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/blargg_config.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_config.h)19
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/blargg_endian.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_endian.h)114
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/blargg_source.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/blargg_source.h)36
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/gb_cpu_io.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/gb_cpu_io.h)2
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/gme.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/gme.cpp)143
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/gme.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/gme.h)22
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/gme_types.h21
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/gme_types.h.in (renamed from plugins/gme/game-music-emu-0.5.5/gme/gme_types.h.in)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/hes_cpu_io.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/hes_cpu_io.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/libgme.pc.in15
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/nes_cpu_io.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/nes_cpu_io.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6.0/gme/sap_cpu_io.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/sap_cpu_io.h)0
-rw-r--r--plugins/gme/game-music-emu-0.6pre/CMakeLists.txt91
-rw-r--r--plugins/gme/game-music-emu-0.6pre/changes.txt (renamed from plugins/gme/game-music-emu-0.5.5/changes.txt)14
-rw-r--r--plugins/gme/game-music-emu-0.6pre/design.txt (renamed from plugins/gme/game-music-emu-0.5.5/design.txt)2
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme.txt (renamed from plugins/gme/game-music-emu-0.5.5/gme.txt)115
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.cpp)103
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.h104
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.cpp190
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.h81
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Cpu.cpp59
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.cpp306
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.h58
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.cpp509
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.h198
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl.h135
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl2.h282
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.cpp)108
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.h79
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.cpp)0
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.h)2
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Downsampler.cpp74
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Downsampler.h25
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.cpp200
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.h58
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.cpp640
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.h149
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.cpp123
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.h101
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.cpp407
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.h193
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.cpp51
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.h82
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu_run.h1183
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.cpp712
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.h188
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.cpp208
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h106
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gbs_Cpu.cpp134
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.cpp143
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.h61
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gme_File.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.cpp)399
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gme_File.h152
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.cpp86
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.h92
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.cpp405
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.h86
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.cpp361
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.h87
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.cpp309
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.h94
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.cpp408
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.h119
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.cpp123
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.h139
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu_run.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.cpp)831
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.cpp163
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.h40
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.cpp214
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.h97
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Cpu.cpp35
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.cpp470
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.h77
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.cpp)91
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.h111
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.cpp)902
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.h)154
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.cpp290
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.h219
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.cpp235
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.h241
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.cpp)75
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.h181
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.cpp62
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.h131
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu_run.h1121
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.cpp280
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.h139
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.cpp)10
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.h)18
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Mmc5_Apu.h70
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.cpp)297
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.h)14
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.cpp)135
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.h)16
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.cpp (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.cpp)19
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.h (renamed from plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.h)14
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.cpp206
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h80
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.cpp302
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.h68
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Cpu.cpp116
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.cpp314
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.h51
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.cpp327
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.h189
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.cpp)651
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.h)32
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.cpp270
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.h63
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Resampler.cpp79
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Resampler.h110
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.cpp99
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.h94
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/SPC_Filter.cpp81
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.cpp)59
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.h103
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.cpp192
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h91
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Cpu.cpp96
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.cpp)827
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.h51
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.cpp108
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.h44
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Cpu.cpp36
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.cpp136
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.h43
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.cpp225
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.h114
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.cpp371
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.h128
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.cpp80
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.h47
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.cpp378
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.h291
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.cpp562
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.h1225
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.cpp1387
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.h315
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.cpp (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.cpp)719
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.h85
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Spc_Filter.h53
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.cpp293
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.h105
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Upsampler.cpp73
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Upsampler.h25
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.cpp441
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.h160
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.cpp360
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.h66
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.cpp70
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.h)70
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.cpp2510
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.h38
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.cpp82
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.h122
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu_run.h (renamed from plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.cpp)3401
-rwxr-xr-xplugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.cpp555
-rwxr-xr-xplugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.h268
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_common.cpp58
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_common.h224
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_config.h55
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_endian.h189
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.cpp117
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.h84
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/blargg_source.h135
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/divfix.h18
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/emu2413.cpp742
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/emu2413.h143
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/fmopl.cpp2617
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/fmopl.h116
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/gme.cpp431
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/gme.h298
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/i_fmpac.h38
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/i_fmunit.h38
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/i_vrc7.h38
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/kmsnddev.h31
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/nestypes.h39
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_deltat.c281
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_deltat.h23
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.c88
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.h43
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_opl.c1244
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_opl.h26
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.c136
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.h38
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/ym2413.c2106
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/ym2413.h61
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.cpp655
-rw-r--r--plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.h98
-rw-r--r--plugins/gme/game-music-emu-0.6pre/license.txt (renamed from plugins/gme/Game_Music_Emu-0.5.2/license.txt)0
-rw-r--r--plugins/gme/game-music-emu-0.6pre/readme.txt (renamed from plugins/gme/game-music-emu-0.5.5/readme.txt)40
-rw-r--r--plugins/gtkui/Makefile.am39
-rw-r--r--plugins/gtkui/actions.c42
-rw-r--r--plugins/gtkui/actions.h2
-rw-r--r--plugins/gtkui/callbacks.c20
-rw-r--r--plugins/gtkui/callbacks.h16
-rw-r--r--plugins/gtkui/ddbcellrenderertextmultiline.c156
-rw-r--r--plugins/gtkui/ddbcellrenderertextmultiline.h1
-rw-r--r--plugins/gtkui/ddbcellrenderertextmultiline.vala111
-rw-r--r--plugins/gtkui/ddbequalizer.vala370
-rw-r--r--plugins/gtkui/ddblistview.c135
-rw-r--r--plugins/gtkui/ddblistview.h10
-rw-r--r--plugins/gtkui/ddbseekbar.vala64
-rw-r--r--plugins/gtkui/ddbtabstrip.c122
-rw-r--r--plugins/gtkui/ddbtabstrip.h2
-rw-r--r--plugins/gtkui/ddbvolumebar.c1
-rw-r--r--plugins/gtkui/deadbeef.glade165
-rw-r--r--plugins/gtkui/drawing.h44
-rw-r--r--plugins/gtkui/dspconfig.c18
-rw-r--r--plugins/gtkui/eq.c14
-rw-r--r--plugins/gtkui/eq.h3
-rw-r--r--plugins/gtkui/fileman.c3
-rw-r--r--plugins/gtkui/gdk-keysyms.vapi2198
-rw-r--r--plugins/gtkui/gdkdrawing.c179
-rw-r--r--plugins/gtkui/gtkui.c100
-rw-r--r--plugins/gtkui/gtkui.h4
-rw-r--r--plugins/gtkui/gtkui.vapi12
-rw-r--r--plugins/gtkui/interface.c219
-rw-r--r--plugins/gtkui/mainplaylist.c12
-rw-r--r--plugins/gtkui/plcommon.c42
-rw-r--r--plugins/gtkui/pluginconf.c5
-rw-r--r--plugins/gtkui/prefwin.c86
-rw-r--r--plugins/gtkui/search.c23
-rw-r--r--plugins/gtkui/search.h6
-rw-r--r--plugins/gtkui/smclient/eggdesktopfile.c1528
-rw-r--r--plugins/gtkui/smclient/eggdesktopfile.h163
-rw-r--r--plugins/gtkui/smclient/eggsmclient-private.h59
-rw-r--r--plugins/gtkui/smclient/eggsmclient-xsmp.c1381
-rw-r--r--plugins/gtkui/smclient/eggsmclient.c604
-rw-r--r--plugins/gtkui/smclient/eggsmclient.h117
-rw-r--r--plugins/gtkui/support.c4
-rw-r--r--plugins/gtkui/support.h6
-rw-r--r--plugins/gtkui/test.vala30
-rw-r--r--plugins/gtkui/trkproperties.c79
-rw-r--r--plugins/hotkeys/hotkeys.c26
-rw-r--r--plugins/lastfm/lastfm.c96
-rw-r--r--plugins/libmp4ff/AUTHORS (renamed from plugins/aac/mp4ff/AUTHORS)0
-rw-r--r--plugins/libmp4ff/COPYING (renamed from plugins/aac/mp4ff/COPYING)0
-rw-r--r--plugins/libmp4ff/README (renamed from plugins/aac/mp4ff/README)0
-rw-r--r--plugins/libmp4ff/mp4atom.c (renamed from plugins/aac/mp4ff/mp4atom.c)546
-rw-r--r--plugins/libmp4ff/mp4ff.c (renamed from plugins/aac/mp4ff/mp4ff.c)63
-rw-r--r--plugins/libmp4ff/mp4ff.h (renamed from plugins/aac/mp4ff/mp4ff.h)40
-rw-r--r--plugins/libmp4ff/mp4ff_int_types.h (renamed from plugins/aac/mp4ff/mp4ff_int_types.h)0
-rw-r--r--plugins/libmp4ff/mp4ffint.h (renamed from plugins/aac/mp4ff/mp4ffint.h)64
-rw-r--r--plugins/libmp4ff/mp4meta.c (renamed from plugins/aac/mp4ff/mp4meta.c)0
-rw-r--r--plugins/libmp4ff/mp4sample.c (renamed from plugins/aac/mp4ff/mp4sample.c)0
-rw-r--r--plugins/libmp4ff/mp4tagupdate.c (renamed from plugins/aac/mp4ff/mp4tagupdate.c)0
-rw-r--r--plugins/libmp4ff/mp4util.c (renamed from plugins/aac/mp4ff/mp4util.c)0
-rw-r--r--plugins/m3u/m3u.c63
-rw-r--r--plugins/mms/libmms/mms.c23
-rw-r--r--plugins/mms/libmms/mms.h2
-rw-r--r--plugins/mms/libmms/mmsh.c20
-rw-r--r--plugins/mms/libmms/mmsh.h2
-rw-r--r--plugins/mms/libmms/mmsio.h2
-rw-r--r--plugins/mms/libmms/mmsx.c9
-rw-r--r--plugins/mms/libmms/mmsx.h2
-rw-r--r--plugins/mms/mmsplug.c9
-rw-r--r--plugins/mpgmad/mpgmad.c30
-rw-r--r--plugins/musepack/musepack.c4
-rw-r--r--plugins/notify/notify.c5
-rw-r--r--plugins/shellexec/Makefile.am2
-rw-r--r--plugins/shellexec/shellexec.c111
-rw-r--r--plugins/shellexec/shellexec.h9
-rw-r--r--plugins/shellexecui/Makefile.am46
-rw-r--r--plugins/shellexecui/callbacks.c11
-rw-r--r--plugins/shellexecui/callbacks.h30
-rw-r--r--plugins/shellexecui/interface.c277
-rw-r--r--plugins/shellexecui/interface.h6
-rw-r--r--plugins/shellexecui/shellexec.glade521
-rw-r--r--plugins/shellexecui/shellexec.gladep12
-rw-r--r--plugins/shellexecui/shellexecui.c443
-rw-r--r--plugins/shellexecui/support.c221
-rw-r--r--plugins/shellexecui/support.h146
-rw-r--r--plugins/shn/shn.c5
-rw-r--r--plugins/sid/csid.cpp4
-rw-r--r--plugins/sid/sidplay-libs/libsidplay/src/player.cpp2
-rw-r--r--plugins/sndfile/sndfile.c34
-rw-r--r--plugins/tta/ttaplug.c15
-rw-r--r--plugins/vfs_curl/vfs_curl.c6
-rw-r--r--plugins/vorbis/vorbis.c28
-rw-r--r--plugins/vtx/vtx.c2
-rw-r--r--plugins/wavpack/wavpack.c15
-rw-r--r--plugins/wildmidi/src/wildmidi_lib.c8
-rw-r--r--plugins/wildmidi/wildmidiplug.c2
-rw-r--r--po/Makefile.in.in217
-rw-r--r--po/POTFILES.in6
-rw-r--r--po/be.po1314
-rw-r--r--po/bg.po1539
-rw-r--r--po/bn.po1283
-rw-r--r--po/ca.po1251
-rw-r--r--po/cs.po1356
-rw-r--r--po/da.po1288
-rw-r--r--po/de.po1316
-rw-r--r--po/deadbeef.pot2062
-rw-r--r--po/el.po1659
-rw-r--r--po/en_GB.po1302
-rw-r--r--po/eo.po1238
-rw-r--r--po/es.po1303
-rw-r--r--po/et.po1305
-rw-r--r--po/eu.po1778
-rw-r--r--po/fa.po1283
-rw-r--r--po/fi.po1499
-rw-r--r--po/fr.po1283
-rw-r--r--po/gl.po1310
-rw-r--r--po/he.po1331
-rw-r--r--po/hr.po1278
-rw-r--r--po/hu.po1430
-rw-r--r--po/id.po1299
-rw-r--r--po/it.po1283
-rw-r--r--po/ja.po2017
-rw-r--r--po/kk.po1530
-rw-r--r--po/km.po1252
-rw-r--r--po/lg.po1292
-rw-r--r--po/lt.po2060
-rw-r--r--po/nb.po1238
-rw-r--r--po/nl.po1365
-rw-r--r--po/pl.po1298
-rw-r--r--po/pt.po1713
-rw-r--r--po/pt_BR.po1325
-rw-r--r--po/ro.po1209
-rw-r--r--po/ru.po1298
-rw-r--r--po/si.po1237
-rw-r--r--po/sk.po1283
-rw-r--r--po/sl.po1541
-rw-r--r--po/sr.po1540
-rw-r--r--po/sr@latin.po1286
-rw-r--r--po/sv.po1283
-rw-r--r--po/te.po1363
-rw-r--r--po/tr.po1561
-rw-r--r--po/ug.po1336
-rw-r--r--po/uk.po1306
-rw-r--r--po/vi.po1462
-rw-r--r--po/zh_CN.po1303
-rw-r--r--po/zh_TW.po1938
-rw-r--r--premix.c9
-rwxr-xr-xscripts/portable_build.sh9
-rwxr-xr-xscripts/portable_package_static.sh18
-rwxr-xr-xscripts/portable_postbuild.sh9
-rwxr-xr-xscripts/quickinstall.sh5
-rwxr-xr-xscripts/static_build.sh22
-rwxr-xr-xscripts/static_install.sh4
-rw-r--r--shortlicense.gpl2 (renamed from shortlicense)0
-rw-r--r--shortlicense.zlib23
-rw-r--r--sr.po2074
-rw-r--r--streamer.c64
-rwxr-xr-xtools/apbuild/apgcc3
-rwxr-xr-xtools/apbuild/apinit9
-rw-r--r--tools/apbuild/apsymbols.h.i686 (renamed from tools/apbuild/apsymbols.h)0
-rw-r--r--tools/apbuild/apsymbols.h.x86_64281
-rw-r--r--tools/apbuild/ctype.h10
-rwxr-xr-xtools/packages/arch.sh49
-rw-r--r--tools/packages/arch_install14
-rw-r--r--tools/packages/arch_pkginfo11
-rw-r--r--tools/packages/deb_control33
-rwxr-xr-xtools/packages/deb_postinst7
-rwxr-xr-xtools/packages/deb_postrm5
-rwxr-xr-xtools/packages/debian.sh81
-rw-r--r--translation/extra.c15
-rw-r--r--translators.txt1
621 files changed, 105884 insertions, 61395 deletions
diff --git a/.gitignore b/.gitignore
index e9a57f66..e3566ce7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,12 +10,12 @@ plugins/*/Makefile
intl/Makefile
icons/Makefile
pixmaps/Makefile
-po/Makefile
Makefile.in
config.h
config.h.in
config.status
config.sub
+config.rpath
depcomp
stamp-h*
*.zip
@@ -45,9 +45,19 @@ vala.stamp
*.tar.bz2
*.tar.gz
*.gmo
-POTFILES
stamp-it
-po/Makevars.template
*.so
tools/pluginfo/pluginfo
cscope.out
+tools/apbuild/apsymbols.h
+po/Makefile
+po/Makefile.in.in
+po/Makevars.template
+po/POTFILES
+po/Rules-quot
+po/boldquot.sed
+po/en@boldquot.header
+po/en@quot.header
+po/insert-header.sin
+po/quot.sed
+po/remove-potcdate.sin
diff --git a/AUTHORS b/AUTHORS
index 0aac4c41..9d7104fb 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,3 +1,3 @@
-code: Alexey Yakovenko <waker@users.sourceforge.net>
-icon: Stas "uncle lag" Akimushkin <uncle.lag@gmail.com>
-hotkeys, cdda plugins: Viktor Semykin <thesame.ml@gmail.com>
+Alexey Yakovenko <waker@users.sourceforge.net>
+Viktor Semykin <thesame.ml@gmail.com>
+and many others, please see about.txt
diff --git a/ChangeLog b/ChangeLog
index afd2654c..4fcc1cf9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,65 @@
+version 0.5.5
+ fixed converter GUI plugin crash if the converter plugin not found
+ fixed compiling on FreeBSD
+ fixed race condition bug in streamer
+ fixed flac embedded cover loading bug
+ fixed multiline tag field editing
+ fixed vorbis streaming audio bug
+ fixed numlock handling in global hotkeys setup
+ fixed KP_Return not working
+ fixed filename being ignored in the search window
+ fixed session saving on reboot/logout using XSMP via eggsmclient
+ fixed few missing translation strings
+ fixed many instability issues caused by improper use of pl_find_meta[_raw] calls
+ fixed improper use of GtkStyle in playlist and tabs widgets
+ fixed prev/next handling when playback is stopped
+ fixed random playback bug caused by libsidplay2 calling srand(time(NULL))
+ fixed crash in adplug when playing ADL files
+ fixed crash in aac reload metadata
+ fixed Grandia - Parallel Trippers.gbs crash in GME plugin
+ fixed crash in GME plugin when a file doesn't exist
+ fixed integer overflow bug in float32->int32 conversion
+ fixed m3u parser string copy bug
+ fixed several dsp bugs in the converter
+ fixed up/down buttons in the converter's dsp preset editor
+ fixed selected row bugs in dsp preset editors in gtkui preferences and converter
+ fixed parent window of dsp plugin configure window
+ fixed all known issues in gtk3 plugin -- it should be fully working now
+
+version 0.5.4
+ fixed starting the player using "deadbeef" command without path
+ fixed missing ; in deadbeef.desktop
+ fixed big-endian support in sndfile plugin
+
+version 0.5.3
+ m3u: fixed few parser bugs; added audio/x-scpls mime-type support; fixed m3uext support
+ adplug: upgraded to 2.2.1, added fake-surround support and emu selection
+ added ShellExec GUI configuration support (thanks to Azeem Arshad)
+ fixed id3v2 parser whitespace trimming bug
+ "Stop after current" can be reconfigured to be auto-reset each time
+ auto-save EQ state on every change
+ gcc 4.7 compile fix in SID plugin
+ added new Sort->Random feature, to randomize the playlist (thanks to Defusix)
+ converter: fixed writing wav files sized over 2 gigs
+ converter: added support for reconstructing of the folder structrure based on longest common root folder
+ converter: added support for writing files to the source track folders
+ fixed possible hang caused by race condition in the alsa/streamer interaction
+ wildmidi: fixed possible linking errors
+ fixed ignoring cuesheet and log fields in search
+ added support for TXX DATE field as written by FB2K
+ bogus "plugin.so file not found" errors are no longer printed
+ fixed bug in search window causing all tracks to become selected on some actions
+ fixed possible crash when loading corrupted playlist files
+ EQ window will reflect changes in the DSP chain configuration
+ fixed excessive CPU load while streamer is waiting for the last track to finish
+ alsa: fixed sleep time bug, which should improve CPU load (thanks to Martin Panter)
+ alsa: fixed buffer underrun handling problem which was causing sound jittering on slow media like sshfs, cd, etc (thanks to Martin Panter)
+ mp3: added option to disable gapless playback, but improve speed (thanks to Martin Panter)
+ aac: fix to potential reading past the end of array (thanks to Martin Panter)
+ new default cover-art image by TheSame
+ fixed loading m3u/pls over http when the file size is unknown
+ added m3u and pls url mime types (audio/x-mpegurl;audio/x-scpls) to deadbeef.desktop
+
version 0.5.2
fixed reading id3v2 and apev2 tags from raw AAC files
fixed proxy authentication bug in vfs_curl plugin
diff --git a/PORTABLE_VERSION b/PORTABLE_VERSION
index cb0c939a..94ee4293 100644
--- a/PORTABLE_VERSION
+++ b/PORTABLE_VERSION
@@ -1 +1 @@
-0.5.2
+0.5.6-test1
diff --git a/README b/README
index 5f398756..e4fc8c1a 100644
--- a/README
+++ b/README
@@ -9,9 +9,9 @@ TABLE OF CONTENTS
* first you need to install dependencies. full list is provided at the end of this section for your convenience
-* you will need intltool to be installed. if you don't need translations -- run ./configure --disable-nls (in this case you won't need to install intltool)
+* you will need intltool to be installed. if you don't need translations -- run ./configure --disable-nls (in this case you won't need to install intltool, as long as the configure script is already generated)
-* if you want to build from git - install autotools, and run ./autogen.sh to bootstrap
+* if you want to build from git - install autotools and intltool, and run ./autogen.sh to bootstrap
* run "./configure --help", and read it.
@@ -23,9 +23,13 @@ TABLE OF CONTENTS
* after build finishes, run "make install" as root
-full list of dependencies:
+full list of dependencies is below.
+most of them are optional, which means deadbeef will build and run without them, but to make it useful - you'd probably need at least GTK UI plugin and some audio codecs built.
+
libsamplerate: for dsp_libsrc plugin (resampler)
gtk+-2.0 >= 2.12 (+ gthread, + glib): GTK+ 2.0 user interface
+ libsm: optional dependency for gtkui session client support
+ libice: optional dependency for gtkui session client support
alsa-lib: ALSA support
libvorbis and libogg: for ogg vorbis plugin
libcurl >= 7.10: for last.fm, vfs_curl (shoutcast/icecast), artwork plugins
@@ -36,7 +40,7 @@ full list of dependencies:
wavpack: for wavpack plugin
libsndfile: for sndfile plugin
libcdio + libcddb: for cd audio plugin
- ffmpeg (libavcodec + libavformat): for ffmpeg plugin
+ ffmpeg < 0.11: for ffmpeg plugin (versions >= 0.11 are not supported)
xlib: for global hotkeys and for gtkui opengl support
dbus: for notification daemon support (OSD current song notifications)
pulseaudio: for PulseAudio output plugin
diff --git a/about.txt b/about.txt
index 05423602..93b4ec7b 100644
--- a/about.txt
+++ b/about.txt
@@ -31,13 +31,16 @@ Contributors:
Sofias <sofias@radikalismus.com>
Icon
+ starws
+ The best QA dude in the world
+
Stas Akimushkin <uncle.lag@gmail.com>
Original artwork
Viktor Semykin <thesame.ml@gmail.com>
- Global Hotkeys, CD Audio, Cover Art, ShellExec plugins, lots of patches and suggestions
+ Global Hotkeys, CD Audio, Cover Art, ShellExec plugins, lots of patches and suggestions, and the default cover art image
- These people sent patches or helped with testing, distribution, or in other ways:
+ These people have also contributed significantly to the project by sending patches, testing, etc:
Alex Dedul <rotmer@gmail.com>
David Bryant <david@wavpack.com>
@@ -46,9 +49,11 @@ Contributors:
Igor Rudchenko <igor@thinkpads.net>
Jan D. Behrens <zykure@web.de>
Kryksyh <druid@foobar2000.ru>
+ Martin Panter
Serghey Kotlyarov <shadowsbrother@gmail.com>
Themaister <maister@archlinux.us>
Veniamin Gvozdikov <g.veniamin@googlemail.com>
+
If you think your name is missing here, or needs to be removed, please send an email to Alexey Yakovenko <waker@users.sf.net>
diff --git a/autogen.sh b/autogen.sh
index 0db33264..785e6288 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,6 +1,8 @@
#!/bin/sh
-aclocal
-autoheader
-libtoolize
-autoconf
-automake -a -c
+echo "Running autopoint..."; autopoint -f || :
+echo "Running aclocal..."; aclocal $ACLOCAL_FLAGS -I m4 || exit 1
+echo "Running autoheader..."; autoheader || exit 1
+echo "Running autoconf..."; autoconf || exit 1
+echo "Running libtoolize..."; (libtoolize --copy --automake || glibtoolize --automake) || exit 1
+echo "Running automake..."; automake --add-missing --copy --gnu || exit 1
+echo "Running intltoolize"; intltoolize --force
diff --git a/common.h b/common.h
index 39355685..0b8fe998 100644
--- a/common.h
+++ b/common.h
@@ -19,8 +19,11 @@
#define __COMMON_H
#include <limits.h>
-#ifndef PATH_MAX
-#define PATH_MAX 1024 /* max # of characters in a path name */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
#endif
#define min(x,y) ((x)<(y)?(x):(y))
diff --git a/conf.c b/conf.c
index d4e0ee28..9b2a75da 100644
--- a/conf.c
+++ b/conf.c
@@ -15,11 +15,22 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
+#include <errno.h>
+#include <unistd.h>
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
#include "conf.h"
#include "threading.h"
@@ -107,19 +118,33 @@ conf_load (void) {
int
conf_save (void) {
extern char dbconfdir[1024]; // $HOME/.config/deadbeef
- char str[1024];
- snprintf (str, 1024, "%s/config", dbconfdir);
- FILE *fp = fopen (str, "w+t");
+
+ char tempfile[PATH_MAX];
+ snprintf (tempfile, sizeof (tempfile), "%s/config.tmp", dbconfdir);
+
+ char str[PATH_MAX];
+ snprintf (str, sizeof (str), "%s/config", dbconfdir);
+
+ FILE *fp = fopen (tempfile, "w+t");
if (!fp) {
fprintf (stderr, "failed to open config file for writing\n");
return -1;
}
conf_lock ();
for (DB_conf_item_t *it = conf_items; it; it = it->next) {
- fprintf (fp, "%s %s\n", it->key, it->value);
+ if (fprintf (fp, "%s %s\n", it->key, it->value) < 0) {
+ fprintf (stderr, "failed to write to file %s (%s)\n", tempfile, strerror (errno));
+ fclose (fp);
+ conf_unlock ();
+ return -1;
+ }
}
fclose (fp);
conf_unlock ();
+ int err = rename (tempfile, str);
+ if (err != 0) {
+ fprintf (stderr, "config rename %s -> %s failed: %s\n", tempfile, str, strerror (errno));
+ }
return 0;
}
diff --git a/config.rpath b/config.rpath
deleted file mode 100755
index 17298f23..00000000
--- a/config.rpath
+++ /dev/null
@@ -1,672 +0,0 @@
-#! /bin/sh
-# Output a system dependent set of variables, describing how to set the
-# run time search path of shared libraries in an executable.
-#
-# Copyright 1996-2010 Free Software Foundation, Inc.
-# Taken from GNU libtool, 2001
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This file is free software; the Free Software Foundation gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-#
-# The first argument passed to this file is the canonical host specification,
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld
-# should be set by the caller.
-#
-# The set of defined variables is at the end of this script.
-
-# Known limitations:
-# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer
-# than 256 bytes, otherwise the compiler driver will dump core. The only
-# known workaround is to choose shorter directory names for the build
-# directory and/or the installation directory.
-
-# All known linkers require a `.a' archive for static linking (except MSVC,
-# which needs '.lib').
-libext=a
-shrext=.so
-
-host="$1"
-host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-# Code taken from libtool.m4's _LT_CC_BASENAME.
-
-for cc_temp in $CC""; do
- case $cc_temp in
- compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
- distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
- \-*) ;;
- *) break;;
- esac
-done
-cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'`
-
-# Code taken from libtool.m4's _LT_COMPILER_PIC.
-
-wl=
-if test "$GCC" = yes; then
- wl='-Wl,'
-else
- case "$host_os" in
- aix*)
- wl='-Wl,'
- ;;
- darwin*)
- case $cc_basename in
- xlc*)
- wl='-Wl,'
- ;;
- esac
- ;;
- mingw* | cygwin* | pw32* | os2* | cegcc*)
- ;;
- hpux9* | hpux10* | hpux11*)
- wl='-Wl,'
- ;;
- irix5* | irix6* | nonstopux*)
- wl='-Wl,'
- ;;
- newsos6)
- ;;
- linux* | k*bsd*-gnu)
- case $cc_basename in
- ecc*)
- wl='-Wl,'
- ;;
- icc* | ifort*)
- wl='-Wl,'
- ;;
- lf95*)
- wl='-Wl,'
- ;;
- pgcc | pgf77 | pgf90)
- wl='-Wl,'
- ;;
- ccc*)
- wl='-Wl,'
- ;;
- como)
- wl='-lopt='
- ;;
- *)
- case `$CC -V 2>&1 | sed 5q` in
- *Sun\ C*)
- wl='-Wl,'
- ;;
- esac
- ;;
- esac
- ;;
- osf3* | osf4* | osf5*)
- wl='-Wl,'
- ;;
- rdos*)
- ;;
- solaris*)
- wl='-Wl,'
- ;;
- sunos4*)
- wl='-Qoption ld '
- ;;
- sysv4 | sysv4.2uw2* | sysv4.3*)
- wl='-Wl,'
- ;;
- sysv4*MP*)
- ;;
- sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
- wl='-Wl,'
- ;;
- unicos*)
- wl='-Wl,'
- ;;
- uts4*)
- ;;
- esac
-fi
-
-# Code taken from libtool.m4's _LT_LINKER_SHLIBS.
-
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-
-case "$host_os" in
- cygwin* | mingw* | pw32* | cegcc*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
- interix*)
- # we just hope/assume this is gcc and not c89 (= MSVC++)
- with_gnu_ld=yes
- ;;
- openbsd*)
- with_gnu_ld=no
- ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
- # Set some defaults for GNU ld with shared library support. These
- # are reset later if shared libraries are not supported. Putting them
- # here allows them to be overridden if necessary.
- # Unlike libtool, we use -rpath here, not --rpath, since the documented
- # option of GNU ld is called -rpath, not --rpath.
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- case "$host_os" in
- aix[3-9]*)
- # On AIX/PPC, the GNU linker is very broken
- if test "$host_cpu" != ia64; then
- ld_shlibs=no
- fi
- ;;
- amigaos*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
- # that the semantics of dynamic libraries on AmigaOS, at least up
- # to version 4, is to share data among multiple programs linked
- # with the same dynamic library. Since this doesn't match the
- # behavior of shared libraries on other platforms, we cannot use
- # them.
- ld_shlibs=no
- ;;
- beos*)
- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
- :
- else
- ld_shlibs=no
- fi
- ;;
- cygwin* | mingw* | pw32* | cegcc*)
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
- :
- else
- ld_shlibs=no
- fi
- ;;
- interix[3-9]*)
- hardcode_direct=no
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- gnu* | linux* | k*bsd*-gnu)
- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
- :
- else
- ld_shlibs=no
- fi
- ;;
- netbsd*)
- ;;
- solaris*)
- if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
- :
- else
- ld_shlibs=no
- fi
- ;;
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
- case `$LD -v 2>&1` in
- *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
- ld_shlibs=no
- ;;
- *)
- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
- hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
- else
- ld_shlibs=no
- fi
- ;;
- esac
- ;;
- sunos4*)
- hardcode_direct=yes
- ;;
- *)
- if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
- :
- else
- ld_shlibs=no
- fi
- ;;
- esac
- if test "$ld_shlibs" = no; then
- hardcode_libdir_flag_spec=
- fi
-else
- case "$host_os" in
- aix3*)
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
- aix[4-9]*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- else
- aix_use_runtimelinking=no
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- ;;
- esac
- fi
- hardcode_direct=yes
- hardcode_libdir_separator=':'
- if test "$GCC" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" && \
- strings "$collect2name" | grep resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- :
- else
- # We have old collect2
- hardcode_direct=unsupported
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- ;;
- esac
- fi
- # Begin _LT_AC_SYS_LIBPATH_AIX.
- echo 'int main () { return 0; }' > conftest.c
- ${CC} ${LDFLAGS} conftest.c -o conftest
- aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
-}'`
- if test -z "$aix_libpath"; then
- aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
-}'`
- fi
- if test -z "$aix_libpath"; then
- aix_libpath="/usr/lib:/lib"
- fi
- rm -f conftest.c conftest
- # End _LT_AC_SYS_LIBPATH_AIX.
- if test "$aix_use_runtimelinking" = yes; then
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- else
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
- fi
- fi
- ;;
- amigaos*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # see comment about different semantics on the GNU ld section
- ld_shlibs=no
- ;;
- bsdi[45]*)
- ;;
- cygwin* | mingw* | pw32* | cegcc*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- libext=lib
- ;;
- darwin* | rhapsody*)
- hardcode_direct=no
- if test "$GCC" = yes ; then
- :
- else
- case $cc_basename in
- xlc*)
- ;;
- *)
- ld_shlibs=no
- ;;
- esac
- fi
- ;;
- dgux*)
- hardcode_libdir_flag_spec='-L$libdir'
- ;;
- freebsd1*)
- ld_shlibs=no
- ;;
- freebsd2.2*)
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- ;;
- freebsd2*)
- hardcode_direct=yes
- hardcode_minus_L=yes
- ;;
- freebsd* | dragonfly*)
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- ;;
- hpux9*)
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- ;;
- hpux10*)
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- fi
- ;;
- hpux11*)
- if test "$with_gnu_ld" = no; then
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- case $host_cpu in
- hppa*64*|ia64*)
- hardcode_direct=no
- ;;
- *)
- hardcode_direct=yes
- # hardcode_minus_L: Not really in the search PATH,
- # but as the default location of the library.
- hardcode_minus_L=yes
- ;;
- esac
- fi
- ;;
- irix5* | irix6* | nonstopux*)
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
- netbsd*)
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- ;;
- newsos6)
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
- openbsd*)
- if test -f /usr/libexec/ld.so; then
- hardcode_direct=yes
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- else
- case "$host_os" in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- else
- ld_shlibs=no
- fi
- ;;
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
- osf3*)
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
- osf4* | osf5*)
- if test "$GCC" = yes; then
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- # Both cc and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- hardcode_libdir_separator=:
- ;;
- solaris*)
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- sunos4*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- ;;
- sysv4)
- case $host_vendor in
- sni)
- hardcode_direct=yes # is this really true???
- ;;
- siemens)
- hardcode_direct=no
- ;;
- motorola)
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- ;;
- esac
- ;;
- sysv4.3*)
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- ld_shlibs=yes
- fi
- ;;
- sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
- ;;
- sysv5* | sco3.2v5* | sco5v6*)
- hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
- hardcode_libdir_separator=':'
- ;;
- uts4*)
- hardcode_libdir_flag_spec='-L$libdir'
- ;;
- *)
- ld_shlibs=no
- ;;
- esac
-fi
-
-# Check dynamic linker characteristics
-# Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER.
-# Unlike libtool.m4, here we don't care about _all_ names of the library, but
-# only about the one the linker finds when passed -lNAME. This is the last
-# element of library_names_spec in libtool.m4, or possibly two of them if the
-# linker has special search rules.
-library_names_spec= # the last element of library_names_spec in libtool.m4
-libname_spec='lib$name'
-case "$host_os" in
- aix3*)
- library_names_spec='$libname.a'
- ;;
- aix[4-9]*)
- library_names_spec='$libname$shrext'
- ;;
- amigaos*)
- library_names_spec='$libname.a'
- ;;
- beos*)
- library_names_spec='$libname$shrext'
- ;;
- bsdi[45]*)
- library_names_spec='$libname$shrext'
- ;;
- cygwin* | mingw* | pw32* | cegcc*)
- shrext=.dll
- library_names_spec='$libname.dll.a $libname.lib'
- ;;
- darwin* | rhapsody*)
- shrext=.dylib
- library_names_spec='$libname$shrext'
- ;;
- dgux*)
- library_names_spec='$libname$shrext'
- ;;
- freebsd1*)
- ;;
- freebsd* | dragonfly*)
- case "$host_os" in
- freebsd[123]*)
- library_names_spec='$libname$shrext$versuffix' ;;
- *)
- library_names_spec='$libname$shrext' ;;
- esac
- ;;
- gnu*)
- library_names_spec='$libname$shrext'
- ;;
- hpux9* | hpux10* | hpux11*)
- case $host_cpu in
- ia64*)
- shrext=.so
- ;;
- hppa*64*)
- shrext=.sl
- ;;
- *)
- shrext=.sl
- ;;
- esac
- library_names_spec='$libname$shrext'
- ;;
- interix[3-9]*)
- library_names_spec='$libname$shrext'
- ;;
- irix5* | irix6* | nonstopux*)
- library_names_spec='$libname$shrext'
- case "$host_os" in
- irix5* | nonstopux*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in
- *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;;
- *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;;
- *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;;
- *) libsuff= shlibsuff= ;;
- esac
- ;;
- esac
- ;;
- linux*oldld* | linux*aout* | linux*coff*)
- ;;
- linux* | k*bsd*-gnu)
- library_names_spec='$libname$shrext'
- ;;
- knetbsd*-gnu)
- library_names_spec='$libname$shrext'
- ;;
- netbsd*)
- library_names_spec='$libname$shrext'
- ;;
- newsos6)
- library_names_spec='$libname$shrext'
- ;;
- nto-qnx*)
- library_names_spec='$libname$shrext'
- ;;
- openbsd*)
- library_names_spec='$libname$shrext$versuffix'
- ;;
- os2*)
- libname_spec='$name'
- shrext=.dll
- library_names_spec='$libname.a'
- ;;
- osf3* | osf4* | osf5*)
- library_names_spec='$libname$shrext'
- ;;
- rdos*)
- ;;
- solaris*)
- library_names_spec='$libname$shrext'
- ;;
- sunos4*)
- library_names_spec='$libname$shrext$versuffix'
- ;;
- sysv4 | sysv4.3*)
- library_names_spec='$libname$shrext'
- ;;
- sysv4*MP*)
- library_names_spec='$libname$shrext'
- ;;
- sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
- library_names_spec='$libname$shrext'
- ;;
- uts4*)
- library_names_spec='$libname$shrext'
- ;;
-esac
-
-sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
-escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"`
-shlibext=`echo "$shrext" | sed -e 's,^\.,,'`
-escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
-
-LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <<EOF
-
-# How to pass a linker flag through the compiler.
-wl="$escaped_wl"
-
-# Static library suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally "so").
-shlibext="$shlibext"
-
-# Format of library name prefix.
-libname_spec="$escaped_libname_spec"
-
-# Library names that the linker finds when passed -lNAME.
-library_names_spec="$escaped_library_names_spec"
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator="$hardcode_libdir_separator"
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct="$hardcode_direct"
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L="$hardcode_minus_L"
-
-EOF
diff --git a/configure.ac b/configure.ac
index 56332f99..0f90e27a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ AC_INIT([deadbeef], [devel])
AC_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE([1.11 dist-bzip2])
-AM_SILENT_RULES([yes])
+dnl AM_SILENT_RULES([yes])
AM_MAINTAINER_MODE()
AC_USE_SYSTEM_EXTENSIONS
@@ -13,7 +13,7 @@ AC_PROG_CC
AC_PROG_CXX
AC_STDC_HEADERS
AC_PROG_INSTALL
-#AC_PROG_LIBTOOL
+dnl AC_PROG_LIBTOOL
AC_CONFIG_MACRO_DIR([m4])
AC_C_BIGENDIAN
AM_GNU_GETTEXT
@@ -71,7 +71,7 @@ AC_ARG_ENABLE(alsa, [AS_HELP_STRING([--disable-alsa ], [disable ALSA outp
AC_ARG_ENABLE(oss, [AS_HELP_STRING([--disable-oss ], [disable Open Sound System output plugin (default: enabled)])], [enable_oss=$enableval], [enable_oss=yes])
AC_ARG_ENABLE(pulse, [AS_HELP_STRING([--disable-pulse ], [disable PulseAudio output plugin (default: enabled)])], [enable_pulse=$enableval], [enable_pulse=yes])
AC_ARG_ENABLE(gtkui, [AS_HELP_STRING([--disable-gtkui ], [disable standard GTK+ user interface plugin (default: enabled)])], [enable_gtkui=$enableval], [enable_gtkui=yes])
-AC_ARG_ENABLE(gtk3, [AS_HELP_STRING([--enable-gtk3 ], [build GTK3 version of gtkui plugin (default: disabled)])], [enable_gtk3=$enableval], [enable_gtk3=no])
+AC_ARG_ENABLE(gtk3, [AS_HELP_STRING([--enable-gtk3 ], [build GTK3 version of gtkui plugin (default: enabled)])], [enable_gtk3=$enableval], [enable_gtk3=yes])
AC_ARG_ENABLE(gtk2, [AS_HELP_STRING([--disable-gtk2 ], [build GTK2 version of gtkui plugin (default: enabled)])], [enable_gtk2=$enableval], [enable_gtk2=yes])
AC_ARG_ENABLE(vfs_curl, [AS_HELP_STRING([--disable-vfs-curl], [disable HTTP streaming vfs plugin (default: enabled)])], [enable_vfs_curl=$enableval], [enable_vfs_curl=yes])
AC_ARG_ENABLE(lfm, [AS_HELP_STRING([--disable-lfm ], [disable last.fm/libre.fm scrobbler plugin (default: enabled)])], [enable_lfm=$enableval], [enable_lfm=yes])
@@ -84,7 +84,7 @@ AC_ARG_ENABLE(vtx, [AS_HELP_STRING([--disable-vtx ], [disable libayemy
AC_ARG_ENABLE(adplug, [AS_HELP_STRING([--disable-adplug ], [disable adplug plugin (default: enabled)])], [enable_adplug=$enableval], [enable_adplug=yes])
AC_ARG_ENABLE(hotkeys, [AS_HELP_STRING([--disable-hotkeys ], [disable global hotkeys plugin (default: enabled)])], [enable_hotkeys=$enableval], [enable_hotkeys=yes])
AC_ARG_ENABLE(vorbis, [AS_HELP_STRING([--disable-vorbis ], [disable Ogg Vorbis player plugin (default: enabled)])], [enable_vorbis=$enableval], [enable_vorbis=yes])
-AC_ARG_ENABLE(ffmpeg, [AS_HELP_STRING([--disable-ffmpeg ], [disable FFMPEG plugin for WMA, MPC, TTA, etc (default: enabled)])], [enable_ffmpeg=$enableval], [enable_ffmpeg=yes])
+AC_ARG_ENABLE(ffmpeg, [AS_HELP_STRING([--disable-ffmpeg ], [disable FFMPEG plugin for WMA, AMR, etc (default: disabled)])], [enable_ffmpeg=$enableval], [enable_ffmpeg=no])
AC_ARG_ENABLE(flac, [AS_HELP_STRING([--disable-flac ], [disable FLAC player plugin (default: enabled)])], [enable_flac=$enableval], [enable_flac=yes])
AC_ARG_ENABLE(sndfile, [AS_HELP_STRING([--disable-sndfile ], [disable libsndfile plugin for PCM wave files (default: enabled)])], [enable_sndfile=$enableval], [enable_sndfile=yes])
AC_ARG_ENABLE(wavpack, [AS_HELP_STRING([--disable-wavpack ], [disable wavpack plugin (default: enabled)])], [enable_wavpack=$enableval], [enable_wavpack=yes])
@@ -110,6 +110,8 @@ AC_ARG_ENABLE(dumb, [AS_HELP_STRING([--enable-dumb ], [build DUMB plug
AC_ARG_ENABLE(shn, [AS_HELP_STRING([--enable-shn ], [build SHN plugin (default: auto)])], [enable_shn=$enableval], [enable_shn=yes])
AC_ARG_ENABLE(psf, [AS_HELP_STRING([--enable-psf ], [build AOSDK-based PSF(,QSF,SSF,DSF) plugin (default: auto)])], [enable_psf=$enableval], [enable_psf=yes])
AC_ARG_ENABLE(mono2stereo, [AS_HELP_STRING([--enable-mono2stereo ], [build mono2stereo DSP plugin (default: auto)])], [enable_mono2stereo=$enableval], [enable_mono2stereo=yes])
+AC_ARG_ENABLE(shellexecui, [AS_HELP_STRING([--enable-shellexecui ], [build shellexec GTK UI plugin (default: auto)])], [enable_shellexecui=$enableval], [enable_shellexecui=yes])
+AC_ARG_ENABLE(alac, [AS_HELP_STRING([--enable-alac ], [build ALAC plugin (default: auto)])], [enable_alac=$enableval], [enable_alac=yes])
if test "x$enable_staticlink" != "xno" ; then
AC_DEFINE_UNQUOTED([STATICLINK], [1], [Define if building static version])
@@ -119,6 +121,9 @@ fi
dnl check for yasm
AC_CHECK_PROG(HAVE_YASM, yasm, yes, no)
+dnl check for log2
+AC_CHECK_LIB([m], [log2], AC_DEFINE([HAVE_LOG2], [], [Define to 1 if the system has log2 in libm]))
+
dnl check for libdl
AC_CHECK_LIB([dl], [main], [HAVE_DL=yes;DL_LIBS="-ldl";AC_SUBST(DL_LIBS)])
@@ -126,6 +131,9 @@ dnl check libsocket (OpenIndiana)
AC_CHECK_LIB([socket], [main], [HAVE_SOCKET=yes;DL_LIBS="-lsocket";AC_SUBST(DL_LIBS)])
dnl check for seperate alloca.h (OpenIndiana)
AC_CHECK_HEADER([alloca.h],[],[alloca.h not found.])
+dnl check for syslimits.h (BSD)
+AC_CHECK_HEADERS([sys/syslimits.h])
+AC_CHECK_HEADERS([sys/cdefs.h])
if test "x$enable_portable" != "xno" && test "x$enable_staticlink" != "xno" ; then
AC_DEFINE_UNQUOTED([PORTABLE], [1], [Define if building portable version])
@@ -165,12 +173,16 @@ AC_SUBST(ZIP_LIBS)
if test "x$enable_gtk3" == "xyes" ; then
PKG_CHECK_MODULES(GTK3_DEPS, gtk+-3.0 >= 3.0 gthread-2.0 glib-2.0, HAVE_GTK3=yes, HAVE_GTK3=no)
+ AC_CHECK_LIB([SM], [main], [HAVE_SM=yes;SM_LIBS="-lSM";AC_SUBST(SM_LIBS)])
+ AC_CHECK_LIB([ICE], [main], [HAVE_ICE=yes;ICE_LIBS="-lICE";AC_SUBST(ICE_LIBS)])
else
HAVE_GTK3=no
fi
if test "x$enable_gtk2" == "xyes" ; then
PKG_CHECK_MODULES(GTK2_DEPS, gtk+-2.0 >= 2.12 gthread-2.0 glib-2.0 gtkglext-1.0, HAVE_GTK2=yes, HAVE_GTK2=no)
+ AC_CHECK_LIB([SM], [main], [HAVE_SM=yes;SM_LIBS="-lSM";AC_SUBST(SM_LIBS)])
+ AC_CHECK_LIB([ICE], [main], [HAVE_ICE=yes;ICE_LIBS="-lICE";AC_SUBST(ICE_LIBS)])
else
HAVE_GTK2=no
fi
@@ -181,11 +193,15 @@ fi
if test "x$enable_ffmpeg" != "xno" ; then
if test "x$enable_staticlink" != "xno" ; then
- FFMPEG_DEPS_LIBS="../../$LIB/lib/libavcodec.a -lpthread ../../$LIB/lib/libavformat.a ../../$LIB/lib/libavcodec.a ../../$LIB/lib/libavutil.a ../../$LIB/lib/libavcore.a -lm ../../$LIB/lib/libz.a "
+ echo "static ffmpeg"
+ FFMPEG_DEPS_CFLAGS="-I../../$LIB/include"
+ FFMPEG_DEPS_LIBS="../../$LIB/lib/libavcodec.a -lpthread ../../$LIB/lib/libavformat.a ../../$LIB/lib/libavcodec.a ../../$LIB/lib/libavutil.a ../../$LIB/lib/libavcore.a -lm ../../$LIB/lib/libz.a"
+ AC_SUBST(FFMPEG_DEPS_CFLAGS)
AC_SUBST(FFMPEG_DEPS_LIBS)
HAVE_FFMPEG=yes
else
PKG_CHECK_MODULES(FFMPEG_DEPS, libavcodec >= 51.0.0 libavutil libavformat >= 52.0.0, HAVE_FFMPEG=yes, HAVE_FFMPEG=no)
+dnl PKG_CHECK_MODULES(FFMPEG_DEPS, libavcodec libavutil libavformat < 54.6.0, HAVE_FFMPEG=yes, HAVE_FFMPEG=no)
fi
fi
@@ -553,10 +569,17 @@ if test "x$enable_converter" != "xno" ; then
fi
fi
+<<<<<<< HEAD
if test "x$enable_medialib" != "xno" ; then
HAVE_MEDIALIB=yes
fi
+if test "x$enable_shellexecui" != "xno" ; then
+ if test "x$HAVE_GTK2" = "xyes" || test "x$HAVE_GTK3" = "xyes" ; then
+ HAVE_SHELLEXECUI=yes
+ fi
+fi
+
if test "x$enable_dumb" != "xno" ; then
HAVE_DUMB=yes
fi
@@ -573,7 +596,11 @@ if test "x$enable_mono2stereo" != "xno" ; then
HAVE_MONO2STEREO=yes
fi
-PLUGINS_DIRS="plugins/lastfm plugins/mpgmad plugins/vorbis plugins/flac plugins/wavpack plugins/sndfile plugins/vfs_curl plugins/cdda plugins/gtkui plugins/alsa plugins/ffmpeg plugins/hotkeys plugins/oss plugins/artwork plugins/adplug plugins/ffap plugins/sid plugins/nullout plugins/supereq plugins/vtx plugins/gme plugins/pulse plugins/notify plugins/musepack plugins/wildmidi plugins/tta plugins/dca plugins/aac plugins/mms plugins/shellexec plugins/dsp_libsrc plugins/m3u plugins/vfs_zip plugins/converter plugins/dumb plugins/shn plugins/ao plugins/mono2stereo plugins/medialib"
+if test "x$enable_alac" != "xno" ; then
+ HAVE_ALAC=yes
+fi
+
+PLUGINS_DIRS="plugins/lastfm plugins/mpgmad plugins/vorbis plugins/flac plugins/wavpack plugins/sndfile plugins/vfs_curl plugins/cdda plugins/gtkui plugins/alsa plugins/ffmpeg plugins/hotkeys plugins/oss plugins/artwork plugins/adplug plugins/ffap plugins/sid plugins/nullout plugins/supereq plugins/vtx plugins/gme plugins/pulse plugins/notify plugins/musepack plugins/wildmidi plugins/tta plugins/dca plugins/aac plugins/mms plugins/shellexec plugins/dsp_libsrc plugins/m3u plugins/vfs_zip plugins/converter plugins/dumb plugins/shn plugins/ao plugins/mono2stereo plugins/shellexecui plugins/alac plugins/medialib"
AM_CONDITIONAL(HAVE_VORBIS, test "x$HAVE_VORBISPLUGIN" = "xyes")
AM_CONDITIONAL(HAVE_FLAC, test "x$HAVE_FLACPLUGIN" = "xyes")
@@ -623,6 +650,10 @@ AM_CONDITIONAL(HAVE_DUMB, test "x$HAVE_DUMB" = "xyes")
AM_CONDITIONAL(HAVE_PSF, test "x$HAVE_PSF" = "xyes")
AM_CONDITIONAL(HAVE_SHN, test "x$HAVE_SHN" = "xyes")
AM_CONDITIONAL(HAVE_MONO2STEREO, test "x$HAVE_MONO2STEREO" = "xyes")
+AM_CONDITIONAL(HAVE_SHELLEXECUI, test "x$HAVE_SHELLEXECUI" = "xyes")
+AM_CONDITIONAL(HAVE_SM, test "x$HAVE_SM" = "xyes")
+AM_CONDITIONAL(HAVE_ICE, test "x$HAVE_ICE" = "xyes")
+AM_CONDITIONAL(HAVE_ALAC, test "x$HAVE_ALAC" = "xyes")
AC_SUBST(PLUGINS_DIRS)
@@ -664,7 +695,8 @@ PRINT_PLUGIN_INFO([vtx],[vtx file player (ay8910/12 emulation)],[test "x$HAVE_VT
PRINT_PLUGIN_INFO([adplug],[adplug player (OPL2/OPL3 emulation)],[test "x$HAVE_ADPLUG" = "xyes"])
PRINT_PLUGIN_INFO([vfs_curl],[http/ftp streaming support],[test "x$HAVE_VFS_CURL" = "xyes"])
PRINT_PLUGIN_INFO([cdda],[cd audio player],[test "x$HAVE_CDDAPLUGIN" = "xyes"])
-PRINT_PLUGIN_INFO([gtkui],[GTK user interface],[test "x$HAVE_GTKUI" = "xyes"])
+PRINT_PLUGIN_INFO([gtkui],[GTK2 user interface],[test "x$HAVE_GTK2" = "xyes" && test "x$HAVE_GTKUI" = "xyes"])
+PRINT_PLUGIN_INFO([gtkui3],[GTK3 user interface],[test "x$HAVE_GTK3" = "xyes" && test "x$HAVE_GTKUI" = "xyes"])
PRINT_PLUGIN_INFO([hotkeys],[Global hotkeys support],[test "x$HAVE_HOTKEYS" = "xyes"])
PRINT_PLUGIN_INFO([ffmpeg],[ffmpeg codecs],[test "x$HAVE_FFMPEGPLUGIN" = "xyes"])
PRINT_PLUGIN_INFO([oss],[oss output plugin],[test "x$HAVE_OSS" = "xyes"])
@@ -688,6 +720,8 @@ PRINT_PLUGIN_INFO([psf],[PSF format plugin, using AOSDK],[test "x$HAVE_PSF" = "x
PRINT_PLUGIN_INFO([dumb],[DUMB module plugin, for MOD, S3M, etc],[test "x$HAVE_DUMB" = "xyes"])
PRINT_PLUGIN_INFO([shn],[SHN plugin based on xmms-shn],[test "x$HAVE_SHN" = "xyes"])
PRINT_PLUGIN_INFO([mono2stereo],[mono2stereo DSP plugin],[test "x$HAVE_MONO2STEREO" = "xyes"])
+PRINT_PLUGIN_INFO([shellexecui],[GTK user interface for configuring shellexec plugin],[test "x$HAVE_SHELLEXECUI" = "xyes"])
+PRINT_PLUGIN_INFO([alac],[ALAC plugin],[test "x$HAVE_ALAC" = "xyes"])
echo
@@ -734,6 +768,8 @@ plugins/dumb/Makefile
plugins/ao/Makefile
plugins/shn/Makefile
plugins/mono2stereo/Makefile
+plugins/shellexecui/Makefile
+plugins/alac/Makefile
intl/Makefile
po/Makefile.in
deadbeef.desktop
diff --git a/deadbeef.desktop.in b/deadbeef.desktop.in
index 3149fbd8..19e16556 100644
--- a/deadbeef.desktop.in
+++ b/deadbeef.desktop.in
@@ -7,7 +7,7 @@ Comment=Listen to music
Comment[pt_BR]=Escute músicas
Comment[ru]=Слушай музыку
Exec=deadbeef %F
-MimeType=application/ogg;audio/x-vorbis+ogg;application/x-ogg;audio/mp3;audio/prs.sid;audio/x-flac;audio/mpeg;audio/x-mpeg;audio/x-mod;audio/x-it;audio/x-s3m;audio/x-xm;
+MimeType=application/ogg;audio/x-vorbis+ogg;application/x-ogg;audio/mp3;audio/prs.sid;audio/x-flac;audio/mpeg;audio/x-mpeg;audio/x-mod;audio/x-it;audio/x-s3m;audio/x-xm;audio/x-mpegurl;audio/x-scpls;
Categories=AudioVideo;Player;GTK;
Terminal=false
Type=Application
diff --git a/deadbeef.h b/deadbeef.h
index 3239d665..aede0fba 100644
--- a/deadbeef.h
+++ b/deadbeef.h
@@ -61,6 +61,7 @@ extern "C" {
// api version history:
// 9.9 -- devel
+// 1.4 -- deadbeef-0.5.5
// 1.3 -- deadbeef-0.5.3
// 1.2 -- deadbeef-0.5.2
// 1.1 -- deadbeef-0.5.1
@@ -78,7 +79,7 @@ extern "C" {
// 0.1 -- deadbeef-0.2.0
#define DB_API_VERSION_MAJOR 1
-#define DB_API_VERSION_MINOR 3
+#define DB_API_VERSION_MINOR 4
#define DDB_PLUGIN_SET_API_VERSION\
.plugin.api_vmajor = DB_API_VERSION_MAJOR,\
@@ -115,8 +116,9 @@ enum {
DDB_TAG_VORBISCOMMENTS = (1<<13),
DDB_TAG_CUESHEET = (1<<14),
DDB_TAG_ICY = (1<<15),
+ DDB_TAG_ITUNES = (1<<16),
- DDB_TAG_MASK = 0x0000ff00
+ DDB_TAG_MASK = 0x000fff00
};
// playlist item
@@ -268,6 +270,8 @@ enum {
DB_EV_OUTPUTCHANGED = 17, // sound output plugin changed
DB_EV_PLAYLISTSWITCHED = 18, // playlist switch occured
DB_EV_SEEK = 19, // seek current track to position p1 (ms)
+ DB_EV_ACTIONSCHANGED = 20, // plugin actions were changed, e.g. for reinitializing gui
+ DB_EV_DSPCHAINCHANGED = 21, // emitted when any parameter of the main dsp chain has been changed
// new in 1.2
DB_EV_SELCHANGED = 20, // selection changed in playlist p1 iter p2
@@ -289,7 +293,6 @@ enum pl_column_t {
DB_COLUMN_FILENUMBER = 0,
DB_COLUMN_PLAYING = 1,
DB_COLUMN_ALBUM_ART = 8,
- DB_COLUMN_ID_MAX
};
// replaygain constants
@@ -468,6 +471,8 @@ typedef struct {
void (*plt_append_meta) (ddb_playlist_t *handle, const char *key, const char *value);
void (*plt_set_meta_int) (ddb_playlist_t *handle, const char *key, int value);
void (*plt_set_meta_float) (ddb_playlist_t *handle, const char *key, float value);
+
+ // plt_find_meta must always be used in the pl_lock/unlock block
const char *(*plt_find_meta) (ddb_playlist_t *handle, const char *key);
DB_metaInfo_t * (*plt_get_metadata_head) (ddb_playlist_t *handle); // returns head of metadata linked list
void (*plt_delete_metadata) (ddb_playlist_t *handle, DB_metaInfo_t *meta);
@@ -761,16 +766,28 @@ typedef struct {
void (*metacache_unref) (const char *str);
// this function must return original un-overriden value (ignoring the keys prefixed with '!')
+ // it's not thread-safe, and must be used under the same conditions as the
+ // pl_find_meta
const char *(*pl_find_meta_raw) (DB_playItem_t *it, const char *key);
// ******* new 1.3 APIs ********
int (*streamer_dsp_chain_save) (void);
+ // ******* new 1.4 APIs ********
+ int (*pl_get_meta) (DB_playItem_t *it, const char *key, char *val, int size);
+ int (*pl_get_meta_raw) (DB_playItem_t *it, const char *key, char *val, int size);
+ int (*plt_get_meta) (ddb_playlist_t *handle, const char *key, char *val, int size);
+
+ // fast way to test if a field exists in playitem
+ int (*pl_meta_exists) (DB_playItem_t *it, const char *key);
+
+ // FIXME ******* devel branch only *******
// access real-time audio data (e.g. for visualization)
// returns data size in bytes
// fmt and data will be filled with last bytes that came to the output plugin
// data size must be float[DDB_AUDIO_MEMORY_FRAMES]
void (*audio_get_waveform_data) (int type, float *data);
+
} DB_functions_t;
// NOTE: an item placement must be selected like this
@@ -878,7 +895,8 @@ typedef struct DB_plugin_s {
// cmdline_size is number of bytes pointed by cmdline
int (*exec_cmdline) (const char *cmdline, int cmdline_size);
- // @returns linked list of actions
+ // @returns linked list of actions for the specified track
+ // when it is NULL -- the plugin must return list of all actions
DB_plugin_action_t* (*get_actions) (DB_playItem_t *it);
// mainloop will call this function for every plugin
@@ -1117,6 +1135,9 @@ typedef struct {
const char *layout;
void (*set_param) (const char *key, const char *value);
void (*get_param) (const char *key, char *value, int len, const char *def);
+
+ // parent was added in 1.4 API
+ void *parent;
} ddb_dialog_t;
enum {
diff --git a/help.txt b/help.txt
index 5273b157..1816d8e1 100644
--- a/help.txt
+++ b/help.txt
@@ -54,3 +54,11 @@ help file for deadbeef player
Unknown Artist - Unknown Album.flac <---- open this file
Unknown Artist - Unknown Album.cue <---- this file will be used automatically
+* KNOWN ISSUES
+
+ global hotkeys configuration is buggy when using GTK3, this is a GTK3 bug:
+ https://bugzilla.gnome.org/show_bug.cgi?id=682826
+
+ ffmpeg devs have been breaking their APIs way too frequently, so i decided to wait until they stop.
+ currently, if you need WMA playback, please use statically-built ffmpeg plugin.
+ you should be able to find it in one of the static builds on the official deadbeef website.
diff --git a/junklib.c b/junklib.c
index d91f4060..b3c72034 100644
--- a/junklib.c
+++ b/junklib.c
@@ -1,19 +1,25 @@
-/*
- DeaDBeeF - ultimate music player for GNU/Linux systems with X11
- Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.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, see <http://www.gnu.org/licenses/>.
+/* junklib -- library for reading tags from various audio files for deadbeef player
+ http://deadbeef.sourceforge.net
+
+ Copyright (C) 2009-2012 Alexey Yakovenko
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Alexey Yakovenko waker@users.sourceforge.net
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -44,6 +50,10 @@ uint16_t sj_to_unicode[] = {
#include "playlist.h"
#include "utf8.h"
#include "plugins.h"
+#include "conf.h"
+
+int enable_cp1251_detection = 1;
+int enable_cp936_detection = 0;
#define MAX_TEXT_FRAME_SIZE 1024
#define MAX_CUESHEET_FRAME_SIZE 10000
@@ -167,6 +177,7 @@ extract_i32_le (unsigned char *buf)
return x;
}
+
static inline uint16_t
extract_i16 (const uint8_t *buf)
{
@@ -176,7 +187,6 @@ extract_i16 (const uint8_t *buf)
x = buf[0];
x <<= 8;
x |= buf[1];
- x <<= 8;
return x;
}
@@ -645,6 +655,9 @@ static const char *junk_genretbl[] = {
static int
can_be_russian (const signed char *str) {
+ if (!enable_cp1251_detection) {
+ return 0;
+ }
int latin = 0;
int rus = 0;
int rus_in_row = 0;
@@ -669,6 +682,30 @@ can_be_russian (const signed char *str) {
return 0;
}
+static int
+can_be_chinese (const uint8_t *str) {
+ if (!enable_cp936_detection) {
+ return 0;
+ }
+ int len = strlen (str);
+ for (int i = 0; *str; str++, i++) {
+ if (i < len-3
+ && (*str >= 0x81 && *str <= 0xFE )
+ && (*(str+1) >= 0x30 && *(str+1) <= 0x39)
+ && (*(str+2) >= 0x81 && *(str+2) <= 0xFE)
+ && (*(str+3) >= 0x30 && *(str+3) <= 0x39)) {
+ return 1;
+ }
+ if (i < len - 1
+ && (*str >= 0x81 && *str <= 0xFE )
+ && ((*(str+1) >= 0x40 && *(str+1) <= 0x7E)
+ || (*(str+1) >= 0x80 && *(str+1) <= 0xFE))) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
static char *
convstr_id3v2 (int version, uint8_t encoding, const unsigned char* str, int sz) {
char out[2048] = "";
@@ -682,8 +719,12 @@ convstr_id3v2 (int version, uint8_t encoding, const unsigned char* str, int sz)
enc = UTF8_STR;
}
else if (encoding == 0) {
- // hack to add limited cp1251 recoding support
- if (can_be_russian (str)) {
+ if (can_be_chinese (str)) {
+ // hack to add cp936 support
+ enc = "cp936";
+ }
+ else if (can_be_russian (str)) {
+ // hack to add limited cp1251 recoding support
enc = "cp1251";
}
else {
@@ -766,7 +807,12 @@ convstr_id3v1 (const char* str, int sz) {
return str;
}
const char *enc = "iso8859-1";
- if (can_be_russian (str)) {
+ if (can_be_chinese (str)) {
+ // hack to add cp936 support
+ enc = "cp936";
+ }
+ else if (can_be_russian (str)) {
+ // hack to add limited cp1251 recoding support
enc = "cp1251";
}
@@ -889,6 +935,8 @@ junk_id3v1_write (FILE *fp, playItem_t *it, const char *enc) {
const char *meta;
+ pl_lock ();
+
#define conv(name, store) {\
memset (store, 0x20, sizeof (store));\
meta = pl_find_meta (it, name);\
@@ -933,6 +981,8 @@ junk_id3v1_write (FILE *fp, playItem_t *it, const char *enc) {
}
}
+ pl_unlock ();
+
if (fwrite ("TAG", 1, 3, fp) != 3) {
trace ("junk_id3v1_write: failed to write signature\n");
return -1;
@@ -1196,6 +1246,15 @@ junk_apev2_read_full_mem (playItem_t *it, DB_apev2_tag_t *tag_store, char *mem,
memcpy (value, mem, itemsize);
value[itemsize] = 0;
+ // replace 0s with \n
+ uint8_t *p = value;
+ while (p < value + itemsize - 1) {
+ if (*p == 0) {
+ *p = '\n';
+ }
+ p++;
+ }
+
junk_apev2_add_frame (it, tag_store, &tail, itemsize, itemflags, key, value);
free (value);
@@ -1301,6 +1360,15 @@ junk_apev2_read_full (playItem_t *it, DB_apev2_tag_t *tag_store, DB_FILE *fp) {
}
value[itemsize] = 0;
+ // replace 0s with \n
+ uint8_t *p = value;
+ while (p < value + itemsize - 1) {
+ if (*p == 0) {
+ *p = '\n';
+ }
+ p++;
+ }
+
junk_apev2_add_frame (it, tag_store, &tail, itemsize, itemflags, key, value);
free (value);
}
@@ -2877,6 +2945,9 @@ junk_id3v2_load_txx (int version_major, playItem_t *it, uint8_t *readptr, int sy
else if (!strcasecmp (txx, "replaygain_track_peak")) {
pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (val));
}
+ else if (!strcasecmp (txx, "date")) { // HACK: fb2k date support
+ pl_append_meta (it, "year", val);
+ }
else {
pl_append_meta (it, txx, val);
}
@@ -3385,6 +3456,10 @@ junk_detect_charset (const char *s) {
if (u8_valid (s, strlen (s), NULL)) {
return NULL; // means no recoding required
}
+ // hack to add cp936 support
+ if (can_be_chinese (s)) {
+ return "cp936";
+ }
// check if that could be non-latin1 (too many nonascii chars)
if (can_be_russian (s)) {
return "cp1251";
@@ -3415,8 +3490,11 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
int write_id3v1 = junk_flags & JUNK_WRITE_ID3V1;
int write_apev2 = junk_flags & JUNK_WRITE_APEV2;
+ char tmppath[PATH_MAX];
// find the beginning and the end of audio data
- const char *fname = pl_find_meta (it, ":URI");
+ char fname[PATH_MAX];
+ pl_get_meta (it, ":URI", fname, sizeof (fname));
+ snprintf (tmppath, sizeof (tmppath), "%s.temp", fname);
fp = deadbeef->fopen (fname);
if (!fp) {
trace ("file not found %s\n", fname);
@@ -3467,8 +3545,6 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
// open output file
out = NULL;
- char tmppath[PATH_MAX];
- snprintf (tmppath, sizeof (tmppath), "%s.temp", pl_find_meta (it, ":URI"));
out = fopen (tmppath, "w+b");
trace ("will write tags into %s\n", tmppath);
@@ -3546,11 +3622,15 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
// COMM
junk_id3v2_remove_frames (&id3v2, "COMM");
- const char *val = pl_find_meta (it, "comment");
- if (val && *val) {
- junk_id3v2_remove_frames (&id3v2, "COMM");
- junk_id3v2_add_comment_frame (&id3v2, "eng", "", val);
+ pl_lock ();
+ {
+ const char *val = pl_find_meta (it, "comment");
+ if (val && *val) {
+ junk_id3v2_remove_frames (&id3v2, "COMM");
+ junk_id3v2_add_comment_frame (&id3v2, "eng", "", val);
+ }
}
+ pl_unlock ();
// remove all known normal frames (they will be refilled from track metadata)
int idx = id3v2.version[0] == 3 ? MAP_ID3V23 : MAP_ID3V24;
@@ -3591,18 +3671,22 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
}
// add tracknumber/totaltracks
- const char *track = pl_find_meta (it, "track");
- const char *totaltracks = pl_find_meta (it, "numtracks");
- if (track && totaltracks) {
- char s[100];
- snprintf (s, sizeof (s), "%s/%s", track, totaltracks);
- junk_id3v2_remove_frames (&id3v2, "TRCK");
- junk_id3v2_add_text_frame (&id3v2, "TRCK", s);
- }
- else if (track) {
- junk_id3v2_remove_frames (&id3v2, "TRCK");
- junk_id3v2_add_text_frame (&id3v2, "TRCK", track);
+ pl_lock ();
+ {
+ const char *track = pl_find_meta (it, "track");
+ const char *totaltracks = pl_find_meta (it, "numtracks");
+ if (track && totaltracks) {
+ char s[100];
+ snprintf (s, sizeof (s), "%s/%s", track, totaltracks);
+ junk_id3v2_remove_frames (&id3v2, "TRCK");
+ junk_id3v2_add_text_frame (&id3v2, "TRCK", s);
+ }
+ else if (track) {
+ junk_id3v2_remove_frames (&id3v2, "TRCK");
+ junk_id3v2_add_text_frame (&id3v2, "TRCK", track);
+ }
}
+ pl_unlock ();
// write tag
if (junk_id3v2_write (out, &id3v2) != 0) {
@@ -3695,18 +3779,22 @@ junk_rewrite_tags (playItem_t *it, uint32_t junk_flags, int id3v2_version, const
}
// add tracknumber/totaltracks
- const char *track = pl_find_meta (it, "track");
- const char *totaltracks = pl_find_meta (it, "numtracks");
- if (track && totaltracks) {
- char s[100];
- snprintf (s, sizeof (s), "%s/%s", track, totaltracks);
- junk_apev2_remove_frames (&apev2, "Track");
- junk_apev2_add_text_frame (&apev2, "Track", s);
- }
- else if (track) {
- junk_apev2_remove_frames (&apev2, "Track");
- junk_apev2_add_text_frame (&apev2, "Track", track);
+ pl_lock ();
+ {
+ const char *track = pl_find_meta (it, "track");
+ const char *totaltracks = pl_find_meta (it, "numtracks");
+ if (track && totaltracks) {
+ char s[100];
+ snprintf (s, sizeof (s), "%s/%s", track, totaltracks);
+ junk_apev2_remove_frames (&apev2, "Track");
+ junk_apev2_add_text_frame (&apev2, "Track", s);
+ }
+ else if (track) {
+ junk_apev2_remove_frames (&apev2, "Track");
+ junk_apev2_add_text_frame (&apev2, "Track", track);
+ }
}
+ pl_unlock ();
// write tag
if (deadbeef->junk_apev2_write (out, &apev2, 0, 1) != 0) {
@@ -3773,7 +3861,9 @@ error:
free (buffer);
}
if (!err) {
- rename (tmppath, pl_find_meta (it, ":URI"));
+ pl_lock ();
+ rename (tmppath, fname);
+ pl_unlock ();
}
else {
unlink (tmppath);
@@ -3781,3 +3871,20 @@ error:
return err;
}
+void
+junk_enable_cp1251_detection (int enable) {
+ enable_cp1251_detection = enable;
+}
+
+void
+junk_enable_cp936_detection (int enable) {
+ enable_cp936_detection = enable;
+}
+
+void
+junk_configchanged (void) {
+ int cp1251 = conf_get_int ("junk.enable_cp1251_detection", 1);
+ int cp936 = conf_get_int ("junk.enable_cp936_detection", 0);
+ junk_enable_cp1251_detection (cp1251);
+ junk_enable_cp936_detection (cp936);
+}
diff --git a/junklib.h b/junklib.h
index 0cd3b275..2cedfdd2 100644
--- a/junklib.h
+++ b/junklib.h
@@ -1,19 +1,25 @@
-/*
- DeaDBeeF - ultimate music player for GNU/Linux systems with X11
- Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.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, see <http://www.gnu.org/licenses/>.
+/* junklib -- library for reading tags from various audio files for deadbeef player
+ http://deadbeef.sourceforge.net
+
+ Copyright (C) 2009-2012 Alexey Yakovenko
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Alexey Yakovenko waker@users.sourceforge.net
*/
#ifndef __JUNKLIB_H
#define __JUNKLIB_H
@@ -110,4 +116,13 @@ junk_recode (const char *in, int inlen, char *out, int outlen, const char *cs);
int
junk_rewrite_tags (struct playItem_s *it, uint32_t junk_flags, int id3v2_version, const char *id3v1_encoding);
+void
+junk_enable_cp1251_detection (int enable);
+
+void
+junk_configchanged (void);
+
+void
+junk_enable_cp936_detection (int enable);
+
#endif // __JUNKLIB_H
diff --git a/main.c b/main.c
index c5c06875..466126df 100644
--- a/main.c
+++ b/main.c
@@ -55,6 +55,7 @@
#include "volume.h"
#include "plugins.h"
#include "common.h"
+#include "junklib.h"
#ifndef PREFIX
#error PREFIX must be defined
@@ -261,6 +262,15 @@ server_exec_command_line (const char *cmdline, int len, char *sendback, int sbsi
else if (!strcmp (parg, "--quit")) {
messagepump_push (DB_EV_TERMINATE, 0, 0, 0);
}
+ else if (!strcmp (parg, "--sm-client-id")) {
+ parg += strlen (parg);
+ parg++;
+ if (parg < pend) {
+ parg += strlen (parg);
+ parg++;
+ }
+ continue;
+ }
else if (parg[0] != '-') {
break; // unknown option is filename
}
@@ -454,7 +464,9 @@ server_update (void) {
}
close(s2);
- free(buf);
+ if (buf) {
+ free(buf);
+ }
}
return 0;
}
@@ -513,97 +525,100 @@ player_mainloop (void) {
uint32_t p2;
int term = 0;
while (messagepump_pop(&msg, &ctx, &p1, &p2) != -1) {
- // broadcast to all plugins
- DB_plugin_t **plugs = plug_get_list ();
- for (int n = 0; plugs[n]; n++) {
- if (plugs[n]->message) {
- plugs[n]->message (msg, ctx, p1, p2);
+ if (!term) { // when term is set to 1 -- it means we can't handle events, but we still need to process them to avoid memleaks
+ // broadcast to all plugins
+ DB_plugin_t **plugs = plug_get_list ();
+ for (int n = 0; plugs[n]; n++) {
+ if (plugs[n]->message) {
+ plugs[n]->message (msg, ctx, p1, p2);
+ }
}
- }
- DB_output_t *output = plug_get_output ();
- switch (msg) {
- case DB_EV_REINIT_SOUND:
- plug_reinit_sound ();
- streamer_reset (1);
- conf_save ();
- break;
- case DB_EV_TERMINATE:
- {
- save_resume_state ();
-
+ DB_output_t *output = plug_get_output ();
+ switch (msg) {
+ case DB_EV_REINIT_SOUND:
+ plug_reinit_sound ();
+ streamer_reset (1);
+ conf_save ();
+ break;
+ case DB_EV_TERMINATE:
+ {
+ save_resume_state ();
+
+ pl_playqueue_clear ();
+
+ // stop streaming and playback before unloading plugins
+ DB_output_t *output = plug_get_output ();
+ output->stop ();
+ streamer_free ();
+ output->free ();
+ term = 1;
+ }
+ break;
+ case DB_EV_PLAY_CURRENT:
+ if (p1) {
+ output->stop ();
+ pl_playqueue_clear ();
+ streamer_set_nextsong (0, 1);
+ }
+ else {
+ streamer_play_current_track ();
+ }
+ break;
+ case DB_EV_PLAY_NUM:
+ output->stop ();
pl_playqueue_clear ();
-
- // stop streaming and playback before unloading plugins
- DB_output_t *output = plug_get_output ();
+ streamer_set_nextsong (p1, 1);
+ if (pl_get_order () == PLAYBACK_ORDER_SHUFFLE_ALBUMS) {
+ int pl = streamer_get_current_playlist ();
+ playlist_t *plt = plt_get_for_idx (pl);
+ plt_init_shuffle_albums (plt, p1);
+ plt_unref (plt);
+ }
+ break;
+ case DB_EV_STOP:
+ streamer_set_nextsong (-2, 0);
+ break;
+ case DB_EV_NEXT:
output->stop ();
- streamer_free ();
- output->free ();
- term = 1;
- }
- break;
- case DB_EV_PLAY_CURRENT:
- if (p1) {
+ streamer_move_to_nextsong (1);
+ break;
+ case DB_EV_PREV:
output->stop ();
- pl_playqueue_clear ();
- streamer_set_nextsong (0, 1);
- }
- else {
- streamer_play_current_track ();
- }
- break;
- case DB_EV_PLAY_NUM:
- output->stop ();
- pl_playqueue_clear ();
- streamer_set_nextsong (p1, 1);
- if (pl_get_order () == PLAYBACK_ORDER_SHUFFLE_ALBUMS) {
- int pl = streamer_get_current_playlist ();
- playlist_t *plt = plt_get_for_idx (pl);
- plt_init_shuffle_albums (plt, p1);
- plt_unref (plt);
- }
- break;
- case DB_EV_STOP:
- streamer_set_nextsong (-2, 0);
- break;
- case DB_EV_NEXT:
- output->stop ();
- streamer_move_to_nextsong (1);
- break;
- case DB_EV_PREV:
- output->stop ();
- streamer_move_to_prevsong ();
- break;
- case DB_EV_PAUSE:
- if (output->state () != OUTPUT_STATE_PAUSED) {
- output->pause ();
- messagepump_push (DB_EV_PAUSED, 0, 1, 0);
- }
- break;
- case DB_EV_TOGGLE_PAUSE:
- if (output->state () == OUTPUT_STATE_PAUSED) {
- output->unpause ();
- messagepump_push (DB_EV_PAUSED, 0, 0, 0);
- }
- else {
- output->pause ();
- messagepump_push (DB_EV_PAUSED, 0, 1, 0);
+ streamer_move_to_prevsong ();
+ break;
+ case DB_EV_PAUSE:
+ if (output->state () != OUTPUT_STATE_PAUSED) {
+ output->pause ();
+ messagepump_push (DB_EV_PAUSED, 0, 1, 0);
+ }
+ break;
+ case DB_EV_TOGGLE_PAUSE:
+ if (output->state () == OUTPUT_STATE_PAUSED) {
+ output->unpause ();
+ messagepump_push (DB_EV_PAUSED, 0, 0, 0);
+ }
+ else {
+ output->pause ();
+ messagepump_push (DB_EV_PAUSED, 0, 1, 0);
+ }
+ break;
+ case DB_EV_PLAY_RANDOM:
+ output->stop ();
+ streamer_move_to_randomsong ();
+ break;
+ case DB_EV_PLAYLIST_REFRESH:
+ pl_save_current ();
+ messagepump_push (DB_EV_PLAYLISTCHANGED, 0, 0, 0);
+ break;
+ case DB_EV_CONFIGCHANGED:
+ conf_save ();
+ streamer_configchanged ();
+ junk_configchanged ();
+ break;
+ case DB_EV_SEEK:
+ streamer_set_seek (p1 / 1000.f);
+ break;
}
- break;
- case DB_EV_PLAY_RANDOM:
- output->stop ();
- streamer_move_to_randomsong ();
- break;
- case DB_EV_PLAYLIST_REFRESH:
- pl_save_current ();
- messagepump_push (DB_EV_PLAYLISTCHANGED, 0, 0, 0);
- break;
- case DB_EV_CONFIGCHANGED:
- conf_save ();
- streamer_configchanged ();
- break;
- case DB_EV_SEEK:
- streamer_set_seek (p1 / 1000.f);
- break;
}
if (msg >= DB_EV_FIRST && ctx) {
messagepump_event_free ((ddb_event_t *)ctx);
@@ -661,6 +676,13 @@ restore_resume_state (void) {
streamer_lock (); // need to hold streamer thread to make the resume operation atomic
streamer_set_current_playlist (plt);
streamer_set_nextsong (track, paused ? 2 : 3);
+ if (pl_get_order () == PLAYBACK_ORDER_SHUFFLE_ALBUMS) {
+ playlist_t *p = plt_get_for_idx (plt);
+ if (p) {
+ plt_init_shuffle_albums (p, track);
+ plt_unref (p);
+ }
+ }
streamer_set_seek (pos);
streamer_unlock ();
}
@@ -669,15 +691,44 @@ restore_resume_state (void) {
int
main (int argc, char *argv[]) {
+ int portable = 0;
+#if STATICLINK
+ int staticlink = 1;
+#else
+ int staticlink = 0;
+#endif
#if PORTABLE
- strcpy (dbinstalldir, argv[0]);
- char *e = dbinstalldir + strlen (dbinstalldir);
- while (e >= dbinstalldir && *e != '/') {
- e--;
+ portable = 1;
+ if (!realpath (argv[0], dbinstalldir)) {
+ strcpy (dbinstalldir, argv[0]);
+ }
+ char *e = strrchr (dbinstalldir, '/');
+ if (e) {
+ *e = 0;
+ }
+ else {
+ fprintf (stderr, "couldn't determine install folder from path %s\n", argv[0]);
+ exit (-1);
}
- *e = 0;
#else
- strcpy (dbinstalldir, PREFIX);
+ if (!realpath (argv[0], dbinstalldir)) {
+ strcpy (dbinstalldir, argv[0]);
+ }
+ char *e = strrchr (dbinstalldir, '/');
+ if (e) {
+ *e = 0;
+ struct stat st;
+ char checkpath[PATH_MAX];
+ snprintf (checkpath, sizeof (checkpath), "%s/.ddb_portable", dbinstalldir);
+ if (!stat (checkpath, &st)) {
+ if (S_ISREG (st.st_mode)) {
+ portable = 1;
+ }
+ }
+ }
+ if (!portable) {
+ strcpy (dbinstalldir, PREFIX);
+ }
#endif
#ifdef __linux__
@@ -687,26 +738,18 @@ main (int argc, char *argv[]) {
setlocale (LC_NUMERIC, "C");
#ifdef ENABLE_NLS
// fprintf (stderr, "enabling gettext support: package=" PACKAGE ", dir=" LOCALEDIR "...\n");
-#if PORTABLE
- char localedir[PATH_MAX];
- snprintf (localedir, sizeof (localedir), "%s/locale", dbinstalldir);
- bindtextdomain (PACKAGE, localedir);
-#else
- bindtextdomain (PACKAGE, LOCALEDIR);
-#endif
+ if (portable) {
+ char localedir[PATH_MAX];
+ snprintf (localedir, sizeof (localedir), "%s/locale", dbinstalldir);
+ bindtextdomain (PACKAGE, localedir);
+ }
+ else {
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ }
bind_textdomain_codeset (PACKAGE, "UTF-8");
textdomain (PACKAGE);
#endif
- int staticlink = 0;
- int portable = 0;
-#if STATICLINK
- staticlink = 1;
-#endif
-#if PORTABLE
- portable = 1;
-#endif
-
fprintf (stderr, "starting deadbeef " VERSION "%s%s\n", staticlink ? " [static]" : "", portable ? " [portable]" : "");
srand (time (NULL));
#ifdef __linux__
@@ -748,34 +791,35 @@ main (int argc, char *argv[]) {
#endif
-#if PORTABLE
- if (snprintf (dbdocdir, sizeof (dbdocdir), "%s/doc", dbinstalldir) > sizeof (dbdocdir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
- }
- if (snprintf (dbplugindir, sizeof (dbplugindir), "%s/plugins", dbinstalldir) > sizeof (dbplugindir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
- }
- if (snprintf (dbpixmapdir, sizeof (dbpixmapdir), "%s/pixmaps", dbinstalldir) > sizeof (dbpixmapdir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
- }
- mkdir (dbplugindir, 0755);
-#else
- if (snprintf (dbdocdir, sizeof (dbdocdir), "%s", DOCDIR) > sizeof (dbdocdir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
- }
- if (snprintf (dbplugindir, sizeof (dbplugindir), "%s/deadbeef", LIBDIR) > sizeof (dbplugindir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
+ if (portable) {
+ if (snprintf (dbdocdir, sizeof (dbdocdir), "%s/doc", dbinstalldir) > sizeof (dbdocdir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
+ if (snprintf (dbplugindir, sizeof (dbplugindir), "%s/plugins", dbinstalldir) > sizeof (dbplugindir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
+ if (snprintf (dbpixmapdir, sizeof (dbpixmapdir), "%s/pixmaps", dbinstalldir) > sizeof (dbpixmapdir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
+ mkdir (dbplugindir, 0755);
}
- if (snprintf (dbpixmapdir, sizeof (dbpixmapdir), "%s/share/deadbeef/pixmaps", PREFIX) > sizeof (dbpixmapdir)) {
- fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
- return -1;
+ else {
+ if (snprintf (dbdocdir, sizeof (dbdocdir), "%s", DOCDIR) > sizeof (dbdocdir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
+ if (snprintf (dbplugindir, sizeof (dbplugindir), "%s/deadbeef", LIBDIR) > sizeof (dbplugindir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
+ if (snprintf (dbpixmapdir, sizeof (dbpixmapdir), "%s/share/deadbeef/pixmaps", PREFIX) > sizeof (dbpixmapdir)) {
+ fprintf (stderr, "fatal: too long install path %s\n", dbinstalldir);
+ return -1;
+ }
}
-#endif
for (int i = 1; i < argc; i++) {
// help, version and nowplaying are executed with any filter
@@ -854,6 +898,9 @@ main (int argc, char *argv[]) {
fprintf (stderr, "%s\n", out);
}
}
+ if (out) {
+ free (out);
+ }
close (s);
exit (0);
}
diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am
index 9eaf9d55..aa1e3854 100644
--- a/pixmaps/Makefile.am
+++ b/pixmaps/Makefile.am
@@ -4,7 +4,7 @@ pixmaps_DATA =\
pause_16.png\
play_16.png\
buffering_16.png\
-noartwork.jpg
+noartwork.png
EXTRA_DIST = $(pixmaps_DATA)
diff --git a/pixmaps/noartwork.jpg b/pixmaps/noartwork.jpg
deleted file mode 100644
index e6f5669f..00000000
--- a/pixmaps/noartwork.jpg
+++ /dev/null
Binary files differ
diff --git a/pixmaps/noartwork.png b/pixmaps/noartwork.png
new file mode 100644
index 00000000..cb5341cb
--- /dev/null
+++ b/pixmaps/noartwork.png
Binary files differ
diff --git a/playlist.c b/playlist.c
index ebc68ce5..e6b6facc 100644
--- a/playlist.c
+++ b/playlist.c
@@ -55,7 +55,7 @@
#define DISABLE_LOCKING 0
#define DEBUG_LOCKING 0
-//#define DETECT_PL_LOCK_RC 1
+#define DETECT_PL_LOCK_RC 0
// file format revision history
// 1.1->1.2 changelog:
@@ -186,7 +186,7 @@ pl_lock (void) {
#if !DISABLE_LOCKING
mutex_lock (mutex);
#if DETECT_PL_LOCK_RC
- pl_lock_tid = pthread_self();
+ pl_lock_tid = pthread_self ();
tids[ntids++] = pl_lock_tid;
#endif
@@ -998,6 +998,10 @@ plt_process_cue_track (playlist_t *playlist, const char *fname, playItem_t **pre
playItem_t *
plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t *origin, const uint8_t *buffer, int buffersize, int numsamples, int samplerate) {
LOCK;
+ if (buffersize >= 3 && buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) {
+ buffer += 3;
+ buffersize -= 3;
+ }
playItem_t *ins = after;
trace ("plt_insert_cue_from_buffer numsamples=%d, samplerate=%d\n", numsamples, samplerate);
char albumperformer[256] = "";
@@ -1014,6 +1018,8 @@ plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t
char replaygain_album_peak[256] = "";
char replaygain_track_gain[256] = "";
char replaygain_track_peak[256] = "";
+ const char *uri = pl_find_meta_raw (origin, ":URI");
+ const char *dec = pl_find_meta_raw (origin, ":DECODER");
const char *filetype = pl_find_meta_raw (origin, ":FILETYPE");
playItem_t *cuetracks[MAX_CUE_TRACKS];
@@ -1068,13 +1074,14 @@ plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t
pl_get_value_from_cue (p + 9, sizeof (date), date);
}
else if (!strncmp (p, "TRACK ", 6)) {
- trace ("cue: adding track: %s %s %s\n", pl_find_meta_raw (origin, ":URI"), title, track);
+ trace ("cue: adding track: %s %s %s\n", uri, title, track);
if (title[0]) {
// add previous track
- playItem_t *it = plt_process_cue_track (playlist, pl_find_meta_raw (origin, ":URI"), &prev, track, index00, index01, pregap, title, albumperformer, performer, albumtitle, genre, date, replaygain_album_gain, replaygain_album_peak, replaygain_track_gain, replaygain_track_peak, pl_find_meta_raw (origin, ":DECODER"), filetype, samplerate);
+ playItem_t *it = plt_process_cue_track (playlist, uri, &prev, track, index00, index01, pregap, title, albumperformer, performer, albumtitle, genre, date, replaygain_album_gain, replaygain_album_peak, replaygain_track_gain, replaygain_track_peak, dec, filetype, samplerate);
trace ("cue: added %p\n", it);
if (it) {
if (it->startsample >= numsamples || it->endsample >= numsamples) {
+ trace ("cue: the track is shorter than cue timeline\n");
goto error;
}
cuetracks[ncuetracks++] = it;
@@ -1119,7 +1126,7 @@ plt_insert_cue_from_buffer (playlist_t *playlist, playItem_t *after, playItem_t
}
if (title[0]) {
// handle last track
- playItem_t *it = plt_process_cue_track (playlist, pl_find_meta_raw (origin, ":URI"), &prev, track, index00, index01, pregap, title, albumperformer, performer, albumtitle, genre, date, replaygain_album_gain, replaygain_album_peak, replaygain_track_gain, replaygain_track_peak, pl_find_meta_raw (origin, ":DECODER"), filetype, samplerate);
+ playItem_t *it = plt_process_cue_track (playlist, uri, &prev, track, index00, index01, pregap, title, albumperformer, performer, albumtitle, genre, date, replaygain_album_gain, replaygain_album_peak, replaygain_track_gain, replaygain_track_peak, dec, filetype, samplerate);
if (it) {
trace ("last track endsample: %d\n", numsamples-1);
it->endsample = numsamples-1;
@@ -1170,10 +1177,12 @@ error:
playItem_t *
plt_insert_cue (playlist_t *plt, playItem_t *after, playItem_t *origin, int numsamples, int samplerate) {
trace ("pl_insert_cue numsamples=%d, samplerate=%d\n", numsamples, samplerate);
+ pl_lock ();
const char *fname = pl_find_meta_raw (origin, ":URI");
int len = strlen (fname);
char cuename[len+5];
strcpy (cuename, fname);
+ pl_unlock ();
strcpy (cuename+len, ".cue");
DB_FILE *fp = vfs_fopen (cuename);
if (!fp) {
@@ -1327,6 +1336,7 @@ plt_insert_file (playlist_t *playlist, playItem_t *after, const char *fname, int
if (cb && cb (inserted, user_data) < 0) {
*pabort = 1;
}
+ trace ("file has been added by decoder: %s\n", decoders[i]->plugin.id);
return inserted;
}
}
@@ -1862,10 +1872,12 @@ plt_save (playlist_t *plt, playItem_t *first, playItem_t *last, const char *fnam
}
}
+ char tempfile[PATH_MAX];
+ snprintf (tempfile, sizeof (tempfile), "%s.tmp", fname);
const char magic[] = "DBPL";
uint8_t majorver = PLAYLIST_MAJOR_VER;
uint8_t minorver = PLAYLIST_MINOR_VER;
- FILE *fp = fopen (fname, "w+b");
+ FILE *fp = fopen (tempfile, "w+b");
if (!fp) {
UNLOCK;
return -1;
@@ -2032,11 +2044,15 @@ plt_save (playlist_t *plt, playItem_t *first, playItem_t *last, const char *fnam
UNLOCK;
fclose (fp);
+ if (rename (tempfile, fname) != 0) {
+ fprintf (stderr, "playlist rename %s -> %s failed: %s\n", tempfile, fname, strerror (errno));
+ return -1;
+ }
return 0;
save_fail:
UNLOCK;
fclose (fp);
- unlink (fname);
+ unlink (tempfile);
return -1;
}
@@ -2134,12 +2150,14 @@ plt_load (playlist_t *plt, playItem_t *after, const char *fname, int *pabort, in
return NULL;
}
+ playItem_t *last_added = NULL;
uint8_t majorver;
uint8_t minorver;
playItem_t *it = NULL;
char magic[4];
if (fread (magic, 1, 4, fp) != 4) {
+ trace ("failed to read magic\n");
goto load_fail;
}
if (strncmp (magic, "DBPL", 4)) {
@@ -2166,8 +2184,6 @@ plt_load (playlist_t *plt, playItem_t *after, const char *fname, int *pabort, in
goto load_fail;
}
- playItem_t *last_added = NULL;
-
for (uint32_t i = 0; i < cnt; i++) {
it = pl_item_alloc ();
if (!it) {
@@ -2379,6 +2395,7 @@ plt_load (playlist_t *plt, playItem_t *after, const char *fname, int *pabort, in
trace ("plt_load: success\n");
return last_added;
load_fail:
+ plt_clear (plt);
fprintf (stderr, "playlist load fail (%s)!\n", fname);
if (fp) {
fclose (fp);
@@ -2716,6 +2733,7 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
char dirname[PATH_MAX];
const char *duration = NULL;
const char *elapsed = NULL;
+ int escape_slash = 0;
char *ss = s;
@@ -2779,11 +2797,15 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
nm[l] = 0;
meta = pl_find_meta_raw (it, nm);
if (!meta) {
- meta = "?";
+ meta = "";
}
fmt = e;
}
}
+ else if (*fmt == '/') {
+ // this means all '/' in the ongoing fields must be replaced with '\'
+ escape_slash = 1;
+ }
else if (*fmt == 'a') {
meta = pl_find_meta_raw (it, "artist");
if (!meta) {
@@ -2811,11 +2833,11 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
meta = dirname;
}
else {
- meta = "?";
+ meta = "";
}
}
else {
- meta = "?";
+ meta = "";
}
}
}
@@ -2938,6 +2960,10 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
c = snprintf (t, e-t, "Icy | ");
t += c;
}
+ if (it->_flags & DDB_TAG_ITUNES) {
+ c = snprintf (t, e-t, "iTunes | ");
+ t += c;
+ }
if (t != tags) {
*(t - 3) = 0;
}
@@ -3034,22 +3060,21 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
n--;
while (n > 2 && *value) {
const char *e = escape_chars;
- for (; *e; e++) {
- if (*value == *e) {
- if (n < 2) {
- // doesn't fit into output buffer, return
- // empty string and error code
- *ss = 0;
- return -1;
- }
- *s++ = '\\';
- n--;
- *s++ = *value++;
- n--;
- }
- else {
- *s++ = *value++;
- }
+ if (strchr (escape_chars, *value)) {
+ *s++ = '\\';
+ n--;
+ *s++ = *value++;
+ n--;
+ }
+ else if (escape_slash && *value == '/') {
+ *s++ = '\\';
+ n--;
+ *s++ = '\\';
+ n--;
+ break;
+ }
+ else {
+ *s++ = *value++;
}
}
if (n < 1) {
@@ -3062,8 +3087,15 @@ pl_format_title_int (const char *escape_chars, playItem_t *it, int idx, char *s,
}
else {
while (n > 0 && *value) {
- *s++ = *value++;
- n--;
+ if (escape_slash && *value == '/') {
+ *s++ = '\\';
+ n--;
+ value++;
+ }
+ else {
+ *s++ = *value++;
+ n--;
+ }
}
}
}
@@ -3531,9 +3563,6 @@ plt_search_process (playlist_t *playlist, const char *text) {
}
*out = 0;
- const char *cuesheet = metacache_add_string ("cuesheet");
- const char *log = metacache_add_string("log");
-
static int cmpidx = 0;
cmpidx++;
if (cmpidx > 127) {
@@ -3545,15 +3574,27 @@ plt_search_process (playlist_t *playlist, const char *text) {
if (*text) {
DB_metaInfo_t *m = NULL;
for (m = it->meta; m; m = m->next) {
- if (m->key[0] == ':' || m->key[0] == '_' || m->key[0] == '!') {
+ int is_uri = !strcmp (m->key, ":URI");
+ if ((m->key[0] == ':' && !is_uri) || m->key[0] == '_' || m->key[0] == '!') {
break;
}
- if (m->key!=cuesheet && m->key!=log) {
+ const char *value = m->value;
+ if (is_uri) {
+ value = strrchr (value, '/');
+ if (value) {
+ value++;
+ }
+ else {
+ value = m->value;
+ }
+ }
+ if (strcasecmp(m->key, "cuesheet") && strcasecmp (m->key, "log")) {
char cmp = *(m->value-1);
if (abs (cmp) == cmpidx) {
if (cmp > 0) {
it->next[PL_SEARCH] = NULL;
+ it->prev[PL_SEARCH] = playlist->tail[PL_SEARCH];
if (playlist->tail[PL_SEARCH]) {
playlist->tail[PL_SEARCH]->next[PL_SEARCH] = it;
playlist->tail[PL_SEARCH] = it;
@@ -3566,10 +3607,11 @@ plt_search_process (playlist_t *playlist, const char *text) {
break;
}
}
- else if (utfcasestr_fast (m->value, lc)) {
- //fprintf (stderr, "%s -> %s match (%s.%s)\n", text, m->value, pl_find_meta_raw (it, ":URI"), m->key);
+ else if (utfcasestr_fast (value, lc)) {
+ //fprintf (stderr, "%s -> %s match (%s.%s)\n", text, value, pl_find_meta_raw (it, ":URI"), m->key);
// add to list
it->next[PL_SEARCH] = NULL;
+ it->prev[PL_SEARCH] = playlist->tail[PL_SEARCH];
if (playlist->tail[PL_SEARCH]) {
playlist->tail[PL_SEARCH]->next[PL_SEARCH] = it;
playlist->tail[PL_SEARCH] = it;
@@ -3589,8 +3631,6 @@ plt_search_process (playlist_t *playlist, const char *text) {
}
}
}
- metacache_remove_string (cuesheet);
- metacache_remove_string(log);
UNLOCK;
}
@@ -3772,13 +3812,17 @@ pl_get_playlist (playItem_t *it) {
return NULL;
}
-// this function must be called user starts track manually in shuffle albums mode
+// this function must be called when the user starts track manually in shuffle albums mode
// r is an index of current track
// mark previous songs in the album as played
void
plt_init_shuffle_albums (playlist_t *plt, int r) {
pl_lock ();
playItem_t *first = plt_get_item_for_idx (plt, r, PL_MAIN);
+ if (!first) {
+ pl_unlock ();
+ return;
+ }
if (first->played) {
plt_reshuffle (plt, NULL, NULL);
}
@@ -3803,3 +3847,17 @@ int
plt_is_fast_mode (playlist_t *plt) {
return plt->fast_mode;
}
+
+void
+pl_ensure_lock (void) {
+#if DETECT_PL_LOCK_RC
+ pthread_t tid = pthread_self ();
+ for (int i = 0; i < ntids; i++) {
+ if (tids[i] == tid) {
+ return;
+ }
+ }
+ fprintf (stderr, "\033[0;31mnon-thread-safe playlist access function was called outside of pl_lock. please make a backtrace and post a bug. thank you.\033[37;0m\n");
+ assert(0);
+#endif
+}
diff --git a/playlist.h b/playlist.h
index fefb3943..06966bde 100644
--- a/playlist.h
+++ b/playlist.h
@@ -454,4 +454,19 @@ plt_set_fast_mode (playlist_t *plt, int fast);
int
plt_is_fast_mode (playlist_t *plt);
+void
+pl_ensure_lock (void);
+
+int
+pl_get_meta (playItem_t *it, const char *key, char *val, int size);
+
+int
+pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size);
+
+int
+pl_meta_exists (playItem_t *it, const char *key);
+
+int
+plt_get_meta (playlist_t *handle, const char *key, char *val, int size);
+
#endif // __PLAYLIST_H
diff --git a/plmeta.c b/plmeta.c
index cf17f341..9e00d1f9 100644
--- a/plmeta.c
+++ b/plmeta.c
@@ -28,6 +28,9 @@
void
pl_add_meta (playItem_t *it, const char *key, const char *value) {
+ if (!value || !*value) {
+ return;
+ }
LOCK;
// check if it's already set
DB_metaInfo_t *normaltail = NULL;
@@ -54,10 +57,6 @@ pl_add_meta (playItem_t *it, const char *key, const char *value) {
}
// add
char str[256];
- if (!value || !*value) {
- UNLOCK;
- return;
- }
m = malloc (sizeof (DB_metaInfo_t));
memset (m, 0, sizeof (DB_metaInfo_t));
m->key = metacache_add_string (key);
@@ -190,14 +189,13 @@ pl_delete_meta (playItem_t *it, const char *key) {
const char *
pl_find_meta (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
if (key && key[0] == ':') {
// try to find an override
while (m) {
if (m->key[0] == '!' && !strcasecmp (key+1, m->key+1)) {
- pl_unlock ();
return m->value;
}
m = m->next;
@@ -207,27 +205,23 @@ pl_find_meta (playItem_t *it, const char *key) {
m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
const char *
pl_find_meta_raw (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
@@ -301,5 +295,44 @@ pl_delete_all_meta (playItem_t *it) {
}
m = next;
}
+ uint32_t f = pl_get_item_flags (it);
+ f &= ~DDB_TAG_MASK;
+ pl_set_item_flags (it, f);
UNLOCK;
}
+
+int
+pl_get_meta (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ if (!v) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta_raw (it, key);
+ if (!v) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_meta_exists (playItem_t *it, const char *key) {
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ pl_unlock ();
+ return v ? 1 : 0;
+}
diff --git a/pltmeta.c b/pltmeta.c
index e2e6cd04..fac97b37 100644
--- a/pltmeta.c
+++ b/pltmeta.c
@@ -64,6 +64,7 @@ plt_add_meta (playlist_t *it, const char *key, const char *value) {
void
plt_append_meta (playlist_t *it, const char *key, const char *value) {
+ pl_lock ();
const char *old = plt_find_meta (it, key);
size_t newlen = strlen (value);
if (!old) {
@@ -85,6 +86,7 @@ plt_append_meta (playlist_t *it, const char *key, const char *value) {
}
if (len == newlen && !memcmp (str, value, len)) {
+ pl_unlock ();
return;
}
@@ -95,6 +97,7 @@ plt_append_meta (playlist_t *it, const char *key, const char *value) {
snprintf (out, sz, "%s\n%s", old, value);
plt_replace_meta (it, key, out);
}
+ pl_unlock ();
}
void
@@ -170,14 +173,20 @@ plt_find_meta (playlist_t *it, const char *key) {
int
plt_find_meta_int (playlist_t *it, const char *key, int def) {
+ pl_lock ();
const char *val = plt_find_meta (it, key);
- return val ? atoi (val) : def;
+ int res = val ? atoi (val) : def;
+ pl_unlock ();
+ return res;
}
float
plt_find_meta_float (playlist_t *it, const char *key, float def) {
+ pl_lock ();
const char *val = plt_find_meta (it, key);
- return val ? atof (val) : def;
+ float res = val ? atof (val) : def;
+ pl_unlock ();
+ return res;
}
DB_metaInfo_t *
@@ -234,3 +243,16 @@ plt_delete_all_meta (playlist_t *it) {
UNLOCK;
}
+int
+plt_get_meta (playlist_t *handle, const char *key, char *val, int size) {
+ *val = 0;
+ LOCK;
+ const char *v = plt_find_meta (handle, key);
+ if (!v) {
+ UNLOCK;
+ return 0;
+ }
+ strncpy (val, v, size);
+ UNLOCK;
+ return 1;
+}
diff --git a/plugins.c b/plugins.c
index e15f640c..1a0216fa 100644
--- a/plugins.c
+++ b/plugins.c
@@ -21,8 +21,8 @@
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
-//#include <alloca.h>
#include <string.h>
+#include <sys/stat.h>
#ifndef __linux__
#define _POSIX_C_SOURCE 1
#endif
@@ -50,10 +50,6 @@
#define trace(...) { fprintf(stderr, __VA_ARGS__); }
//#define trace(fmt,...)
-#ifndef PATH_MAX
-#define PATH_MAX 1024 /* max # of characters in a path name */
-#endif
-
//#define DISABLE_VERSIONCHECK 1
// deadbeef api
@@ -331,6 +327,12 @@ static DB_functions_t deadbeef_api = {
.pl_find_meta_raw = (const char *(*) (DB_playItem_t *it, const char *key))pl_find_meta_raw,
// ******* new 1.3 APIs ********
.streamer_dsp_chain_save = streamer_dsp_chain_save,
+ // ******* new 1.4 APIs ********
+ .pl_get_meta = (int (*) (DB_playItem_t *it, const char *key, char *val, int size))pl_get_meta,
+ .pl_get_meta_raw = (int (*) (DB_playItem_t *it, const char *key, char *val, int size))pl_get_meta_raw,
+ .plt_get_meta = (int (*) (ddb_playlist_t *handle, const char *key, char *val, int size))plt_get_meta,
+ .pl_meta_exists = (int (*) (DB_playItem_t *it, const char *key))pl_meta_exists,
+ // FIXME ******* devel branch only *******
.audio_get_waveform_data = audio_get_waveform_data,
};
@@ -568,6 +570,13 @@ static int
load_plugin (const char *plugdir, char *d_name, int l) {
char fullname[PATH_MAX];
snprintf (fullname, PATH_MAX, "%s/%s", plugdir, d_name);
+
+ // check if the file exists, to avoid printing bogus errors
+ struct stat s;
+ if (0 != stat (fullname, &s)) {
+ return -1;
+ }
+
trace ("loading plugin %s/%s\n", plugdir, d_name);
void *handle = dlopen (fullname, RTLD_NOW);
if (!handle) {
diff --git a/plugins/aac/Makefile.am b/plugins/aac/Makefile.am
index afef6c55..deab8c8f 100644
--- a/plugins/aac/Makefile.am
+++ b/plugins/aac/Makefile.am
@@ -2,19 +2,19 @@ if HAVE_AAC
aacdir = $(libdir)/$(PACKAGE)
pkglib_LTLIBRARIES = aac.la
aac_la_SOURCES = aac.c aac_parser.c aac_parser.h\
-mp4ff/mp4atom.c\
-mp4ff/mp4ff.c\
-mp4ff/mp4meta.c\
-mp4ff/mp4sample.c\
-mp4ff/mp4tagupdate.c\
-mp4ff/mp4util.c\
-mp4ff/mp4ff.h\
-mp4ff/mp4ffint.h\
-mp4ff/mp4ff_int_types.h
+../libmp4ff/mp4atom.c\
+../libmp4ff/mp4ff.c\
+../libmp4ff/mp4meta.c\
+../libmp4ff/mp4sample.c\
+../libmp4ff/mp4tagupdate.c\
+../libmp4ff/mp4util.c\
+../libmp4ff/mp4ff.h\
+../libmp4ff/mp4ffint.h\
+../libmp4ff/mp4ff_int_types.h
aac_la_LDFLAGS = -module
aac_la_LIBADD = $(LDADD) $(FAAD2_LIBS)
-AM_CFLAGS = $(CFLAGS) -std=c99 -DUSE_MP4FF -DUSE_TAGGING
+AM_CFLAGS = $(CFLAGS) -std=c99 -DUSE_MP4FF -DUSE_TAGGING -I../libmp4ff
endif
diff --git a/plugins/aac/aac.c b/plugins/aac/aac.c
index b3417879..a7abece0 100644
--- a/plugins/aac/aac.c
+++ b/plugins/aac/aac.c
@@ -29,12 +29,7 @@
#include "../../deadbeef.h"
#include "aac_parser.h"
-#ifdef USE_MP4FF
-#include "mp4ff/mp4ff.h"
-#else
-#warning linking mp4v2 to faad2 is illegal
-#include <mp4v2/mp4v2.h>
-#endif
+#include "mp4ff.h"
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
@@ -42,8 +37,6 @@
//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
#define trace(fmt,...)
-// FIXME: use aac_probe in both _init and _insert, in order to avoid LOTS of code duplication
-
static DB_decoder_t plugin;
static DB_functions_t *deadbeef;
@@ -51,13 +44,8 @@ static DB_functions_t *deadbeef;
#define AAC_BUFFER_SIZE (FAAD_MIN_STREAMSIZE * 16)
#define OUT_BUFFER_SIZE 100000
-#ifdef USE_MP4FF
#define MP4FILE mp4ff_t *
#define MP4FILE_CB mp4ff_callback_t
-#else
-#define MP4FILE MP4FileHandle
-#define MP4FILE_CB MP4FileProvider
-#endif
// aac channel mapping
@@ -76,11 +64,9 @@ typedef struct {
DB_fileinfo_t info;
NeAACDecHandle dec;
DB_FILE *file;
- MP4FILE mp4file;
+ MP4FILE mp4;
MP4FILE_CB mp4reader;
NeAACDecFrameInfo frame_info; // last frame info
- int32_t timescale;
- uint32_t maxSampleSize;
int mp4track;
int mp4samples;
int mp4sample;
@@ -110,44 +96,19 @@ aac_open (uint32_t hints) {
return _info;
}
-#ifdef USE_MP4FF
static uint32_t
aac_fs_read (void *user_data, void *buffer, uint32_t length) {
- trace ("aac_fs_read %d\n", length);
+// trace ("aac_fs_read %d\n", length);
aac_info_t *info = user_data;
return deadbeef->fread (buffer, 1, length, info->file);
}
static uint32_t
aac_fs_seek (void *user_data, uint64_t position) {
aac_info_t *info = user_data;
- trace ("aac_fs_seek %lld (%lld)\n", position, position + info->junk);
+// trace ("aac_fs_seek %lld (%lld)\n", position, position + info->junk);
return deadbeef->fseek (info->file, position+info->junk, SEEK_SET);
}
-#else
-static void *
-aac_fs_open (const char *fname, MP4FileMode mode) {
- return deadbeef->fopen (fname);
-}
-static int
-aac_fs_seek (void* handle, int64_t pos) {
- return deadbeef->fseek ((DB_FILE*)handle, pos, SEEK_SET);
-}
-
-static int
-aac_fs_read (void *handle, void *buffer, int64_t length, int64_t *nin, int64_t maxChunkSize) {
- if (deadbeef->fread (buffer, length, 1, (DB_FILE*)handle) != 1) {
- return 1;
- }
- *nin = length;
- return 0;
-}
-static int
-aac_fs_close (void *handle) {
- deadbeef->fclose ((DB_FILE*)handle);
- return 1;
-}
-#endif
static int
parse_aac_stream(DB_FILE *fp, int *psamplerate, int *pchannels, float *pduration, int *ptotalsamples)
@@ -206,7 +167,7 @@ parse_aac_stream(DB_FILE *fp, int *psamplerate, int *pchannels, float *pduration
continue;
}
else {
- trace ("aac: frame #%d sync: %dch %d %d %d %d\n", frame, channels, samplerate, bitrate, samples, size);
+// trace ("aac: frame #%d sync: %dch %d %d %d %d\n", frame, channels, samplerate, bitrate, samples, size);
frame++;
nsamples += samples;
if (!stream_sr) {
@@ -260,188 +221,73 @@ parse_aac_stream(DB_FILE *fp, int *psamplerate, int *pchannels, float *pduration
return firstframepos;
}
-// returns -1 for error, 0 for mp4, 1 for aac
-int
-aac_probe (DB_FILE *fp, const char *fname, MP4FILE_CB *cb, float *duration, int *samplerate, int *channels, int *totalsamples, int *mp4track, MP4FILE *pmp4) {
- // try mp4
- trace ("aac_probe: pos=%lld, junk=%d\n", deadbeef->ftell (fp), ((aac_info_t*)cb->user_data)->junk);
-
- if (mp4track) {
- *mp4track = -1;
- }
- if (*pmp4) {
- *pmp4 = NULL;
- }
- *duration = -1;
-#ifdef USE_MP4FF
- trace ("mp4ff_open_read\n");
- mp4ff_t *mp4 = mp4ff_open_read (cb);
-#else
- MP4FileHandle mp4 = MP4ReadProvider (fname, 0, cb);
-#endif
- if (!mp4) {
- trace ("not an mp4 file\n");
- return -1;
- }
- if (pmp4) {
- *pmp4 = mp4;
- }
-#ifdef USE_MP4FF
- int ntracks = mp4ff_total_tracks (mp4);
- if (ntracks > 0) {
- trace ("m4a container detected, ntracks=%d\n", ntracks);
- int i = -1;
- trace ("looking for mp4 data...\n");
- int sr = -1;
- unsigned char* buff = 0;
- unsigned int buff_size = 0;
- for (i = 0; i < ntracks; i++) {
- mp4AudioSpecificConfig mp4ASC;
- mp4ff_get_decoder_config(mp4, i, &buff, &buff_size);
- if (buff) {
- int rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
- sr = mp4ASC.samplingFrequency;
- if(rc < 0) {
- free (buff);
- buff = 0;
- continue;
- }
- break;
- }
- }
- if (i != ntracks && buff)
- {
- trace ("found audio track (%d)\n", i);
- // init mp4 decoding
- NeAACDecHandle dec = NeAACDecOpen ();
- unsigned long srate;
- unsigned char ch;
- if (NeAACDecInit2(dec, buff, buff_size, &srate, &ch) < 0) {
- trace ("NeAACDecInit2 returned error\n");
- goto error;
- }
- *samplerate = srate;
- *channels = ch;
- int samples = mp4ff_num_samples(mp4, i);
- samples = (int64_t)samples * srate / mp4ff_time_scale (mp4, i);
- int tsamples = samples;
- NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (dec);
- conf->dontUpSampleImplicitSBR = 1;
- NeAACDecSetConfiguration (dec, conf);
- mp4AudioSpecificConfig mp4ASC;
- int mp4framesize;
- if (NeAACDecAudioSpecificConfig(buff, buff_size, &mp4ASC) >= 0)
- {
- mp4framesize = 1024;
- if (mp4ASC.frameLengthFlag == 1) {
- mp4framesize = 960;
- }
- // commented this out, since it fixes double-duration bug on
- // some mp4 files
- //if (mp4ASC.sbr_present_flag == 1) {
- // mp4framesize *= 2;
- //}
- }
- else {
- trace ("NeAACDecAudioSpecificConfig failed, can't get mp4framesize\n");
- goto error;
- }
- tsamples *= mp4framesize;
-
- trace ("mp4 nsamples=%d, samplerate=%d, timescale=%d, duration=%lld\n", samples, *samplerate, mp4ff_time_scale(mp4, i), mp4ff_get_track_duration(mp4, i));
- *duration = (float)tsamples / (*samplerate);
- trace ("mp4 duration: %f (tsamples %d/samplerate %d)\n", *duration, tsamples, *samplerate);
-
- NeAACDecClose (dec);
-
- if (totalsamples) {
- *totalsamples = tsamples;
- }
- if (mp4track) {
- *mp4track = i;
- }
- if (!*pmp4) {
- mp4ff_close (mp4);
- }
- return 0;
-error:
- NeAACDecClose (dec);
+static int
+mp4_track_get_info(mp4ff_t *mp4, int track, float *duration, int *samplerate, int *channels, int *totalsamples, int *mp4framesize) {
+ int sr = -1;
+ unsigned char* buff = 0;
+ unsigned int buff_size = 0;
+ mp4AudioSpecificConfig mp4ASC;
+ mp4ff_get_decoder_config(mp4, track, &buff, &buff_size);
+ if (buff) {
+ int rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
+ sr = mp4ASC.samplingFrequency;
+ if(rc < 0) {
free (buff);
- if (!*pmp4) {
- mp4ff_close (mp4);
- }
+ trace ("aac: AudioSpecificConfig returned result=%d\n", rc);
return -1;
}
- else {
- trace ("audio track not found\n");
- mp4ff_close (mp4);
- mp4 = NULL;
- }
- if (buff) {
- free (buff);
- buff = NULL;
- }
+ }
+
+ unsigned long srate;
+ unsigned char ch;
+ int samples;
+ // init mp4 decoding
+ NeAACDecHandle dec = NeAACDecOpen ();
+ if (NeAACDecInit2(dec, buff, buff_size, &srate, &ch) < 0) {
+ trace ("NeAACDecInit2 returned error\n");
+ goto error;
}
-#else
- MP4FileHandle mp4File = mp4;
- MP4TrackId trackId = MP4FindTrackId(mp4File, 0, "audio", 0);
- trace ("trackid: %d\n", trackId);
- uint32_t timeScale = MP4GetTrackTimeScale(mp4File, trackId);
- MP4Duration trackDuration = MP4GetTrackDuration(mp4File, trackId);
- MP4SampleId numSamples = MP4GetTrackNumberOfSamples(mp4File, trackId);
- u_int8_t* pConfig;
- uint32_t configSize = 0;
- bool res = MP4GetTrackESConfiguration(mp4File, trackId, &pConfig, &configSize);
- if (res && pConfig) {
- mp4AudioSpecificConfig mp4ASC;
- int rc = AudioSpecificConfig(pConfig, configSize, &mp4ASC);
- free (pConfig);
- if (rc >= 0) {
- *samplerate = mp4ASC.samplingFrequency;
- *channels = MP4GetTrackAudioChannels (mp4File, trackId);
-// int64_t duration = MP4ConvertFromTrackDuration (mp4File, trackId, trackDuration, timeScale);
- int samples = MP4GetTrackNumberOfSamples (mp4File, trackId) * 1024 * (*channels);
- trace ("mp4 nsamples=%d, timescale=%d, samplerate=%d\n", samples, timeScale, *samplerate);
- *duration = (float)samples / (*samplerate);
-
- if (totalsamples) {
- *totalsamples = samples;
- }
- if (mp4track) {
- *mp4track = trackId;
- }
- if (!*pmp4) {
- MP4Close (mp4);
- }
- return 0;
- }
+ *samplerate = srate;
+ *channels = ch;
+ samples = (int64_t)mp4ff_num_samples(mp4, track);
+
+ NeAACDecClose (dec);
+
+ int i_sample_count = mp4ff_num_samples (mp4, track);
+ int i_sample;
+
+ int64_t total_dur = 0;
+ for( i_sample = 0; i_sample < i_sample_count; i_sample++ )
+ {
+ total_dur += mp4ff_get_sample_duration (mp4, track, i_sample);
}
-#endif
- if (*pmp4) {
- *pmp4 = NULL;
+ if (totalsamples) {
+ *totalsamples = total_dur * (*samplerate) / mp4ff_time_scale (mp4, track);
+ *mp4framesize = (*totalsamples) / i_sample;
}
+ *duration = total_dur / (float)mp4ff_time_scale (mp4, track);
- if (mp4) {
-#if USE_MP4FF
- mp4ff_close (mp4);
-#else
- MP4Close (mp4);
-#endif
- mp4 = NULL;
+ return 0;
+error:
+ if (dec) {
+ NeAACDecClose (dec);
}
- trace ("mp4 track not found, looking for aac stream...\n");
+ free (buff);
+ return -1;
+}
+
+// returns -1 for error, 0 for aac
+int
+aac_probe (DB_FILE *fp, float *duration, int *samplerate, int *channels, int *totalsamples) {
- // not an mp4, try raw aac
-#if USE_MP4FF
deadbeef->rewind (fp);
-#endif
if (parse_aac_stream (fp, samplerate, channels, duration, totalsamples) == -1) {
trace ("aac stream not found\n");
return -1;
}
trace ("found aac stream\n");
- return 1;
+ return 0;
}
@@ -449,7 +295,9 @@ static int
aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
aac_info_t *info = (aac_info_t *)_info;
+ deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->file) {
return -1;
}
@@ -474,156 +322,67 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
}
info->mp4track = -1;
-#if USE_MP4FF
info->mp4reader.read = aac_fs_read;
info->mp4reader.write = NULL;
info->mp4reader.seek = aac_fs_seek;
info->mp4reader.truncate = NULL;
info->mp4reader.user_data = info;
-#else
- info->mp4reader.open = aac_fs_open;
- info->mp4reader.seek = aac_fs_seek;
- info->mp4reader.read = aac_fs_read;
- info->mp4reader.write = NULL;
- info->mp4reader.close = aac_fs_close;
-#endif
if (!info->file->vfs->is_streaming ()) {
-#ifdef USE_MP4FF
trace ("aac_init: mp4ff_open_read %s\n", deadbeef->pl_find_meta (it, ":URI"));
- info->mp4file = mp4ff_open_read (&info->mp4reader);
- if (info->mp4file) {
- int ntracks = mp4ff_total_tracks (info->mp4file);
- if (ntracks > 0) {
- trace ("m4a container detected, ntracks=%d\n", ntracks);
- int i = -1;
- unsigned char* buff = 0;
- unsigned int buff_size = 0;
- for (i = 0; i < ntracks; i++) {
- mp4AudioSpecificConfig mp4ASC;
- mp4ff_get_decoder_config (info->mp4file, i, &buff, &buff_size);
- if(buff){
- int rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
- if(rc < 0)
- continue;
- break;
- }
+ info->mp4 = mp4ff_open_read (&info->mp4reader);
+ if (info->mp4) {
+ int ntracks = mp4ff_total_tracks (info->mp4);
+ for (int i = 0; i < ntracks; i++) {
+ if (mp4ff_get_track_type (info->mp4, i) != TRACK_AUDIO) {
+ continue;
}
- trace ("mp4 probe-buffer size: %d\n", buff_size);
-
- if (i != ntracks && buff)
- {
- trace ("mp4 track: %d\n", i);
- int samples = mp4ff_num_samples(info->mp4file, i);
- info->mp4samples = samples;
+ int res = mp4_track_get_info (info->mp4, i, &duration, &samplerate, &channels, &totalsamples, &info->mp4framesize);
+ if (res >= 0 && duration > 0) {
info->mp4track = i;
-
- // init mp4 decoding
- info->dec = NeAACDecOpen ();
- unsigned long srate;
- unsigned char ch;
- if (NeAACDecInit2(info->dec, buff, buff_size, &srate, &ch) < 0) {
- trace ("NeAACDecInit2 returned error\n");
- free (buff);
- return -1;
- }
- samplerate = srate;
- channels = ch;
- samples = (int64_t)samples * srate / mp4ff_time_scale (info->mp4file, i);
- totalsamples = samples;
- NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (info->dec);
- conf->dontUpSampleImplicitSBR = 1;
- NeAACDecSetConfiguration (info->dec, conf);
- mp4AudioSpecificConfig mp4ASC;
- if (NeAACDecAudioSpecificConfig(buff, buff_size, &mp4ASC) >= 0)
- {
- info->mp4framesize = 1024;
- if (mp4ASC.frameLengthFlag == 1) {
- info->mp4framesize = 960;
- }
-// if (mp4ASC.sbr_present_flag == 1) {
-// info->mp4framesize *= 2;
-// }
- }
- totalsamples *= info->mp4framesize;
- duration = (float)totalsamples / samplerate;
- }
- else {
- mp4ff_close (info->mp4file);
- info->mp4file = NULL;
- }
- if (buff) {
- free (buff);
+ break;
}
}
- else {
- mp4ff_close (info->mp4file);
- info->mp4file = NULL;
- }
- }
-// {{{ libmp4v2 code
-#else
- trace ("aac_init: MP4ReadProvider %s\n", deadbeef->pl_find_meta (it, ":URI"));
- info->mp4file = MP4ReadProvider (deadbeef->pl_find_meta (it, ":URI"), 0, &info->mp4reader);
- info->mp4track = MP4FindTrackId(info->mp4file, 0, "audio", 0);
- trace ("aac_init: MP4FindTrackId returned %d\n", info->mp4track);
- if (info->mp4track >= 0) {
- info->timescale = MP4GetTrackTimeScale(info->mp4file, info->mp4track);
-
- u_int8_t* pConfig;
- uint32_t configSize = 0;
- bool res = MP4GetTrackESConfiguration(info->mp4file, info->mp4track, &pConfig, &configSize);
-
- mp4AudioSpecificConfig mp4ASC;
- int rc = AudioSpecificConfig(pConfig, configSize, &mp4ASC);
- if (rc >= 0) {
- _info->samplerate = mp4ASC.samplingFrequency;
- _info->channels = MP4GetTrackAudioChannels (info->mp4file, info->mp4track);
- totalsamples = MP4GetTrackNumberOfSamples (info->mp4file, info->mp4track) * 1024 * _info->channels;
+ trace ("track: %d\n", info->mp4track);
+ if (info->mp4track >= 0) {
+ // prepare decoder
+ int res = mp4_track_get_info (info->mp4, info->mp4track, &duration, &samplerate, &channels, &totalsamples, &info->mp4framesize);
+ if (res != 0) {
+ trace ("aac: mp4_track_get_info(%d) returned error\n", info->mp4track);
+ return -1;
+ }
// init mp4 decoding
+ info->mp4samples = mp4ff_num_samples(info->mp4, info->mp4track);
info->dec = NeAACDecOpen ();
unsigned long srate;
unsigned char ch;
- if (NeAACDecInit2(info->dec, pConfig, configSize, &srate, &ch) < 0) {
+ unsigned char* buff = 0;
+ unsigned int buff_size = 0;
+ mp4AudioSpecificConfig mp4ASC;
+ mp4ff_get_decoder_config (info->mp4, info->mp4track, &buff, &buff_size);
+ if (NeAACDecInit2(info->dec, buff, buff_size, &srate, &ch) < 0) {
trace ("NeAACDecInit2 returned error\n");
+ free (buff);
return -1;
}
- samplerate = srate;
- channels = ch;
- NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration (info->dec);
- conf->dontUpSampleImplicitSBR = 1;
- NeAACDecSetConfiguration (info->dec, conf);
- mp4AudioSpecificConfig mp4ASC;
- if (NeAACDecAudioSpecificConfig(pConfig, configSize, &mp4ASC) >= 0)
- {
- info->mp4framesize = 1024;
- if (mp4ASC.frameLengthFlag == 1) {
- info->mp4framesize = 960;
- }
-// if (mp4ASC.sbr_present_flag == 1) {
-// info->mp4framesize *= 2;
-// }
+
+ if (buff) {
+ free (buff);
}
- //totalsamples *= info->mp4framesize;
- free (pConfig);
- info->maxSampleSize = MP4GetTrackMaxSampleSize(info->mp4file, info->mp4track);
- info->samplebuffer = malloc (info->maxSampleSize);
- info->mp4sample = 1;
+ trace ("aac: successfully initialized track %d\n", info->mp4track);
+ _info->fmt.samplerate = samplerate;
+ _info->fmt.channels = channels;
}
else {
- MP4Close (info->mp4file);
- info->mp4file = NULL;
+ trace ("aac: track not found in mp4 container\n");
+ mp4ff_close (info->mp4);
+ info->mp4 = NULL;
}
}
- else {
- MP4Close (info->mp4file);
- info->mp4file = NULL;
- }
-#endif
-// }}}
- if (!info->mp4file) {
- trace ("mp4 track not found, looking for aac stream...\n");
+
+ if (!info->mp4) {
+ trace ("aac: looking for raw stream...\n");
if (info->junk >= 0) {
deadbeef->fseek (info->file, info->junk, SEEK_SET);
@@ -646,10 +405,10 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
deadbeef->rewind (info->file);
}
trace ("found aac stream (junk: %d, offs: %d)\n", info->junk, offs);
- }
- _info->fmt.channels = channels;
- _info->fmt.samplerate = samplerate;
+ _info->fmt.channels = channels;
+ _info->fmt.samplerate = samplerate;
+ }
}
else {
// sync before attempting to init
@@ -673,11 +432,8 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
_info->fmt.bps = 16;
_info->plugin = &plugin;
- if (!info->mp4file) {
- //trace ("NeAACDecGetCapabilities\n");
- //unsigned long caps = NeAACDecGetCapabilities();
-
- trace ("NeAACDecOpen\n");
+ if (!info->mp4) {
+ trace ("NeAACDecOpen for raw stream\n");
info->dec = NeAACDecOpen ();
trace ("prepare for NeAACDecInit: fread %d from offs %lld\n", AAC_BUFFER_SIZE, deadbeef->ftell (info->file));
@@ -721,7 +477,7 @@ aac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->endsample = totalsamples-1;
}
}
- trace ("totalsamples: %d, endsample: %d, samples-from-duration: %d\n", totalsamples-1, info->endsample, (int)deadbeef->pl_get_item_duration (it)*44100);
+ trace ("totalsamples: %d, endsample: %d, samples-from-duration: %d, samplerate %d, channels %d\n", totalsamples-1, info->endsample, (int)deadbeef->pl_get_item_duration (it)*44100, _info->fmt.samplerate, _info->fmt.channels);
for (int i = 0; i < _info->fmt.channels; i++) {
_info->fmt.channelmask |= 1 << i;
@@ -740,12 +496,8 @@ aac_free (DB_fileinfo_t *_info) {
if (info->file) {
deadbeef->fclose (info->file);
}
- if (info->mp4file) {
-#ifdef USE_MP4FF
- mp4ff_close (info->mp4file);
-#else
- MP4Close (info->mp4file);
-#endif
+ if (info->mp4) {
+ mp4ff_close (info->mp4);
}
if (info->dec) {
NeAACDecClose (info->dec);
@@ -877,37 +629,20 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
char *samples = NULL;
- if (info->mp4file) {
+ if (info->mp4) {
+ if (info->mp4sample >= info->mp4samples) {
+ trace ("aac: finished with the last mp4sample\n");
+ break;
+ }
+
unsigned char *buffer = NULL;
int buffer_size = 0;
-#ifdef USE_MP4FF
- int rc = mp4ff_read_sample (info->mp4file, info->mp4track, info->mp4sample, &buffer, &buffer_size);
+ int rc = mp4ff_read_sample (info->mp4, info->mp4track, info->mp4sample, &buffer, &buffer_size);
if (rc == 0) {
+ trace ("mp4ff_read_sample failed\n");
info->eof = 1;
break;
}
-#else
-
- buffer = info->samplebuffer;
- buffer_size = info->maxSampleSize;
- MP4Timestamp sampleTime;
- MP4Duration sampleDuration;
- MP4Duration sampleRenderingOffset;
- bool isSyncSample;
- MP4ReadSample (info->mp4file, info->mp4track, info->mp4sample, &buffer, &buffer_size, &sampleTime, &sampleDuration, &sampleRenderingOffset, &isSyncSample);
- // convert timestamp and duration from track time to milliseconds
- u_int64_t myTime = MP4ConvertFromTrackTimestamp (info->mp4file, info->mp4track,
- sampleTime, MP4_MSECS_TIME_SCALE);
-
- u_int64_t myDuration = MP4ConvertFromTrackDuration (info->mp4file, info->mp4track,
- sampleDuration, MP4_MSECS_TIME_SCALE);
-#endif
- if (info->mp4sample >= info->mp4samples) {
- if (buffer) {
- free (buffer);
- }
- break;
- }
info->mp4sample++;
samples = NeAACDecDecode(info->dec, &info->frame_info, buffer, buffer_size);
@@ -915,6 +650,7 @@ aac_read (DB_fileinfo_t *_info, char *bytes, int size) {
free (buffer);
}
if (!samples) {
+ trace ("aac: NeAACDecDecode returned NULL\n");
break;
}
}
@@ -1028,8 +764,8 @@ aac_seek_sample (DB_fileinfo_t *_info, int sample) {
aac_info_t *info = (aac_info_t *)_info;
sample += info->startsample;
- if (info->mp4file) {
- int scale = _info->fmt.samplerate / mp4ff_time_scale (info->mp4file, info->mp4track) * info->mp4framesize;
+ if (info->mp4) {
+ int scale = info->mp4framesize;
info->mp4sample = sample / scale;
info->skipsamples = sample - info->mp4sample * scale;
}
@@ -1060,7 +796,6 @@ aac_seek (DB_fileinfo_t *_info, float t) {
return aac_seek_sample (_info, t * _info->fmt.samplerate);
}
-#ifdef USE_MP4FF
static const char *metainfo[] = {
"artist", "artist",
"title", "title",
@@ -1091,36 +826,63 @@ int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value
void
aac_load_tags (DB_playItem_t *it, mp4ff_t *mp4) {
char *s = NULL;
- for (int i = 0; metainfo[i]; i += 2) {
- if (mp4ff_meta_find_by_name(mp4, metainfo[i], &s)) {
- deadbeef->pl_add_meta (it, metainfo[i+1], s);
- free (s);
+ int got_itunes_tags = 0;
+
+ int n = mp4ff_meta_get_num_items (mp4);
+ for (int t = 0; t < n; t++) {
+ char *key = NULL;
+ char *value = NULL;
+ int res = mp4ff_meta_get_by_index(mp4, t, &key, &value);
+ if (key && value) {
+ got_itunes_tags = 1;
+ if (strcasecmp (key, "cover")) {
+ if (!strcasecmp (key, "replaygain_track_gain")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKGAIN, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_album_gain")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMGAIN, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_track_peak")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_album_peak")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMPEAK, atof (value));
+ }
+ else {
+ int i;
+ for (i = 0; metainfo[i]; i += 2) {
+ if (!strcasecmp (metainfo[i], key)) {
+ deadbeef->pl_add_meta (it, metainfo[i+1], value);
+ break;
+ }
+ }
+ if (!metainfo[i]) {
+ deadbeef->pl_add_meta (it, key, value);
+ }
+ }
+ }
+ }
+ if (key) {
+ free (key);
+ }
+ if (value) {
+ free (value);
}
}
- if (mp4ff_meta_find_by_name(mp4, "replaygain_track_gain", &s)) {
- deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKGAIN, atof (s));
- free (s);
- }
- if (mp4ff_meta_find_by_name(mp4, "replaygain_track_peak", &s)) {
- deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (s));
- free (s);
- }
- if (mp4ff_meta_find_by_name(mp4, "replaygain_album_gain", &s)) {
- deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMGAIN, atof (s));
- free (s);
- }
- if (mp4ff_meta_find_by_name(mp4, "replaygain_album_peak", &s)) {
- deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMPEAK, atof (s));
- free (s);
+
+ if (got_itunes_tags) {
+ uint32_t f = deadbeef->pl_get_item_flags (it);
+ f |= DDB_TAG_ITUNES;
+ deadbeef->pl_set_item_flags (it, f);
}
}
-#endif
int
aac_read_metadata (DB_playItem_t *it) {
-#ifdef USE_MP4FF
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
@@ -1130,12 +892,23 @@ aac_read_metadata (DB_playItem_t *it) {
return -1;
}
+ aac_info_t inf;
+ memset (&inf, 0, sizeof (inf));
+ inf.file = fp;
+ inf.junk = deadbeef->junk_get_leading_size (fp);
+ if (inf.junk >= 0) {
+ deadbeef->fseek (inf.file, inf.junk, SEEK_SET);
+ }
+ else {
+ inf.junk = 0;
+ }
+
MP4FILE_CB cb = {
.read = aac_fs_read,
.write = NULL,
.seek = aac_fs_seek,
.truncate = NULL,
- .user_data = fp
+ .user_data = &inf
};
deadbeef->pl_delete_all_meta (it);
@@ -1144,100 +917,139 @@ aac_read_metadata (DB_playItem_t *it) {
if (mp4) {
aac_load_tags (it, mp4);
mp4ff_close (mp4);
- deadbeef->pl_add_meta (it, "title", NULL);
- }
- else {
- /*int apeerr = */deadbeef->junk_apev2_read (it, fp);
- /*int v2err = */deadbeef->junk_id3v2_read (it, fp);
- /*int v1err = */deadbeef->junk_id3v1_read (it, fp);
- deadbeef->pl_add_meta (it, "title", NULL);
}
+ /*int apeerr = */deadbeef->junk_apev2_read (it, fp);
+ /*int v2err = */deadbeef->junk_id3v2_read (it, fp);
+ /*int v1err = */deadbeef->junk_id3v1_read (it, fp);
deadbeef->fclose (fp);
-#endif
return 0;
}
-#ifdef USE_MP4FF
+typedef struct {
+ char *title;
+ int32_t startsample;
+ int32_t endsample;
+} aac_chapter_t;
+
+static aac_chapter_t *
+aac_load_itunes_chapters (mp4ff_t *mp4, /* out */ int *num_chapters, int samplerate) {
+ *num_chapters = 0;
+ int i_entry_count = mp4ff_chap_get_num_tracks (mp4);
+ int i_tracks = mp4ff_total_tracks (mp4);
+ int i, j;
+ for( i = 0; i < i_entry_count; i++ )
+ {
+ for( j = 0; j < i_tracks; j++ )
+ {
+ int32_t tt = mp4ff_get_track_type (mp4, j);
+ trace ("aac: i_tracks=%d found track id=%d type=%d (expected %d %d)\n", i_tracks, mp4ff_get_track_id (mp4, j), mp4ff_get_track_type (mp4, j), mp4ff_chap_get_track_id (mp4, i), TRACK_TEXT);
+ if(mp4ff_chap_get_track_id (mp4, i) == mp4ff_get_track_id (mp4, j) &&
+ mp4ff_get_track_type (mp4, j) == TRACK_TEXT) {
+ trace ("aac: found subt track\n");
+ break;
+ }
+ }
+ if( j < i_tracks )
+ {
+ int i_sample_count = mp4ff_num_samples (mp4, j);
+ int i_sample;
+
+ aac_chapter_t *chapters = malloc (sizeof (aac_chapter_t) * i_sample_count);
+ memset (chapters, 0, sizeof (aac_chapter_t) * i_sample_count);
+ *num_chapters = 0;
+
+ int64_t total_dur = 0;
+ int64_t curr_sample = 0;
+ for( i_sample = 0; i_sample < i_sample_count; i_sample++ )
+ {
#if 0
-static uint32_t
-mp4ff_read_cb (void *user_data, void *buffer, uint32_t length) {
-// trace ("aac_fs_read %d\n", length);
- FILE *fp = (FILE *)user_data;
- return fread (buffer, 1, length, fp);
-}
-static uint32_t
-mp4ff_seek_cb (void *user_data, uint64_t position) {
-// trace ("aac_fs_seek\n");
- FILE *fp = (FILE *)user_data;
- return fseek (fp, position, SEEK_SET);
-}
-static uint32_t
-mp4ff_write_cb(void *user_data, void *buffer, uint32_t length) {
- FILE *fp = (FILE *)user_data;
- return fwrite (buffer, 1, length, fp);
-}
+ const int64_t i_dts = mp4ff_get_track_dts (mp4, j, i_sample);
+ const int64_t i_pts_delta = mp4ff_get_track_pts_delta(mp4, j, i_sample);
+ trace ("i_dts = %lld, i_pts_delta = %lld\n", i_dts, i_pts_delta);
+ const unsigned int i_size = mp4ff_get_track_sample_size(mp4, j, i_sample);
+ if (i_size <= 0) {
+ continue;
+ }
-static uint32_t
-mp4ff_truncate_cb(void *user_data)
-{
- FILE *fp = (FILE *)user_data;
- ftruncate(fileno(fp), ftello(fp));
- return 0;
-}
+ int64_t i_time_offset = i_dts + max (i_pts_delta, 0);
#endif
+ int32_t dur = (int64_t)1000 * mp4ff_get_sample_duration (mp4, j, i_sample) / mp4ff_time_scale (mp4, j); // milliseconds
+ total_dur += dur;
+#if 0
+ trace ("dur: %d %f min // offs: %lld %f (from currsample: %f)\n", dur, dur / 1000.f / 60.f, i_time_offset, i_time_offset / 1000000.f / 60.f, curr_sample * 1000.f/ samplerate);
+#else
+ trace ("dur: %d %f min\n", dur, dur / 1000.f / 60.f);
#endif
+ unsigned char *buffer = NULL;
+ int buffer_size = 0;
-#ifdef USE_MP4FF
-#if 0
-static int
-aac_write_metadata (DB_playItem_t *it) {
- mp4ff_metadata_t md;
- memset (&md, 0, sizeof (md));
- deadbeef->pl_lock ();
- DB_metaInfo_t *meta = deadbeef->pl_get_metadata_head (it);
+ int rc = mp4ff_read_sample (mp4, j, i_sample, &buffer, &buffer_size);
- // find numtags 1st
- while (meta) {
- if (meta->key[0] != ':') {
- md.count++;
- }
- meta = meta->next;
- }
-
- // fill tags
- if (md.count) {
- md.tags = malloc (sizeof (mp4ff_tag_t) * md.count);
- int n = 0;
- meta = deadbeef->pl_get_metadata_head (it);
- while (meta) {
- if (meta->key[0] != ':') {
- md.tags[n].item = "";//(char *)meta->key;
- md.tags[n].value = (char *)meta->value;
- n++;
+ if (rc == 0 || !buffer) {
+ continue;
+ }
+ int len = (buffer[0] << 8) | buffer[1];
+ len = min (len, buffer_size - 2);
+ chapters[*num_chapters].title = strndup (&buffer[2], len);
+ chapters[*num_chapters].startsample = curr_sample;
+ curr_sample += (int64_t)dur * samplerate / 1000.f;
+ chapters[*num_chapters].endsample = curr_sample - 1;
+ trace ("aac: chapter %d: %s, s=%d e=%d\n", *num_chapters, chapters[*num_chapters].title, chapters[*num_chapters].startsample, chapters[*num_chapters].endsample);
+ if (buffer) {
+ free (buffer);
+ }
+ (*num_chapters)++;
}
- meta = meta->next;
+ trace ("aac: total dur: %lld (%f min)\n", total_dur, total_dur / 1000.f / 60.f);
+ return chapters;
}
}
+ return NULL;
+}
- mp4ff_callback_t f = {
- .read = mp4ff_read_cb,
- .write = mp4ff_write_cb,
- .seek = mp4ff_seek_cb,
- .truncate = mp4ff_truncate_cb,
- };
-
- FILE *fp = fopen (deadbeef->pl_find_meta (it, ":URI"), "w");
- f.user_data = fp;
+static DB_playItem_t *
+aac_insert_with_chapters (ddb_playlist_t *plt, DB_playItem_t *after, DB_playItem_t *origin, aac_chapter_t *chapters, int num_chapters, int totalsamples, int samplerate) {
+ deadbeef->pl_lock ();
+ DB_playItem_t *ins = after;
+ for (int i = 0; i < num_chapters; i++) {
+ const char *uri = deadbeef->pl_find_meta_raw (origin, ":URI");
+ const char *dec = deadbeef->pl_find_meta_raw (origin, ":DECODER");
+ const char *ftype= "MP4 AAC";//pl_find_meta_raw (origin, ":FILETYPE");
+
+ DB_playItem_t *it = deadbeef->pl_item_alloc_init (uri, dec);
+ deadbeef->pl_set_meta_int (it, ":TRACKNUM", i);
+ deadbeef->pl_set_meta_int (it, "TRACK", i);
+ deadbeef->pl_add_meta (it, "title", chapters[i].title);
+ it->startsample = chapters[i].startsample;
+ it->endsample = chapters[i].endsample;
+ deadbeef->pl_replace_meta (it, ":FILETYPE", ftype);
+ deadbeef->plt_set_item_duration (plt, it, (float)(it->endsample - it->startsample + 1) / samplerate);
+ after = deadbeef->plt_insert_item (plt, after, it);
+ deadbeef->pl_item_unref (it);
+ }
+ deadbeef->pl_item_ref (after);
+
+ DB_playItem_t *first = deadbeef->pl_get_next (ins, PL_MAIN);
+
+ if (!first) {
+ first = deadbeef->plt_get_first (plt, PL_MAIN);
+ }
- mp4ff_meta_update (&f, &md);
- if (md.tags) {
- free (md.tags);
+ if (!first) {
+ deadbeef->pl_unlock ();
+ return NULL;
}
+ trace ("aac: split by chapters success\n");
+ // copy metadata from embedded tags
+ uint32_t f = deadbeef->pl_get_item_flags (origin);
+ f |= DDB_IS_SUBTRACK;
+ deadbeef->pl_set_item_flags (origin, f);
+ deadbeef->pl_items_copy_junk (origin, first, after);
+ deadbeef->pl_item_unref (first);
+
deadbeef->pl_unlock ();
- return 0;
+ return after;
}
-#endif
-#endif
static DB_playItem_t *
aac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
@@ -1275,81 +1087,124 @@ aac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
// slowwww!
info.file = fp;
MP4FILE_CB cb = {
-#ifdef USE_MP4FF
.read = aac_fs_read,
.write = NULL,
.seek = aac_fs_seek,
.truncate = NULL,
.user_data = &info
-#else
- .open = aac_fs_open,
- .seek = aac_fs_seek,
- .read = aac_fs_read,
- .write = NULL,
- .close = aac_fs_close
-#endif
};
+ mp4ff_t *mp4 = mp4ff_open_read (&cb);
+ if (mp4) {
+ int ntracks = mp4ff_total_tracks (mp4);
+ trace ("aac: numtracks=%d\n", ntracks);
+ int i;
+ for (i = 0; i < ntracks; i++) {
+ if (mp4ff_get_track_type (mp4, i) != TRACK_AUDIO) {
+ trace ("aac: track %d is not audio\n");
+ continue;
+ }
+ int mp4framesize;
+ int res = mp4_track_get_info (mp4, i, &duration, &samplerate, &channels, &totalsamples, &mp4framesize);
+ if (res >= 0 && duration > 0) {
+ trace ("aac: found audio track %d (duration=%f, totalsamples=%d)\n", i, duration, totalsamples);
+
+ int num_chapters;
+ aac_chapter_t *chapters = NULL;
+ if (mp4ff_chap_get_num_tracks(mp4) > 0) {
+ chapters = aac_load_itunes_chapters (mp4, &num_chapters, samplerate);
+ }
- int res = aac_probe (fp, fname, &cb, &duration, &samplerate, &channels, &totalsamples, &mp4track, &mp4);
- if (res == -1) {
- deadbeef->fclose (fp);
- return NULL;
- }
- else if (res == 0) {
- ftype = "MP4 AAC";
- }
- else if (res == 1) {
- ftype = "RAW AAC";
+ DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id);
+ ftype = "MP4 AAC";
+ deadbeef->pl_add_meta (it, ":FILETYPE", ftype);
+ deadbeef->pl_set_meta_int (it, ":TRACKNUM", i);
+ deadbeef->plt_set_item_duration (plt, it, duration);
+ aac_load_tags (it, mp4);
+ int apeerr = deadbeef->junk_apev2_read (it, fp);
+ int v2err = deadbeef->junk_id3v2_read (it, fp);
+ int v1err = deadbeef->junk_id3v1_read (it, fp);
+
+ int64_t fsize = deadbeef->fgetlength (fp);
+
+ char s[100];
+ snprintf (s, sizeof (s), "%lld", fsize);
+ deadbeef->pl_add_meta (it, ":FILE_SIZE", s);
+ deadbeef->pl_add_meta (it, ":BPS", "16");
+ snprintf (s, sizeof (s), "%d", channels);
+ deadbeef->pl_add_meta (it, ":CHANNELS", s);
+ snprintf (s, sizeof (s), "%d", samplerate);
+ deadbeef->pl_add_meta (it, ":SAMPLERATE", s);
+ int br = (int)roundf(fsize / duration * 8 / 1000);
+ snprintf (s, sizeof (s), "%d", br);
+ deadbeef->pl_add_meta (it, ":BITRATE", s);
+
+ // embedded chapters
+ deadbeef->pl_lock (); // FIXME: is it needed?
+ if (chapters && num_chapters > 0) {
+ DB_playItem_t *cue = aac_insert_with_chapters (plt, after, it, chapters, num_chapters, totalsamples, samplerate);
+ for (int n = 0; n < num_chapters; n++) {
+ if (chapters[n].title) {
+ free (chapters[n].title);
+ }
+ }
+ free (chapters);
+ if (cue) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (cue);
+ deadbeef->pl_unlock ();
+ return cue;
+ }
+ }
+
+ // embedded cue
+ const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
+ DB_playItem_t *cue = NULL;
+
+ if (cuesheet) {
+ cue = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), totalsamples, samplerate);
+ if (cue) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (cue);
+ deadbeef->pl_unlock ();
+ return cue;
+ }
+ }
+ deadbeef->pl_unlock ();
+
+ cue = deadbeef->plt_insert_cue (plt, after, it, totalsamples, samplerate);
+ if (cue) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (cue);
+ return cue;
+ }
+
+ after = deadbeef->plt_insert_item (plt, after, it);
+ deadbeef->pl_item_unref (it);
+ break;
+ }
+ }
+ mp4ff_close (mp4);
+ if (i < ntracks) {
+ return after;
+ }
}
}
-
+ trace ("aac: mp4 container failed, trying raw aac\n");
+ int res = aac_probe (fp, &duration, &samplerate, &channels, &totalsamples);
+ if (res == -1) {
+ deadbeef->fclose (fp);
+ return NULL;
+ }
+ ftype = "RAW AAC";
DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id);
deadbeef->pl_add_meta (it, ":FILETYPE", ftype);
deadbeef->plt_set_item_duration (plt, it, duration);
trace ("duration: %f sec\n", duration);
// read tags
- if (mp4) {
-#ifdef USE_MP4FF
- aac_load_tags (it, mp4);
- mp4ff_close (mp4);
-#else
- const MP4Tags *tags = MP4TagsAlloc ();
- MP4TagsFetch (tags, mp4);
-
- deadbeef->pl_add_meta (it, "title", tags->name);
- deadbeef->pl_add_meta (it, "artist", tags->artist);
- deadbeef->pl_add_meta (it, "albumArtist", tags->albumArtist);
- deadbeef->pl_add_meta (it, "album", tags->album);
- deadbeef->pl_add_meta (it, "composer", tags->composer);
- deadbeef->pl_add_meta (it, "comments", tags->comments);
- deadbeef->pl_add_meta (it, "genre", tags->genre);
- deadbeef->pl_add_meta (it, "year", tags->releaseDate);
- char s[10];
- if (tags->track) {
- snprintf (s, sizeof (s), "%d", tags->track->index);
- deadbeef->pl_add_meta (it, "track", s);
- snprintf (s, sizeof (s), "%d", tags->track->total);
- deadbeef->pl_add_meta (it, "numtracks", s);
- }
- if (tags->disk) {
- snprintf (s, sizeof (s), "%d", tags->disk->index);
- deadbeef->pl_add_meta (it, "disc", s);
- snprintf (s, sizeof (s), "%d", tags->disk->total);
- deadbeef->pl_add_meta (it, "numdiscs", s);
- }
- deadbeef->pl_add_meta (it, "copyright", tags->copyright);
- deadbeef->pl_add_meta (it, "vendor", tags->encodedBy);
- deadbeef->pl_add_meta (it, "title", NULL);
- MP4TagsFree (tags);
- MP4Close (mp4);
-#endif
- }
-
int apeerr = deadbeef->junk_apev2_read (it, fp);
int v2err = deadbeef->junk_id3v2_read (it, fp);
int v1err = deadbeef->junk_id3v1_read (it, fp);
- deadbeef->pl_add_meta (it, "title", NULL);
int64_t fsize = deadbeef->fgetlength (fp);
@@ -1391,14 +1246,13 @@ aac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
}
}
- deadbeef->pl_add_meta (it, "title", NULL);
-
after = deadbeef->plt_insert_item (plt, after, it);
deadbeef->pl_item_unref (it);
+
return after;
}
-static const char * exts[] = { "aac", "mp4", "m4a", NULL };
+static const char * exts[] = { "aac", "mp4", "m4a", "m4b", NULL };
// define plugin interface
static DB_decoder_t plugin = {
@@ -1438,11 +1292,6 @@ static DB_decoder_t plugin = {
.seek_sample = aac_seek_sample,
.insert = aac_insert,
.read_metadata = aac_read_metadata,
-#ifdef USE_MP4FF
- // mp4ff metadata writer doesn't work
- // .write_metadata = aac_write_metadata,
-#else
-#endif
.exts = exts,
};
diff --git a/plugins/adplug/adplug-db.cpp b/plugins/adplug/adplug-db.cpp
index 6e6242e6..a3e0c322 100644
--- a/plugins/adplug/adplug-db.cpp
+++ b/plugins/adplug/adplug-db.cpp
@@ -108,7 +108,9 @@ adplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->opl = new CKemuopl (samplerate, bps == 16, channels == 2);
}
}
+ deadbeef->pl_lock ();
info->decoder = CAdPlug::factory (deadbeef->pl_find_meta (it, ":URI"), info->opl, CAdPlug::players);
+ deadbeef->pl_unlock ();
if (!info->decoder) {
trace ("adplug: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
diff --git a/plugins/adplug/adplug/adl.cpp b/plugins/adplug/adplug/adl.cpp
index 1dd95ea8..6febbf87 100644
--- a/plugins/adplug/adplug/adl.cpp
+++ b/plugins/adplug/adplug/adl.cpp
@@ -2402,7 +2402,7 @@ bool CadlPlayer::load(const char *filename, const CFileProvider &fp)
// _soundFileLoaded = file;
// find last subsong
- for(int i = 199; i >= 0; i--) {
+ for(int i = 119; i >= 0; i--) {
if(_trackEntries[i] != 0xff) {
numsubsongs = i + 1;
break;
diff --git a/plugins/alac/Makefile.am b/plugins/alac/Makefile.am
new file mode 100644
index 00000000..0dc48ade
--- /dev/null
+++ b/plugins/alac/Makefile.am
@@ -0,0 +1,22 @@
+if HAVE_ALAC
+alacdir = $(libdir)/$(PACKAGE)
+pkglib_LTLIBRARIES = alac.la
+alac_la_SOURCES = alac_plugin.c\
+alac.c decomp.h demux.c demux.h stream.c stream.h\
+../libmp4ff/mp4atom.c\
+../libmp4ff/mp4ff.c\
+../libmp4ff/mp4meta.c\
+../libmp4ff/mp4sample.c\
+../libmp4ff/mp4tagupdate.c\
+../libmp4ff/mp4util.c\
+../libmp4ff/mp4ff.h\
+../libmp4ff/mp4ffint.h\
+../libmp4ff/mp4ff_int_types.h
+
+alac_la_LDFLAGS = -module
+
+alac_la_LIBADD = $(LDADD) $(FAAD2_LIBS)
+AM_CFLAGS = $(CFLAGS) -std=c99 -DUSE_MP4FF -DUSE_TAGGING -I../libmp4ff
+endif
+
+
diff --git a/plugins/alac/README b/plugins/alac/README
new file mode 100644
index 00000000..1b304d2d
--- /dev/null
+++ b/plugins/alac/README
@@ -0,0 +1,43 @@
+INSTALLATION:
+-------------
+
+Simply compile by running 'make'
+
+USAGE:
+------
+
+Then run the program, it will give you usage instructions.
+
+It's really quite trivial to use.
+
+For example, to decode input.m4a to output.wav:
+./alac -f output.wav input.m4a
+
+Or, as another example, say if you wanted to stream play
+http://www.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a
+and you're system uses the ALSA sound system:
+wget -O - http://www.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a | ./alac - | aplay
+
+By default the output file is in WAV format. To output as raw PCM, provide the
+-r option on the command line.
+
+MORE INFORMATION:
+-----------------
+
+Please visit http://crazney.net/programs/itunes/alac.html for more information.
+
+HELP NEEDED:
+------------
+I need help to allow myself to continue hacking on various Apple Audio things, please visit
+http://crazney.net/programs/itunes/help.html
+
+AUTHOR:
+-------
+
+David Hammerton
+
+CONTRIBUTORS:
+-------------
+
+Cody Brocious
+
diff --git a/plugins/alac/alac.c b/plugins/alac/alac.c
new file mode 100644
index 00000000..1779eb67
--- /dev/null
+++ b/plugins/alac/alac.c
@@ -0,0 +1,1198 @@
+/*
+ * ALAC (Apple Lossless Audio Codec) decoder
+ * Copyright (c) 2005 David Hammerton
+ * All rights reserved.
+ *
+ * This is the actual decoder.
+ *
+ * http://crazney.net/programs/itunes/alac.html
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef _WIN32
+ #include "stdint_win.h"
+#else
+ #include <stdint.h>
+#endif
+
+#include "decomp.h"
+
+#define _Swap32(v) do { \
+ v = (((v) & 0x000000FF) << 0x18) | \
+ (((v) & 0x0000FF00) << 0x08) | \
+ (((v) & 0x00FF0000) >> 0x08) | \
+ (((v) & 0xFF000000) >> 0x18); } while(0)
+
+#define _Swap16(v) do { \
+ v = (((v) & 0x00FF) << 0x08) | \
+ (((v) & 0xFF00) >> 0x08); } while (0)
+
+struct {signed int x:24;} se_struct_24;
+#define SignExtend24(val) (se_struct_24.x = val)
+
+extern int host_bigendian;
+
+struct alac_file
+{
+ unsigned char *input_buffer;
+ int input_buffer_bitaccumulator; /* used so we can do arbitary
+ bit reads */
+
+ int samplesize;
+ int numchannels;
+ int bytespersample;
+
+
+ /* buffers */
+ int32_t *predicterror_buffer_a;
+ int32_t *predicterror_buffer_b;
+
+ int32_t *outputsamples_buffer_a;
+ int32_t *outputsamples_buffer_b;
+
+ int32_t *uncompressed_bytes_buffer_a;
+ int32_t *uncompressed_bytes_buffer_b;
+
+
+
+ /* stuff from setinfo */
+ uint32_t setinfo_max_samples_per_frame; /* 0x1000 = 4096 */ /* max samples per frame? */
+ uint8_t setinfo_7a; /* 0x00 */
+ uint8_t setinfo_sample_size; /* 0x10 */
+ uint8_t setinfo_rice_historymult; /* 0x28 */
+ uint8_t setinfo_rice_initialhistory; /* 0x0a */
+ uint8_t setinfo_rice_kmodifier; /* 0x0e */
+ uint8_t setinfo_7f; /* 0x02 */
+ uint16_t setinfo_80; /* 0x00ff */
+ uint32_t setinfo_82; /* 0x000020e7 */ /* max sample size?? */
+ uint32_t setinfo_86; /* 0x00069fe4 */ /* bit rate (avarge)?? */
+ uint32_t setinfo_8a_rate; /* 0x0000ac44 */
+ /* end setinfo stuff */
+
+};
+
+
+static void allocate_buffers(alac_file *alac)
+{
+ alac->predicterror_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4);
+ alac->predicterror_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4);
+
+ alac->outputsamples_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4);
+ alac->outputsamples_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4);
+
+ alac->uncompressed_bytes_buffer_a = malloc(alac->setinfo_max_samples_per_frame * 4);
+ alac->uncompressed_bytes_buffer_b = malloc(alac->setinfo_max_samples_per_frame * 4);
+}
+
+void alac_set_info(alac_file *alac, char *inputbuffer)
+{
+ char *ptr = inputbuffer;
+ ptr += 4; /* size */
+ ptr += 4; /* frma */
+ ptr += 4; /* alac */
+ ptr += 4; /* size */
+ ptr += 4; /* alac */
+
+ ptr += 4; /* 0 ? */
+
+ alac->setinfo_max_samples_per_frame = *(uint32_t*)ptr; /* buffer size / 2 ? */
+ if (!host_bigendian)
+ _Swap32(alac->setinfo_max_samples_per_frame);
+ ptr += 4;
+ alac->setinfo_7a = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_sample_size = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_rice_historymult = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_rice_initialhistory = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_rice_kmodifier = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_7f = *(uint8_t*)ptr;
+ ptr += 1;
+ alac->setinfo_80 = *(uint16_t*)ptr;
+ if (!host_bigendian)
+ _Swap16(alac->setinfo_80);
+ ptr += 2;
+ alac->setinfo_82 = *(uint32_t*)ptr;
+ if (!host_bigendian)
+ _Swap32(alac->setinfo_82);
+ ptr += 4;
+ alac->setinfo_86 = *(uint32_t*)ptr;
+ if (!host_bigendian)
+ _Swap32(alac->setinfo_86);
+ ptr += 4;
+ alac->setinfo_8a_rate = *(uint32_t*)ptr;
+ if (!host_bigendian)
+ _Swap32(alac->setinfo_8a_rate);
+
+ ptr += 4;
+
+ allocate_buffers(alac);
+
+}
+
+int
+alac_get_samplerate(alac_file *alac) {
+ return alac->setinfo_8a_rate;
+}
+
+/* stream reading */
+
+/* supports reading 1 to 16 bits, in big endian format */
+static uint32_t readbits_16(alac_file *alac, int bits)
+{
+ uint32_t result;
+ int new_accumulator;
+
+ result = (alac->input_buffer[0] << 16) |
+ (alac->input_buffer[1] << 8) |
+ (alac->input_buffer[2]);
+
+ /* shift left by the number of bits we've already read,
+ * so that the top 'n' bits of the 24 bits we read will
+ * be the return bits */
+ result = result << alac->input_buffer_bitaccumulator;
+
+ result = result & 0x00ffffff;
+
+ /* and then only want the top 'n' bits from that, where
+ * n is 'bits' */
+ result = result >> (24 - bits);
+
+ new_accumulator = (alac->input_buffer_bitaccumulator + bits);
+
+ /* increase the buffer pointer if we've read over n bytes. */
+ alac->input_buffer += (new_accumulator >> 3);
+
+ /* and the remainder goes back into the bit accumulator */
+ alac->input_buffer_bitaccumulator = (new_accumulator & 7);
+
+ return result;
+}
+
+/* supports reading 1 to 32 bits, in big endian format */
+static uint32_t readbits(alac_file *alac, int bits)
+{
+ int32_t result = 0;
+
+ if (bits > 16)
+ {
+ bits -= 16;
+ result = readbits_16(alac, 16) << bits;
+ }
+
+ result |= readbits_16(alac, bits);
+
+ return result;
+}
+
+/* reads a single bit */
+static int readbit(alac_file *alac)
+{
+ int result;
+ int new_accumulator;
+
+ result = alac->input_buffer[0];
+
+ result = result << alac->input_buffer_bitaccumulator;
+
+ result = result >> 7 & 1;
+
+ new_accumulator = (alac->input_buffer_bitaccumulator + 1);
+
+ alac->input_buffer += (new_accumulator / 8);
+
+ alac->input_buffer_bitaccumulator = (new_accumulator % 8);
+
+ return result;
+}
+
+static void unreadbits(alac_file *alac, int bits)
+{
+ int new_accumulator = (alac->input_buffer_bitaccumulator - bits);
+
+ alac->input_buffer += (new_accumulator >> 3);
+
+ alac->input_buffer_bitaccumulator = (new_accumulator & 7);
+ if (alac->input_buffer_bitaccumulator < 0)
+ alac->input_buffer_bitaccumulator *= -1;
+}
+
+/* various implementations of count_leading_zero:
+ * the first one is the original one, the simplest and most
+ * obvious for what it's doing. never use this.
+ * then there are the asm ones. fill in as necessary
+ * and finally an unrolled and optimised c version
+ * to fall back to
+ */
+#if 0
+/* hideously inefficient. could use a bitmask search,
+ * alternatively bsr on x86,
+ */
+static int count_leading_zeros(int32_t input)
+{
+ int i = 0;
+ while (!(0x80000000 & input) && i < 32)
+ {
+ i++;
+ input = input << 1;
+ }
+ return i;
+}
+#elif defined(__GNUC__) && (defined(_X86) || defined(__i386) || defined(i386))
+/* for some reason the unrolled version (below) is
+ * actually faster than this. yay intel!
+ */
+static int count_leading_zeros(int input)
+{
+ int output = 0;
+ if (!input) return 32;
+ __asm("bsr %1, %0\n"
+ : "=r" (output)
+ : "r" (input));
+ return (0x1f - output);
+}
+#elif defined(_MSC_VER) && defined(_M_IX86)
+static int count_leading_zeros(int input)
+{
+ int output = 0;
+ if (!input) return 32;
+ __asm
+ {
+ mov eax, input;
+ mov edx, 0x1f;
+ bsr ecx, eax;
+ sub edx, ecx;
+ mov output, edx;
+ }
+ return output;
+}
+#elif defined(__GNUC__)
+static int count_leading_zeros(int input)
+{
+ return __builtin_clz(input);
+}
+#else
+#warning using generic count leading zeroes. You may wish to write one for your CPU / compiler
+static int count_leading_zeros(int input)
+{
+ int output = 0;
+ int curbyte = 0;
+
+ curbyte = input >> 24;
+ if (curbyte) goto found;
+ output += 8;
+
+ curbyte = input >> 16;
+ if (curbyte & 0xff) goto found;
+ output += 8;
+
+ curbyte = input >> 8;
+ if (curbyte & 0xff) goto found;
+ output += 8;
+
+ curbyte = input;
+ if (curbyte & 0xff) goto found;
+ output += 8;
+
+ return output;
+
+found:
+ if (!(curbyte & 0xf0))
+ {
+ output += 4;
+ }
+ else
+ curbyte >>= 4;
+
+ if (curbyte & 0x8)
+ return output;
+ if (curbyte & 0x4)
+ return output + 1;
+ if (curbyte & 0x2)
+ return output + 2;
+ if (curbyte & 0x1)
+ return output + 3;
+
+ /* shouldn't get here: */
+ return output + 4;
+}
+#endif
+
+#define RICE_THRESHOLD 8 // maximum number of bits for a rice prefix.
+
+int32_t entropy_decode_value(alac_file* alac,
+ int readSampleSize,
+ int k,
+ int rice_kmodifier_mask)
+{
+ int32_t x = 0; // decoded value
+
+ // read x, number of 1s before 0 represent the rice value.
+ while (x <= RICE_THRESHOLD && readbit(alac))
+ {
+ x++;
+ }
+
+ if (x > RICE_THRESHOLD)
+ {
+ // read the number from the bit stream (raw value)
+ int32_t value;
+
+ value = readbits(alac, readSampleSize);
+
+ // mask value
+ value &= (((uint32_t)0xffffffff) >> (32 - readSampleSize));
+
+ x = value;
+ }
+ else
+ {
+ if (k != 1)
+ {
+ int extraBits = readbits(alac, k);
+
+ // x = x * (2^k - 1)
+ x *= (((1 << k) - 1) & rice_kmodifier_mask);
+
+ if (extraBits > 1)
+ x += extraBits - 1;
+ else
+ unreadbits(alac, 1);
+ }
+ }
+
+ return x;
+}
+
+void entropy_rice_decode(alac_file* alac,
+ int32_t* outputBuffer,
+ int outputSize,
+ int readSampleSize,
+ int rice_initialhistory,
+ int rice_kmodifier,
+ int rice_historymult,
+ int rice_kmodifier_mask)
+{
+ int outputCount;
+ int history = rice_initialhistory;
+ int signModifier = 0;
+
+ for (outputCount = 0; outputCount < outputSize; outputCount++)
+ {
+ int32_t decodedValue;
+ int32_t finalValue;
+ int32_t k;
+
+ k = 31 - rice_kmodifier - count_leading_zeros((history >> 9) + 3);
+
+ if (k < 0) k += rice_kmodifier;
+ else k = rice_kmodifier;
+
+ // note: don't use rice_kmodifier_mask here (set mask to 0xFFFFFFFF)
+ decodedValue = entropy_decode_value(alac, readSampleSize, k, 0xFFFFFFFF);
+
+ decodedValue += signModifier;
+ finalValue = (decodedValue + 1) / 2; // inc by 1 and shift out sign bit
+ if (decodedValue & 1) // the sign is stored in the low bit
+ finalValue *= -1;
+
+ outputBuffer[outputCount] = finalValue;
+
+ signModifier = 0;
+
+ // update history
+ history += (decodedValue * rice_historymult)
+ - ((history * rice_historymult) >> 9);
+
+ if (decodedValue > 0xFFFF)
+ history = 0xFFFF;
+
+ // special case, for compressed blocks of 0
+ if ((history < 128) && (outputCount + 1 < outputSize))
+ {
+ int32_t blockSize;
+
+ signModifier = 1;
+
+ k = count_leading_zeros(history) + ((history + 16) / 64) - 24;
+
+ // note: blockSize is always 16bit
+ blockSize = entropy_decode_value(alac, 16, k, rice_kmodifier_mask);
+
+ // got blockSize 0s
+ if (blockSize > 0)
+ {
+ memset(&outputBuffer[outputCount + 1], 0, blockSize * sizeof(*outputBuffer));
+ outputCount += blockSize;
+ }
+
+ if (blockSize > 0xFFFF)
+ signModifier = 0;
+
+ history = 0;
+ }
+ }
+}
+
+#define SIGN_EXTENDED32(val, bits) ((val << (32 - bits)) >> (32 - bits))
+
+#define SIGN_ONLY(v) \
+ ((v < 0) ? (-1) : \
+ ((v > 0) ? (1) : \
+ (0)))
+
+static void predictor_decompress_fir_adapt(int32_t *error_buffer,
+ int32_t *buffer_out,
+ int output_size,
+ int readsamplesize,
+ int16_t *predictor_coef_table,
+ int predictor_coef_num,
+ int predictor_quantitization)
+{
+ int i;
+
+ /* first sample always copies */
+ *buffer_out = *error_buffer;
+
+ if (!predictor_coef_num)
+ {
+ if (output_size <= 1) return;
+ memcpy(buffer_out+1, error_buffer+1, (output_size-1) * 4);
+ return;
+ }
+
+ if (predictor_coef_num == 0x1f) /* 11111 - max value of predictor_coef_num */
+ { /* second-best case scenario for fir decompression,
+ * error describes a small difference from the previous sample only
+ */
+ if (output_size <= 1) return;
+ for (i = 0; i < output_size - 1; i++)
+ {
+ int32_t prev_value;
+ int32_t error_value;
+
+ prev_value = buffer_out[i];
+ error_value = error_buffer[i+1];
+ buffer_out[i+1] = SIGN_EXTENDED32((prev_value + error_value), readsamplesize);
+ }
+ return;
+ }
+
+ /* read warm-up samples */
+ if (predictor_coef_num > 0)
+ {
+ int i;
+ for (i = 0; i < predictor_coef_num; i++)
+ {
+ int32_t val;
+
+ val = buffer_out[i] + error_buffer[i+1];
+
+ val = SIGN_EXTENDED32(val, readsamplesize);
+
+ buffer_out[i+1] = val;
+ }
+ }
+
+#if 0
+ /* 4 and 8 are very common cases (the only ones i've seen). these
+ * should be unrolled and optimised
+ */
+ if (predictor_coef_num == 4)
+ {
+ /* FIXME: optimised general case */
+ return;
+ }
+
+ if (predictor_coef_table == 8)
+ {
+ /* FIXME: optimised general case */
+ return;
+ }
+#endif
+
+
+ /* general case */
+ if (predictor_coef_num > 0)
+ {
+ for (i = predictor_coef_num + 1;
+ i < output_size;
+ i++)
+ {
+ int j;
+ int sum = 0;
+ int outval;
+ int error_val = error_buffer[i];
+
+ for (j = 0; j < predictor_coef_num; j++)
+ {
+ sum += (buffer_out[predictor_coef_num-j] - buffer_out[0]) *
+ predictor_coef_table[j];
+ }
+
+ outval = (1 << (predictor_quantitization-1)) + sum;
+ outval = outval >> predictor_quantitization;
+ outval = outval + buffer_out[0] + error_val;
+ outval = SIGN_EXTENDED32(outval, readsamplesize);
+
+ buffer_out[predictor_coef_num+1] = outval;
+
+ if (error_val > 0)
+ {
+ int predictor_num = predictor_coef_num - 1;
+
+ while (predictor_num >= 0 && error_val > 0)
+ {
+ int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
+ int sign = SIGN_ONLY(val);
+
+ predictor_coef_table[predictor_num] -= sign;
+
+ val *= sign; /* absolute value */
+
+ error_val -= ((val >> predictor_quantitization) *
+ (predictor_coef_num - predictor_num));
+
+ predictor_num--;
+ }
+ }
+ else if (error_val < 0)
+ {
+ int predictor_num = predictor_coef_num - 1;
+
+ while (predictor_num >= 0 && error_val < 0)
+ {
+ int val = buffer_out[0] - buffer_out[predictor_coef_num - predictor_num];
+ int sign = - SIGN_ONLY(val);
+
+ predictor_coef_table[predictor_num] -= sign;
+
+ val *= sign; /* neg value */
+
+ error_val -= ((val >> predictor_quantitization) *
+ (predictor_coef_num - predictor_num));
+
+ predictor_num--;
+ }
+ }
+
+ buffer_out++;
+ }
+ }
+}
+
+void deinterlace_16(int32_t *buffer_a, int32_t *buffer_b,
+ int16_t *buffer_out,
+ int numchannels, int numsamples,
+ uint8_t interlacing_shift,
+ uint8_t interlacing_leftweight)
+{
+ int i;
+ if (numsamples <= 0) return;
+
+ /* weighted interlacing */
+ if (interlacing_leftweight)
+ {
+ for (i = 0; i < numsamples; i++)
+ {
+ int32_t difference, midright;
+ int16_t left;
+ int16_t right;
+
+ midright = buffer_a[i];
+ difference = buffer_b[i];
+
+
+ right = midright - ((difference * interlacing_leftweight) >> interlacing_shift);
+ left = right + difference;
+
+ /* output is always little endian */
+ if (host_bigendian)
+ {
+ _Swap16(left);
+ _Swap16(right);
+ }
+
+ buffer_out[i*numchannels] = left;
+ buffer_out[i*numchannels + 1] = right;
+ }
+
+ return;
+ }
+
+ /* otherwise basic interlacing took place */
+ for (i = 0; i < numsamples; i++)
+ {
+ int16_t left, right;
+
+ left = buffer_a[i];
+ right = buffer_b[i];
+
+ /* output is always little endian */
+ if (host_bigendian)
+ {
+ _Swap16(left);
+ _Swap16(right);
+ }
+
+ buffer_out[i*numchannels] = left;
+ buffer_out[i*numchannels + 1] = right;
+ }
+}
+
+void deinterlace_24(int32_t *buffer_a, int32_t *buffer_b,
+ int uncompressed_bytes,
+ int32_t *uncompressed_bytes_buffer_a, int32_t *uncompressed_bytes_buffer_b,
+ void *buffer_out,
+ int numchannels, int numsamples,
+ uint8_t interlacing_shift,
+ uint8_t interlacing_leftweight)
+{
+ int i;
+ if (numsamples <= 0) return;
+
+ /* weighted interlacing */
+ if (interlacing_leftweight)
+ {
+ for (i = 0; i < numsamples; i++)
+ {
+ int32_t difference, midright;
+ int32_t left;
+ int32_t right;
+
+ midright = buffer_a[i];
+ difference = buffer_b[i];
+
+ right = midright - ((difference * interlacing_leftweight) >> interlacing_shift);
+ left = right + difference;
+
+ if (uncompressed_bytes)
+ {
+ uint32_t mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8));
+ left <<= (uncompressed_bytes * 8);
+ right <<= (uncompressed_bytes * 8);
+
+ left |= uncompressed_bytes_buffer_a[i] & mask;
+ right |= uncompressed_bytes_buffer_b[i] & mask;
+ }
+
+ ((uint8_t*)buffer_out)[i * numchannels * 3] = (left) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 1] = (left >> 8) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 2] = (left >> 16) & 0xFF;
+
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 3] = (right) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 4] = (right >> 8) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 5] = (right >> 16) & 0xFF;
+ }
+
+ return;
+ }
+
+ /* otherwise basic interlacing took place */
+ for (i = 0; i < numsamples; i++)
+ {
+ int32_t left, right;
+
+ left = buffer_a[i];
+ right = buffer_b[i];
+
+ if (uncompressed_bytes)
+ {
+ uint32_t mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8));
+ left <<= (uncompressed_bytes * 8);
+ right <<= (uncompressed_bytes * 8);
+
+ left |= uncompressed_bytes_buffer_a[i] & mask;
+ right |= uncompressed_bytes_buffer_b[i] & mask;
+ }
+
+ ((uint8_t*)buffer_out)[i * numchannels * 3] = (left) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 1] = (left >> 8) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 2] = (left >> 16) & 0xFF;
+
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 3] = (right) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 4] = (right >> 8) & 0xFF;
+ ((uint8_t*)buffer_out)[i * numchannels * 3 + 5] = (right >> 16) & 0xFF;
+
+ }
+
+}
+
+void decode_frame(alac_file *alac,
+ unsigned char *inbuffer,
+ void *outbuffer, int *outputsize)
+{
+ int channels;
+ int32_t outputsamples = alac->setinfo_max_samples_per_frame;
+
+ /* setup the stream */
+ alac->input_buffer = inbuffer;
+ alac->input_buffer_bitaccumulator = 0;
+
+ channels = readbits(alac, 3);
+
+ *outputsize = outputsamples * alac->bytespersample;
+
+ switch(channels)
+ {
+ case 0: /* 1 channel */
+ {
+ int hassize;
+ int isnotcompressed;
+ int readsamplesize;
+
+ int uncompressed_bytes;
+ int ricemodifier;
+
+ /* 2^result = something to do with output waiting.
+ * perhaps matters if we read > 1 frame in a pass?
+ */
+ readbits(alac, 4);
+
+ readbits(alac, 12); /* unknown, skip 12 bits */
+
+ hassize = readbits(alac, 1); /* the output sample size is stored soon */
+
+ uncompressed_bytes = readbits(alac, 2); /* number of bytes in the (compressed) stream that are not compressed */
+
+ isnotcompressed = readbits(alac, 1); /* whether the frame is compressed */
+
+ if (hassize)
+ {
+ /* now read the number of samples,
+ * as a 32bit integer */
+ outputsamples = readbits(alac, 32);
+ *outputsize = outputsamples * alac->bytespersample;
+ }
+
+ readsamplesize = alac->setinfo_sample_size - (uncompressed_bytes * 8);
+
+ if (!isnotcompressed)
+ { /* so it is compressed */
+ int16_t predictor_coef_table[32];
+ int predictor_coef_num;
+ int prediction_type;
+ int prediction_quantitization;
+ int i;
+
+ /* skip 16 bits, not sure what they are. seem to be used in
+ * two channel case */
+ readbits(alac, 8);
+ readbits(alac, 8);
+
+ prediction_type = readbits(alac, 4);
+ prediction_quantitization = readbits(alac, 4);
+
+ ricemodifier = readbits(alac, 3);
+ predictor_coef_num = readbits(alac, 5);
+
+ /* read the predictor table */
+ for (i = 0; i < predictor_coef_num; i++)
+ {
+ predictor_coef_table[i] = (int16_t)readbits(alac, 16);
+ }
+
+ if (uncompressed_bytes)
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ alac->uncompressed_bytes_buffer_a[i] = readbits(alac, uncompressed_bytes * 8);
+ }
+ }
+
+ entropy_rice_decode(alac,
+ alac->predicterror_buffer_a,
+ outputsamples,
+ readsamplesize,
+ alac->setinfo_rice_initialhistory,
+ alac->setinfo_rice_kmodifier,
+ ricemodifier * alac->setinfo_rice_historymult / 4,
+ (1 << alac->setinfo_rice_kmodifier) - 1);
+
+ if (prediction_type == 0)
+ { /* adaptive fir */
+ predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
+ alac->outputsamples_buffer_a,
+ outputsamples,
+ readsamplesize,
+ predictor_coef_table,
+ predictor_coef_num,
+ prediction_quantitization);
+ }
+ else
+ {
+ fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type);
+ /* i think the only other prediction type (or perhaps this is just a
+ * boolean?) runs adaptive fir twice.. like:
+ * predictor_decompress_fir_adapt(predictor_error, tempout, ...)
+ * predictor_decompress_fir_adapt(predictor_error, outputsamples ...)
+ * little strange..
+ */
+ }
+
+ }
+ else
+ { /* not compressed, easy case */
+ if (alac->setinfo_sample_size <= 16)
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int32_t audiobits = readbits(alac, alac->setinfo_sample_size);
+
+ audiobits = SIGN_EXTENDED32(audiobits, alac->setinfo_sample_size);
+
+ alac->outputsamples_buffer_a[i] = audiobits;
+ }
+ }
+ else
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int32_t audiobits;
+
+ audiobits = readbits(alac, 16);
+ /* special case of sign extension..
+ * as we'll be ORing the low 16bits into this */
+ audiobits = audiobits << (alac->setinfo_sample_size - 16);
+ audiobits |= readbits(alac, alac->setinfo_sample_size - 16);
+ audiobits = SignExtend24(audiobits);
+
+ alac->outputsamples_buffer_a[i] = audiobits;
+ }
+ }
+ uncompressed_bytes = 0; // always 0 for uncompressed
+ }
+
+ switch(alac->setinfo_sample_size)
+ {
+ case 16:
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int16_t sample = alac->outputsamples_buffer_a[i];
+ if (host_bigendian)
+ _Swap16(sample);
+ ((int16_t*)outbuffer)[i * alac->numchannels] = sample;
+ }
+ break;
+ }
+ case 24:
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int32_t sample = alac->outputsamples_buffer_a[i];
+
+ if (uncompressed_bytes)
+ {
+ uint32_t mask;
+ sample = sample << (uncompressed_bytes * 8);
+ mask = ~(0xFFFFFFFF << (uncompressed_bytes * 8));
+ sample |= alac->uncompressed_bytes_buffer_a[i] & mask;
+ }
+
+ ((uint8_t*)outbuffer)[i * alac->numchannels * 3] = (sample) & 0xFF;
+ ((uint8_t*)outbuffer)[i * alac->numchannels * 3 + 1] = (sample >> 8) & 0xFF;
+ ((uint8_t*)outbuffer)[i * alac->numchannels * 3 + 2] = (sample >> 16) & 0xFF;
+ }
+ break;
+ }
+ case 20:
+ case 32:
+ fprintf(stderr, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case 1: /* 2 channels */
+ {
+ int hassize;
+ int isnotcompressed;
+ int readsamplesize;
+
+ int uncompressed_bytes;
+
+ uint8_t interlacing_shift;
+ uint8_t interlacing_leftweight;
+
+ /* 2^result = something to do with output waiting.
+ * perhaps matters if we read > 1 frame in a pass?
+ */
+ readbits(alac, 4);
+
+ readbits(alac, 12); /* unknown, skip 12 bits */
+
+ hassize = readbits(alac, 1); /* the output sample size is stored soon */
+
+ uncompressed_bytes = readbits(alac, 2); /* the number of bytes in the (compressed) stream that are not compressed */
+
+ isnotcompressed = readbits(alac, 1); /* whether the frame is compressed */
+
+ if (hassize)
+ {
+ /* now read the number of samples,
+ * as a 32bit integer */
+ outputsamples = readbits(alac, 32);
+ *outputsize = outputsamples * alac->bytespersample;
+ }
+
+ readsamplesize = alac->setinfo_sample_size - (uncompressed_bytes * 8) + 1;
+
+ if (!isnotcompressed)
+ { /* compressed */
+ int16_t predictor_coef_table_a[32];
+ int predictor_coef_num_a;
+ int prediction_type_a;
+ int prediction_quantitization_a;
+ int ricemodifier_a;
+
+ int16_t predictor_coef_table_b[32];
+ int predictor_coef_num_b;
+ int prediction_type_b;
+ int prediction_quantitization_b;
+ int ricemodifier_b;
+
+ int i;
+
+ interlacing_shift = readbits(alac, 8);
+ interlacing_leftweight = readbits(alac, 8);
+
+ /******** channel 1 ***********/
+ prediction_type_a = readbits(alac, 4);
+ prediction_quantitization_a = readbits(alac, 4);
+
+ ricemodifier_a = readbits(alac, 3);
+ predictor_coef_num_a = readbits(alac, 5);
+
+ /* read the predictor table */
+ for (i = 0; i < predictor_coef_num_a; i++)
+ {
+ predictor_coef_table_a[i] = (int16_t)readbits(alac, 16);
+ }
+
+ /******** channel 2 *********/
+ prediction_type_b = readbits(alac, 4);
+ prediction_quantitization_b = readbits(alac, 4);
+
+ ricemodifier_b = readbits(alac, 3);
+ predictor_coef_num_b = readbits(alac, 5);
+
+ /* read the predictor table */
+ for (i = 0; i < predictor_coef_num_b; i++)
+ {
+ predictor_coef_table_b[i] = (int16_t)readbits(alac, 16);
+ }
+
+ /*********************/
+ if (uncompressed_bytes)
+ { /* see mono case */
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ alac->uncompressed_bytes_buffer_a[i] = readbits(alac, uncompressed_bytes * 8);
+ alac->uncompressed_bytes_buffer_b[i] = readbits(alac, uncompressed_bytes * 8);
+ }
+ }
+
+ /* channel 1 */
+ entropy_rice_decode(alac,
+ alac->predicterror_buffer_a,
+ outputsamples,
+ readsamplesize,
+ alac->setinfo_rice_initialhistory,
+ alac->setinfo_rice_kmodifier,
+ ricemodifier_a * alac->setinfo_rice_historymult / 4,
+ (1 << alac->setinfo_rice_kmodifier) - 1);
+
+ if (prediction_type_a == 0)
+ { /* adaptive fir */
+ predictor_decompress_fir_adapt(alac->predicterror_buffer_a,
+ alac->outputsamples_buffer_a,
+ outputsamples,
+ readsamplesize,
+ predictor_coef_table_a,
+ predictor_coef_num_a,
+ prediction_quantitization_a);
+ }
+ else
+ { /* see mono case */
+ fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type_a);
+ }
+
+ /* channel 2 */
+ entropy_rice_decode(alac,
+ alac->predicterror_buffer_b,
+ outputsamples,
+ readsamplesize,
+ alac->setinfo_rice_initialhistory,
+ alac->setinfo_rice_kmodifier,
+ ricemodifier_b * alac->setinfo_rice_historymult / 4,
+ (1 << alac->setinfo_rice_kmodifier) - 1);
+
+ if (prediction_type_b == 0)
+ { /* adaptive fir */
+ predictor_decompress_fir_adapt(alac->predicterror_buffer_b,
+ alac->outputsamples_buffer_b,
+ outputsamples,
+ readsamplesize,
+ predictor_coef_table_b,
+ predictor_coef_num_b,
+ prediction_quantitization_b);
+ }
+ else
+ {
+ fprintf(stderr, "FIXME: unhandled predicition type: %i\n", prediction_type_b);
+ }
+ }
+ else
+ { /* not compressed, easy case */
+ if (alac->setinfo_sample_size <= 16)
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int32_t audiobits_a, audiobits_b;
+
+ audiobits_a = readbits(alac, alac->setinfo_sample_size);
+ audiobits_b = readbits(alac, alac->setinfo_sample_size);
+
+ audiobits_a = SIGN_EXTENDED32(audiobits_a, alac->setinfo_sample_size);
+ audiobits_b = SIGN_EXTENDED32(audiobits_b, alac->setinfo_sample_size);
+
+ alac->outputsamples_buffer_a[i] = audiobits_a;
+ alac->outputsamples_buffer_b[i] = audiobits_b;
+ }
+ }
+ else
+ {
+ int i;
+ for (i = 0; i < outputsamples; i++)
+ {
+ int32_t audiobits_a, audiobits_b;
+
+ audiobits_a = readbits(alac, 16);
+ audiobits_a = audiobits_a << (alac->setinfo_sample_size - 16);
+ audiobits_a |= readbits(alac, alac->setinfo_sample_size - 16);
+ audiobits_a = SignExtend24(audiobits_a);
+
+ audiobits_b = readbits(alac, 16);
+ audiobits_b = audiobits_b << (alac->setinfo_sample_size - 16);
+ audiobits_b |= readbits(alac, alac->setinfo_sample_size - 16);
+ audiobits_b = SignExtend24(audiobits_b);
+
+ alac->outputsamples_buffer_a[i] = audiobits_a;
+ alac->outputsamples_buffer_b[i] = audiobits_b;
+ }
+ }
+ uncompressed_bytes = 0; // always 0 for uncompressed
+ interlacing_shift = 0;
+ interlacing_leftweight = 0;
+ }
+
+ switch(alac->setinfo_sample_size)
+ {
+ case 16:
+ {
+ deinterlace_16(alac->outputsamples_buffer_a,
+ alac->outputsamples_buffer_b,
+ (int16_t*)outbuffer,
+ alac->numchannels,
+ outputsamples,
+ interlacing_shift,
+ interlacing_leftweight);
+ break;
+ }
+ case 24:
+ {
+ deinterlace_24(alac->outputsamples_buffer_a,
+ alac->outputsamples_buffer_b,
+ uncompressed_bytes,
+ alac->uncompressed_bytes_buffer_a,
+ alac->uncompressed_bytes_buffer_b,
+ (int16_t*)outbuffer,
+ alac->numchannels,
+ outputsamples,
+ interlacing_shift,
+ interlacing_leftweight);
+ break;
+ }
+ case 20:
+ case 32:
+ fprintf(stderr, "FIXME: unimplemented sample size %i\n", alac->setinfo_sample_size);
+ break;
+ default:
+ break;
+ }
+
+ break;
+ }
+ }
+}
+
+alac_file *create_alac(int samplesize, int numchannels)
+{
+ alac_file *newfile = malloc(sizeof(alac_file));
+ memset (newfile, 0, sizeof (alac_file));
+
+ newfile->samplesize = samplesize;
+ newfile->numchannels = numchannels;
+ newfile->bytespersample = (samplesize / 8) * numchannels;
+
+ return newfile;
+}
+
+void alac_file_free (alac_file *alac) {
+ if (alac->predicterror_buffer_a) {
+ free (alac->predicterror_buffer_a);
+ }
+ if (alac->predicterror_buffer_b) {
+ free (alac->predicterror_buffer_b);
+ }
+ if (alac->outputsamples_buffer_a) {
+ free (alac->outputsamples_buffer_a);
+ }
+ if (alac->outputsamples_buffer_b) {
+ free (alac->outputsamples_buffer_b);
+ }
+ if (alac->uncompressed_bytes_buffer_a) {
+ free (alac->uncompressed_bytes_buffer_a);
+ }
+ if (alac->uncompressed_bytes_buffer_b) {
+ free (alac->uncompressed_bytes_buffer_b);
+ }
+ free (alac);
+}
+
diff --git a/plugins/alac/alac_plugin.c b/plugins/alac/alac_plugin.c
new file mode 100644
index 00000000..25f45d1e
--- /dev/null
+++ b/plugins/alac/alac_plugin.c
@@ -0,0 +1,663 @@
+/*
+ ALAC plugin for deadbeef
+ Copyright (C) 2012 Alexey Yakovenko <waker@users.sourceforge.net>
+ Uses the reverse engineered ALAC decoder (C) 2005 David Hammerton
+ All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+ */
+#include "../../deadbeef.h"
+#ifdef HAVE_CONFIG_H
+#include "../../config.h"
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "mp4ff.h"
+#include "demux.h"
+#include "decomp.h"
+#include "stream.h"
+
+#define min(x,y) ((x)<(y)?(x):(y))
+#define max(x,y) ((x)>(y)?(x):(y))
+
+//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+#define trace(fmt,...)
+
+static DB_decoder_t plugin;
+DB_functions_t *deadbeef;
+
+#ifdef WORDS_BIGENDIAN
+int host_bigendian = 1;
+#else
+int host_bigendian = 0;
+#endif
+
+#define BUFFER_SIZE (1024*24)
+#define IN_BUFFER_SIZE (1024*80)
+
+typedef struct {
+ DB_fileinfo_t info;
+ DB_FILE *file;
+ demux_res_t demux_res;
+ stream_t *stream;
+ alac_file *alac;
+ int junk;
+ char out_buffer[BUFFER_SIZE];
+ int out_remaining;
+ int skipsamples;
+ int currentsample;
+ int startsample;
+ int endsample;
+ int current_frame;
+ int64_t dataoffs;
+} alacplug_info_t;
+
+// allocate codec control structure
+static DB_fileinfo_t *
+alacplug_open (uint32_t hints) {
+ DB_fileinfo_t *_info = malloc (sizeof (alacplug_info_t));
+ alacplug_info_t *info = (alacplug_info_t *)_info;
+ memset (info, 0, sizeof (alacplug_info_t));
+ return _info;
+}
+
+static uint32_t
+alacplug_fs_read (void *user_data, void *buffer, uint32_t length) {
+ alacplug_info_t *info = user_data;
+ return deadbeef->fread (buffer, 1, length, info->file);
+}
+
+static uint32_t
+alacplug_fs_seek (void *user_data, uint64_t position) {
+ alacplug_info_t *info = user_data;
+ return deadbeef->fseek (info->file, position+info->junk, SEEK_SET);
+}
+
+static int
+get_sample_info(demux_res_t *demux_res, uint32_t samplenum,
+ uint32_t *sample_duration,
+ uint32_t *sample_byte_size)
+{
+ unsigned int duration_index_accum = 0;
+ unsigned int duration_cur_index = 0;
+
+ if (samplenum >= demux_res->num_sample_byte_sizes)
+ {
+ fprintf(stderr, "sample %i does not exist\n", samplenum);
+ return 0;
+ }
+
+ if (!demux_res->num_time_to_samples)
+ {
+ fprintf(stderr, "no time to samples\n");
+ return 0;
+ }
+ while ((demux_res->time_to_sample[duration_cur_index].sample_count + duration_index_accum)
+ <= samplenum)
+ {
+ duration_index_accum += demux_res->time_to_sample[duration_cur_index].sample_count;
+ duration_cur_index++;
+ if (duration_cur_index >= demux_res->num_time_to_samples)
+ {
+ fprintf(stderr, "sample %i does not have a duration\n", samplenum);
+ return 0;
+ }
+ }
+
+ *sample_duration = demux_res->time_to_sample[duration_cur_index].sample_duration;
+ *sample_byte_size = demux_res->sample_byte_size[samplenum];
+
+ return 1;
+}
+
+static int
+alacplug_get_totalsamples (demux_res_t *demux_res) {
+ int totalsamples = 0;
+ for (int i = 0; i < demux_res->num_sample_byte_sizes; i++)
+ {
+ unsigned int thissample_duration = 0;
+ unsigned int thissample_bytesize = 0;
+
+ get_sample_info(demux_res, i, &thissample_duration,
+ &thissample_bytesize);
+
+ totalsamples += thissample_duration;
+ }
+ return totalsamples;
+}
+
+static int
+alacplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
+ alacplug_info_t *info = (alacplug_info_t *)_info;
+
+ deadbeef->pl_lock ();
+ info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
+ if (!info->file) {
+ return -1;
+ }
+
+ info->stream = stream_create_file (info->file, 1, info->junk);
+
+ if (!qtmovie_read(info->stream, &info->demux_res)) {
+ if (!info->demux_res.format_read || info->demux_res.format != MAKEFOURCC('a','l','a','c')) {
+ return -1;
+ }
+ }
+ info->dataoffs = deadbeef->ftell (info->file);
+
+ info->alac = create_alac(info->demux_res.sample_size, info->demux_res.num_channels);
+ alac_set_info(info->alac, info->demux_res.codecdata);
+ info->demux_res.sample_rate = alac_get_samplerate (info->alac);
+
+ int totalsamples = alacplug_get_totalsamples (&info->demux_res);
+ if (!info->file->vfs->is_streaming ()) {
+ if (it->endsample > 0) {
+ info->startsample = it->startsample;
+ info->endsample = it->endsample;
+ plugin.seek_sample (_info, 0);
+ }
+ else {
+ info->startsample = 0;
+ info->endsample = totalsamples-1;
+ }
+ }
+
+ _info->plugin = &plugin;
+ _info->fmt.bps = info->demux_res.sample_size;
+ _info->fmt.channels = info->demux_res.num_channels;
+ _info->fmt.samplerate = info->demux_res.sample_rate;
+ for (int i = 0; i < _info->fmt.channels; i++) {
+ _info->fmt.channelmask |= 1 << i;
+ }
+
+ return 0;
+}
+
+static void
+alacplug_free (DB_fileinfo_t *_info) {
+ alacplug_info_t *info = (alacplug_info_t *)_info;
+ if (info) {
+ if (info->file) {
+ deadbeef->fclose (info->file);
+ }
+ if (info->stream) {
+ stream_destroy (info->stream);
+ }
+ qtmovie_free_demux (&info->demux_res);
+ if (info->alac) {
+ alac_file_free (info->alac);
+ }
+ free (info);
+ }
+}
+
+static int
+alacplug_read (DB_fileinfo_t *_info, char *bytes, int size) {
+ alacplug_info_t *info = (alacplug_info_t *)_info;
+ int samplesize = _info->fmt.channels * _info->fmt.bps / 8;
+ if (!info->file->vfs->is_streaming ()) {
+ if (info->currentsample + size / samplesize > info->endsample) {
+ size = (info->endsample - info->currentsample + 1) * samplesize;
+ if (size <= 0) {
+ trace ("alacplug_read: eof (current=%d, total=%d)\n", info->currentsample, info->endsample);
+ return 0;
+ }
+ }
+ }
+ int initsize = size;
+ while (size > 0) {
+ // handle seeking
+ if (info->skipsamples > 0 && info->out_remaining > 0) {
+ int skip = min (info->out_remaining, info->skipsamples);
+ if (skip < info->out_remaining) {
+ memmove (info->out_buffer, info->out_buffer + skip * samplesize, (info->out_remaining - skip) * samplesize);
+ }
+ info->out_remaining -= skip;
+ info->skipsamples -= skip;
+ }
+ if (info->out_remaining > 0) {
+ int n = size / samplesize;
+ n = min (info->out_remaining, n);
+
+ char *src = info->out_buffer;
+ memcpy (bytes, src, n * samplesize);
+ bytes += n * samplesize;
+ src += n * samplesize;
+ size -= n * samplesize;
+
+ if (n == info->out_remaining) {
+ info->out_remaining = 0;
+ }
+ else {
+ memmove (info->out_buffer, src, (info->out_remaining - n) * samplesize);
+ info->out_remaining -= n;
+ }
+ continue;
+ }
+
+ // decode next frame
+ if (info->current_frame == info->demux_res.num_sample_byte_sizes) {
+ break; // end of file
+ }
+
+ uint32_t sample_duration;
+ uint32_t sample_byte_size;
+
+ int outputBytes;
+
+ /* just get one sample for now */
+ if (!get_sample_info(&info->demux_res, info->current_frame,
+ &sample_duration, &sample_byte_size))
+ {
+ fprintf(stderr, "alac: sample failed\n");
+ break;
+ }
+
+ if (IN_BUFFER_SIZE < sample_byte_size)
+ {
+ fprintf(stderr, "alac: buffer too small! (is %i want %i)\n",
+ IN_BUFFER_SIZE,
+ sample_byte_size);
+ break;
+ }
+
+ char buffer[IN_BUFFER_SIZE];
+ stream_read(info->stream, sample_byte_size, buffer);
+
+ outputBytes = BUFFER_SIZE;
+ decode_frame(info->alac, buffer, info->out_buffer, &outputBytes);
+ info->current_frame++;
+
+ info->out_remaining += outputBytes / samplesize;
+ }
+
+ info->currentsample += (initsize-size) / samplesize;
+ return initsize-size;
+}
+
+static int
+alacplug_seek_sample (DB_fileinfo_t *_info, int sample) {
+ alacplug_info_t *info = (alacplug_info_t *)_info;
+
+ sample += info->startsample;
+
+ int totalsamples = 0;
+ int64_t seekpos = 0;
+ int i;
+ for (i = 0; i < info->demux_res.num_sample_byte_sizes; i++)
+ {
+ unsigned int thissample_duration = 0;
+ unsigned int thissample_bytesize = 0;
+
+ get_sample_info(&info->demux_res, i, &thissample_duration,
+ &thissample_bytesize);
+
+ if (totalsamples + thissample_duration > sample) {
+ info->skipsamples = sample - totalsamples;
+ break;
+ }
+ totalsamples += thissample_duration;
+ seekpos += info->demux_res.sample_byte_size[i];
+ }
+
+ if (i == info->demux_res.num_sample_byte_sizes) {
+ return -1;
+ }
+
+
+ deadbeef->fseek(info->file, info->dataoffs + seekpos, SEEK_SET);
+
+ info->current_frame = i;
+ info->out_remaining = 0;
+ info->currentsample = sample;
+ _info->readpos = (float)(info->currentsample - info->startsample) / _info->fmt.samplerate;
+ return 0;
+}
+
+static int
+alacplug_seek (DB_fileinfo_t *_info, float t) {
+ return alacplug_seek_sample (_info, t * _info->fmt.samplerate);
+}
+
+static const char *metainfo[] = {
+ "artist", "artist",
+ "title", "title",
+ "album", "album",
+ "track", "track",
+ "date", "year",
+ "genre", "genre",
+ "comment", "comment",
+ "performer", "performer",
+ "album_artist", "band",
+ "writer", "composer",
+ "vendor", "vendor",
+ "disc", "disc",
+ "compilation", "compilation",
+ "totaldiscs", "numdiscs",
+ "copyright", "copyright",
+ "totaltracks", "numtracks",
+ "tool", "tool",
+ NULL
+};
+
+
+/* find a metadata item by name */
+/* returns 0 if item found, 1 if no such item */
+int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value);
+
+
+void
+alacplug_load_tags (DB_playItem_t *it, mp4ff_t *mp4) {
+ char *s = NULL;
+ int got_itunes_tags = 0;
+
+ int n = mp4ff_meta_get_num_items (mp4);
+ for (int t = 0; t < n; t++) {
+ char *key = NULL;
+ char *value = NULL;
+ int res = mp4ff_meta_get_by_index(mp4, t, &key, &value);
+ if (key && value) {
+ got_itunes_tags = 1;
+ if (strcasecmp (key, "cover")) {
+ if (!strcasecmp (key, "replaygain_track_gain")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKGAIN, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_album_gain")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMGAIN, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_track_peak")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_TRACKPEAK, atof (value));
+ }
+ else if (!strcasecmp (key, "replaygain_album_peak")) {
+ deadbeef->pl_set_item_replaygain (it, DDB_REPLAYGAIN_ALBUMPEAK, atof (value));
+ }
+ else {
+ int i;
+ for (i = 0; metainfo[i]; i += 2) {
+ if (!strcasecmp (metainfo[i], key)) {
+ deadbeef->pl_add_meta (it, metainfo[i+1], value);
+ break;
+ }
+ }
+ if (!metainfo[i]) {
+ deadbeef->pl_add_meta (it, key, value);
+ }
+ }
+ }
+ }
+ if (key) {
+ free (key);
+ }
+ if (value) {
+ free (value);
+ }
+ }
+
+ if (got_itunes_tags) {
+ uint32_t f = deadbeef->pl_get_item_flags (it);
+ f |= DDB_TAG_ITUNES;
+ deadbeef->pl_set_item_flags (it, f);
+ }
+}
+
+int
+alacplug_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
+ DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
+ if (!fp) {
+ return -1;
+ }
+
+ if (fp->vfs->is_streaming ()) {
+ deadbeef->fclose (fp);
+ return -1;
+ }
+
+ alacplug_info_t inf;
+ memset (&inf, 0, sizeof (inf));
+ inf.file = fp;
+ inf.junk = deadbeef->junk_get_leading_size (fp);
+ if (inf.junk >= 0) {
+ deadbeef->fseek (inf.file, inf.junk, SEEK_SET);
+ }
+ else {
+ inf.junk = 0;
+ }
+
+ mp4ff_callback_t cb = {
+ .read = alacplug_fs_read,
+ .write = NULL,
+ .seek = alacplug_fs_seek,
+ .truncate = NULL,
+ .user_data = &inf
+ };
+
+ deadbeef->pl_delete_all_meta (it);
+
+ mp4ff_t *mp4 = mp4ff_open_read (&cb);
+ if (mp4) {
+ alacplug_load_tags (it, mp4);
+ mp4ff_close (mp4);
+ }
+ /*int apeerr = */deadbeef->junk_apev2_read (it, fp);
+ /*int v2err = */deadbeef->junk_id3v2_read (it, fp);
+ /*int v1err = */deadbeef->junk_id3v1_read (it, fp);
+ deadbeef->fclose (fp);
+ return 0;
+}
+
+static DB_playItem_t *
+alacplug_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
+ trace ("adding %s\n", fname);
+ mp4ff_t *mp4 = NULL;
+ DB_playItem_t *it = NULL;
+ demux_res_t demux_res;
+ memset (&demux_res, 0, sizeof (demux_res));
+ stream_t *stream;
+ DB_FILE *fp = deadbeef->fopen (fname);
+ if (!fp) {
+ trace ("not found\n");
+ return NULL;
+ }
+ alacplug_info_t info = {0};
+ info.file = fp;
+ info.junk = deadbeef->junk_get_leading_size (fp);
+ if (info.junk >= 0) {
+ trace ("junk: %d\n", info.junk);
+ deadbeef->fseek (fp, info.junk, SEEK_SET);
+ }
+ else {
+ info.junk = 0;
+ }
+
+ float duration = -1;
+
+ stream = stream_create_file (fp, 1, info.junk);
+ if (!stream) {
+ trace ("alac: stream_create_file failed\n");
+ goto error;
+ }
+
+ if (!qtmovie_read(stream, &demux_res)) {
+ if (!demux_res.format_read || demux_res.format != MAKEFOURCC('a','l','a','c')) {
+ trace ("alac track not found in the file %s, expected atom %X got %X\n", fname, MAKEFOURCC('a','l','a','c'), demux_res.format);
+ goto error;
+ }
+ }
+
+ alac_file *alac = create_alac(demux_res.sample_size, demux_res.num_channels);
+ alac_set_info(alac, demux_res.codecdata);
+ demux_res.sample_rate = alac_get_samplerate (alac);
+ alac_file_free (alac);
+
+ it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id);
+ deadbeef->pl_add_meta (it, ":FILETYPE", "ALAC");
+
+ int totalsamples = alacplug_get_totalsamples (&demux_res);
+ duration = totalsamples / (float)demux_res.sample_rate;
+
+ deadbeef->plt_set_item_duration (plt, it, duration);
+
+ // read tags
+ mp4ff_callback_t cb = {
+ .read = alacplug_fs_read,
+ .write = NULL,
+ .seek = alacplug_fs_seek,
+ .truncate = NULL,
+ .user_data = &info
+ };
+ deadbeef->fseek (fp, info.junk, SEEK_SET);
+ mp4 = mp4ff_open_read (&cb);
+ if (mp4) {
+ alacplug_load_tags (it, mp4);
+ }
+
+ int apeerr = deadbeef->junk_apev2_read (it, fp);
+ int v2err = deadbeef->junk_id3v2_read (it, fp);
+ int v1err = deadbeef->junk_id3v1_read (it, fp);
+
+ int64_t fsize = deadbeef->fgetlength (fp);
+
+ deadbeef->fclose (fp);
+ fp = NULL;
+ stream_destroy (stream);
+ stream = NULL;
+ if (mp4) {
+ mp4ff_close (mp4);
+ mp4 = NULL;
+ }
+ int samplerate = demux_res.sample_rate;
+ int bps = demux_res.sample_size;
+ int channels = demux_res.num_channels;
+
+ qtmovie_free_demux (&demux_res);
+
+ trace ("duration %f\n", duration);
+ if (duration > 0) {
+ char s[100];
+ snprintf (s, sizeof (s), "%lld", fsize);
+ deadbeef->pl_add_meta (it, ":FILE_SIZE", s);
+ snprintf (s, sizeof (s), "%d", bps);
+ deadbeef->pl_add_meta (it, ":BPS", s);
+ snprintf (s, sizeof (s), "%d", channels);
+ deadbeef->pl_add_meta (it, ":CHANNELS", s);
+ snprintf (s, sizeof (s), "%d", samplerate);
+ deadbeef->pl_add_meta (it, ":SAMPLERATE", s);
+ int br = (int)roundf(fsize / duration * 8 / 1000);
+ snprintf (s, sizeof (s), "%d", br);
+ deadbeef->pl_add_meta (it, ":BITRATE", s);
+ // embedded cue
+ deadbeef->pl_lock ();
+ const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
+ DB_playItem_t *cue = NULL;
+
+ if (cuesheet) {
+ cue = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), totalsamples, samplerate);
+ if (cue) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (cue);
+ deadbeef->pl_unlock ();
+ return cue;
+ }
+ }
+ deadbeef->pl_unlock ();
+
+ cue = deadbeef->plt_insert_cue (plt, after, it, totalsamples, samplerate);
+ if (cue) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (cue);
+ return cue;
+ }
+ }
+
+ trace ("success\n");
+success:
+ after = deadbeef->plt_insert_item (plt, after, it);
+ deadbeef->pl_item_unref (it);
+error:
+ if (fp) {
+ deadbeef->fclose (fp);
+ }
+ if (mp4) {
+ mp4ff_close (mp4);
+ }
+ qtmovie_free_demux (&demux_res);
+ return it;
+}
+
+static const char * exts[] = { "mp4", "m4a", NULL };
+
+// define plugin interface
+static DB_decoder_t plugin = {
+ .plugin.api_vmajor = 1,
+ .plugin.api_vminor = 0,
+ .plugin.version_major = 1,
+ .plugin.version_minor = 0,
+ .plugin.type = DB_PLUGIN_DECODER,
+ .plugin.id = "alac",
+ .plugin.name = "ALAC player",
+ .plugin.descr = "plays alac files from MP4 and M4A files",
+ .plugin.copyright =
+ "ALAC plugin for deadbeef\n"
+ "Copyright (C) 2012 Alexey Yakovenko <waker@users.sourceforge.net>\n"
+ "Uses the reverse engineered ALAC decoder (C) 2005 David Hammerton\n"
+ "All rights reserved.\n"
+ "\n"
+ "Permission is hereby granted, free of charge, to any person\n"
+ "obtaining a copy of this software and associated documentation\n"
+ "files (the \"Software\"), to deal in the Software without\n"
+ "restriction, including without limitation the rights to use,\n"
+ "copy, modify, merge, publish, distribute, sublicense, and/or\n"
+ "sell copies of the Software, and to permit persons to whom the\n"
+ "Software is furnished to do so, subject to the following conditions:\n"
+ "\n"
+ "The above copyright notice and this permission notice shall be\n"
+ "included in all copies or substantial portions of the Software.\n"
+ "\n"
+ "THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n"
+ "EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n"
+ "OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n"
+ "NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n"
+ "HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n"
+ "WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n"
+ "FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n"
+ "OTHER DEALINGS IN THE SOFTWARE.\n"
+ ,
+ .plugin.website = "http://deadbeef.sf.net",
+ .open = alacplug_open,
+ .init = alacplug_init,
+ .free = alacplug_free,
+ .read = alacplug_read,
+ .seek = alacplug_seek,
+ .seek_sample = alacplug_seek_sample,
+ .insert = alacplug_insert,
+ .read_metadata = alacplug_read_metadata,
+ .exts = exts,
+};
+
+DB_plugin_t *
+alac_load (DB_functions_t *api) {
+ deadbeef = api;
+ return DB_PLUGIN (&plugin);
+}
diff --git a/plugins/alac/decomp.h b/plugins/alac/decomp.h
new file mode 100644
index 00000000..47b3a9a7
--- /dev/null
+++ b/plugins/alac/decomp.h
@@ -0,0 +1,17 @@
+#ifndef __ALAC__DECOMP_H
+#define __ALAC__DECOMP_H
+
+typedef struct alac_file alac_file;
+
+alac_file *create_alac(int samplesize, int numchannels);
+void decode_frame(alac_file *alac,
+ unsigned char *inbuffer,
+ void *outbuffer, int *outputsize);
+void alac_set_info(alac_file *alac, char *inputbuffer);
+
+int alac_get_samplerate(alac_file *alac);
+void alac_file_free (alac_file *alac);
+
+
+#endif /* __ALAC__DECOMP_H */
+
diff --git a/plugins/alac/demux.c b/plugins/alac/demux.c
new file mode 100644
index 00000000..cc1ac240
--- /dev/null
+++ b/plugins/alac/demux.c
@@ -0,0 +1,673 @@
+/*
+ * ALAC (Apple Lossless Audio Codec) decoder
+ * Copyright (c) 2005 David Hammerton
+ * All rights reserved.
+ *
+ * This is the quicktime container demuxer.
+ *
+ * http://crazney.net/programs/itunes/alac.html
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _WIN32
+ #include "stdint_win.h"
+#else
+ #include <stdint.h>
+#endif
+
+#include "stream.h"
+#include "demux.h"
+
+//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+#define trace(fmt,...)
+
+typedef struct
+{
+ stream_t *stream;
+ demux_res_t *res;
+ long saved_mdat_pos;
+} qtmovie_t;
+
+
+/* chunk handlers */
+static void read_chunk_ftyp(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ fourcc_t type;
+ uint32_t minor_ver;
+ size_t size_remaining = chunk_len - 8; /* FIXME: can't hardcode 8, size may be 64bit */
+
+ type = stream_read_uint32(qtmovie->stream);
+ size_remaining-=4;
+ if ((type != MAKEFOURCC('M','4','A',' ')) &&
+ (type != MAKEFOURCC('m','4','a',' ')) &&
+ (type != MAKEFOURCC('M','4','B',' ')) &&
+ (type != MAKEFOURCC('m','p','4','2')) &&
+ (type != MAKEFOURCC('3','g','p','6')) &&
+ (type != MAKEFOURCC('q','t',' ',' ')) &&
+ (type != MAKEFOURCC('i','s','o','m')))
+ {
+ trace ("not M4A file\n");
+ return;
+ }
+ minor_ver = stream_read_uint32(qtmovie->stream);
+ size_remaining-=4;
+
+ /* compatible brands */
+ while (size_remaining)
+ {
+ /* unused */
+ /*fourcc_t cbrand =*/ stream_read_uint32(qtmovie->stream);
+ size_remaining-=4;
+ }
+}
+
+static void read_chunk_tkhd(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+static void read_chunk_edts(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+static void read_chunk_elst(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+static int read_chunk_stsd(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ unsigned int i;
+ uint32_t numentries;
+ size_t size_remaining = chunk_len - 8;
+
+ /* version */
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 1;
+ /* flags */
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 3;
+
+ numentries = stream_read_uint32(qtmovie->stream);
+ size_remaining -= 4;
+
+// if (numentries != 1)
+// {
+// trace ("only expecting one entry in sample description atom!\n");
+// return 0;
+// }
+
+ for (i = 0; i < numentries; i++)
+ {
+ uint32_t entry_size;
+
+ uint32_t entry_remaining;
+
+ entry_size = stream_read_uint32(qtmovie->stream);
+ qtmovie->res->format = stream_read_uint32(qtmovie->stream);
+ trace ("format: %c%c%c%c\n",SPLITFOURCC(qtmovie->res->format));
+ entry_remaining = entry_size;
+ entry_remaining -= 8;
+
+
+ /* sound info: */
+
+ /* reserved + data reference index + sound version + reserved */
+ stream_skip(qtmovie->stream, 6 + 2 + 2 + 6);
+ entry_remaining -= 6 + 2 + 2 + 6;
+
+ qtmovie->res->num_channels = stream_read_uint16(qtmovie->stream);
+ qtmovie->res->sample_size = stream_read_uint16(qtmovie->stream);
+ entry_remaining -= 4;
+
+ /* packet size */
+ stream_skip(qtmovie->stream, 2);
+ qtmovie->res->sample_rate = stream_read_uint32(qtmovie->stream);
+ /* reserved size */
+ stream_skip(qtmovie->stream, 2);
+ entry_remaining -= 8;
+
+ /* remaining is codec data */
+ /* 12 = audio format atom, 8 = padding */
+ qtmovie->res->codecdata_len = entry_remaining + 12 + 8;
+ if (qtmovie->res->codecdata_len > 64)
+ {
+ trace ("codecdata too large (%d) in stsd\n",
+ (int)qtmovie->res->codecdata_len);
+ return 0;
+ }
+
+ memset(qtmovie->res->codecdata, 0, qtmovie->res->codecdata_len);
+ /* audio format atom */
+#if 0
+ /* The ALAC decoder skips these bytes, so there is no need to store them,
+ and this code isn't endian/alignment safe */
+ ((unsigned int*)qtmovie->res->codecdata)[0] = 0x0c000000;
+ ((unsigned int*)qtmovie->res->codecdata)[1] = MAKEFOURCC('a','m','r','f');
+ ((unsigned int*)qtmovie->res->codecdata)[2] = MAKEFOURCC('c','a','l','a');
+#endif
+
+ stream_read(qtmovie->stream,
+ entry_remaining,
+ ((char*)qtmovie->res->codecdata) + 12);
+ entry_remaining -= entry_remaining;
+
+ if (entry_remaining)
+ stream_skip(qtmovie->stream, entry_remaining);
+
+
+ qtmovie->res->format_read = 1;
+ if (qtmovie->res->format != MAKEFOURCC('a','l','a','c'))
+ {
+ /*trace ("expecting 'alac' data format, got %c%c%c%c\n",
+ SPLITFOURCC(qtmovie->res->format));*/
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static void read_chunk_stts(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ unsigned int i;
+ uint32_t numentries;
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ /* version */
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 1;
+ /* flags */
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 3;
+
+ numentries = stream_read_uint32(qtmovie->stream);
+ size_remaining -= 4;
+
+ qtmovie->res->num_time_to_samples = numentries;
+ qtmovie->res->time_to_sample = malloc(numentries * sizeof(*qtmovie->res->time_to_sample));
+
+ for (i = 0; i < numentries; i++)
+ {
+ qtmovie->res->time_to_sample[i].sample_count = stream_read_uint32(qtmovie->stream);
+ qtmovie->res->time_to_sample[i].sample_duration = stream_read_uint32(qtmovie->stream);
+ size_remaining -= 8;
+ }
+
+ if (size_remaining)
+ {
+ trace ("ehm, size remianing?\n");
+ stream_skip(qtmovie->stream, size_remaining);
+ }
+}
+
+static void read_chunk_stsz(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ unsigned int i;
+ uint32_t numentries;
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ /* version */
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 1;
+ /* flags */
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ stream_read_uint8(qtmovie->stream);
+ size_remaining -= 3;
+
+ /* default sample size */
+ if (stream_read_uint32(qtmovie->stream) != 0)
+ {
+ trace ("i was expecting variable samples sizes\n");
+ stream_read_uint32(qtmovie->stream);
+ size_remaining -= 4;
+ return;
+ }
+ size_remaining -= 4;
+
+ numentries = stream_read_uint32(qtmovie->stream);
+ size_remaining -= 4;
+
+ qtmovie->res->num_sample_byte_sizes = numentries;
+ qtmovie->res->sample_byte_size = malloc(numentries * sizeof(*qtmovie->res->sample_byte_size));
+
+ for (i = 0; i < numentries; i++)
+ {
+ qtmovie->res->sample_byte_size[i] = stream_read_uint32(qtmovie->stream);
+ size_remaining -= 4;
+ }
+
+ if (size_remaining)
+ {
+ trace ("ehm, size remianing?\n");
+ stream_skip(qtmovie->stream, size_remaining);
+ }
+}
+
+static int read_chunk_stbl(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ while (size_remaining)
+ {
+ size_t sub_chunk_len;
+ fourcc_t sub_chunk_id;
+
+ sub_chunk_len = stream_read_uint32(qtmovie->stream);
+ if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
+ {
+ trace ("strange size for chunk inside stbl (%lu) (remaining: %lu)\n",
+ sub_chunk_len, size_remaining);
+ return 0;
+ }
+
+ sub_chunk_id = stream_read_uint32(qtmovie->stream);
+
+ switch (sub_chunk_id)
+ {
+ case MAKEFOURCC('s','t','s','d'):
+ if (read_chunk_stsd(qtmovie, sub_chunk_len) == 0)
+ return 0;
+ break;
+ case MAKEFOURCC('s','t','t','s'):
+ read_chunk_stts(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('s','t','s','z'):
+ read_chunk_stsz(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('s','t','s','c'):
+ case MAKEFOURCC('s','t','c','o'):
+ /* skip these, no indexing for us! */
+ stream_skip(qtmovie->stream, sub_chunk_len - 8);
+ break;
+ default:
+ trace ("(stbl) unknown chunk id: %c%c%c%c\n",
+ SPLITFOURCC(sub_chunk_id));
+ return 0;
+ }
+
+ size_remaining -= sub_chunk_len;
+ }
+
+ return 1;
+}
+
+static int read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ size_t dinf_size, stbl_size;
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ /**** SOUND HEADER CHUNK ****/
+ if (stream_read_uint32(qtmovie->stream) != 16)
+ {
+ trace ("unexpected size in media info\n");
+ return 0;
+ }
+ if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d'))
+ {
+ trace ("not a sound header! can't handle this.\n");
+ return 0;
+ }
+ /* now skip the rest */
+ stream_skip(qtmovie->stream, 16 - 8);
+ size_remaining -= 16;
+ /****/
+
+ /**** DINF CHUNK ****/
+ dinf_size = stream_read_uint32(qtmovie->stream);
+ if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f'))
+ {
+ trace ("expected dinf, didn't get it.\n");
+ return 0;
+ }
+ /* skip it */
+ stream_skip(qtmovie->stream, dinf_size - 8);
+ size_remaining -= dinf_size;
+ /****/
+
+
+ /**** SAMPLE TABLE ****/
+ stbl_size = stream_read_uint32(qtmovie->stream);
+ if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l'))
+ {
+ trace ("expected stbl, didn't get it.\n");
+ return 0;
+ }
+ if (read_chunk_stbl(qtmovie, stbl_size) == 0)
+ return 0;
+ size_remaining -= stbl_size;
+
+ if (size_remaining)
+ {
+ trace ("oops\n");
+ stream_skip(qtmovie->stream, size_remaining);
+ }
+
+ return 1;
+}
+
+static int read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ while (size_remaining)
+ {
+ size_t sub_chunk_len;
+ fourcc_t sub_chunk_id;
+
+ sub_chunk_len = stream_read_uint32(qtmovie->stream);
+ if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
+ {
+ trace ("strange size for chunk inside mdia\n");
+ return 0;
+ }
+
+ sub_chunk_id = stream_read_uint32(qtmovie->stream);
+
+ switch (sub_chunk_id)
+ {
+ case MAKEFOURCC('m','i','n','f'):
+ if (read_chunk_minf(qtmovie, sub_chunk_len) == 0)
+ return 0;
+ break;
+ default:
+ trace ("(mdia) unknown chunk id: %c%c%c%c\n",
+ SPLITFOURCC(sub_chunk_id));
+ stream_skip(qtmovie->stream, sub_chunk_len - 8);
+ break;;
+ }
+
+ size_remaining -= sub_chunk_len;
+ }
+
+ return 1;
+}
+
+/* 'trak' - a movie track - contains other atoms */
+static int read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ while (size_remaining)
+ {
+ size_t sub_chunk_len;
+ fourcc_t sub_chunk_id;
+
+ sub_chunk_len = stream_read_uint32(qtmovie->stream);
+ if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
+ {
+ trace ("strange size for chunk inside trak\n");
+ return 0;
+ }
+
+ sub_chunk_id = stream_read_uint32(qtmovie->stream);
+
+ switch (sub_chunk_id)
+ {
+ case MAKEFOURCC('t','k','h','d'):
+ read_chunk_tkhd(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('m','d','i','a'):
+ if (read_chunk_mdia(qtmovie, sub_chunk_len) == 0)
+ return 0;
+ break;
+ case MAKEFOURCC('e','d','t','s'):
+ read_chunk_edts(qtmovie, sub_chunk_len);
+ break;
+ default:
+ trace ("(trak) unknown chunk id: %c%c%c%c\n",
+ SPLITFOURCC(sub_chunk_id));
+ return 0;
+ }
+
+ size_remaining -= sub_chunk_len;
+ }
+
+ return 1;
+}
+
+/* 'mvhd' movie header atom */
+static void read_chunk_mvhd(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+/* 'udta' user data.. contains tag info */
+static void read_chunk_udta(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+/* 'iods' */
+static void read_chunk_iods(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ /* don't need anything from here atm, skip */
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ stream_skip(qtmovie->stream, size_remaining);
+}
+
+/* 'moov' movie atom - contains other atoms */
+static int read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len)
+{
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ while (size_remaining)
+ {
+ size_t sub_chunk_len;
+ fourcc_t sub_chunk_id;
+
+ sub_chunk_len = stream_read_uint32(qtmovie->stream);
+ if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)
+ {
+ trace ("strange size for chunk inside moov\n");
+ return 0;
+ }
+
+ sub_chunk_id = stream_read_uint32(qtmovie->stream);
+
+ switch (sub_chunk_id)
+ {
+ case MAKEFOURCC('m','v','h','d'):
+ read_chunk_mvhd(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('t','r','a','k'):
+ if (read_chunk_trak(qtmovie, sub_chunk_len) == 0)
+ return 0;
+ break;
+ case MAKEFOURCC('u','d','t','a'):
+ read_chunk_udta(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('e','l','s','t'):
+ read_chunk_elst(qtmovie, sub_chunk_len);
+ break;
+ case MAKEFOURCC('i','o','d','s'):
+ read_chunk_iods(qtmovie, sub_chunk_len);
+ break;
+ default:
+ trace ("(moov) unknown chunk id: %c%c%c%c\n",
+ SPLITFOURCC(sub_chunk_id));
+ return 0;
+ }
+
+ size_remaining -= sub_chunk_len;
+ }
+
+ return 1;
+}
+
+static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len, int skip_mdat)
+{
+ size_t size_remaining = chunk_len - 8; /* FIXME WRONG */
+
+ if (size_remaining == 0) return;
+
+ qtmovie->res->mdat_len = (uint32_t)size_remaining;
+ if (skip_mdat)
+ {
+ qtmovie->saved_mdat_pos = stream_tell(qtmovie->stream);
+ stream_skip(qtmovie->stream, size_remaining);
+ }
+#if 0
+ qtmovie->res->mdat = malloc(size_remaining);
+
+ stream_read(qtmovie->stream, size_remaining, qtmovie->res->mdat);
+#endif
+}
+
+static int set_saved_mdat(qtmovie_t *qtmovie)
+{
+ if (qtmovie->saved_mdat_pos == -1)
+ {
+ trace ("stream contains mdat before moov but is not seekable\n");
+ return 0;
+ }
+
+ if (stream_setpos(qtmovie->stream, qtmovie->saved_mdat_pos))
+ {
+ trace ("error while seeking stream to mdat pos\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+int qtmovie_read(stream_t *file, demux_res_t *demux_res)
+{
+ int found_moov = 0;
+ int found_mdat = 0;
+ qtmovie_t *qtmovie;
+
+ qtmovie = (qtmovie_t*)malloc(sizeof(qtmovie_t));
+ memset (qtmovie, 0, sizeof (qtmovie_t));
+
+ /* construct the stream */
+ qtmovie->stream = file;
+
+ qtmovie->res = demux_res;
+
+ memset(demux_res, 0, sizeof(demux_res_t));
+
+ /* read the chunks */
+ while (1)
+ {
+ size_t chunk_len;
+ fourcc_t chunk_id;
+
+ chunk_len = stream_read_uint32(qtmovie->stream);
+ if (stream_eof(qtmovie->stream))
+ {
+ free (qtmovie);
+ return 0;
+ }
+
+ if (chunk_len == 1)
+ {
+ trace ("need 64bit support\n");
+ free (qtmovie);
+ return 0;
+ }
+ chunk_id = stream_read_uint32(qtmovie->stream);
+
+ switch (chunk_id)
+ {
+ case MAKEFOURCC('f','t','y','p'):
+ read_chunk_ftyp(qtmovie, chunk_len);
+ break;
+ case MAKEFOURCC('m','o','o','v'):
+ if (read_chunk_moov(qtmovie, chunk_len) == 0) {
+ free (qtmovie);
+ return 0; /* failed to read moov, can't do anything */
+ }
+ if (found_mdat)
+ {
+ int res = set_saved_mdat(qtmovie);
+ free (qtmovie);
+ return res;
+ }
+ found_moov = 1;
+ break;
+ /* if we hit mdat before we've found moov, record the position
+ * and move on. We can then come back to mdat later.
+ * This presumes the stream supports seeking backwards.
+ */
+ case MAKEFOURCC('m','d','a','t'):
+ read_chunk_mdat(qtmovie, chunk_len, !found_moov);
+ if (found_moov) {
+ free (qtmovie);
+ return 1;
+ }
+ found_mdat = 1;
+ break;
+
+ /* these following atoms can be skipped !!!! */
+ case MAKEFOURCC('f','r','e','e'):
+ stream_skip(qtmovie->stream, chunk_len - 8); /* FIXME not 8 */
+ break;
+ default:
+ trace ("(top) unknown chunk id: %c%c%c%c\n",
+ SPLITFOURCC(chunk_id));
+ free (qtmovie);
+ return 0;
+ }
+
+ }
+ free (qtmovie);
+ return 0;
+}
+
+
+void qtmovie_free_demux (demux_res_t *demux_res) {
+ if (demux_res->time_to_sample) {
+ free (demux_res->time_to_sample);
+ }
+ if (demux_res->sample_byte_size) {
+ free (demux_res->sample_byte_size);
+ }
+ memset (demux_res, 0, sizeof (demux_res_t));
+}
diff --git a/plugins/alac/demux.h b/plugins/alac/demux.h
new file mode 100644
index 00000000..091b1544
--- /dev/null
+++ b/plugins/alac/demux.h
@@ -0,0 +1,64 @@
+#ifndef DEMUX_H
+#define DEMUX_H
+
+#ifdef _WIN32
+ #include "stdint_win.h"
+#else
+ #include <stdint.h>
+#endif
+
+#include "stream.h"
+
+typedef uint32_t fourcc_t;
+
+typedef struct
+{
+ int format_read;
+
+ uint16_t num_channels;
+ uint16_t sample_size;
+ uint32_t sample_rate;
+ fourcc_t format;
+ void *buf;
+
+ struct {
+ uint32_t sample_count;
+ uint32_t sample_duration;
+ } *time_to_sample;
+ uint32_t num_time_to_samples;
+
+ uint32_t *sample_byte_size;
+ uint32_t num_sample_byte_sizes;
+
+ uint32_t codecdata_len;
+ char codecdata[64];
+
+ uint32_t mdat_len;
+#if 0
+ void *mdat;
+#endif
+} demux_res_t;
+
+int qtmovie_read(stream_t *stream, demux_res_t *demux_res);
+
+#ifndef MAKEFOURCC
+#define MAKEFOURCC(ch0, ch1, ch2, ch3) ( \
+ ( (int32_t)(char)(ch0) << 24 ) | \
+ ( (int32_t)(char)(ch1) << 16 ) | \
+ ( (int32_t)(char)(ch2) << 8 ) | \
+ ( (int32_t)(char)(ch3) ) )
+#endif
+
+#ifndef SLPITFOURCC
+/* splits it into ch0, ch1, ch2, ch3 - use for printf's */
+#define SPLITFOURCC(code) \
+ (char)((int32_t)code >> 24), \
+ (char)((int32_t)code >> 16), \
+ (char)((int32_t)code >> 8), \
+ (char)code
+#endif
+
+void qtmovie_free_demux (demux_res_t *demux_res);
+
+#endif /* DEMUX_H */
+
diff --git a/plugins/alac/stdint_win.h b/plugins/alac/stdint_win.h
new file mode 100644
index 00000000..a580eb7f
--- /dev/null
+++ b/plugins/alac/stdint_win.h
@@ -0,0 +1,14 @@
+
+#ifndef ALAC_STDINT_WIN_H__
+#define ALAC_STDINT_WIN_H__
+
+typedef signed char int8_t;
+typedef signed short int16_t;
+typedef signed int int32_t;
+typedef signed __int64 int64_t;
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+typedef unsigned __int64 uint64_t;
+
+#endif // ALAC_STDINT_WIN_H__ \ No newline at end of file
diff --git a/plugins/alac/stream.c b/plugins/alac/stream.c
new file mode 100644
index 00000000..cb969dd0
--- /dev/null
+++ b/plugins/alac/stream.c
@@ -0,0 +1,186 @@
+/*
+ * ALAC (Apple Lossless Audio Codec) decoder
+ * Copyright (c) 2005 David Hammerton
+ * All rights reserved.
+ *
+ * Basic stream reading
+ *
+ * http://crazney.net/programs/itunes/alac.html
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#ifdef _WIN32
+ #include "stdint_win.h"
+#else
+ #include <stdint.h>
+#endif
+
+#include "stream.h"
+
+extern DB_functions_t *deadbeef;
+
+#define _Swap32(v) do { \
+ v = (((v) & 0x000000FF) << 0x18) | \
+ (((v) & 0x0000FF00) << 0x08) | \
+ (((v) & 0x00FF0000) >> 0x08) | \
+ (((v) & 0xFF000000) >> 0x18); } while(0)
+
+#define _Swap16(v) do { \
+ v = (((v) & 0x00FF) << 0x08) | \
+ (((v) & 0xFF00) >> 0x08); } while (0)
+
+extern int host_bigendian;
+
+struct stream_tTAG {
+ DB_FILE *f;
+ int bigendian;
+ int eof;
+ int64_t junk_offset;
+};
+
+void stream_read(stream_t *stream, size_t size, void *buf)
+{
+ size_t ret;
+
+ ret = deadbeef->fread(buf, 4, size >> 2, stream->f) * 4;
+ ret += deadbeef->fread((char*)buf + ret, 1, size - ret, stream->f);
+
+ if (ret == 0 && size != 0) stream->eof = 1;
+}
+
+int32_t stream_read_int32(stream_t *stream)
+{
+ int32_t v;
+ stream_read(stream, 4, &v);
+ if ((stream->bigendian && !host_bigendian) ||
+ (!stream->bigendian && host_bigendian))
+ {
+ _Swap32(v);
+ }
+ return v;
+}
+
+uint32_t stream_read_uint32(stream_t *stream)
+{
+ uint32_t v;
+ stream_read(stream, 4, &v);
+ if ((stream->bigendian && !host_bigendian) ||
+ (!stream->bigendian && host_bigendian))
+ {
+ _Swap32(v);
+ }
+ return v;
+}
+
+int16_t stream_read_int16(stream_t *stream)
+{
+ int16_t v;
+ stream_read(stream, 2, &v);
+ if ((stream->bigendian && !host_bigendian) ||
+ (!stream->bigendian && host_bigendian))
+ {
+ _Swap16(v);
+ }
+ return v;
+}
+
+uint16_t stream_read_uint16(stream_t *stream)
+{
+ uint16_t v;
+ stream_read(stream, 2, &v);
+ if ((stream->bigendian && !host_bigendian) ||
+ (!stream->bigendian && host_bigendian))
+ {
+ _Swap16(v);
+ }
+ return v;
+}
+
+int8_t stream_read_int8(stream_t *stream)
+{
+ int8_t v;
+ stream_read(stream, 1, &v);
+ return v;
+}
+
+uint8_t stream_read_uint8(stream_t *stream)
+{
+ uint8_t v;
+ stream_read(stream, 1, &v);
+ return v;
+}
+
+
+void stream_skip(stream_t *stream, int64_t skip)
+{
+ if (deadbeef->fseek(stream->f, skip, SEEK_CUR) == 0) return;
+ if (errno == ESPIPE)
+ {
+ char *buffer = malloc(skip);
+ stream_read(stream, skip, buffer);
+ free(buffer);
+ }
+}
+
+int stream_eof(stream_t *stream)
+{
+ return stream->eof;
+}
+
+int64_t stream_tell(stream_t *stream)
+{
+ int64_t res = deadbeef->ftell(stream->f); /* returns -1 on error */
+ if (res < 0) {
+ return res;
+ }
+ return res - stream->junk_offset;
+}
+
+int64_t stream_setpos(stream_t *stream, int64_t pos)
+{
+ return deadbeef->fseek(stream->f, pos + stream->junk_offset, SEEK_SET);
+}
+
+stream_t *stream_create_file(DB_FILE *file, int bigendian, int64_t junk_offset)
+{
+ stream_t *new_stream;
+
+ new_stream = (stream_t*)malloc(sizeof(stream_t));
+ memset (new_stream, 0, sizeof (new_stream));
+ new_stream->f = file;
+ new_stream->bigendian = bigendian;
+ new_stream->eof = 0;
+ new_stream->junk_offset = 0;//junk_offset;
+
+ return new_stream;
+}
+
+void stream_destroy(stream_t *stream)
+{
+ free(stream);
+}
+
diff --git a/plugins/alac/stream.h b/plugins/alac/stream.h
new file mode 100644
index 00000000..2e32e4a7
--- /dev/null
+++ b/plugins/alac/stream.h
@@ -0,0 +1,39 @@
+#ifndef STREAM_H
+#define STREAM_H
+
+/* stream.h */
+
+#ifdef _WIN32
+ #include "stdint_win.h"
+#else
+ #include <stdint.h>
+#endif
+
+#include "../../deadbeef.h"
+
+typedef struct stream_tTAG stream_t;
+
+void stream_read(stream_t *stream, size_t len, void *buf);
+
+int32_t stream_read_int32(stream_t *stream);
+uint32_t stream_read_uint32(stream_t *stream);
+
+int16_t stream_read_int16(stream_t *stream);
+uint16_t stream_read_uint16(stream_t *stream);
+
+int8_t stream_read_int8(stream_t *stream);
+uint8_t stream_read_uint8(stream_t *stream);
+
+void stream_skip(stream_t *stream, int64_t skip);
+
+int stream_eof(stream_t *stream);
+
+int64_t stream_tell(stream_t *stream);
+int64_t stream_setpos(stream_t *stream, int64_t pos);
+
+stream_t *stream_create_file(DB_FILE *file,
+ int bigendian, int64_t junk_offset);
+void stream_destroy(stream_t *stream);
+
+#endif /* STREAM_H */
+
diff --git a/plugins/alsa/alsa.c b/plugins/alsa/alsa.c
index 3ea17435..fc7691e6 100644
--- a/plugins/alsa/alsa.c
+++ b/plugins/alsa/alsa.c
@@ -23,8 +23,8 @@
#include "../../deadbeef.h"
#include "../../config.h"
-#define trace(...) { fprintf(stderr, __VA_ARGS__); }
-//#define trace(fmt,...)
+//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+#define trace(fmt,...)
#define min(x,y) ((x)<(y)?(x):(y))
@@ -55,6 +55,8 @@ static snd_pcm_uframes_t req_period_size;
static int conf_alsa_resample = 1;
static char conf_alsa_soundcard[100] = "default";
+static int alsa_formatchanged = 0;
+
static int
palsa_callback (char *stream, int len);
@@ -459,24 +461,29 @@ palsa_setformat (ddb_waveformat_t *fmt) {
UNLOCK;
return -1;
}
- UNLOCK;
trace ("new format %dbit %s %dch %dHz channelmask=%X\n", plugin.fmt.bps, plugin.fmt.is_float ? "float" : "int", plugin.fmt.channels, plugin.fmt.samplerate, plugin.fmt.channelmask);
+ int res = -1;
switch (s) {
case OUTPUT_STATE_STOPPED:
- return palsa_stop ();
+ res = palsa_stop ();
+ break;
case OUTPUT_STATE_PLAYING:
- return palsa_play ();
+ res = palsa_play ();
+ break;
case OUTPUT_STATE_PAUSED:
if (0 != palsa_play ()) {
- return -1;
+ res = -1;
}
if (0 != palsa_pause ()) {
- return -1;
+ res = -1;
}
break;
}
- return 0;
+ trace ("alsa_formatchanged=1\n");
+ alsa_formatchanged = 1;
+ UNLOCK;
+ return res;
}
int
@@ -569,8 +576,20 @@ palsa_stop (void) {
#endif
UNLOCK;
deadbeef->streamer_reset (1);
- if (deadbeef->conf_get_int ("alsa.freeonstop", 0)) {
+ DB_playItem_t *ts = deadbeef->streamer_get_streaming_track ();
+ DB_playItem_t *tp = deadbeef->streamer_get_playing_track ();
+ if (deadbeef->conf_get_int ("alsa.freeonstop", 0) && !ts && !tp) {
palsa_free ();
+ trace ("\033[0;31malsa released!\033[37;0m\n");
+ }
+ else {
+ trace ("\033[0;32malsa not released!\033[37;0m\n");
+ }
+ if (tp) {
+ deadbeef->pl_item_unref (tp);
+ }
+ if (ts) {
+ deadbeef->pl_item_unref (ts);
}
return 0;
}
@@ -613,6 +632,15 @@ palsa_thread (void *context) {
continue;
}
LOCK;
+ if (alsa_formatchanged) {
+ trace ("handled alsa_formatchanged [1]\n");
+ alsa_formatchanged = 0;
+ UNLOCK;
+ continue;
+ }
+ char buf[period_size * (plugin.fmt.bps>>3) * plugin.fmt.channels];
+ int bytes_to_write = 0;
+
/* find out how much space is available for playback data */
snd_pcm_sframes_t frames_to_deliver = snd_pcm_avail_update (audio);
@@ -624,13 +652,25 @@ palsa_thread (void *context) {
break;
}
err = 0;
- char buf[period_size * (plugin.fmt.bps>>3) * plugin.fmt.channels];
- int bytes_to_write = palsa_callback (buf, period_size * (plugin.fmt.bps>>3) * plugin.fmt.channels);
+ if (!bytes_to_write) {
+ UNLOCK; // holding a lock here may cause deadlock in the streamer
+ bytes_to_write = palsa_callback (buf, period_size * (plugin.fmt.bps>>3) * plugin.fmt.channels);
+ LOCK;
+ if (OUTPUT_STATE_PLAYING != state || alsa_terminate) {
+ break;
+ }
+ }
if (bytes_to_write >= (plugin.fmt.bps>>3) * plugin.fmt.channels) {
UNLOCK;
err = snd_pcm_writei (audio, buf, snd_pcm_bytes_to_frames(audio, bytes_to_write));
LOCK;
+ if (alsa_formatchanged) {
+ trace ("handled alsa_formatchanged [2]\n");
+ alsa_formatchanged = 0;
+ UNLOCK;
+ break;
+ }
if (alsa_terminate) {
break;
}
@@ -638,7 +678,13 @@ palsa_thread (void *context) {
else {
UNLOCK;
usleep (10000);
+ bytes_to_write = 0;
LOCK;
+ if (alsa_formatchanged) {
+ trace ("handled alsa_formatchanged [3]\n");
+ alsa_formatchanged = 0;
+ break;
+ }
continue;
}
@@ -664,15 +710,16 @@ palsa_thread (void *context) {
//}
snd_pcm_prepare (audio);
snd_pcm_start (audio);
- continue;
}
+ continue;
}
+ bytes_to_write = 0;
frames_to_deliver = snd_pcm_avail_update (audio);
}
UNLOCK;
int sleeptime = period_size-frames_to_deliver;
if (sleeptime > 0 && plugin.fmt.samplerate > 0 && plugin.fmt.channels > 0) {
- usleep (sleeptime * 1000 / plugin.fmt.samplerate / plugin.fmt.channels * 1000);
+ usleep (sleeptime * 1000 / plugin.fmt.samplerate * 1000);
}
}
}
diff --git a/plugins/ao/Makefile.am b/plugins/ao/Makefile.am
index 5a7750e5..b9192338 100644
--- a/plugins/ao/Makefile.am
+++ b/plugins/ao/Makefile.am
@@ -17,11 +17,11 @@ eng_psf/cpuintrf.h eng_psf/mamemem.h eng_psf/psx.h\
eng_psf/peops/adsr.h eng_psf/peops/dma.h eng_psf/peops/externals.h eng_psf/peops/gauss_i.h eng_psf/peops/registers.h eng_psf/peops/regs.h eng_psf/peops/spu.h eng_psf/peops/stdafx.h\
eng_psf/peops2/adsr.h eng_psf/peops2/dma.h eng_psf/peops2/externals.h eng_psf/peops2/gauss_i.h eng_psf/peops2/psemuxa.h eng_psf/peops2/registers.h eng_psf/peops2/regs.h eng_psf/peops2/reverb.h eng_psf/peops2/spu.h eng_psf/peops2/stdafx.h
-ddb_ao_la_LDFLAGS = -module -fPIC
+ddb_ao_la_LDFLAGS = -module $(ZLIB_LIBS)
EXTRA_DIST=eng_psf/peops/reverb.c eng_psf/peops/adsr.c eng_psf/peops/registers.c eng_psf/peops/dma.c eng_psf/peops2/spu2.c eng_psf/peops2/reverb2.c eng_psf/peops2/adsr2.c eng_dsf/arm7memil.c eng_dsf/aicalfo.c eng_ssf/scsplfo.c
ddb_ao_la_LIBADD = $(LDADD)
-AM_CFLAGS = $(CFLAGS) -Wall -DPATH_MAX=1024 -DHAS_PSXCPU=1 -I.. -Ieng_ssf -Ieng_qsf -Ieng_dsf -lm $(ZLIB_LIBS)
+AM_CFLAGS = $(CFLAGS) -Wall -DPATH_MAX=1024 -DHAS_PSXCPU=1 -I.. -Ieng_ssf -Ieng_qsf -Ieng_dsf -lm -fPIC
endif
diff --git a/plugins/ao/plugin.c b/plugins/ao/plugin.c
index 2239d995..3743ea72 100644
--- a/plugins/ao/plugin.c
+++ b/plugins/ao/plugin.c
@@ -66,7 +66,9 @@ aoplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
_info->plugin = &plugin;
info->duration = deadbeef->pl_get_item_duration (it);
+ deadbeef->pl_lock ();
DB_FILE *file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!file) {
trace ("psf: failed to fopen %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
@@ -81,7 +83,9 @@ aoplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
}
if (deadbeef->fread(info->filebuffer, 1, info->filesize, file) != info->filesize) {
+ deadbeef->pl_lock ();
fprintf(stderr, "psf: file read error: %s\n", deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
deadbeef->fclose (file);
return -1;
}
@@ -93,7 +97,9 @@ aoplug_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
return -1;
}
+ deadbeef->pl_lock ();
info->decoder = ao_start (info->type, deadbeef->pl_find_meta (it, ":URI"), (uint8 *)info->filebuffer, info->filesize);
+ deadbeef->pl_unlock ();
if (!info->decoder) {
fprintf (stderr, "psf: ao_start failed\n");
return -1;
diff --git a/plugins/artwork/artwork.c b/plugins/artwork/artwork.c
index 5dffd714..5a5a9800 100644
--- a/plugins/artwork/artwork.c
+++ b/plugins/artwork/artwork.c
@@ -1,5 +1,5 @@
#ifdef HAVE_CONFIG_H
-# include <config.h>
+# include "../../config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
@@ -10,6 +10,12 @@
#include <unistd.h>
#include <fnmatch.h>
#include <inttypes.h>
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
#include "../../deadbeef.h"
#include "artwork.h"
#include "lastfm.h"
@@ -981,74 +987,70 @@ fetcher_thread (void *none)
#ifdef USE_METAFLAC
// try to load embedded from flac metadata
+ for (;;)
{
- FLAC__StreamMetadata *meta = NULL;
- do {
- trace ("trying to load artwork flac metadata for %s\n", param->fname);
-
- if (!FLAC__metadata_get_picture (
- param->fname, // filename
- &meta, // picture
- FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER, // type
- NULL, // mime_type
- NULL, // description
- (unsigned)(-1), // max_width
- (unsigned)(-1), // max_height
- (unsigned)(-1), // max_depth
- (unsigned)(-1) // max_colors
- )){
- trace ("%s don't have an embedded cover\n",param->fname);
-
- if (!FLAC__metadata_get_picture (
- param->fname, // filename
- &meta, // picture
- -1, // type
- NULL, // mime_type
- NULL, // description
- (unsigned)(-1), // max_width
- (unsigned)(-1), // max_height
- (unsigned)(-1), // max_depth
- (unsigned)(-1) // max_colors
- )){
- trace ("%s don't have an embedded album art\n",param->fname);
- break;
- }
+ const char *filename = param->fname;
+ FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new();
+ int is_ogg = 0;
+ if(strlen(filename) >= 4 && (0 == strcmp(filename+strlen(filename)-4, ".oga") || 0 == strcasecmp(filename+strlen(filename)-4, ".ogg"))) {
+ is_ogg = 1;
+ }
- }
- FLAC__StreamMetadata_Picture *pic = &meta->data.picture;
+ if(! (is_ogg? FLAC__metadata_chain_read_ogg(chain, filename) : FLAC__metadata_chain_read(chain, filename)) ) {
+ trace ("%s: ERROR: reading metadata", filename);
+ FLAC__metadata_chain_delete(chain);
+ break;
+ }
+ FLAC__StreamMetadata *picture = 0;
+ FLAC__Metadata_Iterator *iterator = FLAC__metadata_iterator_new();
+ FLAC__metadata_iterator_init(iterator, chain);
- trace ("found flac cover art of %d bytes (%s)\n", pic->data_length, pic->description);
- char tmp_path[1024];
- char cache_path[1024];
- make_cache_path (cache_path, sizeof (cache_path), param->album, param->artist, -1);
- trace ("will write flac cover art into %s\n", cache_path);
- snprintf (tmp_path, sizeof (tmp_path), "%s.part", cache_path);
- FILE *out = fopen (tmp_path, "w+b");
- if (!out) {
- trace ("artwork: failed to open %s for writing\n", tmp_path);
- break;
- }
- if (fwrite (pic->data, 1, pic->data_length, out) != pic->data_length) {
- trace ("artwork: failed to write flac picture into %s\n", tmp_path);
- fclose (out);
- unlink (tmp_path);
- break;
+ do {
+ FLAC__StreamMetadata *block = FLAC__metadata_iterator_get_block(iterator);
+ if(block->type == FLAC__METADATA_TYPE_PICTURE) {
+ picture = block;
}
+ } while(FLAC__metadata_iterator_next(iterator) && 0 == picture);
+
+ if (!picture) {
+ trace ("%s doesn't have an embedded cover\n", param->fname);
+ break;
+ }
+ FLAC__StreamMetadata_Picture *pic = &picture->data.picture;
+ trace ("found flac cover art of %d bytes (%s)\n", pic->data_length, pic->description);
+ char tmp_path[1024];
+ char cache_path[1024];
+ make_cache_path (cache_path, sizeof (cache_path), param->album, param->artist, -1);
+ trace ("will write flac cover art into %s\n", cache_path);
+ snprintf (tmp_path, sizeof (tmp_path), "%s.part", cache_path);
+ FILE *out = fopen (tmp_path, "w+b");
+ if (!out) {
+ trace ("artwork: failed to open %s for writing\n", tmp_path);
+ break;
+ }
+ if (fwrite (pic->data, 1, pic->data_length, out) != pic->data_length) {
+ trace ("artwork: failed to write flac picture into %s\n", tmp_path);
fclose (out);
- int err = rename (tmp_path, cache_path);
- if (err != 0) {
- trace ("Failed not move %s to %s: %s\n", tmp_path, cache_path, strerror (err));
- unlink (tmp_path);
- break;
- }
unlink (tmp_path);
- got_pic = 1;
- } while (0);
+ break;
+ }
+ fclose (out);
+ int err = rename (tmp_path, cache_path);
+ if (err != 0) {
+ trace ("Failed not move %s to %s: %s\n", tmp_path, cache_path, strerror (err));
+ unlink (tmp_path);
+ break;
+ }
+ unlink (tmp_path);
+ got_pic = 1;
- if (meta != NULL) {
- trace ("release flac metadata block\n");
- FLAC__metadata_object_delete (meta);
+ if (chain) {
+ FLAC__metadata_chain_delete(chain);
+ }
+ if (iterator) {
+ FLAC__metadata_iterator_delete(iterator);
}
+ break;
}
#endif
}
@@ -1084,7 +1086,7 @@ fetcher_thread (void *none)
p = e;
}
if (files_count == 0) {
- files_count = scandir (path, &files, filter_jpg, NULL);
+ files_count = scandir (path, &files, filter_jpg, alphasort);
}
if (files_count > 0) {
@@ -1353,7 +1355,7 @@ artwork_plugin_start (void)
const char *def_art = deadbeef->conf_get_str_fast ("gtkui.nocover_pixmap", NULL);
if (!def_art) {
- snprintf (default_cover, sizeof (default_cover), "%s/noartwork.jpg", deadbeef->get_pixmap_dir ());
+ snprintf (default_cover, sizeof (default_cover), "%s/noartwork.png", deadbeef->get_pixmap_dir ());
}
else {
strcpy (default_cover, def_art);
diff --git a/plugins/cdda/cdda.c b/plugins/cdda/cdda.c
index 44c04e7a..339d426c 100644
--- a/plugins/cdda/cdda.c
+++ b/plugins/cdda/cdda.c
@@ -18,11 +18,20 @@
/* screwed/maintained by Alexey Yakovenko <waker@users.sourceforge.net> */
+#ifdef HAVE_CONFIG_H
+# include "../../config.h"
+#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <sys/types.h>
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
#include <cdio/cdio.h>
#include <cdio/cdtext.h>
@@ -81,9 +90,8 @@ cda_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("cdda: init %s\n", deadbeef->pl_find_meta (it, ":URI"));
- size_t l = strlen (deadbeef->pl_find_meta (it, ":URI"));
- char location[l+1];
- memcpy (location, deadbeef->pl_find_meta (it, ":URI"), l+1);
+ char location[PATH_MAX];
+ deadbeef->pl_get_meta (it, ":URI", location, sizeof (location));
char *nr = strchr (location, '#');
if (nr) {
@@ -406,7 +414,11 @@ cddb_thread (void *items_i)
static void
read_track_cdtext (CdIo_t *cdio, int track_nr, DB_playItem_t *item)
{
+#if CDIO_API_VERSION >= 6
+ cdtext_t *cdtext = cdio_get_cdtext (cdio);
+#else
cdtext_t *cdtext = cdio_get_cdtext (cdio, 0);
+#endif
if (!cdtext)
{
trace ("No cdtext\n");
@@ -417,14 +429,23 @@ read_track_cdtext (CdIo_t *cdio, int track_nr, DB_playItem_t *item)
int field_type;
for (field_type = 0; field_type < MAX_CDTEXT_FIELDS; field_type++)
{
+#if CDIO_API_VERSION >= 6
+ const char *text = cdtext_get_const (cdtext, field_type, track_nr);
+#else
const char *text = cdtext_get_const (field_type, cdtext);
+#endif
const char *field = NULL;
if (text)
{
switch (field_type)
{
+#if CDIO_API_VERSION >= 6
+ case CDTEXT_FIELD_TITLE: album = text; break;
+ case CDTEXT_FIELD_PERFORMER: artist = text; break;
+#else
case CDTEXT_TITLE: album = text; break;
case CDTEXT_PERFORMER: artist = text; break;
+#endif
}
}
}
@@ -437,24 +458,41 @@ read_track_cdtext (CdIo_t *cdio, int track_nr, DB_playItem_t *item)
deadbeef->pl_replace_meta (item, "album", album);
}
+#if CDIO_API_VERSION >= 6
+ cdtext = cdio_get_cdtext (cdio);
+#else
cdtext = cdio_get_cdtext (cdio, track_nr);
+#endif
if (!cdtext)
return;
for (field_type = 0; field_type < MAX_CDTEXT_FIELDS; field_type++)
{
+#if CDIO_API_VERSION >= 6
+ const char *text = cdtext_get_const (cdtext, field_type, track_nr);
+#else
const char *text = cdtext_get_const (field_type, cdtext);
+#endif
const char *field = NULL;
if (!text)
continue;
switch (field_type)
{
+#if CDIO_API_VERSION >= 6
+ case CDTEXT_FIELD_TITLE: field = "title"; break;
+ case CDTEXT_FIELD_PERFORMER: field = "artist"; break;
+ case CDTEXT_FIELD_COMPOSER: field = "composer"; break;
+ case CDTEXT_FIELD_GENRE: field = "genre"; break;
+ case CDTEXT_FIELD_SONGWRITER: field = "songwriter"; break;
+ case CDTEXT_FIELD_MESSAGE: field = "comment"; break;
+#else
case CDTEXT_TITLE: field = "title"; break;
case CDTEXT_PERFORMER: field = "artist"; break;
case CDTEXT_COMPOSER: field = "composer"; break;
case CDTEXT_GENRE: field = "genre"; break;
case CDTEXT_SONGWRITER: field = "songwriter"; break;
case CDTEXT_MESSAGE: field = "comment"; break;
+#endif
default: field = NULL;
}
if (field && text)
@@ -469,7 +507,11 @@ static int
read_disc_cdtext (struct cddb_thread_params *params)
{
DB_playItem_t **items = params->items;
+#if CDIO_API_VERSION >= 6
+ cdtext_t *cdtext = cdio_get_cdtext (params->cdio);
+#else
cdtext_t *cdtext = cdio_get_cdtext (params->cdio, 0);
+#endif
if (!cdtext)
return 0;
@@ -601,7 +643,8 @@ cda_action_add_cd (DB_plugin_action_t *act, DB_playItem_t *it)
}
static DB_plugin_action_t add_cd_action = {
- .title = "File/Add Audio CD",
+ .name = "cd_add",
+ .title = "File/Add audio CD",
.flags = DB_ACTION_COMMON,
.callback = DDB_ACTION_CALLBACK(cda_action_add_cd),
.next = NULL
diff --git a/plugins/converter/Makefile.am b/plugins/converter/Makefile.am
index 26691bab..e9b5b964 100644
--- a/plugins/converter/Makefile.am
+++ b/plugins/converter/Makefile.am
@@ -24,7 +24,7 @@ convdata_DATA = \
presets/TTA.txt\
presets/WavPack.txt
-EXTRA_DIST = $(convdata_DATA)
+EXTRA_DIST = $(convdata_DATA) converter.glade
AM_CFLAGS = $(CFLAGS) -std=c99 -fPIC
diff --git a/plugins/converter/converter.c b/plugins/converter/converter.c
index ee25dede..d0f4b2eb 100644
--- a/plugins/converter/converter.c
+++ b/plugins/converter/converter.c
@@ -16,6 +16,15 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#ifdef HAVE_CONFIG_H
+# include "../../config.h"
+#endif
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
@@ -26,8 +35,14 @@
#include "converter.h"
#include "../../deadbeef.h"
-#ifndef PATH_MAX
-#define PATH_MAX 1024 /* max # of characters in a path name */
+#ifndef strdupa
+# define strdupa(s) \
+ ({ \
+ const char *old = (s); \
+ size_t len = strlen (old) + 1; \
+ char *new = (char *) alloca (len); \
+ (char *) memcpy (new, old, len); \
+ })
#endif
#ifndef __linux__
@@ -652,7 +667,9 @@ get_output_field (DB_playItem_t *it, const char *field, char *out, int sz)
{
int idx = deadbeef->pl_get_idx_of (it);
char temp[PATH_MAX];
- deadbeef->pl_format_title (it, idx, temp, sizeof (temp), -1, field);
+ char fmt[strlen(field)+3];
+ snprintf (fmt, sizeof (fmt), "%%/%s", field);
+ deadbeef->pl_format_title (it, idx, temp, sizeof (temp), -1, fmt);
// escape special chars
char invalid[] = "$\"`\\";
@@ -663,9 +680,13 @@ get_output_field (DB_playItem_t *it, const char *field, char *out, int sz)
if (strchr (invalid, *t)) {
*p++ = '\\';
n--;
+ *p++ = *t;
+ n--;
+ }
+ else {
+ *p++ = *t;
+ n--;
}
- *p++ = *t;
- n--;
t++;
}
*p = 0;
@@ -675,7 +696,9 @@ get_output_field (DB_playItem_t *it, const char *field, char *out, int sz)
void
get_output_path (DB_playItem_t *it, const char *outfolder_user, const char *outfile, ddb_encoder_preset_t *encoder_preset, int preserve_folder_structure, const char *root_folder, int write_to_source_folder, char *out, int sz) {
trace ("get_output_path: %s %s %s\n", outfolder_user, outfile, root_folder);
+ deadbeef->pl_lock ();
const char *uri = strdupa (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
char outfolder_preserve[2000];
if (preserve_folder_structure) {
// generate new outfolder
@@ -790,8 +813,7 @@ int
convert (DB_playItem_t *it, const char *out, int output_bps, int output_is_float, ddb_encoder_preset_t *encoder_preset, ddb_dsp_preset_t *dsp_preset, int *abort) {
if (deadbeef->pl_get_item_duration (it) <= 0) {
deadbeef->pl_lock ();
- const char *fname = deadbeef->pl_find_meta (it, ":URI");
- fprintf (stderr, "converter: stream %s doesn't have finite length, skipped\n", fname);
+ fprintf (stderr, "converter: stream %s doesn't have finite length, skipped\n", deadbeef->pl_find_meta (it, ":URI"));
deadbeef->pl_unlock ();
return -1;
}
@@ -802,7 +824,9 @@ convert (DB_playItem_t *it, const char *out, int output_bps, int output_is_float
DB_decoder_t *dec = NULL;
DB_fileinfo_t *fileinfo = NULL;
char input_file_name[PATH_MAX] = "";
+ deadbeef->pl_lock ();
dec = (DB_decoder_t *)deadbeef->plug_get_for_id (deadbeef->pl_find_meta (it, ":DECODER"));
+ deadbeef->pl_unlock ();
if (dec) {
fileinfo = dec->open (0);
@@ -925,10 +949,14 @@ convert (DB_playItem_t *it, const char *out, int output_bps, int output_is_float
uint16_t outch = fileinfo->fmt.channels;
int samplesize = fileinfo->fmt.channels * fileinfo->fmt.bps / 8;
- int bs = 10250 * samplesize;
- char buffer[bs * 4];
- int dspsize = bs / samplesize * sizeof (float) * fileinfo->fmt.channels;
- char dspbuffer[dspsize * 4];
+
+ // block size
+ int bs = 2000 * samplesize;
+ // expected buffer size after worst-case dsp
+ int dspsize = bs/samplesize*sizeof(float)*8*48;
+ char buffer[dspsize];
+ // account for up to float32 7.1 resampled to 48x ratio
+ char dspbuffer[dspsize];
int eof = 0;
for (;;) {
if (eof) {
@@ -955,8 +983,15 @@ convert (DB_playItem_t *it, const char *out, int output_bps, int output_is_float
int frames = sz / samplesize;
while (dsp) {
frames = dsp->plugin->process (dsp, (float *)dspbuffer, frames, sizeof (dspbuffer) / (fmt.channels * 4), &fmt, NULL);
+ if (frames <= 0) {
+ break;
+ }
dsp = dsp->next;
}
+ if (frames <= 0) {
+ fprintf (stderr, "converter: dsp error, please check you dsp preset\n");
+ goto error;
+ }
outsr = fmt.samplerate;
outch = fmt.channels;
@@ -1065,6 +1100,9 @@ error:
if (input_file_name[0] && strcmp (input_file_name, "-")) {
unlink (input_file_name);
}
+ if (err != 0) {
+ return err;
+ }
// write junklib tags
@@ -1073,7 +1111,18 @@ error:
if (encoder_preset->tag_id3v2 || encoder_preset->tag_id3v1 || encoder_preset->tag_apev2 || encoder_preset->tag_flac || encoder_preset->tag_oggvorbis) {
out_it = deadbeef->pl_item_alloc ();
deadbeef->pl_item_copy (out_it, it);
- deadbeef->pl_replace_meta (out_it, ":URI", out);
+ char unesc_path[2000];
+ char invalid[] = "$\"`\\";
+ const char *p = out;
+ char *o = unesc_path;
+ while (*p) {
+ if (*p == '\\') {
+ p++;
+ }
+ *o++ = *p++;
+ }
+ *o = 0;
+ deadbeef->pl_replace_meta (out_it, ":URI", unesc_path);
deadbeef->pl_delete_meta (out_it, "cuesheet");
}
diff --git a/plugins/converter/convgui.c b/plugins/converter/convgui.c
index ad7fa4c4..e225c74d 100644
--- a/plugins/converter/convgui.c
+++ b/plugins/converter/convgui.c
@@ -16,6 +16,15 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#ifdef HAVE_CONFIG_H
+# include "../../config.h"
+#endif
+#if HAVE_SYS_CDEFS_H
+#include <sys/cdefs.h>
+#endif
+#if HAVE_SYS_SYSLIMITS_H
+#include <sys/syslimits.h>
+#endif
#include <string.h>
#include <stdlib.h>
#include <assert.h>
@@ -27,10 +36,6 @@
#include "interface.h"
#include "../gtkui/gtkui_api.h"
-#ifndef PATH_MAX
-#define PATH_MAX 1024 /* max # of characters in a path name */
-#endif
-
DB_functions_t *deadbeef;
ddb_converter_t *converter_plugin;
@@ -130,7 +135,7 @@ converter_worker (void *ctx) {
// prepare for preserving folder struct
if (conv->preserve_folder_structure && conv->convert_items_count >= 1) {
// start with the 1st track path
- strncpy (root, deadbeef->pl_find_meta (conv->convert_items[0], ":URI"), sizeof (root));
+ deadbeef->pl_get_meta (conv->convert_items[0], ":URI", root, sizeof (root));
char *sep = strrchr (root, '/');
if (sep) {
*sep = 0;
@@ -138,6 +143,7 @@ converter_worker (void *ctx) {
// reduce
rootlen = strlen (root);
for (int n = 1; n < conv->convert_items_count; n++) {
+ deadbeef->pl_lock ();
const char *path = deadbeef->pl_find_meta (conv->convert_items[n], ":URI");
if (strncmp (path, root, rootlen)) {
// find where path splits
@@ -156,6 +162,7 @@ converter_worker (void *ctx) {
r++;
}
}
+ deadbeef->pl_unlock ();
}
fprintf (stderr, "common root path: %s\n", root);
}
@@ -164,7 +171,9 @@ converter_worker (void *ctx) {
update_progress_info_t *info = malloc (sizeof (update_progress_info_t));
info->entry = conv->progress_entry;
g_object_ref (info->entry);
+ deadbeef->pl_lock ();
info->text = strdup (deadbeef->pl_find_meta (conv->convert_items[n], ":URI"));
+ deadbeef->pl_unlock ();
g_idle_add (update_progress_cb, info);
char outpath[2000];
@@ -863,6 +872,21 @@ fill_dsp_preset_chain (GtkListStore *mdl) {
}
}
+static int
+listview_get_index (GtkWidget *list) {
+ GtkTreePath *path;
+ GtkTreeViewColumn *col;
+ gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col);
+ if (!path) {
+ // nothing selected
+ return -1;
+ }
+ int *indices = gtk_tree_path_get_indices (path);
+ int idx = *indices;
+ g_free (indices);
+ return idx;
+}
+
void
on_dsp_preset_add_plugin_clicked (GtkButton *button,
gpointer user_data)
@@ -908,8 +932,12 @@ on_dsp_preset_add_plugin_clicked (GtkButton *button,
// reinit list of instances
GtkWidget *list = lookup_widget (toplevel, "plugins");
GtkListStore *mdl = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW(list)));
+ int idx = listview_get_index (list);
gtk_list_store_clear (mdl);
fill_dsp_preset_chain (mdl);
+ GtkTreePath *path = gtk_tree_path_new_from_indices (idx, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, NULL, FALSE);
+ gtk_tree_path_free (path);
}
else {
fprintf (stderr, "converter: failed to add DSP plugin to chain\n");
@@ -982,16 +1010,7 @@ on_dsp_preset_plugin_configure_clicked (GtkButton *button,
{
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
GtkWidget *list = lookup_widget (toplevel, "plugins");
- GtkTreePath *path;
- GtkTreeViewColumn *col;
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col);
- if (!path || !col) {
- // nothing selected
- return;
- }
- int *indices = gtk_tree_path_get_indices (path);
- int idx = *indices;
- g_free (indices);
+ int idx = listview_get_index (list);
if (idx == -1) {
return;
}
@@ -1009,16 +1028,69 @@ on_dsp_preset_plugin_configure_clicked (GtkButton *button,
.layout = p->plugin->configdialog,
.set_param = dsp_ctx_set_param,
.get_param = dsp_ctx_get_param,
+ .parent = toplevel
};
gtkui_plugin->gui.run_dialog (&conf, 0, NULL, NULL);
current_dsp_context = NULL;
}
+static int
+swap_items (GtkWidget *list, int idx) {
+ ddb_dsp_context_t *prev = NULL;
+ ddb_dsp_context_t *p = current_ctx->current_dsp_preset->chain;
+
+ int n = idx;
+ while (n > 0 && p) {
+ prev = p;
+ p = p->next;
+ n--;
+ }
+
+ if (!p || !p->next) {
+ return -1;
+ }
+
+ ddb_dsp_context_t *moved = p->next;
+
+ if (!moved) {
+ return -1;
+ }
+
+ ddb_dsp_context_t *last = moved ? moved->next : NULL;
+
+ if (prev) {
+ p->next = last;
+ prev->next = moved;
+ moved->next = p;
+ }
+ else {
+ p->next = last;
+ current_ctx->current_dsp_preset->chain = moved;
+ moved->next = p;
+ }
+ GtkListStore *mdl = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW(list)));
+ gtk_list_store_clear (mdl);
+ fill_dsp_preset_chain (mdl);
+ return 0;
+}
+
void
on_dsp_preset_plugin_up_clicked (GtkButton *button,
gpointer user_data)
{
+ GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ GtkWidget *list = lookup_widget (toplevel, "plugins");
+ int idx = listview_get_index (list);
+ if (idx <= 0) {
+ return;
+ }
+ if (-1 == swap_items (list, idx-1)) {
+ return;
+ }
+ GtkTreePath *path = gtk_tree_path_new_from_indices (idx-1, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, NULL, FALSE);
+ gtk_tree_path_free (path);
}
@@ -1026,7 +1098,19 @@ void
on_dsp_preset_plugin_down_clicked (GtkButton *button,
gpointer user_data)
{
+ GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ GtkWidget *list = lookup_widget (toplevel, "plugins");
+ int idx = listview_get_index (list);
+ if (idx == -1) {
+ return;
+ }
+ if (-1 == swap_items (list, idx)) {
+ return;
+ }
+ GtkTreePath *path = gtk_tree_path_new_from_indices (idx+1, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, NULL, FALSE);
+ gtk_tree_path_free (path);
}
@@ -1054,6 +1138,9 @@ edit_dsp_preset (const char *title, GtkWidget *toplevel, int overwrite) {
gtk_tree_view_set_model (GTK_TREE_VIEW (list), GTK_TREE_MODEL (mdl));
fill_dsp_preset_chain (mdl);
+ GtkTreePath *path = gtk_tree_path_new_from_indices (0, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (list), path, NULL, FALSE);
+ gtk_tree_path_free (path);
}
for (;;) {
@@ -1312,6 +1399,7 @@ convgui_connect (void) {
}
if (!converter_plugin) {
fprintf (stderr, "convgui: converter plugin not found\n");
+ return -1;
}
if (converter_plugin->misc.plugin.version_major != 1 || converter_plugin->misc.plugin.version_minor < 2) {
fprintf (stderr, "convgui: need converter>=1.2, but found %d.%d\n", converter_plugin->misc.plugin.version_major, converter_plugin->misc.plugin.version_minor);
@@ -1322,20 +1410,20 @@ convgui_connect (void) {
DB_misc_t plugin = {
.plugin.api_vmajor = 1,
- .plugin.api_vminor = 0,
+ .plugin.api_vminor = 4,
.plugin.version_major = 1,
.plugin.version_minor = 1,
.plugin.type = DB_PLUGIN_MISC,
- .plugin.name = "Converter GTK UI",
- .plugin.descr = "GTK2 User interface for the Converter plugin\n"
+#if GTK_CHECK_VERSION(3,0,0)
+ .plugin.name = "Converter GTK3 UI",
+#else
+ .plugin.name = "Converter GTK2 UI",
+#endif
+ .plugin.descr = "GTK User interface for the Converter plugin\n"
"Usage:\n"
"· select some tracks in playlist\n"
"· right click\n"
- "· select «Convert»\n\n"
- "ChangeLog:\n"
- "version 1.1\n"
- " Reload DSP and encoder presets on every converter access\n"
- " Write 0 wave data size into waveheader when using pipe, for oggenc compatibility\n",
+ "· select «Convert»\n",
.plugin.copyright =
"Copyright (C) 2009-2012 Alexey Yakovenko <waker@users.sourceforge.net>\n"
"\n"
diff --git a/plugins/converter/support.c b/plugins/converter/support.c
index 1eef6efc..c0d93fe4 100644
--- a/plugins/converter/support.c
+++ b/plugins/converter/support.c
@@ -145,7 +145,7 @@ glade_set_atk_action_description (AtkAction *action,
#if GTK_CHECK_VERSION(3,0,0)
GtkWidget *
gtk_combo_box_entry_new_text(void) {
- GtkWidget *w = gtk_combo_box_text_new_with_entry ();
+ return gtk_combo_box_text_new_with_entry ();
}
void
@@ -197,7 +197,7 @@ gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box) {
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
void
gtk_widget_set_allocation (GtkWidget *widget, const GtkAllocation *allocation) {
widget->allocation.x = (allocation)->x;
diff --git a/plugins/converter/support.h b/plugins/converter/support.h
index 00e31c0f..2161fb55 100644
--- a/plugins/converter/support.h
+++ b/plugins/converter/support.h
@@ -104,7 +104,7 @@ void gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box, const gchar *t
gchar *gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box);
#endif
-#if !GTK_CHECK_VERSION(2,14,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,14,0)
#define gtk_widget_get_window(widget) ((widget)->window)
#define gtk_selection_data_get_target(data) (data->target)
#define gtk_dialog_get_content_area(dialog) (dialog->vbox)
@@ -116,7 +116,7 @@ gchar *gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box);
#define gtk_adjustment_get_upper(adj) (adj->upper)
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
#define gtk_widget_set_has_window(widget, has_window) \
if (has_window) GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_WINDOW); \
else GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
@@ -127,7 +127,7 @@ void gtk_widget_set_window(GtkWidget *widget, GdkWindow *window);
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
void gtk_widget_set_allocation (GtkWidget *widget,
const GtkAllocation *allocation);
diff --git a/plugins/dca/dcaplug.c b/plugins/dca/dcaplug.c
index 85a04df6..dd37d064 100644
--- a/plugins/dca/dcaplug.c
+++ b/plugins/dca/dcaplug.c
@@ -405,7 +405,9 @@ static int
dts_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
ddb_dca_state_t *info = (ddb_dca_state_t *)_info;
+ deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->file) {
trace ("dca: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
diff --git a/plugins/dsp_libsrc/src.c b/plugins/dsp_libsrc/src.c
index 8544343a..826606af 100644
--- a/plugins/dsp_libsrc/src.c
+++ b/plugins/dsp_libsrc/src.c
@@ -108,6 +108,9 @@ ddb_src_process (ddb_dsp_context_t *_src, float *samples, int nframes, int maxfr
float samplerate = src->samplerate;
if (src->autosamplerate) {
DB_output_t *output = deadbeef->get_output ();
+ if (output->fmt.samplerate <= 0) {
+ return -1;
+ }
samplerate = output->fmt.samplerate;
}
@@ -268,8 +271,8 @@ ddb_src_get_param (ddb_dsp_context_t *ctx, int p, char *val, int sz) {
static const char settings_dlg[] =
"property \"Automatic Samplerate (overrides Target Samplerate)\" checkbox 2 0;\n"
- "property \"Target Samplerate\" spinbtn[8192,192000,1] 0 48000;\n"
- "property \"Quality / Algorythm\" select[5] 1 2 SINC_BEST_QUALITY SINC_MEDIUM_QUALITY SINC_FASTEST ZERO_ORDER_HOLD LINEAR;\n"
+ "property \"Target Samplerate\" spinbtn[8000,192000,1] 0 48000;\n"
+ "property \"Quality / Algorithm\" select[5] 1 2 SINC_BEST_QUALITY SINC_MEDIUM_QUALITY SINC_FASTEST ZERO_ORDER_HOLD LINEAR;\n"
;
static DB_dsp_t plugin = {
diff --git a/plugins/dumb/cdumb.c b/plugins/dumb/cdumb.c
index 26e6fa69..63fb4b18 100644
--- a/plugins/dumb/cdumb.c
+++ b/plugins/dumb/cdumb.c
@@ -64,13 +64,18 @@ cdumb_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
int start_order = 0;
int is_dos, is_it;
- const char *ext = deadbeef->pl_find_meta (it, ":URI") + strlen (deadbeef->pl_find_meta (it, ":URI")) - 1;
- while (*ext != '.' && ext > deadbeef->pl_find_meta (it, ":URI")) {
- ext--;
+ deadbeef->pl_lock ();
+ {
+ const char *uri = deadbeef->pl_find_meta (it, ":URI");
+ const char *ext = uri + strlen (uri) - 1;
+ while (*ext != '.' && ext > uri) {
+ ext--;
+ }
+ ext++;
+ const char *ftype;
+ info->duh = open_module (uri, ext, &start_order, &is_it, &is_dos, &ftype);
}
- ext++;
- const char *ftype;
- info->duh = open_module(deadbeef->pl_find_meta (it, ":URI"), ext, &start_order, &is_it, &is_dos, &ftype);
+ deadbeef->pl_unlock ();
dumb_it_do_initial_runthrough (info->duh);
@@ -766,19 +771,25 @@ read_metadata_internal (DB_playItem_t *it, DUMB_IT_SIGDATA *itsd) {
static int
cdumb_read_metadata (DB_playItem_t *it) {
- const char *fname = deadbeef->pl_find_meta (it, ":URI");
- const char *ext = strrchr (fname, '.');
- if (ext) {
- ext++;
- }
- else {
- ext = "";
- }
+ DUH* duh = NULL;
int start_order = 0;
int is_it;
int is_dos;
const char *ftype;
- DUH* duh = open_module(fname, ext, &start_order, &is_it, &is_dos, &ftype);
+
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+ const char *ext = strrchr (fname, '.');
+ if (ext) {
+ ext++;
+ }
+ else {
+ ext = "";
+ }
+ duh = open_module(fname, ext, &start_order, &is_it, &is_dos, &ftype);
+ }
+ deadbeef->pl_unlock ();
if (!duh) {
unload_duh (duh);
return -1;
diff --git a/plugins/dumb/dumb-kode54/src/it/itread.c b/plugins/dumb/dumb-kode54/src/it/itread.c
index 7170a57f..37557378 100644
--- a/plugins/dumb/dumb-kode54/src/it/itread.c
+++ b/plugins/dumb/dumb-kode54/src/it/itread.c
@@ -19,12 +19,11 @@
#include <stdlib.h>
#include <string.h>//might not be necessary later; required for memset
+#include <stdint.h>
#include "dumb.h"
#include "internal/it.h"
-
-
#define INVESTIGATE_OLD_INSTRUMENTS
@@ -43,11 +42,9 @@ static int it_seek(DUMBFILE *f, long offset)
return 0;
}
-
-
typedef unsigned char byte;
-typedef unsigned short word;
-typedef unsigned long dword;
+typedef uint16_t word;
+typedef uint32_t dword;
typedef struct readblock_crap readblock_crap;
@@ -126,8 +123,8 @@ static int decompress8(DUMBFILE *f, signed char *data, int len, int cmwt)
{
int blocklen, blockpos;
byte bitwidth;
- word val;
- char d1, d2;
+ long val;
+ signed char d1, d2;
readblock_crap crap;
memset(&crap, 0, sizeof(crap));
@@ -146,12 +143,12 @@ static int decompress8(DUMBFILE *f, signed char *data, int len, int cmwt)
//Start the decompression:
while (blockpos < blocklen) {
//Read a value:
- val = (word)readbits(bitwidth, &crap);
+ val = readbits(bitwidth, &crap);
//Check for bit width change:
if (bitwidth < 7) { //Method 1:
if (val == (1 << (bitwidth - 1))) {
- val = (word)readbits(3, &crap) + 1;
+ val = readbits(3, &crap) + 1;
bitwidth = (val < bitwidth) ? val : val + 1;
continue;
}
@@ -178,14 +175,14 @@ static int decompress8(DUMBFILE *f, signed char *data, int len, int cmwt)
//Expand the value to signed byte:
{
- char v; //The sample value:
+ signed char v; //The sample value:
if (bitwidth < 8) {
byte shift = 8 - bitwidth;
v = (val << shift);
v >>= shift;
}
else
- v = (char)val;
+ v = (signed char)val;
//And integrate the sample value
//(It always has to end with integration doesn't it ? ;-)
@@ -670,7 +667,7 @@ static long it_read_sample_data(int cmwt, IT_SAMPLE *sample, unsigned char conve
long datasize = sample->length;
if (sample->flags & IT_SAMPLE_STEREO) datasize <<= 1;
- sample->data = malloc(datasize * (sample->flags & IT_SAMPLE_16BIT ? 2 : 1));
+ sample->data = malloc(datasize * ((sample->flags & IT_SAMPLE_16BIT) ? 2 : 1));
if (!sample->data)
return -1;
@@ -692,8 +689,9 @@ static long it_read_sample_data(int cmwt, IT_SAMPLE *sample, unsigned char conve
*/
if (sample->flags & IT_SAMPLE_16BIT)
decompress16(f, sample->data, datasize, ((cmwt >= 0x215) && (convert & 4)));
- else
+ else {
decompress8(f, sample->data, datasize, ((cmwt >= 0x215) && (convert & 4)));
+ }
} else if (sample->flags & IT_SAMPLE_16BIT) {
if (convert & 2)
for (n = 0; n < datasize; n++)
diff --git a/plugins/dumb/dumb-kode54/src/it/itrender.c b/plugins/dumb/dumb-kode54/src/it/itrender.c
index b69bb765..06aba111 100644
--- a/plugins/dumb/dumb-kode54/src/it/itrender.c
+++ b/plugins/dumb/dumb-kode54/src/it/itrender.c
@@ -17,6 +17,10 @@
* \__/
*/
+#ifdef HAVE_CONFIG_H
+#include "../../../../../config.h"
+#endif
+
#include <math.h>
#include <stdlib.h>
@@ -3558,8 +3562,8 @@ static void process_playing(DUMB_IT_SIGRENDERER *sigrenderer, IT_PLAYING *playin
playing->sample_vibrato_time += playing->sample->vibrato_speed;
}
-#if !(_XOPEN_SOURCE >= 600 || _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L)
-static inline float log2(float x) {return (float)log(x)/(float)log(2.0f);}
+#ifndef HAVE_LOG2
+static inline float log2(float x) {return (float)log(x)/M_LN2;}
#endif
static int delta_to_note(float delta, int base)
diff --git a/plugins/ffap/ffap.c b/plugins/ffap/ffap.c
index c2ba7cbd..d8fb4044 100644
--- a/plugins/ffap/ffap.c
+++ b/plugins/ffap/ffap.c
@@ -690,7 +690,9 @@ ffap_init (DB_fileinfo_t *_info, DB_playItem_t *it)
{
ape_info_t *info = (ape_info_t*)_info;
+ deadbeef->pl_lock ();
info->fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->fp) {
return -1;
}
@@ -1812,7 +1814,9 @@ ffap_seek (DB_fileinfo_t *_info, float seconds) {
static int ffap_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
diff --git a/plugins/ffmpeg/ffmpeg.c b/plugins/ffmpeg/ffmpeg.c
index 9cf6e0c5..98561aa3 100644
--- a/plugins/ffmpeg/ffmpeg.c
+++ b/plugins/ffmpeg/ffmpeg.c
@@ -51,6 +51,11 @@
#endif
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+#error FFMPEG-0.11 and higher is unsupported. please downgrade to an older FFMPEG version, or configure deadbeef with --disable-ffmpeg flag
+//#define av_get_bits_per_sample_format av_get_bits_per_sample_fmt
+#else
+
//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
#define trace(fmt,...)
@@ -60,7 +65,7 @@
static DB_decoder_t plugin;
static DB_functions_t *deadbeef;
-#define DEFAULT_EXTS "m4a;wma;aa3;oma;ac3;vqf;amr"
+#define DEFAULT_EXTS "wma;aa3;oma;ac3;vqf;amr"
#define EXT_MAX 100
@@ -78,7 +83,9 @@ enum {
FT_UNKNOWN = 5
};
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(54, 6, 0)
#define FF_PROTOCOL_NAME "deadbeef"
+#endif
typedef struct {
DB_fileinfo_t info;
@@ -117,22 +124,38 @@ ffmpeg_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
// return -1 on failure
int ret;
- int l = strlen (deadbeef->pl_find_meta (it, ":URI"));
- char *uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
+ char *uri = NULL;
int i;
- // construct uri
- memcpy (uri, FF_PROTOCOL_NAME, sizeof (FF_PROTOCOL_NAME)-1);
- memcpy (uri + sizeof (FF_PROTOCOL_NAME)-1, ":", 1);
- memcpy (uri + sizeof (FF_PROTOCOL_NAME), deadbeef->pl_find_meta (it, ":URI"), l);
- uri[sizeof (FF_PROTOCOL_NAME) + l] = 0;
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ uri = strdupa (fname);
+#else
+ int l = strlen (fname);
+ uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
+
+ // construct uri
+ memcpy (uri, FF_PROTOCOL_NAME, sizeof (FF_PROTOCOL_NAME)-1);
+ memcpy (uri + sizeof (FF_PROTOCOL_NAME)-1, ":", 1);
+ memcpy (uri + sizeof (FF_PROTOCOL_NAME), fname, l);
+ uri[sizeof (FF_PROTOCOL_NAME) + l] = 0;
+#endif
+ }
+ deadbeef->pl_unlock ();
trace ("ffmpeg: uri: %s\n", uri);
// open file
trace ("\033[0;31mffmpeg av_open_input_file\033[37;0m\n");
current_track = it;
current_info = _info;
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ info->fctx = avformat_alloc_context ();
+ if ((ret = avformat_open_input(&info->fctx, uri, NULL, NULL)) < 0) {
+#else
if ((ret = av_open_input_file(&info->fctx, uri, NULL, 0, NULL)) < 0) {
+#endif
current_track = NULL;
trace ("\033[0;31minfo->fctx is %p, ret %d/%s\033[0;31m\n", info->fctx, ret, strerror(-ret));
return -1;
@@ -452,8 +475,7 @@ ffmpeg_read_metadata_internal (DB_playItem_t *it, AVFormatContext *fctx) {
snprintf (tmp, sizeof (tmp), "%d", fctx->track);
deadbeef->pl_add_meta (it, "track", tmp);
#else
-// read using other means?
-// av_metadata_get?
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54,23,0)
AVMetadata *md = fctx->metadata;
for (int m = 0; map[m]; m += 2) {
@@ -465,7 +487,23 @@ ffmpeg_read_metadata_internal (DB_playItem_t *it, AVFormatContext *fctx) {
}
} while (tag);
}
- deadbeef->pl_add_meta (it, "title", NULL);
+#else
+ // ffmpeg-0.11 new metadata format
+ AVDictionary *md = fctx->metadata;
+ AVDictionaryEntry *t = NULL;
+ while (t = av_dict_get (md, "", t, AV_DICT_IGNORE_SUFFIX)) {
+ int m;
+ for (m = 0; map[m]; m += 2) {
+ if (!strcasecmp (t->key, map[m])) {
+ deadbeef->pl_append_meta (it, map[m+1], t->value);
+ break;
+ }
+ }
+ if (!map[m]) {
+ deadbeef->pl_append_meta (it, t->key, t->value);
+ }
+ }
+#endif
#endif
return 0;
}
@@ -484,26 +522,50 @@ ffmpeg_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
AVFormatContext *fctx = NULL;
int ret;
int l = strlen (fname);
- char *uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
+ char *uri = NULL;
int i;
// construct uri
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ uri = strdupa (fname);
+#else
+ uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
memcpy (uri, FF_PROTOCOL_NAME, sizeof (FF_PROTOCOL_NAME)-1);
memcpy (uri + sizeof (FF_PROTOCOL_NAME)-1, ":", 1);
memcpy (uri + sizeof (FF_PROTOCOL_NAME), fname, l);
uri[sizeof (FF_PROTOCOL_NAME) + l] = 0;
+#endif
trace ("ffmpeg: uri: %s\n", uri);
// open file
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ fctx = avformat_alloc_context ();
+ if ((ret = avformat_open_input(&fctx, uri, NULL, NULL)) < 0) {
+#else
if ((ret = av_open_input_file(&fctx, uri, NULL, 0, NULL)) < 0) {
+#endif
trace ("fctx is %p, ret %d/%s", fctx, ret, strerror(-ret));
return NULL;
}
+ trace ("fctx is %p, ret %d/%s\n", fctx, ret, strerror(-ret));
fctx->max_analyze_duration = FFMPEG_MAX_ANALYZE_DURATION;
- av_find_stream_info(fctx);
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ int nb_streams = fctx->nb_streams;
+ ret = avformat_find_stream_info(fctx, NULL);
+#else
+ ret = av_find_stream_info(fctx);
+ int nb_streams = fctx->nb_streams;
+#endif
+ if (ret < 0) {
+ trace ("av_find_stream_info ret: %d/%s\n", ret, strerror(-ret));
+ }
+ trace ("nb_streams=%x\n", nb_streams);
for (i = 0; i < fctx->nb_streams; i++)
{
+ if (!fctx->streams[i]) {
+ continue;
+ }
ctx = fctx->streams[i]->codec;
if (ctx->codec_type ==
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 64, 0)
@@ -548,7 +610,7 @@ ffmpeg_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id);
deadbeef->pl_replace_meta (it, ":FILETYPE", codec->name);
- if (!deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI"))) {
+ if (!deadbeef->is_local_file (fname)) {
deadbeef->plt_set_item_duration (plt, it, -1);
}
else {
@@ -560,7 +622,7 @@ ffmpeg_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
int64_t fsize = -1;
- DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ DB_FILE *fp = deadbeef->fopen (fname);
if (fp) {
if (!fp->vfs->is_streaming ()) {
fsize = deadbeef->fgetlength (fp);
@@ -600,15 +662,20 @@ ffmpeg_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
return after;
}
-// vfs wrapper for ffmpeg
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(54, 6, 0)
+// vfs wrapper for ffmpeg, can't only be done with ffmpeg<0.11
static int
ffmpeg_vfs_open(URLContext *h, const char *filename, int flags)
{
DB_FILE *f;
av_strstart(filename, FF_PROTOCOL_NAME ":", &filename);
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(54, 6, 0)
if (flags & URL_WRONLY) {
return -ENOENT;
- } else {
+ }
+ else
+#endif
+ {
f = deadbeef->fopen (filename);
}
@@ -674,6 +741,7 @@ static URLProtocol vfswrapper = {
.url_seek = ffmpeg_vfs_seek,
.url_close = ffmpeg_vfs_close,
};
+#endif
static void
ffmpeg_init_exts (void) {
@@ -722,9 +790,15 @@ ffmpeg_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
static int
ffmpeg_start (void) {
ffmpeg_init_exts ();
- avcodec_init ();
+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(54, 6, 0)
+ avcodec_register_all ();
+#endif
av_register_all ();
-#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52, 69, 0)
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+#warning FFMPEG-0.11 is no longer exposing register_protocol API, which means that it cant work with MMS and HTTP plugins. if you need this functionality, please downgrade FFMPEG, and rebuild the FFMPEG plugin
+// ffurl_register_protocol(&vfswrapper, sizeof(vfswrapper));
+ avformat_network_init ();
+#elif LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(52, 69, 0)
av_register_protocol2 (&vfswrapper, sizeof(vfswrapper));
#else
av_register_protocol (&vfswrapper);
@@ -748,19 +822,35 @@ ffmpeg_read_metadata (DB_playItem_t *it) {
AVCodecContext *ctx = NULL;
AVFormatContext *fctx = NULL;
int ret;
- int l = strlen (deadbeef->pl_find_meta (it, ":URI"));
- char *uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
+ char *uri = NULL;
int i;
- // construct uri
- memcpy (uri, FF_PROTOCOL_NAME, sizeof (FF_PROTOCOL_NAME)-1);
- memcpy (uri + sizeof (FF_PROTOCOL_NAME)-1, ":", 1);
- memcpy (uri + sizeof (FF_PROTOCOL_NAME), deadbeef->pl_find_meta (it, ":URI"), l);
- uri[sizeof (FF_PROTOCOL_NAME) + l] = 0;
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ uri = strdupa (fname);
+#else
+ int l = strlen (fname);
+ uri = alloca (l + sizeof (FF_PROTOCOL_NAME) + 1);
+
+ // construct uri
+ memcpy (uri, FF_PROTOCOL_NAME, sizeof (FF_PROTOCOL_NAME)-1);
+ memcpy (uri + sizeof (FF_PROTOCOL_NAME)-1, ":", 1);
+ memcpy (uri + sizeof (FF_PROTOCOL_NAME), fname, l);
+ uri[sizeof (FF_PROTOCOL_NAME) + l] = 0;
+#endif
+ }
+ deadbeef->pl_unlock ();
trace ("ffmpeg: uri: %s\n", uri);
// open file
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(54, 6, 0)
+ fctx = avformat_alloc_context ();
+ if ((ret = avformat_open_input(&fctx, uri, NULL, NULL)) < 0) {
+#else
if ((ret = av_open_input_file(&fctx, uri, NULL, 0, NULL)) < 0) {
+#endif
trace ("fctx is %p, ret %d/%s", fctx, ret, strerror(-ret));
return -1;
}
@@ -853,3 +943,4 @@ ffmpeg_load (DB_functions_t *api) {
return DB_PLUGIN (&plugin);
}
+#endif
diff --git a/plugins/flac/flac.c b/plugins/flac/flac.c
index a6ceb497..02d17ecc 100644
--- a/plugins/flac/flac.c
+++ b/plugins/flac/flac.c
@@ -211,7 +211,9 @@ cflac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("cflac_init %s\n", deadbeef->pl_find_meta (it, ":URI"));
flac_info_t *info = (flac_info_t *)_info;
+ deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->file) {
trace ("cflac_init failed to open file\n");
return -1;
@@ -219,16 +221,17 @@ cflac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->flac_critical_error = 0;
- const char *ext = deadbeef->pl_find_meta (it, ":URI") + strlen (deadbeef->pl_find_meta (it, ":URI"));
- while (ext > deadbeef->pl_find_meta (it, ":URI") && *ext != '/' && *ext != '.') {
- ext--;
- }
- if (*ext == '.') {
- ext++;
- }
- else {
- ext = NULL;
+ const char *ext = NULL;
+
+ deadbeef->pl_lock ();
+ {
+ const char *uri = deadbeef->pl_find_meta (it, ":URI");
+ ext = strrchr (uri, '.');
+ if (ext) {
+ ext++;
+ }
}
+ deadbeef->pl_unlock ();
int isogg = 0;
int skip = 0;
@@ -307,13 +310,17 @@ cflac_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
else {
info->bitrate = -1;
}
- const char *channelmask = deadbeef->pl_find_meta (it, "WAVEFORMAT_EXTENSIBLE_CHANNELMASK");
- if (channelmask) {
- uint32_t cm = 0;
- if (1 == sscanf (channelmask, "0x%X", &cm)) {
- _info->fmt.channelmask = cm;
+ deadbeef->pl_lock ();
+ {
+ const char *channelmask = deadbeef->pl_find_meta (it, "WAVEFORMAT_EXTENSIBLE_CHANNELMASK");
+ if (channelmask) {
+ uint32_t cm = 0;
+ if (1 == sscanf (channelmask, "0x%X", &cm)) {
+ _info->fmt.channelmask = cm;
+ }
}
}
+ deadbeef->pl_unlock ();
info->buffer = malloc (BUFFERSIZE);
info->remaining = 0;
@@ -730,15 +737,20 @@ cflac_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
}
// try embedded cue
- const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
- if (cuesheet) {
- DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), info.totalsamples, info.info.fmt.samplerate);
- if (last) {
- deadbeef->pl_item_unref (it);
- deadbeef->pl_item_unref (last);
- return last;
+ deadbeef->pl_lock ();
+ {
+ const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
+ if (cuesheet) {
+ DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), info.totalsamples, info.info.fmt.samplerate);
+ if (last) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (last);
+ deadbeef->pl_unlock ();
+ return last;
+ }
}
}
+ deadbeef->pl_unlock ();
// try external cue
DB_playItem_t *cue_after = deadbeef->plt_insert_cue (plt, after, it, info.totalsamples, info.info.fmt.samplerate);
@@ -781,7 +793,9 @@ cflac_read_metadata (DB_playItem_t *it) {
trace ("cflac_read_metadata: FLAC__metadata_chain_new failed\n");
return -1;
}
+ deadbeef->pl_lock ();
FLAC__bool res = FLAC__metadata_chain_read (chain, deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!res) {
trace ("cflac_read_metadata: FLAC__metadata_chain_read failed\n");
goto error;
@@ -846,7 +860,9 @@ cflac_write_metadata (DB_playItem_t *it) {
trace ("cflac_write_metadata: FLAC__metadata_chain_new failed\n");
return -1;
}
+ deadbeef->pl_lock ();
FLAC__bool res = FLAC__metadata_chain_read (chain, deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!res) {
trace ("cflac_write_metadata: FLAC__metadata_chain_read failed\n");
goto error;
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/Makefile.am b/plugins/gme/Game_Music_Emu-0.5.2/Makefile.am
deleted file mode 100644
index 49e0b8b8..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/Makefile.am
+++ /dev/null
@@ -1,3 +0,0 @@
-EXTRA_DIST = changes.txt design.txt gme.txt license.txt readme.txt
-
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/changes.txt b/plugins/gme/Game_Music_Emu-0.5.2/changes.txt
deleted file mode 100644
index 0405b590..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/changes.txt
+++ /dev/null
@@ -1,218 +0,0 @@
-Game_Music_Emu Change Log
--------------------------
-
-Game_Music_Emu 0.5.2
---------------------
-- *TONS* of changes and improvements. You should re-read the new header
-files and documentation as the changes will allow you to simplify your
-code a lot (it might even be simpler to just rewrite it). Existing code
-should continue to work without changes in most cases (see Deprecated
-features in gme.txt).
-
-- New file formats: AY, HES, KSS, SAP, NSFE
-
-- All-new comprehensive C interface (also usable from C++). Simplifies
-many things, especially file loading, and brings everything together in
-one header file (gme.h).
-
-- Information tags and track names and times can be accessed for all
-game music formats
-
-- New features supported by all emulators: end of track fading,
-automatic silence detection, adjustable song tempo, seek to new time in
-track
-
-- Updated mini player example to support track names and times, echo,
-tempo, and channel muting, and added visual waveform display
-
-- Improved configuration to use blargg_config.h, which you can modify
-and keep when you update to a newer libary version. Includes flag for
-library to automatically handle gzipped files using zlib (so you don't
-need to use Gzip_File_Reader anymore).
-
-- GBS: Fixed wave channel to not reset waveform when APU is powered off
-(affected Garfield). Also improved invalid bank selection (affected Game
-& Watch and others).
-
-- VGM: Added support for alternate noise shifter register
-configurations, used by other systems like the BBC Micro.
-
-- SPC: Removed IPL ROM dump from emulator, as none of the SPC files I
-scanned needed it, and an SPC file can include a copy if necessary. Also
-re-enabled supposed clamping in gaussian interpolation between the third
-and fourth lookups, though I don't know whether it matters
-
-- Added Music_Emu::load_mem() to use music data already in memory
-(without copying it)
-
-- Added Music_Emu::warning(), which reports minor problems when loading
-and playing a music file
-
-- Added Music_Emu::set_gain() for uniform adjustment of gain. Can only
-be set during initialization, so not useful as a general volume control.
-
-- Added custom operator new to ensure that no exceptions are thrown in
-the library (I'd use std::nothrow if it were part of pre-ISO (ARM) C++)
-
-- Added BLIP_BUFFER_FAST flag to blargg_config.h to use a lower quality
-bandlimited synthesis in "classic" emulators, which might help
-performance on ancient processors (measure first!). Don't use this
-unless absolutely necessary, as quality suffers.
-
-- Improved performance a bit for x86 platforms
-
-- Text files now in DOS newline format so they will open in Notepad
-properly
-
-- Removed requirement that file header structures not have any padding
-added to the end
-
-- Fixed common bug in all CPU emulators where negative program counter
-could crash emulator (occurred during a negative branch from the
-beginning of memory). Also fixed related bug in Z80 emulator for
-IX/IY+displacement mode.
-
-- Eliminated all warnings when compiling on gcc 4.0. The following
-generates no diagnostics:
-
- gcc -S gme/*.cpp -o /dev/null -ansi -fno-gnu-keywords
- -fno-nonansi-builtins -pedantic -W -Wabi -Wall -Wcast-align
- -Wcast-qual -Wchar-subscripts -Wdisabled-optimization -Werror
- -Winline -Wlong-long -Wmultichar -Winvalid-offsetof
- -Wnon-virtual-dtor -Woverloaded-virtual -Wparentheses
- -Wpointer-arith -Wredundant-decls -Wreorder -Wsign-compare
- -Wsign-promo -Wunknown-pragmas -Wwrite-strings
-
-
-Game_Music_Emu 0.3.0
---------------------
-- Added more demos, including music player using the SDL multimedia
-library for sound, and improved documentation
-
-- All: Improved interface to emulators to allow simpler setup and
-loading. Instead of various init() functions, all now support
-set_sample_rate( long rate ) and load( const char* file_path ).
-
-- All: Removed error return from start_track() and play(), and added
-error_count() to get the total number of emulation errors since the
-track was last started. See demos for examples of new usage.
-
-- All: Fixed mute_voices() muting to be preserved after loading files
-and starting tracks, instead of being cleared as it was whenever a track
-was started
-
-- VGM: Rewrote Vgm_Emu to support Sega Genesis/Mega Drive FM sound at
-any sample rate with optional FM oversampling, support for alternate
-YM2612 sound cores, and support for optional YM2413
-
-- VGM: Added tempo control, useful for slowing 60Hz NTSC Sega Genesis
-music to 50Hz PAL
-
-- VGM: Removed Vgm_Emu::track_data(), since I realized that this
-information is already present in the VGM header (oops!)
-
-- GYM: Changed Gym_Emu::track_length() operation (see Gym_Emu.h)
-
-- NSF: Added support for Sunsoft FME-7 sound chip used by Gimmick
-soundtrack
-
-- NSF: Fixed Namco 106 problems with Final Lap and others
-
-- Moved library sources to gme/ directory to reduce clutter, and merged
-boost/ functionality into blargg_common.h
-
-- Added Gzip_File_Reader for transparently using gzipped files
-
-
-Game_Music_Emu 0.2.4
---------------------
-- Created a discussion forum for problems and feedback:
-http://groups-beta.google.com/group/blargg-sound-libs
-
-- Changed error return value of Blip_Buffer::sample_rate() (also for
-Stereo_Buffer, Effects_Buffer, etc.) to blargg_err_t (defined in
-blargg_common.h), to make error reporting consistent with other
-functions. This means the "no error" return value is the opposite of
-what it was before, which will break current code which checks the error
-return value:
-
- // current code (broken)
- if ( !buf.sample_rate( samples_per_sec ) )
- out_of_memory();
-
- // quick-and-dirty fix (just remove the ! operation)
- if ( buf.sample_rate( samples_per_sec ) )
- out_of_memory();
-
- // proper fix
- blargg_err_t error = buf.sample_rate( samples_per_sec );
- if ( error )
- report_error( error );
-
-- Implemented workaround for MSVC++ 6 compiler limitations, allowing it
-to work on that compiler again
-
-- Added sample clamping to avoid wrap-around at high volumes, allowing
-higher volume with little distortion
-
-- Added to-do list and design notes
-
-- Added Music_Emu::skip( long sample_count ) to skip ahead in current
-track
-
-- Added Gym_Emu::track_length() and Vgm_Emu::track_length() for
-determining the length of non-looped GYM and VGM files
-
-- Partially implemented DMC non-linearity when its value is directly set
-using $4011, which reduces previously over-emphasized "popping" of
-percussion on some games (TMNT II in particular)
-
-- Fixed Fir_Resampler, used for SPC and GYM playback (was incorrectly
-using abs() instead of fabs()...argh)
-
-- Fixed SPC emulation bugs: eliminated clicks in Plok! soundtrack and
-now stops sample slightly earlier than the end, as the SNES does. Fixed
-a totally broken CPU addressing mode.
-
-- Fixed Konami VRC6 saw wave (was very broken before). Now VRC6 music
-sounds decent
-
-- Fixed a minor GBS emulation bug
-
-- Fixed GYM loop point bug when track was restarted before loop point
-had been reached
-
-- Made default GBS frequency equalization less muffled
-
-- Added pseudo-surround effect removal for SPC files
-
-- Added Music_Emu::voice_names() which returns names for each voice.
-
-- Added BLARGG_SOURCE_BEGIN which allows custom compiler options to be
-easily set for library sources
-
-- Changed assignment of expansion sound chips in Nsf_Emu to be spread
-more evenly when using Effects_Buffer
-
-- Changed 'size_t' values in Blip_Buffer interface to 'long'
-
-- Changed demo to generate a WAVE sound file rather than an AIFF file
-
-
-Game_Music_Emu 0.2.0
---------------------
-- Redid framework and rewrote/cleaned up emulators
-
-- Changed licensing to GNU Lesser General Public License (LGPL)
-
-- Added Sega Genesis GYM and Super Nintendo SPC emulators
-
-- Added Namco-106 and Konami VRC6 sound chip support to NSF emulator
-
-- Eliminated use of static mutable data in emulators, allowing
-multi-instance safety
-
-
-Game_Music_Emu 0.1.0
---------------------
-- First release
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.cpp b/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.cpp
deleted file mode 100644
index ec40959d..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Wave_Writer.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-/* Copyright (C) 2003-2006 by Shay Green. Permission is hereby granted, free
-of charge, to any person obtaining a copy of this software and associated
-documentation files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-to permit persons to whom the Software is furnished to do so, subject to the
-following conditions: The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software. THE
-SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-const int header_size = 0x2C;
-
-static void exit_with_error( const char* str )
-{
- printf( "Error: %s\n", str ); getchar();
- exit( EXIT_FAILURE );
-}
-
-Wave_Writer::Wave_Writer( long sample_rate, const char* filename )
-{
- sample_count_ = 0;
- rate = sample_rate;
- buf_pos = header_size;
- chan_count = 1;
-
- buf = (unsigned char*) malloc( buf_size * sizeof *buf );
- if ( !buf )
- exit_with_error( "Out of memory" );
-
- file = fopen( filename, "wb" );
- if ( !file )
- exit_with_error( "Couldn't open WAVE file for writing" );
-
- setvbuf( file, 0, _IOFBF, 32 * 1024L );
-}
-
-void Wave_Writer::flush()
-{
- if ( buf_pos && !fwrite( buf, buf_pos, 1, file ) )
- exit_with_error( "Couldn't write WAVE data" );
- buf_pos = 0;
-}
-
-void Wave_Writer::write( const sample_t* in, long remain, int skip )
-{
- sample_count_ += remain;
- while ( remain )
- {
- if ( buf_pos >= buf_size )
- flush();
-
- long n = (buf_size - buf_pos) / sizeof (sample_t);
- if ( n > remain )
- n = remain;
- remain -= n;
-
- // convert to lsb first format
- unsigned char* p = &buf [buf_pos];
- while ( n-- )
- {
- int s = *in;
- in += skip;
- *p++ = (unsigned char) s;
- *p++ = (unsigned char) (s >> 8);
- }
-
- buf_pos = p - buf;
- assert( buf_pos <= buf_size );
- }
-}
-
-
-void Wave_Writer::write( const float* in, long remain, int skip )
-{
- sample_count_ += remain;
- while ( remain )
- {
- if ( buf_pos >= buf_size )
- flush();
-
- long n = (buf_size - buf_pos) / sizeof (sample_t);
- if ( n > remain )
- n = remain;
- remain -= n;
-
- // convert to lsb first format
- unsigned char* p = &buf [buf_pos];
- while ( n-- )
- {
- long s = (long) (*in * 0x7FFF);
- in += skip;
- if ( (short) s != s )
- s = 0x7FFF - (s >> 24); // clamp to 16 bits
- *p++ = (unsigned char) s;
- *p++ = (unsigned char) (s >> 8);
- }
-
- buf_pos = p - buf;
- assert( buf_pos <= buf_size );
- }
-}
-
-void Wave_Writer::close()
-{
- if ( file )
- {
- flush();
-
- // generate header
- long ds = sample_count_ * sizeof (sample_t);
- long rs = header_size - 8 + ds;
- int frame_size = chan_count * sizeof (sample_t);
- long bps = rate * frame_size;
- unsigned char header [header_size] =
- {
- 'R','I','F','F',
- rs,rs>>8, // length of rest of file
- rs>>16,rs>>24,
- 'W','A','V','E',
- 'f','m','t',' ',
- 0x10,0,0,0, // size of fmt chunk
- 1,0, // uncompressed format
- chan_count,0, // channel count
- rate,rate >> 8, // sample rate
- rate>>16,rate>>24,
- bps,bps>>8, // bytes per second
- bps>>16,bps>>24,
- frame_size,0, // bytes per sample frame
- 16,0, // bits per sample
- 'd','a','t','a',
- ds,ds>>8,ds>>16,ds>>24// size of sample data
- // ... // sample data
- };
-
- // write header
- fseek( file, 0, SEEK_SET );
- fwrite( header, sizeof header, 1, file );
-
- fclose( file );
- file = 0;
- free( buf );
- }
-}
-
-Wave_Writer::~Wave_Writer()
-{
- close();
-}
-
-// C interface
-
-static Wave_Writer* ww;
-
-void wave_open( long sample_rate, const char* filename )
-{
- ww = new Wave_Writer( sample_rate, filename );
- assert( ww );
-}
-
-void wave_enable_stereo() { ww->enable_stereo(); }
-
-long wave_sample_count() { return ww->sample_count(); }
-
-void wave_write( const short* buf, long count ) { ww->write( buf, count ); }
-
-void wave_close()
-{
- delete ww;
- ww = 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.h b/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.h
deleted file mode 100644
index da08cc2a..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/demo/Wave_Writer.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* WAVE sound file writer for recording 16-bit output during program development */
-
-#ifndef WAVE_WRITER_H
-#define WAVE_WRITER_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* C interface */
-void wave_open( long sample_rate, const char* filename );
-void wave_enable_stereo( void );
-void wave_write( const short* buf, long count );
-long wave_sample_count( void );
-void wave_close( void );
-
-#ifdef __cplusplus
- }
-#endif
-
-#ifdef __cplusplus
-#include <stddef.h>
-#include <stdio.h>
-
-/* C++ interface */
-class Wave_Writer {
-public:
- typedef short sample_t;
-
- // Create sound file with given sample rate (in Hz) and filename.
- // Exits program if there's an error.
- Wave_Writer( long sample_rate, char const* filename = "out.wav" );
-
- // Enable stereo output
- void enable_stereo();
-
- // Append 'count' samples to file. Use every 'skip'th source sample; allows
- // one channel of stereo sample pairs to be written by specifying a skip of 2.
- void write( const sample_t*, long count, int skip = 1 );
-
- // Append 'count' floating-point samples to file. Use every 'skip'th source sample;
- // allows one channel of stereo sample pairs to be written by specifying a skip of 2.
- void write( const float*, long count, int skip = 1 );
-
- // Number of samples written so far
- long sample_count() const;
-
- // Finish writing sound file and close it
- void close();
-
- ~Wave_Writer();
-public:
- // Deprecated
- void stereo( bool b ) { chan_count = b ? 2 : 1; }
-private:
- enum { buf_size = 32768 * 2 };
- unsigned char* buf;
- FILE* file;
- long sample_count_;
- long rate;
- long buf_pos;
- int chan_count;
-
- void flush();
-};
-
-inline void Wave_Writer::enable_stereo() { chan_count = 2; }
-
-inline long Wave_Writer::sample_count() const { return sample_count_; }
-
-#endif
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/basics.c b/plugins/gme/Game_Music_Emu-0.5.2/demo/basics.c
deleted file mode 100644
index 55178251..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/demo/basics.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* C example that opens a game music file and records 10 seconds to "out.wav" */
-
-static char filename [] = "test.nsf"; /* opens this file (can be any music type) */
-
-#include "gme/gme.h"
-
-#include "Wave_Writer.h" /* wave_ functions for writing sound file */
-#include <stdlib.h>
-#include <stdio.h>
-
-void handle_error( const char* str );
-
-int main()
-{
- long sample_rate = 44100; /* number of samples per second */
- int track = 0; /* index of track to play (0 = first) */
-
- /* Open music file in new emulator */
- Music_Emu* emu;
- handle_error( gme_open_file( filename, &emu, sample_rate ) );
-
- /* Start track */
- handle_error( gme_start_track( emu, track ) );
-
- /* Begin writing to wave file */
- wave_open( sample_rate, "out.wav" );
- wave_enable_stereo();
-
- /* Record 10 seconds of track */
- while ( gme_tell( emu ) < 10 * 1000L )
- {
- /* Sample buffer */
- #define buf_size 1024 /* can be any multiple of 2 */
- short buf [buf_size];
-
- /* Fill sample buffer */
- handle_error( gme_play( emu, buf_size, buf ) );
-
- /* Write samples to wave file */
- wave_write( buf, buf_size );
- }
-
- /* Cleanup */
- gme_delete( emu );
- wave_close();
-
- return 0;
-}
-
-void handle_error( const char* str )
-{
- if ( str )
- {
- printf( "Error: %s\n", str ); getchar();
- exit( EXIT_FAILURE );
- }
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/cpp_basics.cpp b/plugins/gme/Game_Music_Emu-0.5.2/demo/cpp_basics.cpp
deleted file mode 100644
index 53fab418..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/demo/cpp_basics.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-// C++ example that opens a game music file and records 10 seconds to "out.wav"
-
-static char filename [] = "test.nsf"; /* opens this file (can be any music type) */
-
-#include "gme/Music_Emu.h"
-
-#include "Wave_Writer.h"
-#include <stdlib.h>
-#include <stdio.h>
-
-void handle_error( const char* str );
-
-int main()
-{
- long sample_rate = 44100; // number of samples per second
- int track = 0; // index of track to play (0 = first)
-
- // Determine file type
- gme_type_t file_type;
- handle_error( gme_identify_file( filename, &file_type ) );
- if ( !file_type )
- handle_error( "Unsupported music type" );
-
- // Create emulator and set sample rate
- Music_Emu* emu = file_type->new_emu();
- if ( !emu )
- handle_error( "Out of memory" );
- handle_error( emu->set_sample_rate( sample_rate ) );
-
- // Load music file into emulator
- handle_error( emu->load_file( filename ) );
-
- // Start track
- handle_error( emu->start_track( track ) );
-
- // Begin writing to wave file
- Wave_Writer wave( sample_rate, "out.wav" );
- wave.enable_stereo();
-
- // Record 10 seconds of track
- while ( emu->tell() < 10 * 1000L )
- {
- // Sample buffer
- const long size = 1024; // can be any multiple of 2
- short buf [size];
-
- // Fill buffer
- handle_error( emu->play( size, buf ) );
-
- // Write samples to wave file
- wave.write( buf, size );
- }
-
- // Cleanup
- delete emu;
-
- return 0;
-}
-
-void handle_error( const char* str )
-{
- if ( str )
- {
- printf( "Error: %s\n", str ); getchar();
- exit( EXIT_FAILURE );
- }
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c b/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c
deleted file mode 100644
index 96a9a8a9..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/demo/features.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/* C example that opens any music file type, opens an m3u playlist if present,
-prints its info and voice names, customizes the sound, and fades a track out.
-Records to "out.wav". */
-
-static char filename [] = "test.nsf"; /* opens this file (can be any music type) */
-static char playlist [] = "test.m3u"; /* uses this playlist, if present*/
-
-#include "gme/gme.h"
-
-#include "Wave_Writer.h" /* wave_ functions for writing sound file */
-#include <stdlib.h>
-#include <stdio.h>
-
-void handle_error( const char* );
-
-/* Example of loading from memory, which would be useful if using a zip file or
-other custom format. In this example it's silly because we could just use
-gme_load( &emu, sample_rate, path, 0 ). */
-Music_Emu* load_file( const char* path, long sample_rate )
-{
- Music_Emu* emu;
- char* data;
- long size;
-
- /* Read file data into memory. You might read the data from a zip file or
- other compressed format. */
- FILE* in = fopen( path, "rb" );
- if ( !in )
- handle_error( "Couldn't open file" );
- fseek( in, 0, SEEK_END );
- size = ftell( in );
- rewind( in );
-
- data = malloc( size );
- if ( !data )
- handle_error( "Out of memory" );
- if ( fread( data, size, 1, in ) <= 0 )
- handle_error( "Read error" );
- fclose( in );
-
- handle_error( gme_open_data( data, size, &emu, sample_rate ) );
- free( data ); /* a copy is made of the data */
- return emu;
-}
-
-/* Print any warning for most recent emulator action (load, start_track, play) */
-void print_warning( Music_Emu* emu )
-{
- const char* warning = gme_warning( emu );
- if ( warning )
- printf( "**** Warning: %s\n\n", warning );
-}
-
-static char my_data [] = "Our cleanup function was called";
-
-/* Example cleanup function automatically called when emulator is deleted. */
-static void my_cleanup( void* my_data )
-{
- printf( "\n%s\n", (char*) my_data );
-}
-
-int main()
-{
- long sample_rate = 44100;
- int track = 0; /* index of track to play (0 = first) */
- int i;
-
- /* Load file into emulator */
- Music_Emu* emu = load_file( filename, sample_rate );
- print_warning( emu );
-
- /* Register cleanup function and confirmation string as data */
- gme_set_user_data( emu, my_data );
- gme_set_user_cleanup( emu, my_cleanup );
-
- /* Load .m3u playlist file. All tracks are assumed to use current file.
- We ignore error here in case there is no m3u file present. */
- gme_load_m3u( emu, playlist );
- print_warning( emu );
-
- /* Get and print main info for track */
- {
- track_info_t info;
- handle_error( gme_track_info( emu, &info, track ) );
- printf( "System : %s\n", info.system );
- printf( "Game : %s\n", info.game );
- printf( "Author : %s\n", info.author );
- printf( "Copyright: %s\n", info.copyright );
- printf( "Comment : %s\n", info.comment );
- printf( "Dumper : %s\n", info.dumper );
- printf( "Tracks : %d\n", (int) info.track_count );
- printf( "\n" );
- printf( "Track : %d\n", (int) track + 1 );
- printf( "Name : %s\n", info.song );
- printf( "Length : %ld:%02ld",
- (long) info.length / 1000 / 60, (long) info.length / 1000 % 60 );
- if ( info.loop_length != 0 )
- printf( " (endless)" );
- printf( "\n\n" );
- }
-
- /* Print voice names */
- for ( i = 0; i < gme_voice_count( emu ); i++ )
- printf( "Voice %d: %s\n", i, gme_voice_names( emu ) [i] );
-
- /* Add some stereo enhancement */
- gme_set_stereo_depth( emu, 0.20 );
-
- /* Adjust equalizer for crisp, bassy sound */
- {
- gme_equalizer_t eq;
- eq.treble = 0.0;
- eq.bass = 20;
- gme_set_equalizer( emu, &eq );
- }
-
- /* Start track and begin fade at 10 seconds */
- handle_error( gme_start_track( emu, track ) );
- print_warning( emu );
- gme_set_fade( emu, 10 * 1000L );
-
- /* Record track until it ends */
- wave_open( sample_rate, "out.wav" );
- wave_enable_stereo();
- while ( !gme_track_ended( emu ) )
- {
- #define buf_size 1024
- short buf [buf_size];
- handle_error( gme_play( emu, buf_size, buf ) );
- print_warning( emu );
- wave_write( buf, buf_size );
- }
-
- /* Cleanup */
- gme_delete( emu );
- wave_close();
-
- getchar();
- return 0;
-}
-
-void handle_error( const char* str )
-{
- if ( str )
- {
- printf( "Error: %s\n", str ); getchar();
- exit( EXIT_FAILURE );
- }
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/design.txt b/plugins/gme/Game_Music_Emu-0.5.2/design.txt
deleted file mode 100644
index 8c8c65b1..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/design.txt
+++ /dev/null
@@ -1,194 +0,0 @@
-Game_Music_Emu 0.5.2 Design
----------------------------
-This might be slightly out-of-date at times, but will be a big help in
-understanding the library implementation.
-
-
-Architecture
-------------
-The library is essentially a bunch of independent game music file
-emulators unified with a common interface.
-
-Gme_File and Music_Emu provide a common interface to the emulators. The
-virtual functions are protected rather than public to allow pre- and
-post-processing of arguments and data in one place. This allows the
-emulator classes to assume that everything is set up properly when
-starting a track and playing samples.
-
-All file input is done with the Data_Reader interface. Many derived
-classes are present, for the usual disk-based file and block of memory,
-to specialized adaptors for things like reading a subset of data or
-combining a block of memory with a Data_Reader to the remaining data.
-This makes the library much more flexible with regard to the source of
-game music file data. I still added a specialized load_mem() function to
-have the emulator keep a pointer to data already read in memory, for
-those formats whose files can be absolutely huge (GYM, some VGMs). This
-is important if for some reason the caller must load the data ahead of
-time, but doesn't want the emulator needlessly making a copy.
-
-Since silence checking and fading are relatively complex, they are kept
-separate from basic file loading and track information, which are
-handled in the base class Gme_File. My original intent was to use
-Gme_File as the common base class for full emulators and track
-information-only readers, but implementing the C interface was much
-simpler if both derived from Music_Emu. User C++ code can still benefit
-from static checking by using Gme_File where only track information will
-be accessed.
-
-Each emulator generally has three components: main emulator, CPU
-emulator, and sound chip emulator(s). Each component has minimal
-coupling, so use in a full emulator or stand alone is fairly easy. This
-modularity really helps reduce complexity. Blip_Buffer helps a lot with
-simplifying the APU interfaces and implementation.
-
-The "classic" emulators derive from Classic_Emu, which handles
-Blip_Buffer filling and multiple channels. It uses Multi_Buffer for
-output, allowing you to derive a custom buffer that could output each
-voice to a separate sound channel and do different processing on each.
-At some point I'm going to implement a better Effects_Buffer that allows
-individual control of every channel.
-
-In implementing the C interface, I wanted a way to specify an emulator
-type that didn't require linking in all the emulators. For each emulator
-type there is a global object with pointers to functions to create the
-emulator or a track information reader. The emulator type is thus a
-pointer to this, which conveniently allows for a NULL value. The user
-referencing this emulator type object is what ultimately links the
-emulator in (unless new Foo_Emu is used in C++, of course). This type
-also serves as a useful substitute for RTTI on older C++ compilers.
-
-Addendum: I have since added gme_type_list(), which causes all listed
-emulators to be linked in. To avoid this, I make the list itself
-editable in blargg_config.h. Having a built-in list allows
-gme_load_file() to take a path and give back an emulator with the file
-loaded, which is extremely useful for new users.
-
-
-Interface conventions
-----------------------
-If a function retains a pointer to or replaces the value of an object
-passed, it takes a pointer so that it will be clear in the caller's
-source code that care is required.
-
-Multi-word names have an underscore '_' separator between individual
-words.
-
-Functions are named with lowercase words. Functions which perform an
-action with side-effects are named with a verb phrase (i.e. load, move,
-run). Functions which return the value of a piece of state are named
-using a noun phrase (i.e. loaded, moved, running).
-
-Classes are named with capitalized words. Only the first letter of an
-acronym is capitalized. Class names are nouns, sometimes suggestive of
-what they do (i.e. File_Scanner).
-
-Structure, enumeration, and typedefs to these and built-in types are
-named using lowercase words with a _t suffix.
-
-Macros are named with all-uppercase words.
-
-Internal names which can't be hidden due to technical reasons have an
-underscore '_' suffix.
-
-
-Managing Complexity
--------------------
-Complexity has been a factor in most library decisions. Many features
-have been passed by due to the complexity they would add. Once
-complexity goes past a certain level, it mentally grasping the library
-in its entirety, at which point more defects will occur and be hard to
-find.
-
-I chose 16-bit signed samples because it seems to be the most common
-format. Supporting multiple formats would add too much complexity to be
-worth it. Other formats can be obtained via conversion.
-
-I've kept interfaces fairly lean, leaving many possible features
-untapped but easy to add if necessary. For example the classic emulators
-could have volume and frequency equalization adjusted separately for
-each channel, since they each have an associated Blip_Synth.
-
-Source files of 400 lines or less seem to be the best size to limit
-complexity. In a few cases there is no reasonable way to split longer
-files, or there is benefit from having the source together in one file.
-
-
-Preventing Bugs
----------------
-I've done many things to reduce the opportunity for defects. A general
-principle is to write code so that defects will be as visible as
-possible. I've used several techniques to achieve this.
-
-I put assertions at key points where defects seem likely or where
-corruption due to a defect is likely to be visible. I've also put
-assertions where violations of the interface are likely. In emulators
-where I am unsure of exact hardware operation in a particular case, I
-output a debug-only message noting that this has occurred; many times I
-haven't implemented a hardware feature because nothing uses it. I've
-made code brittle where there is no clear reason flexibility; code
-written to handle every possibility sacrifices quality and reliability
-to handle vaguely defined situations.
-
-
-Flexibility through indirection
--------------------------------
-I've tried to allow the most flexibility of modules by using indirection
-to allow extension by the user. This keeps each module simpler and more
-focused on its unique task.
-
-The classic emulators use Multi_Buffer, which potentially allows a
-separate Blip_Buffer for each channel. This keeps emulators free of
-typical code to allow output in mono, stereo, panning, etc.
-
-All emulators use a reader object to access file data, allowing it to be
-stored in a regular file, compressed archive, memory, or generated
-on-the-fly. Again, the library can be kept free of the particulars of
-file access and changes required to support new formats.
-
-
-Emulators in general
---------------------
-When I wrote the first NES sound emulator, I stored most of the state in
-an emulator-specific format, with significant redundancy. In the
-register write function I decoded everything into named variables. I
-became tired of the verbosity and wanted to more closely model the
-hardware, so I moved to a style of storing the last written value to
-each register, along with as little other state as possible, mostly the
-internal hardware registers. While this involves slightly more
-recalculation, in most cases the emulation code is of comparable size.
-It also makes state save/restore (for use in a full emulator) much
-simpler. Finally, it makes debugging easier since the hardware registers
-used in emulation are obvious.
-
-
-CPU Cores
----------
-I've spent lots of time coming up with techniques to optimize the CPU
-cores. Some of the most important: execute multiple instructions during
-an emulation call, keep state in local variables to allow register
-assignment, optimize state representation for most common instructions,
-defer status flag calculation until actually needed, read program code
-directly without a call to the memory read function, always pre-fetch
-the operand byte before decoding instruction, and emulate instructions
-using common blocks of code.
-
-I've successfully used Nes_Cpu in a fairly complete NES emulator, and
-I'd like to make all the CPU emulators suitable for use in emulators. It
-seems a waste for them to be used only for the small amount of emulation
-necessary for game music files.
-
-I debugged the CPU cores by writing a test shell that ran them in
-parallel with other CPU cores and compared all memory accesses and
-processor states at each step. This provided good value at little cost.
-
-The CPU mapping page size is adjustable to allow the best tradeoff
-between memory/cache usage and handler granularity. The interface allows
-code to be somewhat independent of the page size.
-
-I optimize program memory accesses to direct reads rather than calls to
-the memory read function. My assumption is that it would be difficult to
-get useful code out of hardware I/O addresses, so no software will
-intentionally execute out of I/O space. Since the page size can be
-changed easily, most program memory mapping schemes can be accommodated.
-This greatly reduces memory access function calls.
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme.txt b/plugins/gme/Game_Music_Emu-0.5.2/gme.txt
deleted file mode 100644
index 2c963d8e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme.txt
+++ /dev/null
@@ -1,464 +0,0 @@
-Game_Music_Emu 0.5.2
---------------------
-Author : Shay Green <gblargg@gmail.com>
-Website: http://www.slack.net/~ant/libs/
-Forum : http://groups.google.com/group/blargg-sound-libs
-License: GNU Lesser General Public License (LGPL)
-
-Contents
---------
-* Overview
-* C and C++ interfaces
-* Function reference
-* Error handling
-* Emulator types
-* M3U playlist support
-* Information fields
-* Track length
-* Loading file data
-* Sound parameters
-* VGM/GYM YM2413 & YM2612 FM sound
-* Modular construction
-* Obscure features
-* Solving problems
-* Deprecated features
-* Thanks
-
-
-Overview
---------
-This library can open game music files, play tracks, and read game and
-track information tags. To play a game music file, do the following:
-
-* Open the file with gme_open_file()
-* Start a track with gme_start_track();
-* Generate samples as needed with gme_play()
-* Play samples through speaker using your operating system
-* Delete emulator when done with gme_delete()
-
-Your code must arrange for the generated samples to be played through
-the computer's speaker using whatever method your operating system
-requires.
-
-There are many additional features available; you can:
-
-* Determine of the type of a music file without opening it with
-gme_identify_*()
-* Load just the file's information tags with gme_info_only
-* Load from a block of memory rather than a file with gme_load_data()
-* Arrange for a fade-out at a particular time with gme_set_fade
-* Find when a track has ended with gme_track_ended()
-* Seek to a new time in the track with gme_seek()
-* Load an extended m3u playlist with gme_load_m3u()
-* Get a list of the voices (channels) and mute them individually with
-gme_voice_names() and gme_mute_voice()
-* Change the playback tempo without affecting pitch with gme_set_tempo()
-* Adjust treble/bass equalization with gme_set_equalizer()
-* Associate your own data with an emulator and later get it back with
-gme_set_user_data()
-* Register a function of yours to be called back when the emulator is
-deleted with gme_set_user_cleanup()
-
-Refer to gme.h for a comprehensive summary of features.
-
-
-C and C++ interfaces
---------------------
-While the library is written in C++, an extensive C interface is
-provided in gme.h. This C interface will be referred to throughout this
-documentation unless a feature is only available in the full C++
-interface. All C interface functions and other names have the gme_
-prefix, so you can recognize a C++-only feature by the lack of gme_ in
-the names used (contact me if you'd like a feature added to the C
-interface). If you're building a shared library, I highly recommend
-sticking to the C interface only, because it will be more stable between
-releases of the library than the C++ interface. Finally, the C and C++
-interfaces can be freely mixed without problems. Compare demo/basics.c
-with demo/cpp_basics.cpp to see how the C and C++ interfaces translate
-between each other.
-
-
-Function reference
-------------------
-Read the following header files for a complete reference to functions
-and features. The second group of header files can only be used in C++.
-
-blargg_config.h Library configuration
-gme.h C interface (also usable from C++)
-
-Gme_File.h File loading and track information
-Music_Emu.h Track playback and adjustments
-Data_Reader.h Custom data readers
-Effects_Buffer.h Sound buffer with adjustable stereo echo and panning
-M3u_Playlist.h M3U playlist support
-Gbs_Emu.h GBS equalizer settings
-Nsf_Emu.h NSF equalizer settings
-Spc_Emu.h SPC surround disable
-Vgm_Emu.h VGM oversampling disable and custom buffer query
-
-
-Error handling
---------------
-Functions which can fail have a return type of gme_err_t (blargg_err_t
-in the C++ interfaces), which is a pointer to an error string (const
-char*). If a function is successful it returns NULL. Errors that you can
-easily avoid are checked with debug assertions; gme_err_t return values
-are only used for genuine run-time errors that can't be easily predicted
-in advance (out of memory, I/O errors, incompatible file data). Your
-code should check all error values.
-
-To improve usability for C programmers, C++ programmers unfamiliar with
-exceptions, and compatibility with older C++ compilers, the library does
-*not* throw any C++ exceptions and uses malloc() instead of the standard
-operator new. This means that you *must* check for NULL when creating a
-library object with the new operator.
-
-When loading a music file in the wrong emulator or trying to load a
-non-music file, gme_wrong_file_type is returned. You can check for this
-error in C++ like this:
-
- gme_err_t err = gme_open_file( path, &emu );
- if ( err == gme_wrong_file_type )
- ...
-
-To check for minor problems, call gme_warning() to get a string
-describing the last warning. Your player should allow the user some way
-of knowing when this is the case, since these minor errors could affect
-playback. Without this information the user can't solve problems as
-well. When playing a track, gme_warning() returns minor playback-related
-problems (major playback problems end the track immediately and set the
-warning string).
-
-
-Emulator types
---------------
-The library includes several game music emulators that each support a
-different file type. Each is identified by a gme_type_t constant defined
-in gme.h, for example gme_nsf_emu is for the NSF emulator. If you use
-gme_open_file() or gme_open_data(), the library does the work of
-determining the file type and creating an appropriate emulator. If you
-want more control over this process, read on.
-
-There are two basic ways to identify a game music file's type: look at
-its file extension, or read the header data. The library includes
-functions to help with both methods. The first is preferable because it
-is fast and the most common way to identify files. Sometimes the
-extension is lost or wrong, so the header must be read.
-
-Use gme_identify_extension() to find the correct game music type based
-on a filename. To identify a file based on its extension and header
-contents, use gme_identify_file(). If you read the header data yourself,
-use gme_identify_header().
-
-If you want to remove support for some music types to reduce your
-executable size, edit GME_TYPE_LIST in blargg_config.h. For example, to
-support just NSF and GBS, use this:
-
- #define GME_TYPE_LIST gme_nsf_type, gme_gbs_type
-
-
-M3U playlist support
---------------------
-The library supports playlists in an extended m3u format with
-gme_load_m3u() to give track names and times to multi-song formats: AY,
-GBS, HES, KSS, NSF, NSFE, and SAP. Some aspects of the file format
-itself is not well-defined so some m3u files won't work properly
-(particularly those provided with KSS files). Only m3u files referencing
-a single file are supported; your code must handle m3u files covering
-more than one game music file, though it can use the built-in m3u
-parsing provided by the library.
-
-
-Information fields
-------------------
-Support is provided for the various text fields and length information
-in a file with gme_track_info(). If you just need track information for
-a file (for example, building a playlist), use gme_new_info() in place
-of gme_new_emu(), load the file normally, then you can access the track
-count and info, but nothing else.
-
- M3U VGM GYM SPC SAP NSFE NSF AY GBS HES KSS
- -------------------------------------------------------
-Track Count | * * * * * * * * *
- |
-System | * * * * * * * * * *
- |
-Game | * * * * * * *
- |
-Song | * * * * * * *
- |
-Author | * * * * * * * *
- |
-Copyright | * * * * * * * *
- |
-Comment | * * * *
- |
-Dumper | * * * *
- |
-Length | * * * * * *
- |
-Intro Length| * * *
- |
-Loop Length | * * *
-
-As listed above, the HES and KSS file formats don't include a track
-count, and tracks are often scattered over the 0-255 range, so an m3u
-playlist for these is a must.
-
-Unavailable text fields are set to an empty string and times to -1. Your
-code should be prepared for any combination of available and unavailable
-fields, as a particular music file might not use all of the supported
-fields listed above.
-
-Currently text fields are truncated to 255 characters. Obscure fields of
-some formats are not currently decoded; contact me if you want one
-added.
-
-
-Track length
-------------
-The library leaves it up to you as to when to stop playing a track. You
-can ask for available length information and then tell the library what
-time it should start fading the track with gme_set_fade(). By default it
-also continually checks for 6 or more seconds of silence to mark the end
-of a track. Here is a reasonable algorithm you can use to decide how
-long to play a track:
-
-* If the track length is > 0, use it
-* If the loop length > 0, play for intro + loop * 2
-* Otherwise, default to 2.5 minutes (150000 msec)
-
-If you want to play a track longer than normal, be sure the loop length
-isn't zero. See Music_Player.cpp around line 145 for example code.
-
-By default, the library skips silence at the beginning of a track. It
-also continually checks for the end of a non-looping track by watching
-for 6 seconds of unbroken silence. When doing this is scans *ahead* by
-several seconds so it can report the end of the track after only one
-second of silence has actually played. This feature can be disabled with
-gme_ignore_silence().
-
-
-Loading file data
------------------
-The library allows file data to be loaded in many different ways. All
-load functions return an error which you should check. The following
-examples assume these variables:
-
- Music_Emu* emu;
- gme_err_t error;
-
-If you're letting the library determine a file's type, you can use
-either gme_open_file() or gme_open_data():
-
- error = gme_open_file( pathname, &emu );
- error = gme_open_data( pointer, size, &emu );
-
-If you're manually determining file type and using used gme_new_emu() to
-create an emulator, you can use the following methods of loading:
-
-* From a block of memory:
-
- error = gme_load_data( emu, pointer, size );
-
-* Have library call your function to read data:
-
- gme_err_t my_read( void* my_data, void* out, long count )
- {
- // code that reads 'count' bytes into 'out' buffer
- // and return 0 if no error
- }
-
- error = gme_load_custom( emu, my_read, file_size, my_data );
-
-* If you must load the file data into memory yourself, you can have the
-library use your data directly *without* making a copy. If you do this,
-you must not free the data until you're done playing the file.
-
- error = emu->load_mem( pointer, size );
-
-* If you've already read the first bytes of a file (perhaps to determine
-the file type) and want to avoid seeking back to the beginning for
-performance reasons, use Remaining_Reader:
-
- Std_File_Reader in;
- error = in.open( file_path );
-
- char header [4];
- error = in.read( &header, sizeof header );
- ...
-
- Remaining_Reader rem( &header, sizeof header, &in );
- error = emu->load( rem );
-
-If you merely need access to a file's header after loading, use the
-emulator-specific header() functions, after casting the Music_Emu
-pointer to the specific emulator's type. This example examines the
-chip_flags field of the header if it's an NSF file:
-
- if ( music_emu->type() == gme_nsf_type )
- {
- Nsf_Emu* nsf_emu = (Nsf_Emu*) music_emu;
- if ( nsf_emu->header().chip_flags & 0x01 )
- ...
- }
-
-Contact me if you want more information about loading files.
-
-
-Sound parameters
-----------------
-All emulators support an arbitrary output sampling rate. A rate of 44100
-Hz should work well on most systems. Since band-limited synthesis is
-used, a sampling rate above 48000 Hz is not necessary and will actually
-reduce sound quality and performance.
-
-All emulators also support adjustable gain, mainly for the purpose of
-getting consistent volume between different music formats and avoiding
-excessive modulation. The gain can only be set *before* setting the
-emulator's sampling rate, so it's not useful as a general volume
-control. The default gains of emulators are set so that they give
-generally similar volumes, though some soundtracks are significantly
-louder or quieter than normal.
-
-Some emulators support adjustable treble and bass frequency equalization
-(AY, GBS, HES, KSS, NSF, NSFE, SAP, VGM) using set_equalizer().
-Parameters are specified using gme_equalizer_t eq = { treble_dB,
-bass_freq }. Treble_dB sets the treble level (in dB), where 0.0 dB gives
-normal treble; -200.0 dB is quite muffled, and 5.0 dB emphasizes treble
-for an extra crisp sound. Bass_freq sets the frequency where bass
-response starts to diminish; 15 Hz is normal, 0 Hz gives maximum bass,
-and 15000 Hz removes all bass. For example, the following makes the
-sound extra-crisp but lacking bass:
-
- gme_equalizer_t eq = { 5.0, 1000 };
- gme_set_equalizer( music_emu, &eq );
-
-Each emulator's equalization defaults to approximate the particular
-console's sound quality; this default can be determined by calling
-equalizer() just after creating the emulator. The Music_Emu::tv_eq
-profile gives sound as if coming from a TV speaker, and some emulators
-include other profiles for different versions of the system. For
-example, to use Famicom sound equalization with the NSF emulator, do the
-following:
-
- music_emu->set_equalizer( Nsf_Emu::famicom_eq );
-
-
-VGM/GYM YM2413 & YM2612 FM sound
---------------------------------
-The library plays Sega Genesis/Mega Drive music using a YM2612 FM sound
-chip emulator based on the Gens project. Because this has some
-inaccuracies, other YM2612 emulators can be used in its place by
-re-implementing the interface in YM2612_Emu.h. Available on my website
-is a modified version of MAME's YM2612 emulator, which sounds better in
-some ways and whose author is still making improvements.
-
-VGM music files using the YM2413 FM sound chip are also supported, but a
-YM2413 emulator isn't included with the library due to technical
-reasons. I have put one of the available YM2413 emulators on my website
-that can be used directly.
-
-
-Modular construction
---------------------
-The library is made of many fairly independent modules. If you're using
-only one music file emulator, you can eliminate many of the library
-sources from your program. Refer to the files list in readme.txt to get
-a general idea of what can be removed, and be sure to edit GME_TYPE_LIST
-(see "Emulator types" above). Post to the forum if you'd like me to put
-together a smaller version for a particular use, as this only takes me a
-few minutes to do.
-
-If you want to use one of the individual sound chip emulators (or CPU
-cores) in your own console emulator, first check the libraries page on
-my website since I have released several of them as stand alone
-libraries with included documentation and examples on their use. If you
-don't find it as a standalone library, contact me and I'll consider
-separating it.
-
-The "classic" sound chips use my Blip_Buffer library, which greatly
-simplifies their implementation and efficiently handles band-limited
-synthesis. It is also available as a stand alone library with
-documentation and many examples.
-
-
-Obscure features
-----------------
-The library's flexibility allows many possibilities. Contact me if you
-want help implementing ideas or removing limitations.
-
-* Uses no global/static variables, allowing multiple instances of any
-emulator. This is useful in a music player if you want to allow
-simultaneous recording or scanning of other tracks while one is already
-playing. This will also be useful if your platform disallows global
-data.
-
-* Emulators that support a custom sound buffer can have *every* voice
-routed to a different Blip_Buffer, allowing custom processing on each
-voice. For example you could record a Game Boy track as a 4-channel
-sound file.
-
-* Defining BLIP_BUFFER_FAST uses lower quality, less-multiply-intensive
-synthesis on "classic" emulators, which might help on some really old
-processors. This significantly lowers sound quality and prevents treble
-equalization. Try this if your platform's processor isn't fast enough
-for normal quality. Even on my ten-year-old 400 MHz Mac, this reduces
-processor usage at most by about 0.6% (from 4% to 3.4%), hardly worth
-the quality loss.
-
-
-Solving problems
-----------------
-If you're having problems, try the following:
-
-* If you're getting garbled sound, try this simple siren generator in
-place of your call to play(). This will quickly tell whether the problem
-is in the library or in your code.
-
- static void play_siren( long count, short* out )
- {
- static double a, a2;
- while ( count-- )
- *out++ = 0x2000 * sin( a += .1 + .05*sin( a2+=.00005 ) );
- }
-
-* Enable debugging support in your environment. This enables assertions
-and other run-time checks.
-
-* Turn the compiler's optimizer is off. Sometimes an optimizer generates
-bad code.
-
-* If multiple threads are being used, ensure that only one at a time is
-accessing a given set of objects from the library. This library is not
-in general thread-safe, though independent objects can be used in
-separate threads.
-
-* If all else fails, see if the demos work.
-
-
-Deprecated features
--------------------
-The following functions and other features have been deprecated and will
-be removed in a future release of the library. Alternatives to the
-deprecated features are listed to the right.
-
-Music_Emu::error_count() warning()
-load( header, reader ) see "Loading file data" above
-Spc_Emu::trailer() track_info()
-Spc_Emu::trailer_size()
-Gym_Emu::track_length() track_info()
-Vgm_Emu::gd3_data() track_info()
-Nsfe_Emu::disable_playlist() clear_playlist()
-
-
-Thanks
-------
-Big thanks to Chris Moeller (kode54) for help with library testing and
-feedback, for maintaining the Foobar2000 plugin foo_gep based on it, and
-for original work on openspc++ that was used when developing Spc_Emu.
-Brad Martin's excellent OpenSPC SNES DSP emulator worked well from the
-start. Also thanks to Richard Bannister, Mahendra Tallur, Shazz,
-nenolod, theHobbit, Johan Samuelsson, and nes6502 for testing, using,
-and giving feedback for the library in their respective game music
-players.
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.h
deleted file mode 100644
index 31956939..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// AY-3-8910 sound chip emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef AY_APU_H
-#define AY_APU_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-class Ay_Apu {
-public:
- // Set buffer to generate all sound into, or disable sound if NULL
- void output( Blip_Buffer* );
-
- // Reset sound chip
- void reset();
-
- // Write to register at specified time
- enum { reg_count = 16 };
- void write( blip_time_t time, int addr, int data );
-
- // Run sound to specified time, end current time frame, then start a new
- // time frame at time 0. Time frames have no effect on emulation and each
- // can be whatever length is convenient.
- void end_frame( blip_time_t length );
-
-// Additional features
-
- // Set sound output of specific oscillator to buffer, where index is
- // 0, 1, or 2. If buffer is NULL, the specified oscillator is muted.
- enum { osc_count = 3 };
- void osc_output( int index, Blip_Buffer* );
-
- // Set overall volume (default is 1.0)
- void volume( double );
-
- // Set treble equalization (see documentation)
- void treble_eq( blip_eq_t const& );
-
-public:
- Ay_Apu();
- typedef unsigned char byte;
-private:
- struct osc_t
- {
- blip_time_t period;
- blip_time_t delay;
- short last_amp;
- short phase;
- Blip_Buffer* output;
- } oscs [osc_count];
- blip_time_t last_time;
- byte latch;
- byte regs [reg_count];
-
- struct {
- blip_time_t delay;
- blargg_ulong lfsr;
- } noise;
-
- struct {
- blip_time_t delay;
- byte const* wave;
- int pos;
- byte modes [8] [48]; // values already passed through volume table
- } env;
-
- void run_until( blip_time_t );
- void write_data_( int addr, int data );
-public:
- enum { amp_range = 255 };
- Blip_Synth<blip_good_quality,1> synth_;
-};
-
-inline void Ay_Apu::volume( double v ) { synth_.volume( 0.7 / osc_count / amp_range * v ); }
-
-inline void Ay_Apu::treble_eq( blip_eq_t const& eq ) { synth_.treble_eq( eq ); }
-
-inline void Ay_Apu::write( blip_time_t time, int addr, int data )
-{
- run_until( time );
- write_data_( addr, data );
-}
-
-inline void Ay_Apu::osc_output( int i, Blip_Buffer* buf )
-{
- assert( (unsigned) i < osc_count );
- oscs [i].output = buf;
-}
-
-inline void Ay_Apu::output( Blip_Buffer* buf )
-{
- osc_output( 0, buf );
- osc_output( 1, buf );
- osc_output( 2, buf );
-}
-
-inline void Ay_Apu::end_frame( blip_time_t time )
-{
- if ( time > last_time )
- run_until( time );
-
- assert( last_time >= time );
- last_time -= time;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.cpp
deleted file mode 100644
index 6ff7156b..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.cpp
+++ /dev/null
@@ -1,1665 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-/*
-Last validated with zexall 2006.11.21 5:26 PM
-* Doesn't implement the R register or immediate interrupt after EI.
-* Address wrap-around isn't completely correct, but is prevented from crashing emulator.
-*/
-
-#include "Ay_Cpu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-//#include "z80_cpu_log.h"
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#define SYNC_TIME() (void) (s.time = s_time)
-#define RELOAD_TIME() (void) (s_time = s.time)
-
-// Callbacks to emulator
-
-#define CPU_OUT( cpu, addr, data, TIME )\
- ay_cpu_out( cpu, TIME, addr, data )
-
-#define CPU_IN( cpu, addr, TIME )\
- ay_cpu_in( cpu, addr )
-
-#include "blargg_source.h"
-
-// flags, named with hex value for clarity
-int const S80 = 0x80;
-int const Z40 = 0x40;
-int const F20 = 0x20;
-int const H10 = 0x10;
-int const F08 = 0x08;
-int const V04 = 0x04;
-int const P04 = 0x04;
-int const N02 = 0x02;
-int const C01 = 0x01;
-
-#define SZ28P( n ) szpc [n]
-#define SZ28PC( n ) szpc [n]
-#define SZ28C( n ) (szpc [n] & ~P04)
-#define SZ28( n ) SZ28C( n )
-
-#define SET_R( n ) (void) (r.r = n)
-#define GET_R() (r.r)
-
-Ay_Cpu::Ay_Cpu()
-{
- state = &state_;
- for ( int i = 0x100; --i >= 0; )
- {
- int even = 1;
- for ( int p = i; p; p >>= 1 )
- even ^= p;
- int n = (i & (S80 | F20 | F08)) | ((even & 1) * P04);
- szpc [i] = n;
- szpc [i + 0x100] = n | C01;
- }
- szpc [0x000] |= Z40;
- szpc [0x100] |= Z40;
-}
-
-void Ay_Cpu::reset( void* m )
-{
- mem = (uint8_t*) m;
-
- check( state == &state_ );
- state = &state_;
- state_.time = 0;
- state_.base = 0;
- end_time_ = 0;
-
- memset( &r, 0, sizeof r );
-}
-
-#define TIME (s_time + s.base)
-#define READ_PROG( addr ) (mem [addr])
-#define INSTR( offset ) READ_PROG( pc + (offset) )
-#define GET_ADDR() GET_LE16( &READ_PROG( pc ) )
-#define READ( addr ) READ_PROG( addr )
-#define WRITE( addr, data ) (void) (READ_PROG( addr ) = data)
-#define READ_WORD( addr ) GET_LE16( &READ_PROG( addr ) )
-#define WRITE_WORD( addr, data ) SET_LE16( &READ_PROG( addr ), data )
-#define IN( addr ) CPU_IN( this, addr, TIME )
-#define OUT( addr, data ) CPU_OUT( this, addr, data, TIME )
-
-#if BLARGG_BIG_ENDIAN
- #define R8( n, offset ) ((r8_ - offset) [n])
-#elif BLARGG_LITTLE_ENDIAN
- #define R8( n, offset ) ((r8_ - offset) [(n) ^ 1])
-#else
- #error "Byte order of CPU must be known"
-#endif
-
-//#define R16( n, shift, offset ) (r16_ [((n) >> shift) - (offset >> shift)])
-
-// help compiler see that it can just adjust stack offset, saving an extra instruction
-#define R16( n, shift, offset )\
- (*(uint16_t*) ((char*) r16_ - (offset >> (shift - 1)) + ((n) >> (shift - 1))))
-
-#define CASE5( a, b, c, d, e ) case 0x##a:case 0x##b:case 0x##c:case 0x##d:case 0x##e
-#define CASE6( a, b, c, d, e, f ) CASE5( a, b, c, d, e ): case 0x##f
-#define CASE7( a, b, c, d, e, f, g ) CASE6( a, b, c, d, e, f ): case 0x##g
-#define CASE8( a, b, c, d, e, f, g, h ) CASE7( a, b, c, d, e, f, g ): case 0x##h
-
-// high four bits are $ED time - 8, low four bits are $DD/$FD time - 8
-static byte const ed_dd_timing [0x100] = {
-//0 1 2 3 4 5 6 7 8 9 A B C D E F
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x06,0x0C,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x0C,0x02,0x00,0x00,0x03,0x00,
-0x00,0x00,0x00,0x00,0x0F,0x0F,0x0B,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,
-0x4B,0x4B,0x7B,0xCB,0x0B,0x6B,0x00,0x0B,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
-0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,
-0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x06,0x00,0x0F,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
-};
-
-// even on x86, using short and unsigned char was slower
-typedef int fint16;
-typedef unsigned fuint16;
-typedef unsigned fuint8;
-
-bool Ay_Cpu::run( cpu_time_t end_time )
-{
- set_end_time( end_time );
- state_t s = this->state_;
- this->state = &s;
- bool warning = false;
-
- typedef BOOST::int8_t int8_t;
-
- union {
- regs_t rg;
- pairs_t rp;
- uint8_t r8_ [8]; // indexed
- uint16_t r16_ [4];
- };
- rg = this->r.b;
-
- cpu_time_t s_time = s.time;
- uint8_t* const mem = this->mem; // cache
- fuint16 pc = r.pc;
- fuint16 sp = r.sp;
- fuint16 ix = r.ix; // TODO: keep in memory for direct access?
- fuint16 iy = r.iy;
- int flags = r.b.flags;
-
- goto loop;
-jr_not_taken:
- s_time -= 5;
- goto loop;
-call_not_taken:
- s_time -= 7;
-jp_not_taken:
- pc += 2;
-loop:
-
- check( (unsigned long) pc < 0x10000 );
- check( (unsigned long) sp < 0x10000 );
- check( (unsigned) flags < 0x100 );
- check( (unsigned) ix < 0x10000 );
- check( (unsigned) iy < 0x10000 );
-
- fuint8 opcode;
- opcode = READ_PROG( pc );
- pc++;
-
- static byte const base_timing [0x100] = {
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, // 0
- 13,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, // 1
- 12,10,16, 6, 4, 4, 7, 4,12,11,16, 6, 4, 4, 7, 4, // 2
- 12,10,13, 6,11,11,10, 4,12,11,13, 6, 4, 4, 7, 4, // 3
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 4
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 5
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 6
- 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, // 7
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 8
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 9
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // A
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // B
- 11,10,10,10,17,11, 7,11,11,10,10, 8,17,17, 7,11, // C
- 11,10,10,11,17,11, 7,11,11, 4,10,11,17, 8, 7,11, // D
- 11,10,10,19,17,11, 7,11,11, 4,10, 4,17, 8, 7,11, // E
- 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17, 8, 7,11, // F
- };
-
- fuint16 data;
- data = base_timing [opcode];
- if ( (s_time += data) >= 0 )
- goto possibly_out_of_time;
-almost_out_of_time:
-
- data = READ_PROG( pc );
-
- #ifdef Z80_CPU_LOG_H
- //log_opcode( opcode, READ_PROG( pc ) );
- z80_log_regs( rg.a, rp.bc, rp.de, rp.hl, sp, ix, iy );
- z80_cpu_log( "new", pc - 1, opcode, READ_PROG( pc ),
- READ_PROG( pc + 1 ), READ_PROG( pc + 2 ) );
- #endif
-
- switch ( opcode )
- {
-possibly_out_of_time:
- if ( s_time < (int) data )
- goto almost_out_of_time;
- s_time -= data;
- goto out_of_time;
-
-// Common
-
- case 0x00: // NOP
- CASE7( 40, 49, 52, 5B, 64, 6D, 7F ): // LD B,B etc.
- goto loop;
-
- case 0x08:{// EX AF,AF'
- int temp = r.alt.b.a;
- r.alt.b.a = rg.a;
- rg.a = temp;
-
- temp = r.alt.b.flags;
- r.alt.b.flags = flags;
- flags = temp;
- goto loop;
- }
-
- case 0xD3: // OUT (imm),A
- pc++;
- OUT( data + rg.a * 0x100, rg.a );
- goto loop;
-
- case 0x2E: // LD L,imm
- pc++;
- rg.l = data;
- goto loop;
-
- case 0x3E: // LD A,imm
- pc++;
- rg.a = data;
- goto loop;
-
- case 0x3A:{// LD A,(addr)
- fuint16 addr = GET_ADDR();
- pc += 2;
- rg.a = READ( addr );
- goto loop;
- }
-
-// Conditional
-
-#define ZERO (flags & Z40)
-#define CARRY (flags & C01)
-#define EVEN (flags & P04)
-#define MINUS (flags & S80)
-
-// JR
-#define JR( cond ) {\
- int disp = (BOOST::int8_t) data;\
- pc++;\
- if ( !(cond) )\
- goto jr_not_taken;\
- pc += disp;\
- goto loop;\
-}
-
- case 0x20: JR( !ZERO ) // JR NZ,disp
- case 0x28: JR( ZERO ) // JR Z,disp
- case 0x30: JR( !CARRY ) // JR NC,disp
- case 0x38: JR( CARRY ) // JR C,disp
- case 0x18: JR( true ) // JR disp
-
- case 0x10:{// DJNZ disp
- int temp = rg.b - 1;
- rg.b = temp;
- JR( temp )
- }
-
-// JP
-#define JP( cond ) if ( !(cond) ) goto jp_not_taken; pc = GET_ADDR(); goto loop;
-
- case 0xC2: JP( !ZERO ) // JP NZ,addr
- case 0xCA: JP( ZERO ) // JP Z,addr
- case 0xD2: JP( !CARRY ) // JP NC,addr
- case 0xDA: JP( CARRY ) // JP C,addr
- case 0xE2: JP( !EVEN ) // JP PO,addr
- case 0xEA: JP( EVEN ) // JP PE,addr
- case 0xF2: JP( !MINUS ) // JP P,addr
- case 0xFA: JP( MINUS ) // JP M,addr
-
- case 0xC3: // JP addr
- pc = GET_ADDR();
- goto loop;
-
- case 0xE9: // JP HL
- pc = rp.hl;
- goto loop;
-
-// RET
-#define RET( cond ) if ( cond ) goto ret_taken; s_time -= 6; goto loop;
-
- case 0xC0: RET( !ZERO ) // RET NZ
- case 0xC8: RET( ZERO ) // RET Z
- case 0xD0: RET( !CARRY ) // RET NC
- case 0xD8: RET( CARRY ) // RET C
- case 0xE0: RET( !EVEN ) // RET PO
- case 0xE8: RET( EVEN ) // RET PE
- case 0xF0: RET( !MINUS ) // RET P
- case 0xF8: RET( MINUS ) // RET M
-
- case 0xC9: // RET
- ret_taken:
- pc = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto loop;
-
-// CALL
-#define CALL( cond ) if ( cond ) goto call_taken; goto call_not_taken;
-
- case 0xC4: CALL( !ZERO ) // CALL NZ,addr
- case 0xCC: CALL( ZERO ) // CALL Z,addr
- case 0xD4: CALL( !CARRY ) // CALL NC,addr
- case 0xDC: CALL( CARRY ) // CALL C,addr
- case 0xE4: CALL( !EVEN ) // CALL PO,addr
- case 0xEC: CALL( EVEN ) // CALL PE,addr
- case 0xF4: CALL( !MINUS ) // CALL P,addr
- case 0xFC: CALL( MINUS ) // CALL M,addr
-
- case 0xCD:{// CALL addr
- call_taken:
- fuint16 addr = pc + 2;
- pc = GET_ADDR();
- sp = uint16_t (sp - 2);
- WRITE_WORD( sp, addr );
- goto loop;
- }
-
- case 0xFF: // RST
- if ( (pc - 1) > 0xFFFF )
- {
- pc = uint16_t (pc - 1);
- s_time -= 11;
- goto loop;
- }
- CASE7( C7, CF, D7, DF, E7, EF, F7 ):
- data = pc;
- pc = opcode & 0x38;
- goto push_data;
-
-// PUSH/POP
- case 0xF5: // PUSH AF
- data = rg.a * 0x100u + flags;
- goto push_data;
-
- case 0xC5: // PUSH BC
- case 0xD5: // PUSH DE
- case 0xE5: // PUSH HL
- data = R16( opcode, 4, 0xC5 );
- push_data:
- sp = uint16_t (sp - 2);
- WRITE_WORD( sp, data );
- goto loop;
-
- case 0xF1: // POP AF
- flags = READ( sp );
- rg.a = READ( sp + 1 );
- sp = uint16_t (sp + 2);
- goto loop;
-
- case 0xC1: // POP BC
- case 0xD1: // POP DE
- case 0xE1: // POP HL
- R16( opcode, 4, 0xC1 ) = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto loop;
-
-// ADC/ADD/SBC/SUB
- case 0x96: // SUB (HL)
- case 0x86: // ADD (HL)
- flags &= ~C01;
- case 0x9E: // SBC (HL)
- case 0x8E: // ADC (HL)
- data = READ( rp.hl );
- goto adc_data;
-
- case 0xD6: // SUB A,imm
- case 0xC6: // ADD imm
- flags &= ~C01;
- case 0xDE: // SBC A,imm
- case 0xCE: // ADC imm
- pc++;
- goto adc_data;
-
- CASE7( 90, 91, 92, 93, 94, 95, 97 ): // SUB r
- CASE7( 80, 81, 82, 83, 84, 85, 87 ): // ADD r
- flags &= ~C01;
- CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // SBC r
- CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // ADC r
- data = R8( opcode & 7, 0 );
- adc_data: {
- int result = data + (flags & C01);
- data ^= rg.a;
- flags = opcode >> 3 & N02; // bit 4 is set in subtract opcodes
- if ( flags )
- result = -result;
- result += rg.a;
- data ^= result;
- flags |=(data & H10) |
- ((data - -0x80) >> 6 & V04) |
- SZ28C( result & 0x1FF );
- rg.a = result;
- goto loop;
- }
-
-// CP
- case 0xBE: // CP (HL)
- data = READ( rp.hl );
- goto cp_data;
-
- case 0xFE: // CP imm
- pc++;
- goto cp_data;
-
- CASE7( B8, B9, BA, BB, BC, BD, BF ): // CP r
- data = R8( opcode, 0xB8 );
- cp_data: {
- int result = rg.a - data;
- flags = N02 | (data & (F20 | F08)) | (result >> 8 & C01);
- data ^= rg.a;
- flags |=(((result ^ rg.a) & data) >> 5 & V04) |
- (((data & H10) ^ result) & (S80 | H10));
- if ( (uint8_t) result )
- goto loop;
- flags |= Z40;
- goto loop;
- }
-
-// ADD HL,rp
-
- case 0x39: // ADD HL,SP
- data = sp;
- goto add_hl_data;
-
- case 0x09: // ADD HL,BC
- case 0x19: // ADD HL,DE
- case 0x29: // ADD HL,HL
- data = R16( opcode, 4, 0x09 );
- add_hl_data: {
- blargg_ulong sum = rp.hl + data;
- data ^= rp.hl;
- rp.hl = sum;
- flags = (flags & (S80 | Z40 | V04)) |
- (sum >> 16) |
- (sum >> 8 & (F20 | F08)) |
- ((data ^ sum) >> 8 & H10);
- goto loop;
- }
-
- case 0x27:{// DAA
- int a = rg.a;
- if ( a > 0x99 )
- flags |= C01;
-
- int adjust = 0x60 & -(flags & C01);
-
- if ( flags & H10 || (a & 0x0F) > 9 )
- adjust |= 0x06;
-
- if ( flags & N02 )
- adjust = -adjust;
- a += adjust;
-
- flags = (flags & (C01 | N02)) |
- ((rg.a ^ a) & H10) |
- SZ28P( (uint8_t) a );
- rg.a = a;
- goto loop;
- }
- /*
- case 0x27:{// DAA
- // more optimized, but probably not worth the obscurity
- int f = (rg.a + (0xFF - 0x99)) >> 8 | flags; // (a > 0x99 ? C01 : 0) | flags
- int adjust = 0x60 & -(f & C01); // f & C01 ? 0x60 : 0
-
- if ( (((rg.a + (0x0F - 9)) ^ rg.a) | f) & H10 ) // flags & H10 || (rg.a & 0x0F) > 9
- adjust |= 0x06;
-
- if ( f & N02 )
- adjust = -adjust;
- int a = rg.a + adjust;
-
- flags = (f & (N02 | C01)) | ((rg.a ^ a) & H10) | SZ28P( (uint8_t) a );
- rg.a = a;
- goto loop;
- }
- */
-
-// INC/DEC
- case 0x34: // INC (HL)
- data = READ( rp.hl ) + 1;
- WRITE( rp.hl, data );
- goto inc_set_flags;
-
- CASE7( 04, 0C, 14, 1C, 24, 2C, 3C ): // INC r
- data = ++R8( opcode >> 3, 0 );
- inc_set_flags:
- flags = (flags & C01) |
- (((data & 0x0F) - 1) & H10) |
- SZ28( (uint8_t) data );
- if ( data != 0x80 )
- goto loop;
- flags |= V04;
- goto loop;
-
- case 0x35: // DEC (HL)
- data = READ( rp.hl ) - 1;
- WRITE( rp.hl, data );
- goto dec_set_flags;
-
- CASE7( 05, 0D, 15, 1D, 25, 2D, 3D ): // DEC r
- data = --R8( opcode >> 3, 0 );
- dec_set_flags:
- flags = (flags & C01) | N02 |
- (((data & 0x0F) + 1) & H10) |
- SZ28( (uint8_t) data );
- if ( data != 0x7F )
- goto loop;
- flags |= V04;
- goto loop;
-
- case 0x03: // INC BC
- case 0x13: // INC DE
- case 0x23: // INC HL
- R16( opcode, 4, 0x03 )++;
- goto loop;
-
- case 0x33: // INC SP
- sp = uint16_t (sp + 1);
- goto loop;
-
- case 0x0B: // DEC BC
- case 0x1B: // DEC DE
- case 0x2B: // DEC HL
- R16( opcode, 4, 0x0B )--;
- goto loop;
-
- case 0x3B: // DEC SP
- sp = uint16_t (sp - 1);
- goto loop;
-
-// AND
- case 0xA6: // AND (HL)
- data = READ( rp.hl );
- goto and_data;
-
- case 0xE6: // AND imm
- pc++;
- goto and_data;
-
- CASE7( A0, A1, A2, A3, A4, A5, A7 ): // AND r
- data = R8( opcode, 0xA0 );
- and_data:
- rg.a &= data;
- flags = SZ28P( rg.a ) | H10;
- goto loop;
-
-// OR
- case 0xB6: // OR (HL)
- data = READ( rp.hl );
- goto or_data;
-
- case 0xF6: // OR imm
- pc++;
- goto or_data;
-
- CASE7( B0, B1, B2, B3, B4, B5, B7 ): // OR r
- data = R8( opcode, 0xB0 );
- or_data:
- rg.a |= data;
- flags = SZ28P( rg.a );
- goto loop;
-
-// XOR
- case 0xAE: // XOR (HL)
- data = READ( rp.hl );
- goto xor_data;
-
- case 0xEE: // XOR imm
- pc++;
- goto xor_data;
-
- CASE7( A8, A9, AA, AB, AC, AD, AF ): // XOR r
- data = R8( opcode, 0xA8 );
- xor_data:
- rg.a ^= data;
- flags = SZ28P( rg.a );
- goto loop;
-
-// LD
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (HL),r
- WRITE( rp.hl, R8( opcode, 0x70 ) );
- goto loop;
-
- CASE6( 41, 42, 43, 44, 45, 47 ): // LD B,r
- CASE6( 48, 4A, 4B, 4C, 4D, 4F ): // LD C,r
- CASE6( 50, 51, 53, 54, 55, 57 ): // LD D,r
- CASE6( 58, 59, 5A, 5C, 5D, 5F ): // LD E,r
- CASE6( 60, 61, 62, 63, 65, 67 ): // LD H,r
- CASE6( 68, 69, 6A, 6B, 6C, 6F ): // LD L,r
- CASE6( 78, 79, 7A, 7B, 7C, 7D ): // LD A,r
- R8( opcode >> 3 & 7, 0 ) = R8( opcode & 7, 0 );
- goto loop;
-
- CASE5( 06, 0E, 16, 1E, 26 ): // LD r,imm
- R8( opcode >> 3, 0 ) = data;
- pc++;
- goto loop;
-
- case 0x36: // LD (HL),imm
- pc++;
- WRITE( rp.hl, data );
- goto loop;
-
- CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(HL)
- R8( opcode >> 3, 8 ) = READ( rp.hl );
- goto loop;
-
- case 0x01: // LD rp,imm
- case 0x11:
- case 0x21:
- R16( opcode, 4, 0x01 ) = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x31: // LD sp,imm
- sp = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x2A:{// LD HL,(addr)
- fuint16 addr = GET_ADDR();
- pc += 2;
- rp.hl = READ_WORD( addr );
- goto loop;
- }
-
- case 0x32:{// LD (addr),A
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE( addr, rg.a );
- goto loop;
- }
-
- case 0x22:{// LD (addr),HL
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, rp.hl );
- goto loop;
- }
-
- case 0x02: // LD (BC),A
- case 0x12: // LD (DE),A
- WRITE( R16( opcode, 4, 0x02 ), rg.a );
- goto loop;
-
- case 0x0A: // LD A,(BC)
- case 0x1A: // LD A,(DE)
- rg.a = READ( R16( opcode, 4, 0x0A ) );
- goto loop;
-
- case 0xF9: // LD SP,HL
- sp = rp.hl;
- goto loop;
-
-// Rotate
-
- case 0x07:{// RLCA
- fuint16 temp = rg.a;
- temp = (temp << 1) | (temp >> 7);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08 | C01));
- rg.a = temp;
- goto loop;
- }
-
- case 0x0F:{// RRCA
- fuint16 temp = rg.a;
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & C01);
- temp = (temp << 7) | (temp >> 1);
- flags |= temp & (F20 | F08);
- rg.a = temp;
- goto loop;
- }
-
- case 0x17:{// RLA
- blargg_ulong temp = (rg.a << 1) | (flags & C01);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08)) |
- (temp >> 8);
- rg.a = temp;
- goto loop;
- }
-
- case 0x1F:{// RRA
- fuint16 temp = (flags << 7) | (rg.a >> 1);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08)) |
- (rg.a & C01);
- rg.a = temp;
- goto loop;
- }
-
-// Misc
- case 0x2F:{// CPL
- fuint16 temp = ~rg.a;
- flags = (flags & (S80 | Z40 | P04 | C01)) |
- (temp & (F20 | F08)) |
- (H10 | N02);
- rg.a = temp;
- goto loop;
- }
-
- case 0x3F:{// CCF
- flags = ((flags & (S80 | Z40 | P04 | C01)) ^ C01) |
- (flags << 4 & H10) |
- (rg.a & (F20 | F08));
- goto loop;
- }
-
- case 0x37: // SCF
- flags = (flags & (S80 | Z40 | P04)) | C01 |
- (rg.a & (F20 | F08));
- goto loop;
-
- case 0xDB: // IN A,(imm)
- pc++;
- rg.a = IN( data + rg.a * 0x100 );
- goto loop;
-
- case 0xE3:{// EX (SP),HL
- fuint16 temp = READ_WORD( sp );
- WRITE_WORD( sp, rp.hl );
- rp.hl = temp;
- goto loop;
- }
-
- case 0xEB:{// EX DE,HL
- fuint16 temp = rp.hl;
- rp.hl = rp.de;
- rp.de = temp;
- goto loop;
- }
-
- case 0xD9:{// EXX DE,HL
- fuint16 temp = r.alt.w.bc;
- r.alt.w.bc = rp.bc;
- rp.bc = temp;
-
- temp = r.alt.w.de;
- r.alt.w.de = rp.de;
- rp.de = temp;
-
- temp = r.alt.w.hl;
- r.alt.w.hl = rp.hl;
- rp.hl = temp;
- goto loop;
- }
-
- case 0xF3: // DI
- r.iff1 = 0;
- r.iff2 = 0;
- goto loop;
-
- case 0xFB: // EI
- r.iff1 = 1;
- r.iff2 = 1;
- // TODO: delayed effect
- goto loop;
-
- case 0x76: // HALT
- goto halt;
-
-//////////////////////////////////////// CB prefix
- {
- case 0xCB:
- unsigned data2;
- data2 = INSTR( 1 );
- pc++;
- switch ( data )
- {
-
- // Rotate left
-
- #define RLC( read, write ) {\
- fuint8 result = read;\
- result = uint8_t (result << 1) | (result >> 7);\
- flags = SZ28P( result ) | (result & C01);\
- write;\
- goto loop;\
- }
-
- case 0x06: // RLC (HL)
- s_time += 7;
- data = rp.hl;
- rlc_data_addr:
- RLC( READ( data ), WRITE( data, result ) )
-
- CASE7( 00, 01, 02, 03, 04, 05, 07 ):{// RLC r
- uint8_t& reg = R8( data, 0 );
- RLC( reg, reg = result )
- }
-
- #define RL( read, write ) {\
- fuint16 result = (read << 1) | (flags & C01);\
- flags = SZ28PC( result );\
- write;\
- goto loop;\
- }
-
- case 0x16: // RL (HL)
- s_time += 7;
- data = rp.hl;
- rl_data_addr:
- RL( READ( data ), WRITE( data, result ) )
-
- CASE7( 10, 11, 12, 13, 14, 15, 17 ):{// RL r
- uint8_t& reg = R8( data, 0x10 );
- RL( reg, reg = result )
- }
-
- #define SLA( read, add, write ) {\
- fuint16 result = (read << 1) | add;\
- flags = SZ28PC( result );\
- write;\
- goto loop;\
- }
-
- case 0x26: // SLA (HL)
- s_time += 7;
- data = rp.hl;
- sla_data_addr:
- SLA( READ( data ), 0, WRITE( data, result ) )
-
- CASE7( 20, 21, 22, 23, 24, 25, 27 ):{// SLA r
- uint8_t& reg = R8( data, 0x20 );
- SLA( reg, 0, reg = result )
- }
-
- case 0x36: // SLL (HL)
- s_time += 7;
- data = rp.hl;
- sll_data_addr:
- SLA( READ( data ), 1, WRITE( data, result ) )
-
- CASE7( 30, 31, 32, 33, 34, 35, 37 ):{// SLL r
- uint8_t& reg = R8( data, 0x30 );
- SLA( reg, 1, reg = result )
- }
-
- // Rotate right
-
- #define RRC( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result = uint8_t (result << 7) | (result >> 1);\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x0E: // RRC (HL)
- s_time += 7;
- data = rp.hl;
- rrc_data_addr:
- RRC( READ( data ), WRITE( data, result ) )
-
- CASE7( 08, 09, 0A, 0B, 0C, 0D, 0F ):{// RRC r
- uint8_t& reg = R8( data, 0x08 );
- RRC( reg, reg = result )
- }
-
- #define RR( read, write ) {\
- fuint8 result = read;\
- fuint8 temp = result & C01;\
- result = uint8_t (flags << 7) | (result >> 1);\
- flags = SZ28P( result ) | temp;\
- write;\
- goto loop;\
- }
-
- case 0x1E: // RR (HL)
- s_time += 7;
- data = rp.hl;
- rr_data_addr:
- RR( READ( data ), WRITE( data, result ) )
-
- CASE7( 18, 19, 1A, 1B, 1C, 1D, 1F ):{// RR r
- uint8_t& reg = R8( data, 0x18 );
- RR( reg, reg = result )
- }
-
- #define SRA( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result = (result & 0x80) | (result >> 1);\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x2E: // SRA (HL)
- data = rp.hl;
- s_time += 7;
- sra_data_addr:
- SRA( READ( data ), WRITE( data, result ) )
-
- CASE7( 28, 29, 2A, 2B, 2C, 2D, 2F ):{// SRA r
- uint8_t& reg = R8( data, 0x28 );
- SRA( reg, reg = result )
- }
-
- #define SRL( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result >>= 1;\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x3E: // SRL (HL)
- s_time += 7;
- data = rp.hl;
- srl_data_addr:
- SRL( READ( data ), WRITE( data, result ) )
-
- CASE7( 38, 39, 3A, 3B, 3C, 3D, 3F ):{// SRL r
- uint8_t& reg = R8( data, 0x38 );
- SRL( reg, reg = result )
- }
-
- // BIT
- {
- unsigned temp;
- CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ): // BIT b,(HL)
- s_time += 4;
- temp = READ( rp.hl );
- flags &= C01;
- goto bit_temp;
- CASE7( 40, 41, 42, 43, 44, 45, 47 ): // BIT 0,r
- CASE7( 48, 49, 4A, 4B, 4C, 4D, 4F ): // BIT 1,r
- CASE7( 50, 51, 52, 53, 54, 55, 57 ): // BIT 2,r
- CASE7( 58, 59, 5A, 5B, 5C, 5D, 5F ): // BIT 3,r
- CASE7( 60, 61, 62, 63, 64, 65, 67 ): // BIT 4,r
- CASE7( 68, 69, 6A, 6B, 6C, 6D, 6F ): // BIT 5,r
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // BIT 6,r
- CASE7( 78, 79, 7A, 7B, 7C, 7D, 7F ): // BIT 7,r
- temp = R8( data & 7, 0 );
- flags = (flags & C01) | (temp & (F20 | F08));
- bit_temp:
- int masked = temp & 1 << (data >> 3 & 7);
- flags |=(masked & S80) | H10 |
- ((masked - 1) >> 8 & (Z40 | P04));
- goto loop;
- }
-
- // SET/RES
- CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(HL)
- CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(HL)
- s_time += 7;
- int temp = READ( rp.hl );
- int bit = 1 << (data >> 3 & 7);
- temp |= bit; // SET
- if ( !(data & 0x40) )
- temp ^= bit; // RES
- WRITE( rp.hl, temp );
- goto loop;
- }
-
- CASE7( C0, C1, C2, C3, C4, C5, C7 ): // SET 0,r
- CASE7( C8, C9, CA, CB, CC, CD, CF ): // SET 1,r
- CASE7( D0, D1, D2, D3, D4, D5, D7 ): // SET 2,r
- CASE7( D8, D9, DA, DB, DC, DD, DF ): // SET 3,r
- CASE7( E0, E1, E2, E3, E4, E5, E7 ): // SET 4,r
- CASE7( E8, E9, EA, EB, EC, ED, EF ): // SET 5,r
- CASE7( F0, F1, F2, F3, F4, F5, F7 ): // SET 6,r
- CASE7( F8, F9, FA, FB, FC, FD, FF ): // SET 7,r
- R8( data & 7, 0 ) |= 1 << (data >> 3 & 7);
- goto loop;
-
- CASE7( 80, 81, 82, 83, 84, 85, 87 ): // RES 0,r
- CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // RES 1,r
- CASE7( 90, 91, 92, 93, 94, 95, 97 ): // RES 2,r
- CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // RES 3,r
- CASE7( A0, A1, A2, A3, A4, A5, A7 ): // RES 4,r
- CASE7( A8, A9, AA, AB, AC, AD, AF ): // RES 5,r
- CASE7( B0, B1, B2, B3, B4, B5, B7 ): // RES 6,r
- CASE7( B8, B9, BA, BB, BC, BD, BF ): // RES 7,r
- R8( data & 7, 0 ) &= ~(1 << (data >> 3 & 7));
- goto loop;
- }
- assert( false );
- }
-
-//////////////////////////////////////// ED prefix
- {
- case 0xED:
- pc++;
- s_time += ed_dd_timing [data] >> 4;
- switch ( data )
- {
- {
- blargg_ulong temp;
- case 0x72: // SBC HL,SP
- case 0x7A: // ADC HL,SP
- temp = sp;
- if ( 0 )
- case 0x42: // SBC HL,BC
- case 0x52: // SBC HL,DE
- case 0x62: // SBC HL,HL
- case 0x4A: // ADC HL,BC
- case 0x5A: // ADC HL,DE
- case 0x6A: // ADC HL,HL
- temp = R16( data >> 3 & 6, 1, 0 );
- blargg_ulong sum = temp + (flags & C01);
- flags = ~data >> 2 & N02;
- if ( flags )
- sum = -sum;
- sum += rp.hl;
- temp ^= rp.hl;
- temp ^= sum;
- flags |=(sum >> 16 & C01) |
- (temp >> 8 & H10) |
- (sum >> 8 & (S80 | F20 | F08)) |
- ((temp - -0x8000) >> 14 & V04);
- rp.hl = sum;
- if ( (uint16_t) sum )
- goto loop;
- flags |= Z40;
- goto loop;
- }
-
- CASE8( 40, 48, 50, 58, 60, 68, 70, 78 ):{// IN r,(C)
- int temp = IN( rp.bc );
- R8( data >> 3, 8 ) = temp;
- flags = (flags & C01) | SZ28P( temp );
- goto loop;
- }
-
- case 0x71: // OUT (C),0
- rg.flags = 0;
- CASE7( 41, 49, 51, 59, 61, 69, 79 ): // OUT (C),r
- OUT( rp.bc, R8( data >> 3, 8 ) );
- goto loop;
-
- {
- unsigned temp;
- case 0x73: // LD (ADDR),SP
- temp = sp;
- if ( 0 )
- case 0x43: // LD (ADDR),BC
- case 0x53: // LD (ADDR),DE
- temp = R16( data, 4, 0x43 );
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, temp );
- goto loop;
- }
-
- case 0x4B: // LD BC,(ADDR)
- case 0x5B:{// LD DE,(ADDR)
- fuint16 addr = GET_ADDR();
- pc += 2;
- R16( data, 4, 0x4B ) = READ_WORD( addr );
- goto loop;
- }
-
- case 0x7B:{// LD SP,(ADDR)
- fuint16 addr = GET_ADDR();
- pc += 2;
- sp = READ_WORD( addr );
- goto loop;
- }
-
- case 0x67:{// RRD
- fuint8 temp = READ( rp.hl );
- WRITE( rp.hl, (rg.a << 4) | (temp >> 4) );
- temp = (rg.a & 0xF0) | (temp & 0x0F);
- flags = (flags & C01) | SZ28P( temp );
- rg.a = temp;
- goto loop;
- }
-
- case 0x6F:{// RLD
- fuint8 temp = READ( rp.hl );
- WRITE( rp.hl, (temp << 4) | (rg.a & 0x0F) );
- temp = (rg.a & 0xF0) | (temp >> 4);
- flags = (flags & C01) | SZ28P( temp );
- rg.a = temp;
- goto loop;
- }
-
- CASE8( 44, 4C, 54, 5C, 64, 6C, 74, 7C ): // NEG
- opcode = 0x10; // flag to do SBC instead of ADC
- flags &= ~C01;
- data = rg.a;
- rg.a = 0;
- goto adc_data;
-
- {
- int inc;
- case 0xA9: // CPD
- case 0xB9: // CPDR
- inc = -1;
- if ( 0 )
- case 0xA1: // CPI
- case 0xB1: // CPIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- int result = rg.a - temp;
- flags = (flags & C01) | N02 |
- ((((temp ^ rg.a) & H10) ^ result) & (S80 | H10));
-
- if ( !(uint8_t) result ) flags |= Z40;
- result -= (flags & H10) >> 4;
- flags |= result & F08;
- flags |= result << 4 & F20;
- if ( !--rp.bc )
- goto loop;
-
- flags |= V04;
- if ( flags & Z40 || data < 0xB0 )
- goto loop;
-
- pc -= 2;
- s_time += 5;
- goto loop;
- }
-
- {
- int inc;
- case 0xA8: // LDD
- case 0xB8: // LDDR
- inc = -1;
- if ( 0 )
- case 0xA0: // LDI
- case 0xB0: // LDIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- addr = rp.de;
- rp.de = addr + inc;
- WRITE( addr, temp );
-
- temp += rg.a;
- flags = (flags & (S80 | Z40 | C01)) |
- (temp & F08) | (temp << 4 & F20);
- if ( !--rp.bc )
- goto loop;
-
- flags |= V04;
- if ( data < 0xB0 )
- goto loop;
-
- pc -= 2;
- s_time += 5;
- goto loop;
- }
-
- {
- int inc;
- case 0xAB: // OUTD
- case 0xBB: // OTDR
- inc = -1;
- if ( 0 )
- case 0xA3: // OUTI
- case 0xB3: // OTIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- int b = --rg.b;
- flags = (temp >> 6 & N02) | SZ28( b );
- if ( b && data >= 0xB0 )
- {
- pc -= 2;
- s_time += 5;
- }
-
- OUT( rp.bc, temp );
- goto loop;
- }
-
- {
- int inc;
- case 0xAA: // IND
- case 0xBA: // INDR
- inc = -1;
- if ( 0 )
- case 0xA2: // INI
- case 0xB2: // INIR
- inc = +1;
-
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
-
- int temp = IN( rp.bc );
-
- int b = --rg.b;
- flags = (temp >> 6 & N02) | SZ28( b );
- if ( b && data >= 0xB0 )
- {
- pc -= 2;
- s_time += 5;
- }
-
- WRITE( addr, temp );
- goto loop;
- }
-
- case 0x47: // LD I,A
- r.i = rg.a;
- goto loop;
-
- case 0x4F: // LD R,A
- SET_R( rg.a );
- dprintf( "LD R,A not supported\n" );
- warning = true;
- goto loop;
-
- case 0x57: // LD A,I
- rg.a = r.i;
- goto ld_ai_common;
-
- case 0x5F: // LD A,R
- rg.a = GET_R();
- dprintf( "LD A,R not supported\n" );
- warning = true;
- ld_ai_common:
- flags = (flags & C01) | SZ28( rg.a ) | (r.iff2 << 2 & V04);
- goto loop;
-
- CASE8( 45, 4D, 55, 5D, 65, 6D, 75, 7D ): // RETI/RETN
- r.iff1 = r.iff2;
- goto ret_taken;
-
- case 0x46: case 0x4E: case 0x66: case 0x6E: // IM 0
- r.im = 0;
- goto loop;
-
- case 0x56: case 0x76: // IM 1
- r.im = 1;
- goto loop;
-
- case 0x5E: case 0x7E: // IM 2
- r.im = 2;
- goto loop;
-
- default:
- dprintf( "Opcode $ED $%02X not supported\n", data );
- warning = true;
- goto loop;
- }
- assert( false );
- }
-
-//////////////////////////////////////// DD/FD prefix
- {
- fuint16 ixy;
- case 0xDD:
- ixy = ix;
- goto ix_prefix;
- case 0xFD:
- ixy = iy;
- ix_prefix:
- pc++;
- unsigned data2 = READ_PROG( pc );
- s_time += ed_dd_timing [data] & 0x0F;
- switch ( data )
- {
- // TODO: more efficient way of avoid negative address
- #define IXY_DISP( ixy, disp ) uint16_t ((ixy) + (disp))
-
- #define SET_IXY( in ) if ( opcode == 0xDD ) ix = in; else iy = in;
-
- // ADD/ADC/SUB/SBC
-
- case 0x96: // SUB (IXY+disp)
- case 0x86: // ADD (IXY+disp)
- flags &= ~C01;
- case 0x9E: // SBC (IXY+disp)
- case 0x8E: // ADC (IXY+disp)
- pc++;
- opcode = data;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto adc_data;
-
- case 0x94: // SUB HXY
- case 0x84: // ADD HXY
- flags &= ~C01;
- case 0x9C: // SBC HXY
- case 0x8C: // ADC HXY
- opcode = data;
- data = ixy >> 8;
- goto adc_data;
-
- case 0x95: // SUB LXY
- case 0x85: // ADD LXY
- flags &= ~C01;
- case 0x9D: // SBC LXY
- case 0x8D: // ADC LXY
- opcode = data;
- data = (uint8_t) ixy;
- goto adc_data;
-
- {
- unsigned temp;
- case 0x39: // ADD IXY,SP
- temp = sp;
- goto add_ixy_data;
-
- case 0x29: // ADD IXY,HL
- temp = ixy;
- goto add_ixy_data;
-
- case 0x09: // ADD IXY,BC
- case 0x19: // ADD IXY,DE
- temp = R16( data, 4, 0x09 );
- add_ixy_data: {
- blargg_ulong sum = ixy + temp;
- temp ^= ixy;
- ixy = (uint16_t) sum;
- flags = (flags & (S80 | Z40 | V04)) |
- (sum >> 16) |
- (sum >> 8 & (F20 | F08)) |
- ((temp ^ sum) >> 8 & H10);
- goto set_ixy;
- }
- }
-
- // AND
- case 0xA6: // AND (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto and_data;
-
- case 0xA4: // AND HXY
- data = ixy >> 8;
- goto and_data;
-
- case 0xA5: // AND LXY
- data = (uint8_t) ixy;
- goto and_data;
-
- // OR
- case 0xB6: // OR (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto or_data;
-
- case 0xB4: // OR HXY
- data = ixy >> 8;
- goto or_data;
-
- case 0xB5: // OR LXY
- data = (uint8_t) ixy;
- goto or_data;
-
- // XOR
- case 0xAE: // XOR (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto xor_data;
-
- case 0xAC: // XOR HXY
- data = ixy >> 8;
- goto xor_data;
-
- case 0xAD: // XOR LXY
- data = (uint8_t) ixy;
- goto xor_data;
-
- // CP
- case 0xBE: // CP (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto cp_data;
-
- case 0xBC: // CP HXY
- data = ixy >> 8;
- goto cp_data;
-
- case 0xBD: // CP LXY
- data = (uint8_t) ixy;
- goto cp_data;
-
- // LD
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (IXY+disp),r
- data = R8( data, 0x70 );
- if ( 0 )
- case 0x36: // LD (IXY+disp),imm
- pc++, data = READ_PROG( pc );
- pc++;
- WRITE( IXY_DISP( ixy, (int8_t) data2 ), data );
- goto loop;
-
- CASE5( 44, 4C, 54, 5C, 7C ): // LD r,HXY
- R8( data >> 3, 8 ) = ixy >> 8;
- goto loop;
-
- case 0x64: // LD HXY,HXY
- case 0x6D: // LD LXY,LXY
- goto loop;
-
- CASE5( 45, 4D, 55, 5D, 7D ): // LD r,LXY
- R8( data >> 3, 8 ) = ixy;
- goto loop;
-
- CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(IXY+disp)
- pc++;
- R8( data >> 3, 8 ) = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto loop;
-
- case 0x26: // LD HXY,imm
- pc++;
- goto ld_hxy_data;
-
- case 0x65: // LD HXY,LXY
- data2 = (uint8_t) ixy;
- goto ld_hxy_data;
-
- CASE5( 60, 61, 62, 63, 67 ): // LD HXY,r
- data2 = R8( data, 0x60 );
- ld_hxy_data:
- ixy = (uint8_t) ixy | (data2 << 8);
- goto set_ixy;
-
- case 0x2E: // LD LXY,imm
- pc++;
- goto ld_lxy_data;
-
- case 0x6C: // LD LXY,HXY
- data2 = ixy >> 8;
- goto ld_lxy_data;
-
- CASE5( 68, 69, 6A, 6B, 6F ): // LD LXY,r
- data2 = R8( data, 0x68 );
- ld_lxy_data:
- ixy = (ixy & 0xFF00) | data2;
- set_ixy:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto loop;
- }
- iy = ixy;
- goto loop;
-
- case 0xF9: // LD SP,IXY
- sp = ixy;
- goto loop;
-
- case 0x22:{// LD (ADDR),IXY
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, ixy );
- goto loop;
- }
-
- case 0x21: // LD IXY,imm
- ixy = GET_ADDR();
- pc += 2;
- goto set_ixy;
-
- case 0x2A:{// LD IXY,(addr)
- fuint16 addr = GET_ADDR();
- ixy = READ_WORD( addr );
- pc += 2;
- goto set_ixy;
- }
-
- // DD/FD CB prefix
- case 0xCB: {
- data = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data2 = READ_PROG( pc );
- pc++;
- switch ( data2 )
- {
- case 0x06: goto rlc_data_addr; // RLC (IXY)
- case 0x16: goto rl_data_addr; // RL (IXY)
- case 0x26: goto sla_data_addr; // SLA (IXY)
- case 0x36: goto sll_data_addr; // SLL (IXY)
- case 0x0E: goto rrc_data_addr; // RRC (IXY)
- case 0x1E: goto rr_data_addr; // RR (IXY)
- case 0x2E: goto sra_data_addr; // SRA (IXY)
- case 0x3E: goto srl_data_addr; // SRL (IXY)
-
- CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ):{// BIT b,(IXY+disp)
- fuint8 temp = READ( data );
- int masked = temp & 1 << (data2 >> 3 & 7);
- flags = (flags & C01) | H10 |
- (masked & S80) |
- ((masked - 1) >> 8 & (Z40 | P04));
- goto loop;
- }
-
- CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(IXY+disp)
- CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(IXY+disp)
- int temp = READ( data );
- int bit = 1 << (data2 >> 3 & 7);
- temp |= bit; // SET
- if ( !(data2 & 0x40) )
- temp ^= bit; // RES
- WRITE( data, temp );
- goto loop;
- }
-
- default:
- dprintf( "Opcode $%02X $CB $%02X not supported\n", opcode, data2 );
- warning = true;
- goto loop;
- }
- assert( false );
- }
-
- // INC/DEC
- case 0x23: // INC IXY
- ixy = uint16_t (ixy + 1);
- goto set_ixy;
-
- case 0x2B: // DEC IXY
- ixy = uint16_t (ixy - 1);
- goto set_ixy;
-
- case 0x34: // INC (IXY+disp)
- ixy = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data = READ( ixy ) + 1;
- WRITE( ixy, data );
- goto inc_set_flags;
-
- case 0x35: // DEC (IXY+disp)
- ixy = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data = READ( ixy ) - 1;
- WRITE( ixy, data );
- goto dec_set_flags;
-
- case 0x24: // INC HXY
- ixy = uint16_t (ixy + 0x100);
- data = ixy >> 8;
- goto inc_xy_common;
-
- case 0x2C: // INC LXY
- data = uint8_t (ixy + 1);
- ixy = (ixy & 0xFF00) | data;
- inc_xy_common:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto inc_set_flags;
- }
- iy = ixy;
- goto inc_set_flags;
-
- case 0x25: // DEC HXY
- ixy = uint16_t (ixy - 0x100);
- data = ixy >> 8;
- goto dec_xy_common;
-
- case 0x2D: // DEC LXY
- data = uint8_t (ixy - 1);
- ixy = (ixy & 0xFF00) | data;
- dec_xy_common:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto dec_set_flags;
- }
- iy = ixy;
- goto dec_set_flags;
-
- // PUSH/POP
- case 0xE5: // PUSH IXY
- data = ixy;
- goto push_data;
-
- case 0xE1:{// POP IXY
- ixy = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto set_ixy;
- }
-
- // Misc
-
- case 0xE9: // JP (IXY)
- pc = ixy;
- goto loop;
-
- case 0xE3:{// EX (SP),IXY
- fuint16 temp = READ_WORD( sp );
- WRITE_WORD( sp, ixy );
- ixy = temp;
- goto set_ixy;
- }
-
- default:
- dprintf( "Unnecessary DD/FD prefix encountered\n" );
- warning = true;
- pc--;
- goto loop;
- }
- assert( false );
- }
-
- }
- dprintf( "Unhandled main opcode: $%02X\n", opcode );
- assert( false );
-
-halt:
- s_time &= 3; // increment by multiple of 4
-out_of_time:
- pc--;
-
- s.time = s_time;
- rg.flags = flags;
- r.ix = ix;
- r.iy = iy;
- r.sp = sp;
- r.pc = pc;
- this->r.b = rg;
- this->state_ = s;
- this->state = &this->state_;
-
- return warning;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.h
deleted file mode 100644
index 07241d5e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Cpu.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Z80 CPU emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef AY_CPU_H
-#define AY_CPU_H
-
-#include "blargg_endian.h"
-
-typedef blargg_long cpu_time_t;
-
-// must be defined by caller
-void ay_cpu_out( class Ay_Cpu*, cpu_time_t, unsigned addr, int data );
-int ay_cpu_in( class Ay_Cpu*, unsigned addr );
-
-class Ay_Cpu {
-public:
- // Clear all registers and keep pointer to 64K memory passed in
- void reset( void* mem_64k );
-
- // Run until specified time is reached. Returns true if suspicious/unsupported
- // instruction was encountered at any point during run.
- bool run( cpu_time_t end_time );
-
- // Time of beginning of next instruction
- cpu_time_t time() const { return state->time + state->base; }
-
- // Alter current time. Not supported during run() call.
- void set_time( cpu_time_t t ) { state->time = t - state->base; }
- void adjust_time( int delta ) { state->time += delta; }
-
- typedef BOOST::uint8_t uint8_t;
- typedef BOOST::uint16_t uint16_t;
-
- #if BLARGG_BIG_ENDIAN
- struct regs_t { uint8_t b, c, d, e, h, l, flags, a; };
- #else
- struct regs_t { uint8_t c, b, e, d, l, h, a, flags; };
- #endif
- BOOST_STATIC_ASSERT( sizeof (regs_t) == 8 );
-
- struct pairs_t { uint16_t bc, de, hl, fa; };
-
- // Registers are not updated until run() returns
- struct registers_t {
- uint16_t pc;
- uint16_t sp;
- uint16_t ix;
- uint16_t iy;
- union {
- regs_t b; // b.b, b.c, b.d, b.e, b.h, b.l, b.flags, b.a
- pairs_t w; // w.bc, w.de, w.hl. w.fa
- };
- union {
- regs_t b;
- pairs_t w;
- } alt;
- uint8_t iff1;
- uint8_t iff2;
- uint8_t r;
- uint8_t i;
- uint8_t im;
- };
- //registers_t r; (below for efficiency)
-
- // can read this far past end of memory
- enum { cpu_padding = 0x100 };
-
-public:
- Ay_Cpu();
-private:
- uint8_t szpc [0x200];
- uint8_t* mem;
- cpu_time_t end_time_;
- struct state_t {
- cpu_time_t base;
- cpu_time_t time;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
- void set_end_time( cpu_time_t t );
-public:
- registers_t r;
-};
-
-inline void Ay_Cpu::set_end_time( cpu_time_t t )
-{
- cpu_time_t delta = state->base - t;
- state->base = t;
- state->time += delta;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.cpp
deleted file mode 100644
index bdc82e9e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.cpp
+++ /dev/null
@@ -1,404 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Ay_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-long const spectrum_clock = 3546900;
-long const cpc_clock = 2000000;
-
-unsigned const ram_start = 0x4000;
-int const osc_count = Ay_Apu::osc_count + 1;
-
-Ay_Emu::Ay_Emu()
-{
- beeper_output = 0;
- set_type( gme_ay_type );
-
- static const char* const names [osc_count] = {
- "Wave 1", "Wave 2", "Wave 3", "Beeper"
- };
- set_voice_names( names );
-
- static int const types [osc_count] = {
- wave_type | 0, wave_type | 1, wave_type | 2, mixed_type | 0
- };
- set_voice_types( types );
- set_silence_lookahead( 6 );
-}
-
-Ay_Emu::~Ay_Emu() { }
-
-// Track info
-
-static byte const* get_data( Ay_Emu::file_t const& file, byte const* ptr, int min_size )
-{
- long pos = ptr - (byte const*) file.header;
- long file_size = file.end - (byte const*) file.header;
- assert( (unsigned long) pos <= (unsigned long) file_size - 2 );
- int offset = (BOOST::int16_t) get_be16( ptr );
- if ( !offset || blargg_ulong (pos + offset) > blargg_ulong (file_size - min_size) )
- return 0;
- return ptr + offset;
-}
-
-static blargg_err_t parse_header( byte const* in, long size, Ay_Emu::file_t* out )
-{
- typedef Ay_Emu::header_t header_t;
- out->header = (header_t const*) in;
- out->end = in + size;
-
- if ( size < Ay_Emu::header_size )
- return gme_wrong_file_type;
-
- header_t const& h = *(header_t const*) in;
- if ( memcmp( h.tag, "ZXAYEMUL", 8 ) )
- return gme_wrong_file_type;
-
- out->tracks = get_data( *out, h.track_info, (h.max_track + 1) * 4 );
- if ( !out->tracks )
- return "Missing track data";
-
- return 0;
-}
-
-static void copy_ay_fields( Ay_Emu::file_t const& file, track_info_t* out, int track )
-{
- Gme_File::copy_field_( out->song, (char const*) get_data( file, file.tracks + track * 4, 1 ) );
- byte const* track_info = get_data( file, file.tracks + track * 4 + 2, 6 );
- if ( track_info )
- out->length = get_be16( track_info + 4 ) * (1000L / 50); // frames to msec
-
- Gme_File::copy_field_( out->author, (char const*) get_data( file, file.header->author, 1 ) );
- Gme_File::copy_field_( out->comment, (char const*) get_data( file, file.header->comment, 1 ) );
-}
-
-blargg_err_t Ay_Emu::track_info_( track_info_t* out, int track ) const
-{
- copy_ay_fields( file, out, track );
- return 0;
-}
-
-struct Ay_File : Gme_Info_
-{
- Ay_Emu::file_t file;
-
- Ay_File() { set_type( gme_ay_type ); }
-
- blargg_err_t load_mem_( byte const* begin, long size )
- {
- RETURN_ERR( parse_header( begin, size, &file ) );
- set_track_count( file.header->max_track + 1 );
- return 0;
- }
-
- blargg_err_t track_info_( track_info_t* out, int track ) const
- {
- copy_ay_fields( file, out, track );
- return 0;
- }
-};
-
-static Music_Emu* new_ay_emu () { return BLARGG_NEW Ay_Emu ; }
-static Music_Emu* new_ay_file() { return BLARGG_NEW Ay_File; }
-
-gme_type_t_ const gme_ay_type [1] = { "ZX Spectrum", 0, &new_ay_emu, &new_ay_file, "AY", 1 };
-
-// Setup
-
-blargg_err_t Ay_Emu::load_mem_( byte const* in, long size )
-{
- assert( offsetof (header_t,track_info [2]) == header_size );
-
- RETURN_ERR( parse_header( in, size, &file ) );
- set_track_count( file.header->max_track + 1 );
-
- if ( file.header->vers > 2 )
- set_warning( "Unknown file version" );
-
- set_voice_count( osc_count );
- apu.volume( gain() );
-
- return setup_buffer( spectrum_clock );
-}
-
-void Ay_Emu::update_eq( blip_eq_t const& eq )
-{
- apu.treble_eq( eq );
-}
-
-void Ay_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer*, Blip_Buffer* )
-{
- if ( i >= Ay_Apu::osc_count )
- beeper_output = center;
- else
- apu.osc_output( i, center );
-}
-
-// Emulation
-
-void Ay_Emu::set_tempo_( double t )
-{
- play_period = blip_time_t (clock_rate() / 50 / t);
-}
-
-blargg_err_t Ay_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( mem.ram + 0x0000, 0xC9, 0x100 ); // fill RST vectors with RET
- memset( mem.ram + 0x0100, 0xFF, 0x4000 - 0x100 );
- memset( mem.ram + ram_start, 0x00, sizeof mem.ram - ram_start );
- memset( mem.padding1, 0xFF, sizeof mem.padding1 );
- memset( mem.ram + 0x10000, 0xFF, sizeof mem.ram - 0x10000 );
-
- // locate data blocks
- byte const* const data = get_data( file, file.tracks + track * 4 + 2, 14 );
- if ( !data ) return "File data missing";
-
- byte const* const more_data = get_data( file, data + 10, 6 );
- if ( !more_data ) return "File data missing";
-
- byte const* blocks = get_data( file, data + 12, 8 );
- if ( !blocks ) return "File data missing";
-
- // initial addresses
- cpu::reset( mem.ram );
- r.sp = get_be16( more_data );
- r.b.a = r.b.b = r.b.d = r.b.h = data [8];
- r.b.flags = r.b.c = r.b.e = r.b.l = data [9];
- r.alt.w = r.w;
- r.ix = r.iy = r.w.hl;
-
- unsigned addr = get_be16( blocks );
- if ( !addr ) return "File data missing";
-
- unsigned init = get_be16( more_data + 2 );
- if ( !init )
- init = addr;
-
- // copy blocks into memory
- do
- {
- blocks += 2;
- unsigned len = get_be16( blocks ); blocks += 2;
- if ( addr + len > 0x10000 )
- {
- set_warning( "Bad data block size" );
- len = 0x10000 - addr;
- }
- check( len );
- byte const* in = get_data( file, blocks, 0 ); blocks += 2;
- if ( len > blargg_ulong (file.end - in) )
- {
- set_warning( "Missing file data" );
- len = file.end - in;
- }
- //dprintf( "addr: $%04X, len: $%04X\n", addr, len );
- if ( addr < ram_start && addr >= 0x400 ) // several tracks use low data
- dprintf( "Block addr in ROM\n" );
- memcpy( mem.ram + addr, in, len );
-
- if ( file.end - blocks < 8 )
- {
- set_warning( "Missing file data" );
- break;
- }
- }
- while ( (addr = get_be16( blocks )) != 0 );
-
- // copy and configure driver
- static byte const passive [] = {
- 0xF3, // DI
- 0xCD, 0, 0, // CALL init
- 0xED, 0x5E, // LOOP: IM 2
- 0xFB, // EI
- 0x76, // HALT
- 0x18, 0xFA // JR LOOP
- };
- static byte const active [] = {
- 0xF3, // DI
- 0xCD, 0, 0, // CALL init
- 0xED, 0x56, // LOOP: IM 1
- 0xFB, // EI
- 0x76, // HALT
- 0xCD, 0, 0, // CALL play
- 0x18, 0xF7 // JR LOOP
- };
- memcpy( mem.ram, passive, sizeof passive );
- unsigned play_addr = get_be16( more_data + 4 );
- //dprintf( "Play: $%04X\n", play_addr );
- if ( play_addr )
- {
- memcpy( mem.ram, active, sizeof active );
- mem.ram [ 9] = play_addr;
- mem.ram [10] = play_addr >> 8;
- }
- mem.ram [2] = init;
- mem.ram [3] = init >> 8;
-
- mem.ram [0x38] = 0xFB; // Put EI at interrupt vector (followed by RET)
-
- memcpy( mem.ram + 0x10000, mem.ram, 0x80 ); // some code wraps around (ugh)
-
- beeper_delta = int (apu.amp_range * 0.65);
- last_beeper = 0;
- apu.reset();
- next_play = play_period;
-
- // start at spectrum speed
- change_clock_rate( spectrum_clock );
- set_tempo( tempo() );
-
- spectrum_mode = false;
- cpc_mode = false;
- cpc_latch = 0;
-
- return 0;
-}
-
-// Emulation
-
-void Ay_Emu::cpu_out_misc( cpu_time_t time, unsigned addr, int data )
-{
- if ( !cpc_mode )
- {
- switch ( addr & 0xFEFF )
- {
- case 0xFEFD:
- spectrum_mode = true;
- apu_addr = data & 0x0F;
- return;
-
- case 0xBEFD:
- spectrum_mode = true;
- apu.write( time, apu_addr, data );
- return;
- }
- }
-
- if ( !spectrum_mode )
- {
- switch ( addr >> 8 )
- {
- case 0xF6:
- switch ( data & 0xC0 )
- {
- case 0xC0:
- apu_addr = cpc_latch & 0x0F;
- goto enable_cpc;
-
- case 0x80:
- apu.write( time, apu_addr, cpc_latch );
- goto enable_cpc;
- }
- break;
-
- case 0xF4:
- cpc_latch = data;
- goto enable_cpc;
- }
- }
-
- dprintf( "Unmapped OUT: $%04X <- $%02X\n", addr, data );
- return;
-
-enable_cpc:
- if ( !cpc_mode )
- {
- cpc_mode = true;
- change_clock_rate( cpc_clock );
- set_tempo( tempo() );
- }
-}
-
-void ay_cpu_out( Ay_Cpu* cpu, cpu_time_t time, unsigned addr, int data )
-{
- Ay_Emu& emu = STATIC_CAST(Ay_Emu&,*cpu);
-
- if ( (addr & 0xFF) == 0xFE && !emu.cpc_mode )
- {
- int delta = emu.beeper_delta;
- data &= 0x10;
- if ( emu.last_beeper != data )
- {
- emu.last_beeper = data;
- emu.beeper_delta = -delta;
- emu.spectrum_mode = true;
- if ( emu.beeper_output )
- emu.apu.synth_.offset( time, delta, emu.beeper_output );
- }
- }
- else
- {
- emu.cpu_out_misc( time, addr, data );
- }
-}
-
-int ay_cpu_in( Ay_Cpu*, unsigned addr )
-{
- // keyboard read and other things
- if ( (addr & 0xFF) == 0xFE )
- return 0xFF; // other values break some beeper tunes
-
- dprintf( "Unmapped IN : $%04X\n", addr );
- return 0xFF;
-}
-
-blargg_err_t Ay_Emu::run_clocks( blip_time_t& duration, int )
-{
- set_time( 0 );
- if ( !(spectrum_mode | cpc_mode) )
- duration /= 2; // until mode is set, leave room for halved clock rate
-
- while ( time() < duration )
- {
- cpu::run( min( duration, (blip_time_t) next_play ) );
-
- if ( time() >= next_play )
- {
- next_play += play_period;
-
- if ( r.iff1 )
- {
- if ( mem.ram [r.pc] == 0x76 )
- r.pc++;
-
- r.iff1 = r.iff2 = 0;
-
- mem.ram [--r.sp] = uint8_t (r.pc >> 8);
- mem.ram [--r.sp] = uint8_t (r.pc);
- r.pc = 0x38;
- cpu::adjust_time( 12 );
- if ( r.im == 2 )
- {
- cpu::adjust_time( 6 );
- unsigned addr = r.i * 0x100u + 0xFF;
- r.pc = mem.ram [(addr + 1) & 0xFFFF] * 0x100u + mem.ram [addr];
- }
- }
- }
- }
- duration = time();
- next_play -= duration;
- check( next_play >= 0 );
- adjust_time( -duration );
-
- apu.end_frame( duration );
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h
deleted file mode 100644
index ba8445d3..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Emu.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Sinclair Spectrum AY music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef AY_EMU_H
-#define AY_EMU_H
-
-#include "Classic_Emu.h"
-#include "Ay_Apu.h"
-#include "Ay_Cpu.h"
-
-class Ay_Emu : private Ay_Cpu, public Classic_Emu {
- typedef Ay_Cpu cpu;
-public:
- // AY file header
- enum { header_size = 0x14 };
- struct header_t
- {
- byte tag [8];
- byte vers;
- byte player;
- byte unused [2];
- byte author [2];
- byte comment [2];
- byte max_track;
- byte first_track;
- byte track_info [2];
- };
-
- static gme_type_t static_type() { return gme_ay_type; }
-public:
- Ay_Emu();
- ~Ay_Emu();
- struct file_t {
- header_t const* header;
- byte const* end;
- byte const* tracks;
- };
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_mem_( byte const*, long );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
-private:
- file_t file;
-
- unsigned play_addr;
- cpu_time_t play_period;
- cpu_time_t next_play;
- Blip_Buffer* beeper_output;
- int beeper_delta;
- int last_beeper;
- int apu_addr;
- int cpc_latch;
- bool spectrum_mode;
- bool cpc_mode;
-
- // large items
- struct {
- byte padding1 [0x100];
- byte ram [0x10000 + 0x100];
- } mem;
- Ay_Apu apu;
- friend void ay_cpu_out( Ay_Cpu*, cpu_time_t, unsigned addr, int data );
- void cpu_out_misc( cpu_time_t, unsigned addr, int data );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.cpp
deleted file mode 100644
index 07e9d658..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.cpp
+++ /dev/null
@@ -1,446 +0,0 @@
-// Blip_Buffer 0.4.1. http://www.slack.net/~ant/
-
-#include "Blip_Buffer.h"
-#include "blargg_common.h"
-#include <assert.h>
-#include <limits.h>
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-int const silent_buf_size = 1; // size used for Silent_Blip_Buffer
-
-Blip_Buffer::Blip_Buffer()
-{
- factor_ = 0x7fffffff;
- offset_ = 0;
- buffer_ = 0;
- buffer_size_ = 0;
- sample_rate_ = 0;
- reader_accum_ = 0;
- bass_shift_ = 0;
- clock_rate_ = 0;
- bass_freq_ = 16;
- length_ = 0;
-
- // assumptions code makes about implementation-defined features
- #ifndef NDEBUG
- // right shift of negative value preserves sign
- buf_t_ i = -0x7FFFFFFE;
- assert( (i >> 1) == -0x3FFFFFFF );
-
- // casting to short truncates to 16 bits and sign-extends
- i = 0x18000;
- assert( (short) i == -0x8000 );
- #endif
-}
-
-Blip_Buffer::~Blip_Buffer()
-{
- if ( buffer_size_ != silent_buf_size )
- free( buffer_ );
-}
-
-Silent_Blip_Buffer::Silent_Blip_Buffer()
-{
- factor_ = 0;
- buffer_ = buf;
- buffer_size_ = silent_buf_size;
- memset( buf, 0, sizeof buf ); // in case machine takes exception for signed overflow
-}
-
-void Blip_Buffer::clear( int entire_buffer )
-{
- offset_ = 0;
- reader_accum_ = 0;
- modified_ = 0;
- if ( buffer_ )
- {
- long count = (entire_buffer ? buffer_size_ : samples_avail());
- memset( buffer_, 0, (count + blip_buffer_extra_) * sizeof (buf_t_) );
- }
-}
-
-Blip_Buffer::blargg_err_t Blip_Buffer::set_sample_rate( long new_rate, int msec )
-{
- if ( buffer_size_ == silent_buf_size )
- {
- assert( 0 );
- return "Internal (tried to resize Silent_Blip_Buffer)";
- }
-
- // start with maximum length that resampled time can represent
- long new_size = (ULONG_MAX >> BLIP_BUFFER_ACCURACY) - blip_buffer_extra_ - 64;
- if ( msec != blip_max_length )
- {
- long s = (new_rate * (msec + 1) + 999) / 1000;
- if ( s < new_size )
- new_size = s;
- else
- assert( 0 ); // fails if requested buffer length exceeds limit
- }
-
- if ( buffer_size_ != new_size )
- {
- void* p = realloc( buffer_, (new_size + blip_buffer_extra_) * sizeof *buffer_ );
- if ( !p )
- return "Out of memory";
- buffer_ = (buf_t_*) p;
- }
-
- buffer_size_ = new_size;
- assert( buffer_size_ != silent_buf_size );
-
- // update things based on the sample rate
- sample_rate_ = new_rate;
- length_ = new_size * 1000 / new_rate - 1;
- if ( msec )
- assert( length_ == msec ); // ensure length is same as that passed in
- if ( clock_rate_ )
- clock_rate( clock_rate_ );
- bass_freq( bass_freq_ );
-
- clear();
-
- return 0; // success
-}
-
-blip_resampled_time_t Blip_Buffer::clock_rate_factor( long rate ) const
-{
- double ratio = (double) sample_rate_ / rate;
- blip_long factor = (blip_long) floor( ratio * (1L << BLIP_BUFFER_ACCURACY) + 0.5 );
- assert( factor > 0 || !sample_rate_ ); // fails if clock/output ratio is too large
- return (blip_resampled_time_t) factor;
-}
-
-void Blip_Buffer::bass_freq( int freq )
-{
- bass_freq_ = freq;
- int shift = 31;
- if ( freq > 0 )
- {
- shift = 13;
- long f = (freq << 16) / sample_rate_;
- while ( (f >>= 1) && --shift ) { }
- }
- bass_shift_ = shift;
-}
-
-void Blip_Buffer::end_frame( blip_time_t t )
-{
- offset_ += t * factor_;
- assert( samples_avail() <= (long) buffer_size_ ); // time outside buffer length
-}
-
-void Blip_Buffer::remove_silence( long count )
-{
- assert( count <= samples_avail() ); // tried to remove more samples than available
- offset_ -= (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
-}
-
-long Blip_Buffer::count_samples( blip_time_t t ) const
-{
- unsigned long last_sample = resampled_time( t ) >> BLIP_BUFFER_ACCURACY;
- unsigned long first_sample = offset_ >> BLIP_BUFFER_ACCURACY;
- return (long) (last_sample - first_sample);
-}
-
-blip_time_t Blip_Buffer::count_clocks( long count ) const
-{
- if ( !factor_ )
- {
- assert( 0 ); // sample rate and clock rates must be set first
- return 0;
- }
-
- if ( count > buffer_size_ )
- count = buffer_size_;
- blip_resampled_time_t time = (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
- return (blip_time_t) ((time - offset_ + factor_ - 1) / factor_);
-}
-
-void Blip_Buffer::remove_samples( long count )
-{
- if ( count )
- {
- remove_silence( count );
-
- // copy remaining samples to beginning and clear old samples
- long remain = samples_avail() + blip_buffer_extra_;
- memmove( buffer_, buffer_ + count, remain * sizeof *buffer_ );
- memset( buffer_ + remain, 0, count * sizeof *buffer_ );
- }
-}
-
-// Blip_Synth_
-
-Blip_Synth_Fast_::Blip_Synth_Fast_()
-{
- buf = 0;
- last_amp = 0;
- delta_factor = 0;
-}
-
-void Blip_Synth_Fast_::volume_unit( double new_unit )
-{
- delta_factor = int (new_unit * (1L << blip_sample_bits) + 0.5);
-}
-
-#if !BLIP_BUFFER_FAST
-
-Blip_Synth_::Blip_Synth_( short* p, int w ) :
- impulses( p ),
- width( w )
-{
- volume_unit_ = 0.0;
- kernel_unit = 0;
- buf = 0;
- last_amp = 0;
- delta_factor = 0;
-}
-
-#undef PI
-#define PI 3.1415926535897932384626433832795029
-
-static void gen_sinc( float* out, int count, double oversample, double treble, double cutoff )
-{
- if ( cutoff >= 0.999 )
- cutoff = 0.999;
-
- if ( treble < -300.0 )
- treble = -300.0;
- if ( treble > 5.0 )
- treble = 5.0;
-
- double const maxh = 4096.0;
- double const rolloff = pow( 10.0, 1.0 / (maxh * 20.0) * treble / (1.0 - cutoff) );
- double const pow_a_n = pow( rolloff, maxh - maxh * cutoff );
- double const to_angle = PI / 2 / maxh / oversample;
- for ( int i = 0; i < count; i++ )
- {
- double angle = ((i - count) * 2 + 1) * to_angle;
- double c = rolloff * cos( (maxh - 1.0) * angle ) - cos( maxh * angle );
- double cos_nc_angle = cos( maxh * cutoff * angle );
- double cos_nc1_angle = cos( (maxh * cutoff - 1.0) * angle );
- double cos_angle = cos( angle );
-
- c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle;
- double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle);
- double b = 2.0 - cos_angle - cos_angle;
- double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle;
-
- out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d
- }
-}
-
-void blip_eq_t::generate( float* out, int count ) const
-{
- // lower cutoff freq for narrow kernels with their wider transition band
- // (8 points->1.49, 16 points->1.15)
- double oversample = blip_res * 2.25 / count + 0.85;
- double half_rate = sample_rate * 0.5;
- if ( cutoff_freq )
- oversample = half_rate / cutoff_freq;
- double cutoff = rolloff_freq * oversample / half_rate;
-
- gen_sinc( out, count, blip_res * oversample, treble, cutoff );
-
- // apply (half of) hamming window
- double to_fraction = PI / (count - 1);
- for ( int i = count; i--; )
- out [i] *= 0.54f - 0.46f * (float) cos( i * to_fraction );
-}
-
-void Blip_Synth_::adjust_impulse()
-{
- // sum pairs for each phase and add error correction to end of first half
- int const size = impulses_size();
- for ( int p = blip_res; p-- >= blip_res / 2; )
- {
- int p2 = blip_res - 2 - p;
- long error = kernel_unit;
- for ( int i = 1; i < size; i += blip_res )
- {
- error -= impulses [i + p ];
- error -= impulses [i + p2];
- }
- if ( p == p2 )
- error /= 2; // phase = 0.5 impulse uses same half for both sides
- impulses [size - blip_res + p] += (short) error;
- //printf( "error: %ld\n", error );
- }
-
- //for ( int i = blip_res; i--; printf( "\n" ) )
- // for ( int j = 0; j < width / 2; j++ )
- // printf( "%5ld,", impulses [j * blip_res + i + 1] );
-}
-
-void Blip_Synth_::treble_eq( blip_eq_t const& eq )
-{
- float fimpulse [blip_res / 2 * (blip_widest_impulse_ - 1) + blip_res * 2];
-
- int const half_size = blip_res / 2 * (width - 1);
- eq.generate( &fimpulse [blip_res], half_size );
-
- int i;
-
- // need mirror slightly past center for calculation
- for ( i = blip_res; i--; )
- fimpulse [blip_res + half_size + i] = fimpulse [blip_res + half_size - 1 - i];
-
- // starts at 0
- for ( i = 0; i < blip_res; i++ )
- fimpulse [i] = 0.0f;
-
- // find rescale factor
- double total = 0.0;
- for ( i = 0; i < half_size; i++ )
- total += fimpulse [blip_res + i];
-
- //double const base_unit = 44800.0 - 128 * 18; // allows treble up to +0 dB
- //double const base_unit = 37888.0; // allows treble to +5 dB
- double const base_unit = 32768.0; // necessary for blip_unscaled to work
- double rescale = base_unit / 2 / total;
- kernel_unit = (long) base_unit;
-
- // integrate, first difference, rescale, convert to int
- double sum = 0.0;
- double next = 0.0;
- int const impulses_size = this->impulses_size();
- for ( i = 0; i < impulses_size; i++ )
- {
- impulses [i] = (short) floor( (next - sum) * rescale + 0.5 );
- sum += fimpulse [i];
- next += fimpulse [i + blip_res];
- }
- adjust_impulse();
-
- // volume might require rescaling
- double vol = volume_unit_;
- if ( vol )
- {
- volume_unit_ = 0.0;
- volume_unit( vol );
- }
-}
-
-void Blip_Synth_::volume_unit( double new_unit )
-{
- if ( new_unit != volume_unit_ )
- {
- // use default eq if it hasn't been set yet
- if ( !kernel_unit )
- treble_eq( -8.0 );
-
- volume_unit_ = new_unit;
- double factor = new_unit * (1L << blip_sample_bits) / kernel_unit;
-
- if ( factor > 0.0 )
- {
- int shift = 0;
-
- // if unit is really small, might need to attenuate kernel
- while ( factor < 2.0 )
- {
- shift++;
- factor *= 2.0;
- }
-
- if ( shift )
- {
- kernel_unit >>= shift;
- assert( kernel_unit > 0 ); // fails if volume unit is too low
-
- // keep values positive to avoid round-towards-zero of sign-preserving
- // right shift for negative values
- long offset = 0x8000 + (1 << (shift - 1));
- long offset2 = 0x8000 >> shift;
- for ( int i = impulses_size(); i--; )
- impulses [i] = (short) (((impulses [i] + offset) >> shift) - offset2);
- adjust_impulse();
- }
- }
- delta_factor = (int) floor( factor + 0.5 );
- //printf( "delta_factor: %d, kernel_unit: %d\n", delta_factor, kernel_unit );
- }
-}
-#endif
-
-long Blip_Buffer::read_samples( blip_sample_t* BLIP_RESTRICT out, long max_samples, int stereo )
-{
- long count = samples_avail();
- if ( count > max_samples )
- count = max_samples;
-
- if ( count )
- {
- int const bass = BLIP_READER_BASS( *this );
- BLIP_READER_BEGIN( reader, *this );
-
- if ( !stereo )
- {
- for ( blip_long n = count; n; --n )
- {
- blip_long s = BLIP_READER_READ( reader );
- if ( (blip_sample_t) s != s )
- s = 0x7FFF - (s >> 24);
- *out++ = (blip_sample_t) s;
- BLIP_READER_NEXT( reader, bass );
- }
- }
- else
- {
- for ( blip_long n = count; n; --n )
- {
- blip_long s = BLIP_READER_READ( reader );
- if ( (blip_sample_t) s != s )
- s = 0x7FFF - (s >> 24);
- *out = (blip_sample_t) s;
- out += 2;
- BLIP_READER_NEXT( reader, bass );
- }
- }
- BLIP_READER_END( reader, *this );
-
- remove_samples( count );
- }
- return count;
-}
-
-void Blip_Buffer::mix_samples( blip_sample_t const* in, long count )
-{
- if ( buffer_size_ == silent_buf_size )
- {
- assert( 0 );
- return;
- }
-
- buf_t_* out = buffer_ + (offset_ >> BLIP_BUFFER_ACCURACY) + blip_widest_impulse_ / 2;
-
- int const sample_shift = blip_sample_bits - 16;
- int prev = 0;
- while ( count-- )
- {
- blip_long s = (blip_long) *in++ << sample_shift;
- *out += s - prev;
- prev = s;
- ++out;
- }
- *out -= prev;
-}
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.h
deleted file mode 100644
index 73341b8c..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Blip_Buffer.h
+++ /dev/null
@@ -1,485 +0,0 @@
-// Band-limited sound synthesis buffer
-
-// Blip_Buffer 0.4.1
-#ifndef BLIP_BUFFER_H
-#define BLIP_BUFFER_H
-
-// internal
-#include <limits.h>
-#include <stdint.h>
-typedef int32_t blip_long;
-typedef uint32_t blip_ulong;
-
-// Time unit at source clock rate
-typedef blip_long blip_time_t;
-
-// Output samples are 16-bit signed, with a range of -32768 to 32767
-typedef short blip_sample_t;
-enum { blip_sample_max = 32767 };
-
-class Blip_Buffer {
-public:
- typedef const char* blargg_err_t;
-
- // Set output sample rate and buffer length in milliseconds (1/1000 sec, defaults
- // to 1/4 second), then clear buffer. Returns NULL on success, otherwise if there
- // isn't enough memory, returns error without affecting current buffer setup.
- blargg_err_t set_sample_rate( long samples_per_sec, int msec_length = 1000 / 4 );
-
- // Set number of source time units per second
- void clock_rate( long );
-
- // End current time frame of specified duration and make its samples available
- // (along with any still-unread samples) for reading with read_samples(). Begins
- // a new time frame at the end of the current frame.
- void end_frame( blip_time_t time );
-
- // Read at most 'max_samples' out of buffer into 'dest', removing them from from
- // the buffer. Returns number of samples actually read and removed. If stereo is
- // true, increments 'dest' one extra time after writing each sample, to allow
- // easy interleving of two channels into a stereo output buffer.
- long read_samples( blip_sample_t* dest, long max_samples, int stereo = 0 );
-
-// Additional optional features
-
- // Current output sample rate
- long sample_rate() const;
-
- // Length of buffer, in milliseconds
- int length() const;
-
- // Number of source time units per second
- long clock_rate() const;
-
- // Set frequency high-pass filter frequency, where higher values reduce bass more
- void bass_freq( int frequency );
-
- // Number of samples delay from synthesis to samples read out
- int output_latency() const;
-
- // Remove all available samples and clear buffer to silence. If 'entire_buffer' is
- // false, just clears out any samples waiting rather than the entire buffer.
- void clear( int entire_buffer = 1 );
-
- // Number of samples available for reading with read_samples()
- long samples_avail() const;
-
- // Remove 'count' samples from those waiting to be read
- void remove_samples( long count );
-
-// Experimental features
-
- // Count number of clocks needed until 'count' samples will be available.
- // If buffer can't even hold 'count' samples, returns number of clocks until
- // buffer becomes full.
- blip_time_t count_clocks( long count ) const;
-
- // Number of raw samples that can be mixed within frame of specified duration.
- long count_samples( blip_time_t duration ) const;
-
- // Mix 'count' samples from 'buf' into buffer.
- void mix_samples( blip_sample_t const* buf, long count );
-
- // not documented yet
- void set_modified() { modified_ = 1; }
- int clear_modified() { int b = modified_; modified_ = 0; return b; }
- typedef blip_ulong blip_resampled_time_t;
- void remove_silence( long count );
- blip_resampled_time_t resampled_duration( int t ) const { return t * factor_; }
- blip_resampled_time_t resampled_time( blip_time_t t ) const { return t * factor_ + offset_; }
- blip_resampled_time_t clock_rate_factor( long clock_rate ) const;
-public:
- Blip_Buffer();
- ~Blip_Buffer();
-
- // Deprecated
- typedef blip_resampled_time_t resampled_time_t;
- blargg_err_t sample_rate( long r ) { return set_sample_rate( r ); }
- blargg_err_t sample_rate( long r, int msec ) { return set_sample_rate( r, msec ); }
-private:
- // noncopyable
- Blip_Buffer( const Blip_Buffer& );
- Blip_Buffer& operator = ( const Blip_Buffer& );
-public:
- typedef blip_time_t buf_t_;
- blip_ulong factor_;
- blip_resampled_time_t offset_;
- buf_t_* buffer_;
- blip_long buffer_size_;
- blip_long reader_accum_;
- int bass_shift_;
-private:
- long sample_rate_;
- long clock_rate_;
- int bass_freq_;
- int length_;
- int modified_;
- friend class Blip_Reader;
-};
-
-#ifdef HAVE_CONFIG_H
- #include "config.h"
-#endif
-
-// Number of bits in resample ratio fraction. Higher values give a more accurate ratio
-// but reduce maximum buffer size.
-#ifndef BLIP_BUFFER_ACCURACY
- #define BLIP_BUFFER_ACCURACY 16
-#endif
-
-// Number bits in phase offset. Fewer than 6 bits (64 phase offsets) results in
-// noticeable broadband noise when synthesizing high frequency square waves.
-// Affects size of Blip_Synth objects since they store the waveform directly.
-#ifndef BLIP_PHASE_BITS
- #if BLIP_BUFFER_FAST
- #define BLIP_PHASE_BITS 8
- #else
- #define BLIP_PHASE_BITS 6
- #endif
-#endif
-
- // Internal
- typedef blip_ulong blip_resampled_time_t;
- int const blip_widest_impulse_ = 16;
- int const blip_buffer_extra_ = blip_widest_impulse_ + 2;
- int const blip_res = 1 << BLIP_PHASE_BITS;
- class blip_eq_t;
-
- class Blip_Synth_Fast_ {
- public:
- Blip_Buffer* buf;
- int last_amp;
- int delta_factor;
-
- void volume_unit( double );
- Blip_Synth_Fast_();
- void treble_eq( blip_eq_t const& ) { }
- };
-
- class Blip_Synth_ {
- public:
- Blip_Buffer* buf;
- int last_amp;
- int delta_factor;
-
- void volume_unit( double );
- Blip_Synth_( short* impulses, int width );
- void treble_eq( blip_eq_t const& );
- private:
- double volume_unit_;
- short* const impulses;
- int const width;
- blip_long kernel_unit;
- int impulses_size() const { return blip_res / 2 * width + 1; }
- void adjust_impulse();
- };
-
-// Quality level. Start with blip_good_quality.
-const int blip_med_quality = 8;
-const int blip_good_quality = 12;
-const int blip_high_quality = 16;
-
-// Range specifies the greatest expected change in amplitude. Calculate it
-// by finding the difference between the maximum and minimum expected
-// amplitudes (max - min).
-template<int quality,int range>
-class Blip_Synth {
-public:
- // Set overall volume of waveform
- void volume( double v ) { impl.volume_unit( v * (1.0 / (range < 0 ? -range : range)) ); }
-
- // Configure low-pass filter (see blip_buffer.txt)
- void treble_eq( blip_eq_t const& eq ) { impl.treble_eq( eq ); }
-
- // Get/set Blip_Buffer used for output
- Blip_Buffer* output() const { return impl.buf; }
- void output( Blip_Buffer* b ) { impl.buf = b; impl.last_amp = 0; }
-
- // Update amplitude of waveform at given time. Using this requires a separate
- // Blip_Synth for each waveform.
- void update( blip_time_t time, int amplitude );
-
-// Low-level interface
-
- // Add an amplitude transition of specified delta, optionally into specified buffer
- // rather than the one set with output(). Delta can be positive or negative.
- // The actual change in amplitude is delta * (volume / range)
- void offset( blip_time_t, int delta, Blip_Buffer* ) const;
- void offset( blip_time_t t, int delta ) const { offset( t, delta, impl.buf ); }
-
- // Works directly in terms of fractional output samples. Contact author for more info.
- void offset_resampled( blip_resampled_time_t, int delta, Blip_Buffer* ) const;
-
- // Same as offset(), except code is inlined for higher performance
- void offset_inline( blip_time_t t, int delta, Blip_Buffer* buf ) const {
- offset_resampled( t * buf->factor_ + buf->offset_, delta, buf );
- }
- void offset_inline( blip_time_t t, int delta ) const {
- offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf );
- }
-
-private:
-#if BLIP_BUFFER_FAST
- Blip_Synth_Fast_ impl;
-#else
- Blip_Synth_ impl;
- typedef short imp_t;
- imp_t impulses [blip_res * (quality / 2) + 1];
-public:
- Blip_Synth() : impl( impulses, quality ) { }
-#endif
-};
-
-// Low-pass equalization parameters
-class blip_eq_t {
-public:
- // Logarithmic rolloff to treble dB at half sampling rate. Negative values reduce
- // treble, small positive values (0 to 5.0) increase treble.
- blip_eq_t( double treble_db = 0 );
-
- // See blip_buffer.txt
- blip_eq_t( double treble, long rolloff_freq, long sample_rate, long cutoff_freq = 0 );
-
-private:
- double treble;
- long rolloff_freq;
- long sample_rate;
- long cutoff_freq;
- void generate( float* out, int count ) const;
- friend class Blip_Synth_;
-};
-
-int const blip_sample_bits = 30;
-
-// Dummy Blip_Buffer to direct sound output to, for easy muting without
-// having to stop sound code.
-class Silent_Blip_Buffer : public Blip_Buffer {
- buf_t_ buf [blip_buffer_extra_ + 1];
-public:
- // The following cannot be used (an assertion will fail if attempted):
- blargg_err_t set_sample_rate( long samples_per_sec, int msec_length );
- blip_time_t count_clocks( long count ) const;
- void mix_samples( blip_sample_t const* buf, long count );
-
- Silent_Blip_Buffer();
-};
-
- #if defined (__GNUC__) || _MSC_VER >= 1100
- #define BLIP_RESTRICT __restrict
- #else
- #define BLIP_RESTRICT
- #endif
-
-// Optimized reading from Blip_Buffer, for use in custom sample output
-
-// Begin reading from buffer. Name should be unique to the current block.
-#define BLIP_READER_BEGIN( name, blip_buffer ) \
- const Blip_Buffer::buf_t_* BLIP_RESTRICT name##_reader_buf = (blip_buffer).buffer_;\
- blip_long name##_reader_accum = (blip_buffer).reader_accum_
-
-// Get value to pass to BLIP_READER_NEXT()
-#define BLIP_READER_BASS( blip_buffer ) ((blip_buffer).bass_shift_)
-
-// Constant value to use instead of BLIP_READER_BASS(), for slightly more optimal
-// code at the cost of having no bass control
-int const blip_reader_default_bass = 9;
-
-// Current sample
-#define BLIP_READER_READ( name ) (name##_reader_accum >> (blip_sample_bits - 16))
-
-// Current raw sample in full internal resolution
-#define BLIP_READER_READ_RAW( name ) (name##_reader_accum)
-
-// Advance to next sample
-#define BLIP_READER_NEXT( name, bass ) \
- (void) (name##_reader_accum += *name##_reader_buf++ - (name##_reader_accum >> (bass)))
-
-// End reading samples from buffer. The number of samples read must now be removed
-// using Blip_Buffer::remove_samples().
-#define BLIP_READER_END( name, blip_buffer ) \
- (void) ((blip_buffer).reader_accum_ = name##_reader_accum)
-
-
-// Compatibility with older version
-const long blip_unscaled = 65535;
-const int blip_low_quality = blip_med_quality;
-const int blip_best_quality = blip_high_quality;
-
-// Deprecated; use BLIP_READER macros as follows:
-// Blip_Reader r; r.begin( buf ); -> BLIP_READER_BEGIN( r, buf );
-// int bass = r.begin( buf ) -> BLIP_READER_BEGIN( r, buf ); int bass = BLIP_READER_BASS( buf );
-// r.read() -> BLIP_READER_READ( r )
-// r.read_raw() -> BLIP_READER_READ_RAW( r )
-// r.next( bass ) -> BLIP_READER_NEXT( r, bass )
-// r.next() -> BLIP_READER_NEXT( r, blip_reader_default_bass )
-// r.end( buf ) -> BLIP_READER_END( r, buf )
-class Blip_Reader {
-public:
- int begin( Blip_Buffer& );
- blip_long read() const { return accum >> (blip_sample_bits - 16); }
- blip_long read_raw() const { return accum; }
- void next( int bass_shift = 9 ) { accum += *buf++ - (accum >> bass_shift); }
- void end( Blip_Buffer& b ) { b.reader_accum_ = accum; }
-
-private:
- const Blip_Buffer::buf_t_* buf;
- blip_long accum;
-};
-
-// End of public interface
-
-#include <assert.h>
-
-template<int quality,int range>
-inline void Blip_Synth<quality,range>::offset_resampled( blip_resampled_time_t time,
- int delta, Blip_Buffer* blip_buf ) const
-{
- // Fails if time is beyond end of Blip_Buffer, due to a bug in caller code or the
- // need for a longer buffer as set by set_sample_rate().
- assert( (blip_long) (time >> BLIP_BUFFER_ACCURACY) < blip_buf->buffer_size_ );
- delta *= impl.delta_factor;
- blip_long* BLIP_RESTRICT buf = blip_buf->buffer_ + (time >> BLIP_BUFFER_ACCURACY);
- int phase = (int) (time >> (BLIP_BUFFER_ACCURACY - BLIP_PHASE_BITS) & (blip_res - 1));
-
-#if BLIP_BUFFER_FAST
- blip_long left = buf [0] + delta;
-
- // Kind of crappy, but doing shift after multiply results in overflow.
- // Alternate way of delaying multiply by delta_factor results in worse
- // sub-sample resolution.
- blip_long right = (delta >> BLIP_PHASE_BITS) * phase;
- left -= right;
- right += buf [1];
-
- buf [0] = left;
- buf [1] = right;
-#else
-
- int const fwd = (blip_widest_impulse_ - quality) / 2;
- int const rev = fwd + quality - 2;
- int const mid = quality / 2 - 1;
-
- imp_t const* BLIP_RESTRICT imp = impulses + blip_res - phase;
-
- #if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \
- defined (__x86_64__) || defined (__ia64__) || defined (__i386__)
-
- // straight forward implementation resulted in better code on GCC for x86
-
- #define ADD_IMP( out, in ) \
- buf [out] += (blip_long) imp [blip_res * (in)] * delta
-
- #define BLIP_FWD( i ) {\
- ADD_IMP( fwd + i, i );\
- ADD_IMP( fwd + 1 + i, i + 1 );\
- }
- #define BLIP_REV( r ) {\
- ADD_IMP( rev - r, r + 1 );\
- ADD_IMP( rev + 1 - r, r );\
- }
-
- BLIP_FWD( 0 )
- if ( quality > 8 ) BLIP_FWD( 2 )
- if ( quality > 12 ) BLIP_FWD( 4 )
- {
- ADD_IMP( fwd + mid - 1, mid - 1 );
- ADD_IMP( fwd + mid , mid );
- imp = impulses + phase;
- }
- if ( quality > 12 ) BLIP_REV( 6 )
- if ( quality > 8 ) BLIP_REV( 4 )
- BLIP_REV( 2 )
-
- ADD_IMP( rev , 1 );
- ADD_IMP( rev + 1, 0 );
-
- #else
-
- // for RISC processors, help compiler by reading ahead of writes
-
- #define BLIP_FWD( i ) {\
- blip_long t0 = i0 * delta + buf [fwd + i];\
- blip_long t1 = imp [blip_res * (i + 1)] * delta + buf [fwd + 1 + i];\
- i0 = imp [blip_res * (i + 2)];\
- buf [fwd + i] = t0;\
- buf [fwd + 1 + i] = t1;\
- }
- #define BLIP_REV( r ) {\
- blip_long t0 = i0 * delta + buf [rev - r];\
- blip_long t1 = imp [blip_res * r] * delta + buf [rev + 1 - r];\
- i0 = imp [blip_res * (r - 1)];\
- buf [rev - r] = t0;\
- buf [rev + 1 - r] = t1;\
- }
-
- blip_long i0 = *imp;
- BLIP_FWD( 0 )
- if ( quality > 8 ) BLIP_FWD( 2 )
- if ( quality > 12 ) BLIP_FWD( 4 )
- {
- blip_long t0 = i0 * delta + buf [fwd + mid - 1];
- blip_long t1 = imp [blip_res * mid] * delta + buf [fwd + mid ];
- imp = impulses + phase;
- i0 = imp [blip_res * mid];
- buf [fwd + mid - 1] = t0;
- buf [fwd + mid ] = t1;
- }
- if ( quality > 12 ) BLIP_REV( 6 )
- if ( quality > 8 ) BLIP_REV( 4 )
- BLIP_REV( 2 )
-
- blip_long t0 = i0 * delta + buf [rev ];
- blip_long t1 = *imp * delta + buf [rev + 1];
- buf [rev ] = t0;
- buf [rev + 1] = t1;
- #endif
-
-#endif
-}
-
-#undef BLIP_FWD
-#undef BLIP_REV
-
-template<int quality,int range>
-#if BLIP_BUFFER_FAST
- inline
-#endif
-void Blip_Synth<quality,range>::offset( blip_time_t t, int delta, Blip_Buffer* buf ) const
-{
- offset_resampled( t * buf->factor_ + buf->offset_, delta, buf );
-}
-
-template<int quality,int range>
-#if BLIP_BUFFER_FAST
- inline
-#endif
-void Blip_Synth<quality,range>::update( blip_time_t t, int amp )
-{
- int delta = amp - impl.last_amp;
- impl.last_amp = amp;
- offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf );
-}
-
-inline blip_eq_t::blip_eq_t( double t ) :
- treble( t ), rolloff_freq( 0 ), sample_rate( 44100 ), cutoff_freq( 0 ) { }
-inline blip_eq_t::blip_eq_t( double t, long rf, long sr, long cf ) :
- treble( t ), rolloff_freq( rf ), sample_rate( sr ), cutoff_freq( cf ) { }
-
-inline int Blip_Buffer::length() const { return length_; }
-inline long Blip_Buffer::samples_avail() const { return (long) (offset_ >> BLIP_BUFFER_ACCURACY); }
-inline long Blip_Buffer::sample_rate() const { return sample_rate_; }
-inline int Blip_Buffer::output_latency() const { return blip_widest_impulse_ / 2; }
-inline long Blip_Buffer::clock_rate() const { return clock_rate_; }
-inline void Blip_Buffer::clock_rate( long cps ) { factor_ = clock_rate_factor( clock_rate_ = cps ); }
-
-inline int Blip_Reader::begin( Blip_Buffer& blip_buf )
-{
- buf = blip_buf.buffer_;
- accum = blip_buf.reader_accum_;
- return blip_buf.bass_shift_;
-}
-
-int const blip_max_length = 0;
-int const blip_default_length = 250;
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.h
deleted file mode 100644
index 8cd822ca..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.h
+++ /dev/null
@@ -1,127 +0,0 @@
-// Common aspects of emulators which use Blip_Buffer for sound output
-
-// Game_Music_Emu 0.5.2
-#ifndef CLASSIC_EMU_H
-#define CLASSIC_EMU_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-#include "Music_Emu.h"
-
-class Classic_Emu : public Music_Emu {
-public:
- Classic_Emu();
- ~Classic_Emu();
- void set_buffer( Multi_Buffer* );
-protected:
- // Services
- enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
- void set_voice_types( int const* t ) { voice_types = t; }
- blargg_err_t setup_buffer( long clock_rate );
- long clock_rate() const { return clock_rate_; }
- void change_clock_rate( long ); // experimental
-
- // Overridable
- virtual void set_voice( int index, Blip_Buffer* center,
- Blip_Buffer* left, Blip_Buffer* right ) = 0;
- virtual void update_eq( blip_eq_t const& ) = 0;
- virtual blargg_err_t start_track_( int track ) = 0;
- virtual blargg_err_t run_clocks( blip_time_t& time_io, int msec ) = 0;
-protected:
- blargg_err_t set_sample_rate_( long sample_rate );
- void mute_voices_( int );
- void set_equalizer_( equalizer_t const& );
- blargg_err_t play_( long, sample_t* );
-private:
- Multi_Buffer* buf;
- Multi_Buffer* stereo_buffer; // NULL if using custom buffer
- long clock_rate_;
- unsigned buf_changed_count;
- int const* voice_types;
-};
-
-inline void Classic_Emu::set_buffer( Multi_Buffer* new_buf )
-{
- assert( !buf && new_buf );
- buf = new_buf;
-}
-
-// ROM data handler, used by several Classic_Emu derivitives. Loads file data
-// with padding on both sides, allowing direct use in bank mapping. The main purpose
-// is to allow all file data to be loaded with only one read() call (for efficiency).
-
-class Rom_Data_ {
-public:
- typedef unsigned char byte;
-protected:
- enum { pad_extra = 8 };
- blargg_vector<byte> rom;
- long file_size_;
- blargg_long rom_addr;
- blargg_long mask;
- blargg_long size_; // TODO: eliminate
-
- blargg_err_t load_rom_data_( Data_Reader& in, int header_size, void* header_out,
- int fill, long pad_size );
- void set_addr_( long addr, int unit );
-};
-
-template<int unit>
-class Rom_Data : public Rom_Data_ {
- enum { pad_size = unit + pad_extra };
-public:
- // Load file data, using already-loaded header 'h' if not NULL. Copy header
- // from loaded file data into *out and fill unmapped bytes with 'fill'.
- blargg_err_t load( Data_Reader& in, int header_size, void* header_out, int fill )
- {
- return load_rom_data_( in, header_size, header_out, fill, pad_size );
- }
-
- // Size of file data read in (excluding header)
- long file_size() const { return file_size_; }
-
- // Pointer to beginning of file data
- byte* begin() const { return rom.begin() + pad_size; }
-
- // Set address that file data should start at
- void set_addr( long addr ) { set_addr_( addr, unit ); }
-
- // Free data
- void clear() { rom.clear(); }
-
- // Size of data + start addr, rounded to a multiple of unit
- long size() const { return size_; }
-
- // Pointer to unmapped page filled with same value
- byte* unmapped() { return rom.begin(); }
-
- // Mask address to nearest power of two greater than size()
- blargg_long mask_addr( blargg_long addr ) const
- {
- #ifdef check
- check( addr <= mask );
- #endif
- return addr & mask;
- }
-
- // Pointer to page starting at addr. Returns unmapped() if outside data.
- byte* at_addr( blargg_long addr )
- {
- blargg_ulong offset = mask_addr( addr ) - rom_addr;
- if ( offset > blargg_ulong (rom.size() - pad_size) )
- offset = 0; // unmapped
- return &rom [offset];
- }
-};
-
-#ifndef GME_APU_HOOK
- #define GME_APU_HOOK( emu, addr, data ) ((void) 0)
-#endif
-
-#ifndef GME_FRAME_HOOK
- #define GME_FRAME_HOOK( emu ) ((void) 0)
-#else
- #define GME_FRAME_HOOK_DEFINED 1
-#endif
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.h
deleted file mode 100644
index 61beb8a0..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Combination of Fir_Resampler and Blip_Buffer mixing. Used by Sega FM emulators.
-
-// Game_Music_Emu 0.5.2
-#ifndef DUAL_RESAMPLER_H
-#define DUAL_RESAMPLER_H
-
-#include "Fir_Resampler.h"
-#include "Blip_Buffer.h"
-
-class Dual_Resampler {
-public:
- Dual_Resampler();
- virtual ~Dual_Resampler();
-
- typedef short dsample_t;
-
- double setup( double oversample, double rolloff, double gain );
- blargg_err_t reset( int max_pairs );
- void resize( int pairs_per_frame );
- void clear();
-
- void dual_play( long count, dsample_t* out, Blip_Buffer& );
-
-protected:
- virtual int play_frame( blip_time_t, int pcm_count, dsample_t* pcm_out ) = 0;
-private:
-
- blargg_vector<dsample_t> sample_buf;
- int sample_buf_size;
- int oversamples_per_frame;
- int buf_pos;
- int resampler_size;
-
- Fir_Resampler<12> resampler;
- void mix_samples( Blip_Buffer&, dsample_t* );
- void play_frame_( Blip_Buffer&, dsample_t* );
-};
-
-inline double Dual_Resampler::setup( double oversample, double rolloff, double gain )
-{
- return resampler.time_ratio( oversample, rolloff, gain * 0.5 );
-}
-
-inline void Dual_Resampler::clear()
-{
- buf_pos = sample_buf_size;
- resampler.clear();
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.cpp
deleted file mode 100644
index 730f8e94..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.cpp
+++ /dev/null
@@ -1,529 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Effects_Buffer.h"
-
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-typedef blargg_long fixed_t;
-
-#define TO_FIXED( f ) fixed_t ((f) * (1L << 15) + 0.5)
-#define FMUL( x, y ) (((x) * (y)) >> 15)
-
-const unsigned echo_size = 4096;
-const unsigned echo_mask = echo_size - 1;
-BOOST_STATIC_ASSERT( (echo_size & echo_mask) == 0 ); // must be power of 2
-
-const unsigned reverb_size = 8192 * 2;
-const unsigned reverb_mask = reverb_size - 1;
-BOOST_STATIC_ASSERT( (reverb_size & reverb_mask) == 0 ); // must be power of 2
-
-Effects_Buffer::config_t::config_t()
-{
- pan_1 = -0.15f;
- pan_2 = 0.15f;
- reverb_delay = 88.0f;
- reverb_level = 0.12f;
- echo_delay = 61.0f;
- echo_level = 0.10f;
- delay_variance = 18.0f;
- effects_enabled = false;
-}
-
-void Effects_Buffer::set_depth( double d )
-{
- float f = (float) d;
- config_t c;
- c.pan_1 = -0.6f * f;
- c.pan_2 = 0.6f * f;
- c.reverb_delay = 880 * 0.1f;
- c.echo_delay = 610 * 0.1f;
- if ( f > 0.5 )
- f = 0.5; // TODO: more linear reduction of extreme reverb/echo
- c.reverb_level = 0.5f * f;
- c.echo_level = 0.30f * f;
- c.delay_variance = 180 * 0.1f;
- c.effects_enabled = (d > 0.0f);
- config( c );
-}
-
-Effects_Buffer::Effects_Buffer( bool center_only ) : Multi_Buffer( 2 )
-{
- buf_count = center_only ? max_buf_count - 4 : max_buf_count;
-
- echo_pos = 0;
- reverb_pos = 0;
-
- stereo_remain = 0;
- effect_remain = 0;
- effects_enabled = false;
- set_depth( 0 );
-}
-
-Effects_Buffer::~Effects_Buffer() { }
-
-blargg_err_t Effects_Buffer::set_sample_rate( long rate, int msec )
-{
- if ( !echo_buf.size() )
- RETURN_ERR( echo_buf.resize( echo_size ) );
-
- if ( !reverb_buf.size() )
- RETURN_ERR( reverb_buf.resize( reverb_size ) );
-
- for ( int i = 0; i < buf_count; i++ )
- RETURN_ERR( bufs [i].set_sample_rate( rate, msec ) );
-
- config( config_ );
- clear();
-
- return Multi_Buffer::set_sample_rate( bufs [0].sample_rate(), bufs [0].length() );
-}
-
-void Effects_Buffer::clock_rate( long rate )
-{
- for ( int i = 0; i < buf_count; i++ )
- bufs [i].clock_rate( rate );
-}
-
-void Effects_Buffer::bass_freq( int freq )
-{
- for ( int i = 0; i < buf_count; i++ )
- bufs [i].bass_freq( freq );
-}
-
-void Effects_Buffer::clear()
-{
- stereo_remain = 0;
- effect_remain = 0;
- if ( echo_buf.size() )
- memset( &echo_buf [0], 0, echo_size * sizeof echo_buf [0] );
-
- if ( reverb_buf.size() )
- memset( &reverb_buf [0], 0, reverb_size * sizeof reverb_buf [0] );
-
- for ( int i = 0; i < buf_count; i++ )
- bufs [i].clear();
-}
-
-inline int pin_range( int n, int max, int min = 0 )
-{
- if ( n < min )
- return min;
- if ( n > max )
- return max;
- return n;
-}
-
-void Effects_Buffer::config( const config_t& cfg )
-{
- channels_changed();
-
- // clear echo and reverb buffers
- if ( !config_.effects_enabled && cfg.effects_enabled && echo_buf.size() )
- {
- memset( &echo_buf [0], 0, echo_size * sizeof echo_buf [0] );
- memset( &reverb_buf [0], 0, reverb_size * sizeof reverb_buf [0] );
- }
-
- config_ = cfg;
-
- if ( config_.effects_enabled )
- {
- // convert to internal format
-
- chans.pan_1_levels [0] = TO_FIXED( 1 ) - TO_FIXED( config_.pan_1 );
- chans.pan_1_levels [1] = TO_FIXED( 2 ) - chans.pan_1_levels [0];
-
- chans.pan_2_levels [0] = TO_FIXED( 1 ) - TO_FIXED( config_.pan_2 );
- chans.pan_2_levels [1] = TO_FIXED( 2 ) - chans.pan_2_levels [0];
-
- chans.reverb_level = TO_FIXED( config_.reverb_level );
- chans.echo_level = TO_FIXED( config_.echo_level );
-
- int delay_offset = int (1.0 / 2000 * config_.delay_variance * sample_rate());
-
- int reverb_sample_delay = int (1.0 / 1000 * config_.reverb_delay * sample_rate());
- chans.reverb_delay_l = pin_range( reverb_size -
- (reverb_sample_delay - delay_offset) * 2, reverb_size - 2, 0 );
- chans.reverb_delay_r = pin_range( reverb_size + 1 -
- (reverb_sample_delay + delay_offset) * 2, reverb_size - 1, 1 );
-
- int echo_sample_delay = int (1.0 / 1000 * config_.echo_delay * sample_rate());
- chans.echo_delay_l = pin_range( echo_size - 1 - (echo_sample_delay - delay_offset),
- echo_size - 1 );
- chans.echo_delay_r = pin_range( echo_size - 1 - (echo_sample_delay + delay_offset),
- echo_size - 1 );
-
- chan_types [0].center = &bufs [0];
- chan_types [0].left = &bufs [3];
- chan_types [0].right = &bufs [4];
-
- chan_types [1].center = &bufs [1];
- chan_types [1].left = &bufs [3];
- chan_types [1].right = &bufs [4];
-
- chan_types [2].center = &bufs [2];
- chan_types [2].left = &bufs [5];
- chan_types [2].right = &bufs [6];
- assert( 2 < chan_types_count );
- }
- else
- {
- // set up outputs
- for ( unsigned i = 0; i < chan_types_count; i++ )
- {
- channel_t& c = chan_types [i];
- c.center = &bufs [0];
- c.left = &bufs [1];
- c.right = &bufs [2];
- }
- }
-
- if ( buf_count < max_buf_count )
- {
- for ( int i = 0; i < chan_types_count; i++ )
- {
- channel_t& c = chan_types [i];
- c.left = c.center;
- c.right = c.center;
- }
- }
-}
-
-Effects_Buffer::channel_t Effects_Buffer::channel( int i, int type )
-{
- int out = 2;
- if ( !type )
- {
- out = i % 5;
- if ( out > 2 )
- out = 2;
- }
- else if ( !(type & noise_type) && (type & type_index_mask) % 3 != 0 )
- {
- out = type & 1;
- }
- return chan_types [out];
-}
-
-void Effects_Buffer::end_frame( blip_time_t clock_count )
-{
- int bufs_used = 0;
- for ( int i = 0; i < buf_count; i++ )
- {
- bufs_used |= bufs [i].clear_modified() << i;
- bufs [i].end_frame( clock_count );
- }
-
- int stereo_mask = (config_.effects_enabled ? 0x78 : 0x06);
- if ( (bufs_used & stereo_mask) && buf_count == max_buf_count )
- stereo_remain = bufs [0].samples_avail() + bufs [0].output_latency();
-
- if ( effects_enabled || config_.effects_enabled )
- effect_remain = bufs [0].samples_avail() + bufs [0].output_latency();
-
- effects_enabled = config_.effects_enabled;
-}
-
-long Effects_Buffer::samples_avail() const
-{
- return bufs [0].samples_avail() * 2;
-}
-
-long Effects_Buffer::read_samples( blip_sample_t* out, long total_samples )
-{
- require( total_samples % 2 == 0 ); // count must be even
-
- long remain = bufs [0].samples_avail();
- if ( remain > (total_samples >> 1) )
- remain = (total_samples >> 1);
- total_samples = remain;
- while ( remain )
- {
- int active_bufs = buf_count;
- long count = remain;
-
- // optimizing mixing to skip any channels which had nothing added
- if ( effect_remain )
- {
- if ( count > effect_remain )
- count = effect_remain;
-
- if ( stereo_remain )
- {
- mix_enhanced( out, count );
- }
- else
- {
- mix_mono_enhanced( out, count );
- active_bufs = 3;
- }
- }
- else if ( stereo_remain )
- {
- mix_stereo( out, count );
- active_bufs = 3;
- }
- else
- {
- mix_mono( out, count );
- active_bufs = 1;
- }
-
- out += count * 2;
- remain -= count;
-
- stereo_remain -= count;
- if ( stereo_remain < 0 )
- stereo_remain = 0;
-
- effect_remain -= count;
- if ( effect_remain < 0 )
- effect_remain = 0;
-
- for ( int i = 0; i < buf_count; i++ )
- {
- if ( i < active_bufs )
- bufs [i].remove_samples( count );
- else
- bufs [i].remove_silence( count ); // keep time synchronized
- }
- }
-
- return total_samples * 2;
-}
-
-void Effects_Buffer::mix_mono( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [0] );
- BLIP_READER_BEGIN( c, bufs [0] );
-
- // unrolled loop
- for ( blargg_long n = count >> 1; n; --n )
- {
- blargg_long cs0 = BLIP_READER_READ( c );
- BLIP_READER_NEXT( c, bass );
-
- blargg_long cs1 = BLIP_READER_READ( c );
- BLIP_READER_NEXT( c, bass );
-
- if ( (BOOST::int16_t) cs0 != cs0 )
- cs0 = 0x7FFF - (cs0 >> 24);
- ((BOOST::uint32_t*) out) [0] = ((BOOST::uint16_t) cs0) | (cs0 << 16);
-
- if ( (BOOST::int16_t) cs1 != cs1 )
- cs1 = 0x7FFF - (cs1 >> 24);
- ((BOOST::uint32_t*) out) [1] = ((BOOST::uint16_t) cs1) | (cs1 << 16);
- out += 4;
- }
-
- if ( count & 1 )
- {
- int s = BLIP_READER_READ( c );
- BLIP_READER_NEXT( c, bass );
- out [0] = s;
- out [1] = s;
- if ( (BOOST::int16_t) s != s )
- {
- s = 0x7FFF - (s >> 24);
- out [0] = s;
- out [1] = s;
- }
- }
-
- BLIP_READER_END( c, bufs [0] );
-}
-
-void Effects_Buffer::mix_stereo( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [0] );
- BLIP_READER_BEGIN( c, bufs [0] );
- BLIP_READER_BEGIN( l, bufs [1] );
- BLIP_READER_BEGIN( r, bufs [2] );
-
- while ( count-- )
- {
- int cs = BLIP_READER_READ( c );
- BLIP_READER_NEXT( c, bass );
- int left = cs + BLIP_READER_READ( l );
- int right = cs + BLIP_READER_READ( r );
- BLIP_READER_NEXT( l, bass );
- BLIP_READER_NEXT( r, bass );
-
- if ( (BOOST::int16_t) left != left )
- left = 0x7FFF - (left >> 24);
-
- out [0] = left;
- out [1] = right;
-
- out += 2;
-
- if ( (BOOST::int16_t) right != right )
- out [-1] = 0x7FFF - (right >> 24);
- }
-
- BLIP_READER_END( r, bufs [2] );
- BLIP_READER_END( l, bufs [1] );
- BLIP_READER_END( c, bufs [0] );
-}
-
-void Effects_Buffer::mix_mono_enhanced( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [2] );
- BLIP_READER_BEGIN( center, bufs [2] );
- BLIP_READER_BEGIN( sq1, bufs [0] );
- BLIP_READER_BEGIN( sq2, bufs [1] );
-
- blip_sample_t* const reverb_buf = this->reverb_buf.begin();
- blip_sample_t* const echo_buf = this->echo_buf.begin();
- int echo_pos = this->echo_pos;
- int reverb_pos = this->reverb_pos;
-
- while ( count-- )
- {
- int sum1_s = BLIP_READER_READ( sq1 );
- int sum2_s = BLIP_READER_READ( sq2 );
-
- BLIP_READER_NEXT( sq1, bass );
- BLIP_READER_NEXT( sq2, bass );
-
- int new_reverb_l = FMUL( sum1_s, chans.pan_1_levels [0] ) +
- FMUL( sum2_s, chans.pan_2_levels [0] ) +
- reverb_buf [(reverb_pos + chans.reverb_delay_l) & reverb_mask];
-
- int new_reverb_r = FMUL( sum1_s, chans.pan_1_levels [1] ) +
- FMUL( sum2_s, chans.pan_2_levels [1] ) +
- reverb_buf [(reverb_pos + chans.reverb_delay_r) & reverb_mask];
-
- fixed_t reverb_level = chans.reverb_level;
- reverb_buf [reverb_pos] = (blip_sample_t) FMUL( new_reverb_l, reverb_level );
- reverb_buf [reverb_pos + 1] = (blip_sample_t) FMUL( new_reverb_r, reverb_level );
- reverb_pos = (reverb_pos + 2) & reverb_mask;
-
- int sum3_s = BLIP_READER_READ( center );
- BLIP_READER_NEXT( center, bass );
-
- int left = new_reverb_l + sum3_s + FMUL( chans.echo_level,
- echo_buf [(echo_pos + chans.echo_delay_l) & echo_mask] );
- int right = new_reverb_r + sum3_s + FMUL( chans.echo_level,
- echo_buf [(echo_pos + chans.echo_delay_r) & echo_mask] );
-
- echo_buf [echo_pos] = sum3_s;
- echo_pos = (echo_pos + 1) & echo_mask;
-
- if ( (BOOST::int16_t) left != left )
- left = 0x7FFF - (left >> 24);
-
- out [0] = left;
- out [1] = right;
-
- out += 2;
-
- if ( (BOOST::int16_t) right != right )
- out [-1] = 0x7FFF - (right >> 24);
- }
- this->reverb_pos = reverb_pos;
- this->echo_pos = echo_pos;
-
- BLIP_READER_END( sq1, bufs [0] );
- BLIP_READER_END( sq2, bufs [1] );
- BLIP_READER_END( center, bufs [2] );
-}
-
-void Effects_Buffer::mix_enhanced( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [2] );
- BLIP_READER_BEGIN( center, bufs [2] );
- BLIP_READER_BEGIN( l1, bufs [3] );
- BLIP_READER_BEGIN( r1, bufs [4] );
- BLIP_READER_BEGIN( l2, bufs [5] );
- BLIP_READER_BEGIN( r2, bufs [6] );
- BLIP_READER_BEGIN( sq1, bufs [0] );
- BLIP_READER_BEGIN( sq2, bufs [1] );
-
- blip_sample_t* const reverb_buf = this->reverb_buf.begin();
- blip_sample_t* const echo_buf = this->echo_buf.begin();
- int echo_pos = this->echo_pos;
- int reverb_pos = this->reverb_pos;
-
- while ( count-- )
- {
- int sum1_s = BLIP_READER_READ( sq1 );
- int sum2_s = BLIP_READER_READ( sq2 );
-
- BLIP_READER_NEXT( sq1, bass );
- BLIP_READER_NEXT( sq2, bass );
-
- int new_reverb_l = FMUL( sum1_s, chans.pan_1_levels [0] ) +
- FMUL( sum2_s, chans.pan_2_levels [0] ) + BLIP_READER_READ( l1 ) +
- reverb_buf [(reverb_pos + chans.reverb_delay_l) & reverb_mask];
-
- int new_reverb_r = FMUL( sum1_s, chans.pan_1_levels [1] ) +
- FMUL( sum2_s, chans.pan_2_levels [1] ) + BLIP_READER_READ( r1 ) +
- reverb_buf [(reverb_pos + chans.reverb_delay_r) & reverb_mask];
-
- BLIP_READER_NEXT( l1, bass );
- BLIP_READER_NEXT( r1, bass );
-
- fixed_t reverb_level = chans.reverb_level;
- reverb_buf [reverb_pos] = (blip_sample_t) FMUL( new_reverb_l, reverb_level );
- reverb_buf [reverb_pos + 1] = (blip_sample_t) FMUL( new_reverb_r, reverb_level );
- reverb_pos = (reverb_pos + 2) & reverb_mask;
-
- int sum3_s = BLIP_READER_READ( center );
- BLIP_READER_NEXT( center, bass );
-
- int left = new_reverb_l + sum3_s + BLIP_READER_READ( l2 ) + FMUL( chans.echo_level,
- echo_buf [(echo_pos + chans.echo_delay_l) & echo_mask] );
- int right = new_reverb_r + sum3_s + BLIP_READER_READ( r2 ) + FMUL( chans.echo_level,
- echo_buf [(echo_pos + chans.echo_delay_r) & echo_mask] );
-
- BLIP_READER_NEXT( l2, bass );
- BLIP_READER_NEXT( r2, bass );
-
- echo_buf [echo_pos] = sum3_s;
- echo_pos = (echo_pos + 1) & echo_mask;
-
- if ( (BOOST::int16_t) left != left )
- left = 0x7FFF - (left >> 24);
-
- out [0] = left;
- out [1] = right;
-
- out += 2;
-
- if ( (BOOST::int16_t) right != right )
- out [-1] = 0x7FFF - (right >> 24);
- }
- this->reverb_pos = reverb_pos;
- this->echo_pos = echo_pos;
-
- BLIP_READER_END( l1, bufs [3] );
- BLIP_READER_END( r1, bufs [4] );
- BLIP_READER_END( l2, bufs [5] );
- BLIP_READER_END( r2, bufs [6] );
- BLIP_READER_END( sq1, bufs [0] );
- BLIP_READER_END( sq2, bufs [1] );
- BLIP_READER_END( center, bufs [2] );
-}
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.h
deleted file mode 100644
index eb0aa67a..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Effects_Buffer.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Multi-channel effects buffer with panning, echo and reverb
-
-// Game_Music_Emu 0.5.2
-#ifndef EFFECTS_BUFFER_H
-#define EFFECTS_BUFFER_H
-
-#include "Multi_Buffer.h"
-
-// Effects_Buffer uses several buffers and outputs stereo sample pairs.
-class Effects_Buffer : public Multi_Buffer {
-public:
- // If center_only is true, only center buffers are created and
- // less memory is used.
- Effects_Buffer( bool center_only = false );
-
- // Channel Effect Center Pan
- // ---------------------------------
- // 0,5 reverb pan_1
- // 1,6 reverb pan_2
- // 2,7 echo -
- // 3 echo -
- // 4 echo -
-
- // Channel configuration
- struct config_t {
- double pan_1; // -1.0 = left, 0.0 = center, 1.0 = right
- double pan_2;
- double echo_delay; // msec
- double echo_level; // 0.0 to 1.0
- double reverb_delay; // msec
- double delay_variance; // difference between left/right delays (msec)
- double reverb_level; // 0.0 to 1.0
- bool effects_enabled; // if false, use optimized simple mixer
- config_t();
- };
-
- // Set configuration of buffer
- virtual void config( const config_t& );
- void set_depth( double );
-
-public:
- ~Effects_Buffer();
- blargg_err_t set_sample_rate( long samples_per_sec, int msec = blip_default_length );
- void clock_rate( long );
- void bass_freq( int );
- void clear();
- channel_t channel( int, int );
- void end_frame( blip_time_t );
- long read_samples( blip_sample_t*, long );
- long samples_avail() const;
-private:
- typedef long fixed_t;
-
- enum { max_buf_count = 7 };
- Blip_Buffer bufs [max_buf_count];
- enum { chan_types_count = 3 };
- channel_t chan_types [3];
- config_t config_;
- long stereo_remain;
- long effect_remain;
- int buf_count;
- bool effects_enabled;
-
- blargg_vector<blip_sample_t> reverb_buf;
- blargg_vector<blip_sample_t> echo_buf;
- int reverb_pos;
- int echo_pos;
-
- struct {
- fixed_t pan_1_levels [2];
- fixed_t pan_2_levels [2];
- int echo_delay_l;
- int echo_delay_r;
- fixed_t echo_level;
- int reverb_delay_l;
- int reverb_delay_r;
- fixed_t reverb_level;
- } chans;
-
- void mix_mono( blip_sample_t*, blargg_long );
- void mix_stereo( blip_sample_t*, blargg_long );
- void mix_enhanced( blip_sample_t*, blargg_long );
- void mix_mono_enhanced( blip_sample_t*, blargg_long );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.cpp
deleted file mode 100644
index 4e0a4631..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Fir_Resampler.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <math.h>
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#undef PI
-#define PI 3.1415926535897932384626433832795029
-
-static void gen_sinc( double rolloff, int width, double offset, double spacing, double scale,
- int count, short* out )
-{
- double const maxh = 256;
- double const step = PI / maxh * spacing;
- double const to_w = maxh * 2 / width;
- double const pow_a_n = pow( rolloff, maxh );
- scale /= maxh * 2;
-
- double angle = (count / 2 - 1 + offset) * -step;
- while ( count-- )
- {
- *out++ = 0;
- double w = angle * to_w;
- if ( fabs( w ) < PI )
- {
- double rolloff_cos_a = rolloff * cos( angle );
- double num = 1 - rolloff_cos_a -
- pow_a_n * cos( maxh * angle ) +
- pow_a_n * rolloff * cos( (maxh - 1) * angle );
- double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff;
- double sinc = scale * num / den - scale;
-
- out [-1] = (short) (cos( w ) * sinc + sinc);
- }
- angle += step;
- }
-}
-
-Fir_Resampler_::Fir_Resampler_( int width, sample_t* impulses_ ) :
- width_( width ),
- write_offset( width * stereo - stereo ),
- impulses( impulses_ )
-{
- write_pos = 0;
- res = 1;
- imp_phase = 0;
- skip_bits = 0;
- step = stereo;
- ratio_ = 1.0;
-}
-
-Fir_Resampler_::~Fir_Resampler_() { }
-
-void Fir_Resampler_::clear()
-{
- imp_phase = 0;
- if ( buf.size() )
- {
- write_pos = &buf [write_offset];
- memset( buf.begin(), 0, write_offset * sizeof buf [0] );
- }
-}
-
-blargg_err_t Fir_Resampler_::buffer_size( int new_size )
-{
- RETURN_ERR( buf.resize( new_size + write_offset ) );
- clear();
- return 0;
-}
-
-double Fir_Resampler_::time_ratio( double new_factor, double rolloff, double gain )
-{
- ratio_ = new_factor;
-
- double fstep = 0.0;
- {
- double least_error = 2;
- double pos = 0;
- res = -1;
- for ( int r = 1; r <= max_res; r++ )
- {
- pos += ratio_;
- double nearest = floor( pos + 0.5 );
- double error = fabs( pos - nearest );
- if ( error < least_error )
- {
- res = r;
- fstep = nearest / res;
- least_error = error;
- }
- }
- }
-
- skip_bits = 0;
-
- step = stereo * (int) floor( fstep );
-
- ratio_ = fstep;
- fstep = fmod( fstep, 1.0 );
-
- double filter = (ratio_ < 1.0) ? 1.0 : 1.0 / ratio_;
- double pos = 0.0;
- input_per_cycle = 0;
- for ( int i = 0; i < res; i++ )
- {
- gen_sinc( rolloff, int (width_ * filter + 1) & ~1, pos, filter,
- double (0x7FFF * gain * filter),
- (int) width_, impulses + i * width_ );
-
- pos += fstep;
- input_per_cycle += step;
- if ( pos >= 0.9999999 )
- {
- pos -= 1.0;
- skip_bits |= 1 << i;
- input_per_cycle++;
- }
- }
-
- clear();
-
- return ratio_;
-}
-
-int Fir_Resampler_::input_needed( blargg_long output_count ) const
-{
- blargg_long input_count = 0;
-
- unsigned long skip = skip_bits >> imp_phase;
- int remain = res - imp_phase;
- while ( (output_count -= 2) > 0 )
- {
- input_count += step + (skip & 1) * stereo;
- skip >>= 1;
- if ( !--remain )
- {
- skip = skip_bits;
- remain = res;
- }
- output_count -= 2;
- }
-
- long input_extra = input_count - (write_pos - &buf [(width_ - 1) * stereo]);
- if ( input_extra < 0 )
- input_extra = 0;
- return input_extra;
-}
-
-int Fir_Resampler_::avail_( blargg_long input_count ) const
-{
- int cycle_count = input_count / input_per_cycle;
- int output_count = cycle_count * res * stereo;
- input_count -= cycle_count * input_per_cycle;
-
- blargg_ulong skip = skip_bits >> imp_phase;
- int remain = res - imp_phase;
- while ( input_count >= 0 )
- {
- input_count -= step + (skip & 1) * stereo;
- skip >>= 1;
- if ( !--remain )
- {
- skip = skip_bits;
- remain = res;
- }
- output_count += 2;
- }
- return output_count;
-}
-
-int Fir_Resampler_::skip_input( long count )
-{
- int remain = write_pos - buf.begin();
- int max_count = remain - width_ * stereo;
- if ( count > max_count )
- count = max_count;
-
- remain -= count;
- write_pos = &buf [remain];
- memmove( buf.begin(), &buf [count], remain * sizeof buf [0] );
-
- return count;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.h
deleted file mode 100644
index 339dfce3..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Fir_Resampler.h
+++ /dev/null
@@ -1,171 +0,0 @@
-// Finite impulse response (FIR) resampler with adjustable FIR size
-
-// Game_Music_Emu 0.5.2
-#ifndef FIR_RESAMPLER_H
-#define FIR_RESAMPLER_H
-
-#include "blargg_common.h"
-#include <string.h>
-
-class Fir_Resampler_ {
-public:
-
- // Use Fir_Resampler<width> (below)
-
- // Set input/output resampling ratio and optionally low-pass rolloff and gain.
- // Returns actual ratio used (rounded to internal precision).
- double time_ratio( double factor, double rolloff = 0.999, double gain = 1.0 );
-
- // Current input/output ratio
- double ratio() const { return ratio_; }
-
-// Input
-
- typedef short sample_t;
-
- // Resize and clear input buffer
- blargg_err_t buffer_size( int );
-
- // Clear input buffer. At least two output samples will be available after
- // two input samples are written.
- void clear();
-
- // Number of input samples that can be written
- int max_write() const { return buf.end() - write_pos; }
-
- // Pointer to place to write input samples
- sample_t* buffer() { return write_pos; }
-
- // Notify resampler that 'count' input samples have been written
- void write( long count );
-
- // Number of input samples in buffer
- int written() const { return write_pos - &buf [write_offset]; }
-
- // Skip 'count' input samples. Returns number of samples actually skipped.
- int skip_input( long count );
-
-// Output
-
- // Number of extra input samples needed until 'count' output samples are available
- int input_needed( blargg_long count ) const;
-
- // Number of output samples available
- int avail() const { return avail_( write_pos - &buf [width_ * stereo] ); }
-
-public:
- ~Fir_Resampler_();
-protected:
- enum { stereo = 2 };
- enum { max_res = 32 };
- blargg_vector<sample_t> buf;
- sample_t* write_pos;
- int res;
- int imp_phase;
- int const width_;
- int const write_offset;
- blargg_ulong skip_bits;
- int step;
- int input_per_cycle;
- double ratio_;
- sample_t* impulses;
-
- Fir_Resampler_( int width, sample_t* );
- int avail_( blargg_long input_count ) const;
-};
-
-// Width is number of points in FIR. Must be even and 4 or more. More points give
-// better quality and rolloff effectiveness, and take longer to calculate.
-template<int width>
-class Fir_Resampler : public Fir_Resampler_ {
- BOOST_STATIC_ASSERT( width >= 4 && width % 2 == 0 );
- short impulses [max_res] [width];
-public:
- Fir_Resampler() : Fir_Resampler_( width, impulses [0] ) { }
-
- // Read at most 'count' samples. Returns number of samples actually read.
- typedef short sample_t;
- int read( sample_t* out, blargg_long count );
-};
-
-// End of public interface
-
-inline void Fir_Resampler_::write( long count )
-{
- write_pos += count;
- assert( write_pos <= buf.end() );
-}
-
-template<int width>
-int Fir_Resampler<width>::read( sample_t* out_begin, blargg_long count )
-{
- sample_t* out = out_begin;
- const sample_t* in = buf.begin();
- sample_t* end_pos = write_pos;
- blargg_ulong skip = skip_bits >> imp_phase;
- sample_t const* imp = impulses [imp_phase];
- int remain = res - imp_phase;
- int const step = this->step;
-
- count >>= 1;
-
- if ( end_pos - in >= width * stereo )
- {
- end_pos -= width * stereo;
- do
- {
- count--;
-
- // accumulate in extended precision
- blargg_long l = 0;
- blargg_long r = 0;
-
- const sample_t* i = in;
- if ( count < 0 )
- break;
-
- for ( int n = width / 2; n; --n )
- {
- int pt0 = imp [0];
- l += pt0 * i [0];
- r += pt0 * i [1];
- int pt1 = imp [1];
- imp += 2;
- l += pt1 * i [2];
- r += pt1 * i [3];
- i += 4;
- }
-
- remain--;
-
- l >>= 15;
- r >>= 15;
-
- in += (skip * stereo) & stereo;
- skip >>= 1;
- in += step;
-
- if ( !remain )
- {
- imp = impulses [0];
- skip = skip_bits;
- remain = res;
- }
-
- out [0] = (sample_t) l;
- out [1] = (sample_t) r;
- out += 2;
- }
- while ( in <= end_pos );
- }
-
- imp_phase = res - remain;
-
- int left = write_pos - in;
- write_pos = &buf [left];
- memmove( buf.begin(), in, left * sizeof *in );
-
- return out - out_begin;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.cpp
deleted file mode 100644
index 932ebb83..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.cpp
+++ /dev/null
@@ -1,306 +0,0 @@
-// Gb_Snd_Emu 0.1.5. http://www.slack.net/~ant/
-
-#include "Gb_Apu.h"
-
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-unsigned const vol_reg = 0xFF24;
-unsigned const status_reg = 0xFF26;
-
-Gb_Apu::Gb_Apu()
-{
- square1.synth = &square_synth;
- square2.synth = &square_synth;
- wave.synth = &other_synth;
- noise.synth = &other_synth;
-
- oscs [0] = &square1;
- oscs [1] = &square2;
- oscs [2] = &wave;
- oscs [3] = &noise;
-
- for ( int i = 0; i < osc_count; i++ )
- {
- Gb_Osc& osc = *oscs [i];
- osc.regs = &regs [i * 5];
- osc.output = 0;
- osc.outputs [0] = 0;
- osc.outputs [1] = 0;
- osc.outputs [2] = 0;
- osc.outputs [3] = 0;
- }
-
- set_tempo( 1.0 );
- volume( 1.0 );
- reset();
-}
-
-void Gb_Apu::treble_eq( const blip_eq_t& eq )
-{
- square_synth.treble_eq( eq );
- other_synth.treble_eq( eq );
-}
-
-void Gb_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- require( (unsigned) index < osc_count );
- require( (center && left && right) || (!center && !left && !right) );
- Gb_Osc& osc = *oscs [index];
- osc.outputs [1] = right;
- osc.outputs [2] = left;
- osc.outputs [3] = center;
- osc.output = osc.outputs [osc.output_select];
-}
-
-void Gb_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, center, left, right );
-}
-
-void Gb_Apu::update_volume()
-{
- // TODO: doesn't handle differing left/right global volume (support would
- // require modification to all oscillator code)
- int data = regs [vol_reg - start_addr];
- double vol = (max( data & 7, data >> 4 & 7 ) + 1) * volume_unit;
- square_synth.volume( vol );
- other_synth.volume( vol );
-}
-
-static unsigned char const powerup_regs [0x20] = {
- 0x80,0x3F,0x00,0xFF,0xBF, // square 1
- 0xFF,0x3F,0x00,0xFF,0xBF, // square 2
- 0x7F,0xFF,0x9F,0xFF,0xBF, // wave
- 0xFF,0xFF,0x00,0x00,0xBF, // noise
- 0x00, // left/right enables
- 0x77, // master volume
- 0x80, // power
- 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
-};
-
-void Gb_Apu::set_tempo( double t )
-{
- frame_period = 4194304 / 256; // 256 Hz
- if ( t != 1.0 )
- frame_period = blip_time_t (frame_period / t);
-}
-
-void Gb_Apu::reset()
-{
- next_frame_time = 0;
- last_time = 0;
- frame_count = 0;
-
- square1.reset();
- square2.reset();
- wave.reset();
- noise.reset();
- noise.bits = 1;
- wave.wave_pos = 0;
-
- // avoid click at beginning
- regs [vol_reg - start_addr] = 0x77;
- update_volume();
-
- regs [status_reg - start_addr] = 0x01; // force power
- write_register( 0, status_reg, 0x00 );
-
- static unsigned char const initial_wave [] = {
- 0x84,0x40,0x43,0xAA,0x2D,0x78,0x92,0x3C, // wave table
- 0x60,0x59,0x59,0xB0,0x34,0xB8,0x2E,0xDA
- };
- memcpy( wave.wave, initial_wave, sizeof wave.wave );
-}
-
-void Gb_Apu::run_until( blip_time_t end_time )
-{
- require( end_time >= last_time ); // end_time must not be before previous time
- if ( end_time == last_time )
- return;
-
- while ( true )
- {
- blip_time_t time = next_frame_time;
- if ( time > end_time )
- time = end_time;
-
- // run oscillators
- for ( int i = 0; i < osc_count; ++i )
- {
- Gb_Osc& osc = *oscs [i];
- if ( osc.output )
- {
- osc.output->set_modified(); // TODO: misses optimization opportunities?
- int playing = false;
- if ( osc.enabled && osc.volume &&
- (!(osc.regs [4] & osc.len_enabled_mask) || osc.length) )
- playing = -1;
- switch ( i )
- {
- case 0: square1.run( last_time, time, playing ); break;
- case 1: square2.run( last_time, time, playing ); break;
- case 2: wave .run( last_time, time, playing ); break;
- case 3: noise .run( last_time, time, playing ); break;
- }
- }
- }
- last_time = time;
-
- if ( time == end_time )
- break;
-
- next_frame_time += frame_period;
-
- // 256 Hz actions
- square1.clock_length();
- square2.clock_length();
- wave.clock_length();
- noise.clock_length();
-
- frame_count = (frame_count + 1) & 3;
- if ( frame_count == 0 )
- {
- // 64 Hz actions
- square1.clock_envelope();
- square2.clock_envelope();
- noise.clock_envelope();
- }
-
- if ( frame_count & 1 )
- square1.clock_sweep(); // 128 Hz action
- }
-}
-
-void Gb_Apu::end_frame( blip_time_t end_time )
-{
- if ( end_time > last_time )
- run_until( end_time );
-
- assert( next_frame_time >= end_time );
- next_frame_time -= end_time;
-
- assert( last_time >= end_time );
- last_time -= end_time;
-}
-
-void Gb_Apu::write_register( blip_time_t time, unsigned addr, int data )
-{
- require( (unsigned) data < 0x100 );
-
- int reg = addr - start_addr;
- if ( (unsigned) reg >= register_count )
- return;
-
- run_until( time );
-
- int old_reg = regs [reg];
- regs [reg] = data;
-
- if ( addr < vol_reg )
- {
- write_osc( reg / 5, reg, data );
- }
- else if ( addr == vol_reg && data != old_reg ) // global volume
- {
- // return all oscs to 0
- for ( int i = 0; i < osc_count; i++ )
- {
- Gb_Osc& osc = *oscs [i];
- int amp = osc.last_amp;
- osc.last_amp = 0;
- if ( amp && osc.enabled && osc.output )
- other_synth.offset( time, -amp, osc.output );
- }
-
- if ( wave.outputs [3] )
- other_synth.offset( time, 30, wave.outputs [3] );
-
- update_volume();
-
- if ( wave.outputs [3] )
- other_synth.offset( time, -30, wave.outputs [3] );
-
- // oscs will update with new amplitude when next run
- }
- else if ( addr == 0xFF25 || addr == status_reg )
- {
- int mask = (regs [status_reg - start_addr] & 0x80) ? ~0 : 0;
- int flags = regs [0xFF25 - start_addr] & mask;
-
- // left/right assignments
- for ( int i = 0; i < osc_count; i++ )
- {
- Gb_Osc& osc = *oscs [i];
- osc.enabled &= mask;
- int bits = flags >> i;
- Blip_Buffer* old_output = osc.output;
- osc.output_select = (bits >> 3 & 2) | (bits & 1);
- osc.output = osc.outputs [osc.output_select];
- if ( osc.output != old_output )
- {
- int amp = osc.last_amp;
- osc.last_amp = 0;
- if ( amp && old_output )
- other_synth.offset( time, -amp, old_output );
- }
- }
-
- if ( addr == status_reg && data != old_reg )
- {
- if ( !(data & 0x80) )
- {
- for ( unsigned i = 0; i < sizeof powerup_regs; i++ )
- {
- if ( i != status_reg - start_addr )
- write_register( time, i + start_addr, powerup_regs [i] );
- }
- }
- else
- {
- //dprintf( "APU powered on\n" );
- }
- }
- }
- else if ( addr >= 0xFF30 )
- {
- int index = (addr & 0x0F) * 2;
- wave.wave [index] = data >> 4;
- wave.wave [index + 1] = data & 0x0F;
- }
-}
-
-int Gb_Apu::read_register( blip_time_t time, unsigned addr )
-{
- run_until( time );
-
- int index = addr - start_addr;
- require( (unsigned) index < register_count );
- int data = regs [index];
-
- if ( addr == status_reg )
- {
- data = (data & 0x80) | 0x70;
- for ( int i = 0; i < osc_count; i++ )
- {
- const Gb_Osc& osc = *oscs [i];
- if ( osc.enabled && (osc.length || !(osc.regs [4] & osc.len_enabled_mask)) )
- data |= 1 << i;
- }
- }
-
- return data;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.cpp
deleted file mode 100644
index b1f22bd9..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.cpp
+++ /dev/null
@@ -1,1056 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Gb_Cpu.h"
-
-#include <string.h>
-
-//#include "gb_cpu_log.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "gb_cpu_io.h"
-
-#include "blargg_source.h"
-
-// Common instructions:
-//
-// 365880 FA LD A,IND16
-// 355863 20 JR NZ
-// 313655 21 LD HL,IMM
-// 274580 28 JR Z
-// 252878 FE CMP IMM
-// 230541 7E LD A,(HL)
-// 226209 2A LD A,(HL+)
-// 217467 CD CALL
-// 212034 C9 RET
-// 208376 CB CB prefix
-//
-// 27486 CB 7E BIT 7,(HL)
-// 15925 CB 76 BIT 6,(HL)
-// 13035 CB 19 RR C
-// 11557 CB 7F BIT 7,A
-// 10898 CB 37 SWAP A
-// 10208 CB 66 BIT 4,(HL)
-
-#if BLARGG_NONPORTABLE
- #define PAGE_OFFSET( addr ) (addr)
-#else
- #define PAGE_OFFSET( addr ) ((addr) & (page_size - 1))
-#endif
-
-inline void Gb_Cpu::set_code_page( int i, uint8_t* p )
-{
- state->code_map [i] = p - PAGE_OFFSET( i * (blargg_long) page_size );
-}
-
-void Gb_Cpu::reset( void* unmapped )
-{
- check( state == &state_ );
- state = &state_;
-
- state_.remain = 0;
-
- for ( int i = 0; i < page_count + 1; i++ )
- set_code_page( i, (uint8_t*) unmapped );
-
- memset( &r, 0, sizeof r );
- //interrupts_enabled = false;
-
- blargg_verify_byte_order();
-}
-
-void Gb_Cpu::map_code( gb_addr_t start, unsigned size, void* data )
-{
- // address range must begin and end on page boundaries
- require( start % page_size == 0 );
- require( size % page_size == 0 );
-
- unsigned first_page = start / page_size;
- for ( unsigned i = size / page_size; i--; )
- set_code_page( first_page + i, (uint8_t*) data + i * page_size );
-}
-
-#define READ( addr ) CPU_READ( this, (addr), s.remain )
-#define WRITE( addr, data ) {CPU_WRITE( this, (addr), (data), s.remain );}
-#define READ_FAST( addr, out ) CPU_READ_FAST( this, (addr), s.remain, out )
-#define READ_PROG( addr ) (s.code_map [(addr) >> page_shift] [PAGE_OFFSET( addr )])
-
-unsigned const z_flag = 0x80;
-unsigned const n_flag = 0x40;
-unsigned const h_flag = 0x20;
-unsigned const c_flag = 0x10;
-
-bool Gb_Cpu::run( blargg_long cycle_count )
-{
- state_.remain = blargg_ulong (cycle_count + clocks_per_instr) / clocks_per_instr;
- state_t s;
- this->state = &s;
- memcpy( &s, &this->state_, sizeof s );
-
- typedef BOOST::uint16_t uint16_t;
-
-#if BLARGG_BIG_ENDIAN
- #define R8( n ) (r8_ [n])
-#elif BLARGG_LITTLE_ENDIAN
- #define R8( n ) (r8_ [(n) ^ 1])
-#else
- #error "Byte order of CPU must be known"
-#endif
-
- union {
- core_regs_t rg; // individual registers
-
- struct {
- BOOST::uint16_t bc, de, hl, unused; // pairs
- } rp;
-
- uint8_t r8_ [8]; // indexed registers (use R8 macro due to endian dependence)
- BOOST::uint16_t r16 [4]; // indexed pairs
- };
- BOOST_STATIC_ASSERT( sizeof rg == 8 && sizeof rp == 8 );
-
- rg = r;
- unsigned pc = r.pc;
- unsigned sp = r.sp;
- unsigned flags = r.flags;
-
-loop:
-
- check( (unsigned long) pc < 0x10000 );
- check( (unsigned long) sp < 0x10000 );
- check( (flags & ~0xF0) == 0 );
-
- uint8_t const* instr = s.code_map [pc >> page_shift];
- unsigned op;
-
- // TODO: eliminate this special case
- #if BLARGG_NONPORTABLE
- op = instr [pc];
- pc++;
- instr += pc;
- #else
- instr += PAGE_OFFSET( pc );
- op = *instr++;
- pc++;
- #endif
-
-#define GET_ADDR() GET_LE16( instr )
-
- if ( !--s.remain )
- goto stop;
-
- unsigned data;
- data = *instr;
-
- #ifdef GB_CPU_LOG_H
- gb_cpu_log( "new", pc - 1, op, data, instr [1] );
- #endif
-
- switch ( op )
- {
-
-// TODO: more efficient way to handle negative branch that wraps PC around
-#define BRANCH( cond )\
-{\
- pc++;\
- int offset = (BOOST::int8_t) data;\
- if ( !(cond) ) goto loop;\
- pc = uint16_t (pc + offset);\
- goto loop;\
-}
-
-// Most Common
-
- case 0x20: // JR NZ
- BRANCH( !(flags & z_flag) )
-
- case 0x21: // LD HL,IMM (common)
- rp.hl = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x28: // JR Z
- BRANCH( flags & z_flag )
-
- {
- unsigned temp;
- case 0xF0: // LD A,(0xFF00+imm)
- temp = data | 0xFF00;
- pc++;
- goto ld_a_ind_comm;
-
- case 0xF2: // LD A,(0xFF00+C)
- temp = rg.c | 0xFF00;
- goto ld_a_ind_comm;
-
- case 0x0A: // LD A,(BC)
- temp = rp.bc;
- goto ld_a_ind_comm;
-
- case 0x3A: // LD A,(HL-)
- temp = rp.hl;
- rp.hl = temp - 1;
- goto ld_a_ind_comm;
-
- case 0x1A: // LD A,(DE)
- temp = rp.de;
- goto ld_a_ind_comm;
-
- case 0x2A: // LD A,(HL+) (common)
- temp = rp.hl;
- rp.hl = temp + 1;
- goto ld_a_ind_comm;
-
- case 0xFA: // LD A,IND16 (common)
- temp = GET_ADDR();
- pc += 2;
- ld_a_ind_comm:
- READ_FAST( temp, rg.a );
- goto loop;
- }
-
- case 0xBE: // CMP (HL)
- data = READ( rp.hl );
- goto cmp_comm;
-
- case 0xB8: // CMP B
- case 0xB9: // CMP C
- case 0xBA: // CMP D
- case 0xBB: // CMP E
- case 0xBC: // CMP H
- case 0xBD: // CMP L
- data = R8( op & 7 );
- goto cmp_comm;
-
- case 0xFE: // CMP IMM
- pc++;
- cmp_comm:
- op = rg.a;
- data = op - data;
- sub_set_flags:
- flags = ((op & 15) - (data & 15)) & h_flag;
- flags |= (data >> 4) & c_flag;
- flags |= n_flag;
- if ( data & 0xFF )
- goto loop;
- flags |= z_flag;
- goto loop;
-
- case 0x46: // LD B,(HL)
- case 0x4E: // LD C,(HL)
- case 0x56: // LD D,(HL)
- case 0x5E: // LD E,(HL)
- case 0x66: // LD H,(HL)
- case 0x6E: // LD L,(HL)
- case 0x7E:{// LD A,(HL)
- unsigned addr = rp.hl;
- READ_FAST( addr, R8( (op >> 3) & 7 ) );
- goto loop;
- }
-
- case 0xC4: // CNZ (next-most-common)
- pc += 2;
- if ( flags & z_flag )
- goto loop;
- call:
- pc -= 2;
- case 0xCD: // CALL (most-common)
- data = pc + 2;
- pc = GET_ADDR();
- push:
- sp = (sp - 1) & 0xFFFF;
- WRITE( sp, data >> 8 );
- sp = (sp - 1) & 0xFFFF;
- WRITE( sp, data & 0xFF );
- goto loop;
-
- case 0xC8: // RNZ (next-most-common)
- if ( !(flags & z_flag) )
- goto loop;
- case 0xC9: // RET (most common)
- ret:
- pc = READ( sp );
- pc += 0x100 * READ( sp + 1 );
- sp = (sp + 2) & 0xFFFF;
- goto loop;
-
- case 0x00: // NOP
- case 0x40: // LD B,B
- case 0x49: // LD C,C
- case 0x52: // LD D,D
- case 0x5B: // LD E,E
- case 0x64: // LD H,H
- case 0x6D: // LD L,L
- case 0x7F: // LD A,A
- goto loop;
-
-// CB Instructions
-
- case 0xCB:
- pc++;
- // now data is the opcode
- switch ( data ) {
-
- {
- int temp;
- case 0x46: // BIT b,(HL)
- case 0x4E:
- case 0x56:
- case 0x5E:
- case 0x66:
- case 0x6E:
- case 0x76:
- case 0x7E:
- {
- unsigned addr = rp.hl;
- READ_FAST( addr, temp );
- goto bit_comm;
- }
-
- case 0x40: case 0x41: case 0x42: case 0x43: // BIT b,r
- case 0x44: case 0x45: case 0x47: case 0x48:
- case 0x49: case 0x4A: case 0x4B: case 0x4C:
- case 0x4D: case 0x4F: case 0x50: case 0x51:
- case 0x52: case 0x53: case 0x54: case 0x55:
- case 0x57: case 0x58: case 0x59: case 0x5A:
- case 0x5B: case 0x5C: case 0x5D: case 0x5F:
- case 0x60: case 0x61: case 0x62: case 0x63:
- case 0x64: case 0x65: case 0x67: case 0x68:
- case 0x69: case 0x6A: case 0x6B: case 0x6C:
- case 0x6D: case 0x6F: case 0x70: case 0x71:
- case 0x72: case 0x73: case 0x74: case 0x75:
- case 0x77: case 0x78: case 0x79: case 0x7A:
- case 0x7B: case 0x7C: case 0x7D: case 0x7F:
- temp = R8( data & 7 );
- bit_comm:
- int bit = (~data >> 3) & 7;
- flags &= ~n_flag;
- flags |= h_flag | z_flag;
- flags ^= (temp << bit) & z_flag;
- goto loop;
- }
-
- case 0x86: // RES b,(HL)
- case 0x8E:
- case 0x96:
- case 0x9E:
- case 0xA6:
- case 0xAE:
- case 0xB6:
- case 0xBE:
- case 0xC6: // SET b,(HL)
- case 0xCE:
- case 0xD6:
- case 0xDE:
- case 0xE6:
- case 0xEE:
- case 0xF6:
- case 0xFE: {
- int temp = READ( rp.hl );
- int bit = 1 << ((data >> 3) & 7);
- temp &= ~bit;
- if ( !(data & 0x40) )
- bit = 0;
- WRITE( rp.hl, temp | bit );
- goto loop;
- }
-
- case 0xC0: case 0xC1: case 0xC2: case 0xC3: // SET b,r
- case 0xC4: case 0xC5: case 0xC7: case 0xC8:
- case 0xC9: case 0xCA: case 0xCB: case 0xCC:
- case 0xCD: case 0xCF: case 0xD0: case 0xD1:
- case 0xD2: case 0xD3: case 0xD4: case 0xD5:
- case 0xD7: case 0xD8: case 0xD9: case 0xDA:
- case 0xDB: case 0xDC: case 0xDD: case 0xDF:
- case 0xE0: case 0xE1: case 0xE2: case 0xE3:
- case 0xE4: case 0xE5: case 0xE7: case 0xE8:
- case 0xE9: case 0xEA: case 0xEB: case 0xEC:
- case 0xED: case 0xEF: case 0xF0: case 0xF1:
- case 0xF2: case 0xF3: case 0xF4: case 0xF5:
- case 0xF7: case 0xF8: case 0xF9: case 0xFA:
- case 0xFB: case 0xFC: case 0xFD: case 0xFF:
- R8( data & 7 ) |= 1 << ((data >> 3) & 7);
- goto loop;
-
- case 0x80: case 0x81: case 0x82: case 0x83: // RES b,r
- case 0x84: case 0x85: case 0x87: case 0x88:
- case 0x89: case 0x8A: case 0x8B: case 0x8C:
- case 0x8D: case 0x8F: case 0x90: case 0x91:
- case 0x92: case 0x93: case 0x94: case 0x95:
- case 0x97: case 0x98: case 0x99: case 0x9A:
- case 0x9B: case 0x9C: case 0x9D: case 0x9F:
- case 0xA0: case 0xA1: case 0xA2: case 0xA3:
- case 0xA4: case 0xA5: case 0xA7: case 0xA8:
- case 0xA9: case 0xAA: case 0xAB: case 0xAC:
- case 0xAD: case 0xAF: case 0xB0: case 0xB1:
- case 0xB2: case 0xB3: case 0xB4: case 0xB5:
- case 0xB7: case 0xB8: case 0xB9: case 0xBA:
- case 0xBB: case 0xBC: case 0xBD: case 0xBF:
- R8( data & 7 ) &= ~(1 << ((data >> 3) & 7));
- goto loop;
-
- {
- int temp;
- case 0x36: // SWAP (HL)
- temp = READ( rp.hl );
- goto swap_comm;
-
- case 0x30: // SWAP B
- case 0x31: // SWAP C
- case 0x32: // SWAP D
- case 0x33: // SWAP E
- case 0x34: // SWAP H
- case 0x35: // SWAP L
- case 0x37: // SWAP A
- temp = R8( data & 7 );
- swap_comm:
- op = (temp >> 4) | (temp << 4);
- flags = 0;
- goto shift_comm;
- }
-
-// Shift/Rotate
-
- case 0x06: // RLC (HL)
- case 0x16: // RL (HL)
- case 0x26: // SLA (HL)
- op = READ( rp.hl );
- goto rl_comm;
-
- case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x27: // SLA A
- case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x07: // RLC A
- case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x17: // RL A
- op = R8( data & 7 );
- goto rl_comm;
-
- case 0x3E: // SRL (HL)
- data += 0x10; // bump up to 0x4n to avoid preserving sign bit
- case 0x1E: // RR (HL)
- case 0x0E: // RRC (HL)
- case 0x2E: // SRA (HL)
- op = READ( rp.hl );
- goto rr_comm;
-
- case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3F: // SRL A
- data += 0x10; // bump up to 0x4n
- case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1F: // RR A
- case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0F: // RRC A
- case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2F: // SRA A
- op = R8( data & 7 );
- goto rr_comm;
-
- } // CB op
- assert( false ); // unhandled CB op
-
- case 0x07: // RLCA
- case 0x17: // RLA
- data = op;
- op = rg.a;
- rl_comm:
- op <<= 1;
- op |= ((data & flags) >> 4) & 1; // RL and carry is set
- flags = (op >> 4) & c_flag; // C = bit shifted out
- if ( data < 0x10 ) // RLC
- op |= op >> 8;
- // SLA doesn't fill lower bit
- goto shift_comm;
-
- case 0x0F: // RRCA
- case 0x1F: // RRA
- data = op;
- op = rg.a;
- rr_comm:
- op |= (data & flags) << 4; // RR and carry is set
- flags = (op << 4) & c_flag; // C = bit shifted out
- if ( data < 0x10 ) // RRC
- op |= op << 8;
- op >>= 1;
- if ( data & 0x20 ) // SRA propagates sign bit
- op |= (op << 1) & 0x80;
- shift_comm:
- data &= 7;
- if ( !(op & 0xFF) )
- flags |= z_flag;
- if ( data == 6 )
- goto write_hl_op_ff;
- R8( data ) = op;
- goto loop;
-
-// Load
-
- case 0x70: // LD (HL),B
- case 0x71: // LD (HL),C
- case 0x72: // LD (HL),D
- case 0x73: // LD (HL),E
- case 0x74: // LD (HL),H
- case 0x75: // LD (HL),L
- case 0x77: // LD (HL),A
- op = R8( op & 7 );
- write_hl_op_ff:
- WRITE( rp.hl, op & 0xFF );
- goto loop;
-
- case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x47: // LD r,r
- case 0x48: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4F:
- case 0x50: case 0x51: case 0x53: case 0x54: case 0x55: case 0x57:
- case 0x58: case 0x59: case 0x5A: case 0x5C: case 0x5D: case 0x5F:
- case 0x60: case 0x61: case 0x62: case 0x63: case 0x65: case 0x67:
- case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6F:
- case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D:
- R8( (op >> 3) & 7 ) = R8( op & 7 );
- goto loop;
-
- case 0x08: // LD IND16,SP
- data = GET_ADDR();
- pc += 2;
- WRITE( data, sp&0xFF );
- data++;
- WRITE( data, sp >> 8 );
- goto loop;
-
- case 0xF9: // LD SP,HL
- sp = rp.hl;
- goto loop;
-
- case 0x31: // LD SP,IMM
- sp = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x01: // LD BC,IMM
- case 0x11: // LD DE,IMM
- r16 [op >> 4] = GET_ADDR();
- pc += 2;
- goto loop;
-
- {
- unsigned temp;
- case 0xE0: // LD (0xFF00+imm),A
- temp = data | 0xFF00;
- pc++;
- goto write_data_rg_a;
-
- case 0xE2: // LD (0xFF00+C),A
- temp = rg.c | 0xFF00;
- goto write_data_rg_a;
-
- case 0x32: // LD (HL-),A
- temp = rp.hl;
- rp.hl = temp - 1;
- goto write_data_rg_a;
-
- case 0x02: // LD (BC),A
- temp = rp.bc;
- goto write_data_rg_a;
-
- case 0x12: // LD (DE),A
- temp = rp.de;
- goto write_data_rg_a;
-
- case 0x22: // LD (HL+),A
- temp = rp.hl;
- rp.hl = temp + 1;
- goto write_data_rg_a;
-
- case 0xEA: // LD IND16,A (common)
- temp = GET_ADDR();
- pc += 2;
- write_data_rg_a:
- WRITE( temp, rg.a );
- goto loop;
- }
-
- case 0x06: // LD B,IMM
- rg.b = data;
- pc++;
- goto loop;
-
- case 0x0E: // LD C,IMM
- rg.c = data;
- pc++;
- goto loop;
-
- case 0x16: // LD D,IMM
- rg.d = data;
- pc++;
- goto loop;
-
- case 0x1E: // LD E,IMM
- rg.e = data;
- pc++;
- goto loop;
-
- case 0x26: // LD H,IMM
- rg.h = data;
- pc++;
- goto loop;
-
- case 0x2E: // LD L,IMM
- rg.l = data;
- pc++;
- goto loop;
-
- case 0x36: // LD (HL),IMM
- WRITE( rp.hl, data );
- pc++;
- goto loop;
-
- case 0x3E: // LD A,IMM
- rg.a = data;
- pc++;
- goto loop;
-
-// Increment/Decrement
-
- case 0x03: // INC BC
- case 0x13: // INC DE
- case 0x23: // INC HL
- r16 [op >> 4]++;
- goto loop;
-
- case 0x33: // INC SP
- sp = (sp + 1) & 0xFFFF;
- goto loop;
-
- case 0x0B: // DEC BC
- case 0x1B: // DEC DE
- case 0x2B: // DEC HL
- r16 [op >> 4]--;
- goto loop;
-
- case 0x3B: // DEC SP
- sp = (sp - 1) & 0xFFFF;
- goto loop;
-
- case 0x34: // INC (HL)
- op = rp.hl;
- data = READ( op );
- data++;
- WRITE( op, data & 0xFF );
- goto inc_comm;
-
- case 0x04: // INC B
- case 0x0C: // INC C (common)
- case 0x14: // INC D
- case 0x1C: // INC E
- case 0x24: // INC H
- case 0x2C: // INC L
- case 0x3C: // INC A
- op = (op >> 3) & 7;
- R8( op ) = data = R8( op ) + 1;
- inc_comm:
- flags = (flags & c_flag) | (((data & 15) - 1) & h_flag) | ((data >> 1) & z_flag);
- goto loop;
-
- case 0x35: // DEC (HL)
- op = rp.hl;
- data = READ( op );
- data--;
- WRITE( op, data & 0xFF );
- goto dec_comm;
-
- case 0x05: // DEC B
- case 0x0D: // DEC C
- case 0x15: // DEC D
- case 0x1D: // DEC E
- case 0x25: // DEC H
- case 0x2D: // DEC L
- case 0x3D: // DEC A
- op = (op >> 3) & 7;
- data = R8( op ) - 1;
- R8( op ) = data;
- dec_comm:
- flags = (flags & c_flag) | n_flag | (((data & 15) + 0x31) & h_flag);
- if ( data & 0xFF )
- goto loop;
- flags |= z_flag;
- goto loop;
-
-// Add 16-bit
-
- {
- blargg_ulong temp; // need more than 16 bits for carry
- unsigned prev;
-
- case 0xF8: // LD HL,SP+imm
- temp = BOOST::int8_t (data); // sign-extend to 16 bits
- pc++;
- flags = 0;
- temp += sp;
- prev = sp;
- goto add_16_hl;
-
- case 0xE8: // ADD SP,IMM
- temp = BOOST::int8_t (data); // sign-extend to 16 bits
- pc++;
- flags = 0;
- temp += sp;
- prev = sp;
- sp = temp & 0xFFFF;
- goto add_16_comm;
-
- case 0x39: // ADD HL,SP
- temp = sp;
- goto add_hl_comm;
-
- case 0x09: // ADD HL,BC
- case 0x19: // ADD HL,DE
- case 0x29: // ADD HL,HL
- temp = r16 [op >> 4];
- add_hl_comm:
- prev = rp.hl;
- temp += prev;
- flags &= z_flag;
- add_16_hl:
- rp.hl = temp;
- add_16_comm:
- flags |= (temp >> 12) & c_flag;
- flags |= (((temp & 0x0FFF) - (prev & 0x0FFF)) >> 7) & h_flag;
- goto loop;
- }
-
- case 0x86: // ADD (HL)
- data = READ( rp.hl );
- goto add_comm;
-
- case 0x80: // ADD B
- case 0x81: // ADD C
- case 0x82: // ADD D
- case 0x83: // ADD E
- case 0x84: // ADD H
- case 0x85: // ADD L
- case 0x87: // ADD A
- data = R8( op & 7 );
- goto add_comm;
-
- case 0xC6: // ADD IMM
- pc++;
- add_comm:
- flags = rg.a;
- data += flags;
- flags = ((data & 15) - (flags & 15)) & h_flag;
- flags |= (data >> 4) & c_flag;
- rg.a = data;
- if ( data & 0xFF )
- goto loop;
- flags |= z_flag;
- goto loop;
-
-// Add/Subtract
-
- case 0x8E: // ADC (HL)
- data = READ( rp.hl );
- goto adc_comm;
-
- case 0x88: // ADC B
- case 0x89: // ADC C
- case 0x8A: // ADC D
- case 0x8B: // ADC E
- case 0x8C: // ADC H
- case 0x8D: // ADC L
- case 0x8F: // ADC A
- data = R8( op & 7 );
- goto adc_comm;
-
- case 0xCE: // ADC IMM
- pc++;
- adc_comm:
- data += (flags >> 4) & 1;
- data &= 0xFF; // to do: does carry get set when sum + carry = 0x100?
- goto add_comm;
-
- case 0x96: // SUB (HL)
- data = READ( rp.hl );
- goto sub_comm;
-
- case 0x90: // SUB B
- case 0x91: // SUB C
- case 0x92: // SUB D
- case 0x93: // SUB E
- case 0x94: // SUB H
- case 0x95: // SUB L
- case 0x97: // SUB A
- data = R8( op & 7 );
- goto sub_comm;
-
- case 0xD6: // SUB IMM
- pc++;
- sub_comm:
- op = rg.a;
- data = op - data;
- rg.a = data;
- goto sub_set_flags;
-
- case 0x9E: // SBC (HL)
- data = READ( rp.hl );
- goto sbc_comm;
-
- case 0x98: // SBC B
- case 0x99: // SBC C
- case 0x9A: // SBC D
- case 0x9B: // SBC E
- case 0x9C: // SBC H
- case 0x9D: // SBC L
- case 0x9F: // SBC A
- data = R8( op & 7 );
- goto sbc_comm;
-
- case 0xDE: // SBC IMM
- pc++;
- sbc_comm:
- data += (flags >> 4) & 1;
- data &= 0xFF; // to do: does carry get set when sum + carry = 0x100?
- goto sub_comm;
-
-// Logical
-
- case 0xA0: // AND B
- case 0xA1: // AND C
- case 0xA2: // AND D
- case 0xA3: // AND E
- case 0xA4: // AND H
- case 0xA5: // AND L
- data = R8( op & 7 );
- goto and_comm;
-
- case 0xA6: // AND (HL)
- data = READ( rp.hl );
- pc--;
- case 0xE6: // AND IMM
- pc++;
- and_comm:
- rg.a &= data;
- case 0xA7: // AND A
- flags = h_flag | (((rg.a - 1) >> 1) & z_flag);
- goto loop;
-
- case 0xB0: // OR B
- case 0xB1: // OR C
- case 0xB2: // OR D
- case 0xB3: // OR E
- case 0xB4: // OR H
- case 0xB5: // OR L
- data = R8( op & 7 );
- goto or_comm;
-
- case 0xB6: // OR (HL)
- data = READ( rp.hl );
- pc--;
- case 0xF6: // OR IMM
- pc++;
- or_comm:
- rg.a |= data;
- case 0xB7: // OR A
- flags = ((rg.a - 1) >> 1) & z_flag;
- goto loop;
-
- case 0xA8: // XOR B
- case 0xA9: // XOR C
- case 0xAA: // XOR D
- case 0xAB: // XOR E
- case 0xAC: // XOR H
- case 0xAD: // XOR L
- data = R8( op & 7 );
- goto xor_comm;
-
- case 0xAE: // XOR (HL)
- data = READ( rp.hl );
- pc--;
- case 0xEE: // XOR IMM
- pc++;
- xor_comm:
- data ^= rg.a;
- rg.a = data;
- data--;
- flags = (data >> 1) & z_flag;
- goto loop;
-
- case 0xAF: // XOR A
- rg.a = 0;
- flags = z_flag;
- goto loop;
-
-// Stack
-
- case 0xF1: // POP FA
- case 0xC1: // POP BC
- case 0xD1: // POP DE
- case 0xE1: // POP HL (common)
- data = READ( sp );
- r16 [(op >> 4) & 3] = data + 0x100 * READ( sp + 1 );
- sp = (sp + 2) & 0xFFFF;
- if ( op != 0xF1 )
- goto loop;
- flags = rg.flags & 0xF0;
- goto loop;
-
- case 0xC5: // PUSH BC
- data = rp.bc;
- goto push;
-
- case 0xD5: // PUSH DE
- data = rp.de;
- goto push;
-
- case 0xE5: // PUSH HL
- data = rp.hl;
- goto push;
-
- case 0xF5: // PUSH FA
- data = (flags << 8) | rg.a;
- goto push;
-
-// Flow control
-
- case 0xFF:
- if ( pc == idle_addr + 1 )
- goto stop;
- case 0xC7: case 0xCF: case 0xD7: case 0xDF: // RST
- case 0xE7: case 0xEF: case 0xF7:
- data = pc;
- pc = (op & 0x38) + rst_base;
- goto push;
-
- case 0xCC: // CZ
- pc += 2;
- if ( flags & z_flag )
- goto call;
- goto loop;
-
- case 0xD4: // CNC
- pc += 2;
- if ( !(flags & c_flag) )
- goto call;
- goto loop;
-
- case 0xDC: // CC
- pc += 2;
- if ( flags & c_flag )
- goto call;
- goto loop;
-
- case 0xD9: // RETI
- //interrupts_enabled = 1;
- goto ret;
-
- case 0xC0: // RZ
- if ( !(flags & z_flag) )
- goto ret;
- goto loop;
-
- case 0xD0: // RNC
- if ( !(flags & c_flag) )
- goto ret;
- goto loop;
-
- case 0xD8: // RC
- if ( flags & c_flag )
- goto ret;
- goto loop;
-
- case 0x18: // JR
- BRANCH( true )
-
- case 0x30: // JR NC
- BRANCH( !(flags & c_flag) )
-
- case 0x38: // JR C
- BRANCH( flags & c_flag )
-
- case 0xE9: // JP_HL
- pc = rp.hl;
- goto loop;
-
- case 0xC3: // JP (next-most-common)
- pc = GET_ADDR();
- goto loop;
-
- case 0xC2: // JP NZ
- pc += 2;
- if ( !(flags & z_flag) )
- goto jp_taken;
- goto loop;
-
- case 0xCA: // JP Z (most common)
- pc += 2;
- if ( !(flags & z_flag) )
- goto loop;
- jp_taken:
- pc -= 2;
- pc = GET_ADDR();
- goto loop;
-
- case 0xD2: // JP NC
- pc += 2;
- if ( !(flags & c_flag) )
- goto jp_taken;
- goto loop;
-
- case 0xDA: // JP C
- pc += 2;
- if ( flags & c_flag )
- goto jp_taken;
- goto loop;
-
-// Flags
-
- case 0x2F: // CPL
- rg.a = ~rg.a;
- flags |= n_flag | h_flag;
- goto loop;
-
- case 0x3F: // CCF
- flags = (flags ^ c_flag) & ~(n_flag | h_flag);
- goto loop;
-
- case 0x37: // SCF
- flags = (flags | c_flag) & ~(n_flag | h_flag);
- goto loop;
-
- case 0xF3: // DI
- //interrupts_enabled = 0;
- goto loop;
-
- case 0xFB: // EI
- //interrupts_enabled = 1;
- goto loop;
-
-// Special
-
- case 0xDD: case 0xD3: case 0xDB: case 0xE3: case 0xE4: // ?
- case 0xEB: case 0xEC: case 0xF4: case 0xFD: case 0xFC:
- case 0x10: // STOP
- case 0x27: // DAA (I'll have to implement this eventually...)
- case 0xBF:
- case 0xED: // Z80 prefix
- case 0x76: // HALT
- s.remain++;
- goto stop;
- }
-
- // If this fails then the case above is missing an opcode
- assert( false );
-
-stop:
- pc--;
-
- // copy state back
- STATIC_CAST(core_regs_t&,r) = rg;
- r.pc = pc;
- r.sp = sp;
- r.flags = flags;
-
- this->state = &state_;
- memcpy( &this->state_, &s, sizeof this->state_ );
-
- return s.remain > 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.h
deleted file mode 100644
index 953fbaf5..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Cpu.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Nintendo Game Boy CPU emulator
-// Treats every instruction as taking 4 cycles
-
-// Game_Music_Emu 0.5.2
-#ifndef GB_CPU_H
-#define GB_CPU_H
-
-#include "blargg_common.h"
-#include "blargg_endian.h"
-
-typedef unsigned gb_addr_t; // 16-bit CPU address
-
-class Gb_Cpu {
- enum { clocks_per_instr = 4 };
-public:
- typedef BOOST::uint8_t uint8_t;
-
- // Clear registers and map all pages to unmapped
- void reset( void* unmapped = 0 );
-
- // Map code memory (memory accessed via the program counter). Start and size
- // must be multiple of page_size.
- enum { page_size = 0x2000 };
- void map_code( gb_addr_t start, unsigned size, void* code );
-
- uint8_t* get_code( gb_addr_t );
-
- // Push a byte on the stack
- void push_byte( int );
-
- // Game Boy Z80 registers. *Not* kept updated during a call to run().
- struct core_regs_t {
- #if BLARGG_BIG_ENDIAN
- uint8_t b, c, d, e, h, l, flags, a;
- #else
- uint8_t c, b, e, d, l, h, a, flags;
- #endif
- };
-
- struct registers_t : core_regs_t {
- long pc; // more than 16 bits to allow overflow detection
- BOOST::uint16_t sp;
- };
- registers_t r;
-
- // Interrupt enable flag set by EI and cleared by DI
- //bool interrupts_enabled; // unused
-
- // Base address for RST vectors (normally 0)
- gb_addr_t rst_base;
-
- // If CPU executes opcode 0xFF at this address, it treats as illegal instruction
- enum { idle_addr = 0xF00D };
-
- // Run CPU for at least 'count' cycles and return false, or return true if
- // illegal instruction is encountered.
- bool run( blargg_long count );
-
- // Number of clock cycles remaining for most recent run() call
- blargg_long remain() const { return state->remain * clocks_per_instr; }
-
- // Can read this many bytes past end of a page
- enum { cpu_padding = 8 };
-
-public:
- Gb_Cpu() : rst_base( 0 ) { state = &state_; }
- enum { page_shift = 13 };
- enum { page_count = 0x10000 >> page_shift };
-private:
- // noncopyable
- Gb_Cpu( const Gb_Cpu& );
- Gb_Cpu& operator = ( const Gb_Cpu& );
-
- struct state_t {
- uint8_t* code_map [page_count + 1];
- blargg_long remain;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
-
- void set_code_page( int, uint8_t* );
-};
-
-inline BOOST::uint8_t* Gb_Cpu::get_code( gb_addr_t addr )
-{
- return state->code_map [addr >> page_shift] + addr
- #if !BLARGG_NONPORTABLE
- % (unsigned) page_size
- #endif
- ;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.cpp
deleted file mode 100644
index 30a147e5..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Gbs_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-Gbs_Emu::equalizer_t const Gbs_Emu::handheld_eq = { -47.0, 2000 };
-Gbs_Emu::equalizer_t const Gbs_Emu::headphones_eq = { 0.0, 300 };
-
-Gbs_Emu::Gbs_Emu()
-{
- set_type( gme_gbs_type );
-
- static const char* const names [Gb_Apu::osc_count] = {
- "Square 1", "Square 2", "Wave", "Noise"
- };
- set_voice_names( names );
-
- static int const types [Gb_Apu::osc_count] = {
- wave_type | 1, wave_type | 2, wave_type | 0, mixed_type | 0
- };
- set_voice_types( types );
-
- set_silence_lookahead( 6 );
- set_max_initial_silence( 21 );
- set_gain( 1.2 );
-
- static equalizer_t const eq = { -1.0, 120 };
- set_equalizer( eq );
-}
-
-Gbs_Emu::~Gbs_Emu() { }
-
-void Gbs_Emu::unload()
-{
- rom.clear();
- Music_Emu::unload();
-}
-
-// Track info
-
-static void copy_gbs_fields( Gbs_Emu::header_t const& h, track_info_t* out )
-{
- GME_COPY_FIELD( h, out, game );
- GME_COPY_FIELD( h, out, author );
- GME_COPY_FIELD( h, out, copyright );
-}
-
-blargg_err_t Gbs_Emu::track_info_( track_info_t* out, int ) const
-{
- copy_gbs_fields( header_, out );
- return 0;
-}
-
-static blargg_err_t check_gbs_header( void const* header )
-{
- if ( memcmp( header, "GBS", 3 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Gbs_File : Gme_Info_
-{
- Gbs_Emu::header_t h;
-
- Gbs_File() { set_type( gme_gbs_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- blargg_err_t err = in.read( &h, Gbs_Emu::header_size );
- if ( err )
- return (err == in.eof_error ? gme_wrong_file_type : err);
-
- set_track_count( h.track_count );
- return check_gbs_header( &h );
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- copy_gbs_fields( h, out );
- return 0;
- }
-};
-
-static Music_Emu* new_gbs_emu () { return BLARGG_NEW Gbs_Emu ; }
-static Music_Emu* new_gbs_file() { return BLARGG_NEW Gbs_File; }
-
-gme_type_t_ const gme_gbs_type [1] = { "Game Boy", 0, &new_gbs_emu, &new_gbs_file, "GBS", 1 };
-
-// Setup
-
-blargg_err_t Gbs_Emu::load_( Data_Reader& in )
-{
- assert( offsetof (header_t,copyright [32]) == header_size );
- RETURN_ERR( rom.load( in, header_size, &header_, 0 ) );
-
- set_track_count( header_.track_count );
- RETURN_ERR( check_gbs_header( &header_ ) );
-
- if ( header_.vers != 1 )
- set_warning( "Unknown file version" );
-
- if ( header_.timer_mode & 0x78 )
- set_warning( "Invalid timer mode" );
-
- unsigned load_addr = get_le16( header_.load_addr );
- if ( (header_.load_addr [1] | header_.init_addr [1] | header_.play_addr [1]) > 0x7F ||
- load_addr < 0x400 )
- set_warning( "Invalid load/init/play address" );
-
- set_voice_count( Gb_Apu::osc_count );
-
- apu.volume( gain() );
-
- return setup_buffer( 4194304 );
-}
-
-void Gbs_Emu::update_eq( blip_eq_t const& eq )
-{
- apu.treble_eq( eq );
-}
-
-void Gbs_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
-{
- apu.osc_output( i, c, l, r );
-}
-
-// Emulation
-
-// see gb_cpu_io.h for read/write functions
-
-void Gbs_Emu::set_bank( int n )
-{
- blargg_long addr = rom.mask_addr( n * (blargg_long) bank_size );
- if ( addr == 0 && rom.size() > bank_size )
- {
- // TODO: what is the correct behavior? Current Game & Watch Gallery
- // rip requires that this have no effect or set to bank 1.
- //dprintf( "Selected ROM bank 0\n" );
- return;
- //n = 1;
- }
- cpu::map_code( bank_size, bank_size, rom.at_addr( addr ) );
-}
-
-void Gbs_Emu::update_timer()
-{
- if ( header_.timer_mode & 0x04 )
- {
- static byte const rates [4] = { 10, 4, 6, 8 };
- int shift = rates [ram [hi_page + 7] & 3] - (header_.timer_mode >> 7);
- play_period = (256L - ram [hi_page + 6]) << shift;
- }
- else
- {
- play_period = 70224; // 59.73 Hz
- }
- if ( tempo() != 1.0 )
- play_period = blip_time_t (play_period / tempo());
-}
-
-static BOOST::uint8_t const sound_data [Gb_Apu::register_count] = {
- 0x80, 0xBF, 0x00, 0x00, 0xBF, // square 1
- 0x00, 0x3F, 0x00, 0x00, 0xBF, // square 2
- 0x7F, 0xFF, 0x9F, 0x00, 0xBF, // wave
- 0x00, 0xFF, 0x00, 0x00, 0xBF, // noise
- 0x77, 0xF3, 0xF1, // vin/volume, status, power mode
- 0, 0, 0, 0, 0, 0, 0, 0, 0, // unused
- 0xAC, 0xDD, 0xDA, 0x48, 0x36, 0x02, 0xCF, 0x16, // waveform data
- 0x2C, 0x04, 0xE5, 0x2C, 0xAC, 0xDD, 0xDA, 0x48
-};
-
-void Gbs_Emu::cpu_jsr( gb_addr_t addr )
-{
- check( cpu::r.sp == get_le16( header_.stack_ptr ) );
- cpu::r.pc = addr;
- cpu_write( --cpu::r.sp, idle_addr >> 8 );
- cpu_write( --cpu::r.sp, idle_addr&0xFF );
-}
-
-void Gbs_Emu::set_tempo_( double t )
-{
- apu.set_tempo( t );
- update_timer();
-}
-
-blargg_err_t Gbs_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( ram, 0, 0x4000 );
- memset( ram + 0x4000, 0xFF, 0x1F80 );
- memset( ram + 0x5F80, 0, sizeof ram - 0x5F80 );
- ram [hi_page] = 0; // joypad reads back as 0
-
- apu.reset();
- for ( int i = 0; i < (int) sizeof sound_data; i++ )
- apu.write_register( 0, i + apu.start_addr, sound_data [i] );
-
- cpu::reset( rom.unmapped() );
-
- unsigned load_addr = get_le16( header_.load_addr );
- cpu::rst_base = load_addr;
- rom.set_addr( load_addr );
-
- cpu::map_code( ram_addr, 0x10000 - ram_addr, ram );
- cpu::map_code( 0, bank_size, rom.at_addr( 0 ) );
- set_bank( rom.size() > bank_size );
-
- ram [hi_page + 6] = header_.timer_modulo;
- ram [hi_page + 7] = header_.timer_mode;
- update_timer();
- next_play = play_period;
-
- cpu::r.a = track;
- cpu::r.pc = idle_addr;
- cpu::r.sp = get_le16( header_.stack_ptr );
- cpu_time = 0;
- cpu_jsr( get_le16( header_.init_addr ) );
-
- return 0;
-}
-
-blargg_err_t Gbs_Emu::run_clocks( blip_time_t& duration, int )
-{
- cpu_time = 0;
- while ( cpu_time < duration )
- {
- long count = duration - cpu_time;
- cpu_time = duration;
- bool result = cpu::run( count );
- cpu_time -= cpu::remain();
-
- if ( result )
- {
- if ( cpu::r.pc == idle_addr )
- {
- if ( next_play > duration )
- {
- cpu_time = duration;
- break;
- }
-
- if ( cpu_time < next_play )
- cpu_time = next_play;
- next_play += play_period;
- cpu_jsr( get_le16( header_.play_addr ) );
- GME_FRAME_HOOK( this );
- // TODO: handle timer rates different than 60 Hz
- }
- else if ( cpu::r.pc > 0xFFFF )
- {
- dprintf( "PC wrapped around\n" );
- cpu::r.pc &= 0xFFFF;
- }
- else
- {
- set_warning( "Emulation error (illegal/unsupported instruction)" );
- dprintf( "Bad opcode $%.2x at $%.4x\n",
- (int) *cpu::get_code( cpu::r.pc ), (int) cpu::r.pc );
- cpu::r.pc = (cpu::r.pc + 1) & 0xFFFF;
- cpu_time += 6;
- }
- }
- }
-
- duration = cpu_time;
- next_play -= cpu_time;
- if ( next_play < 0 ) // could go negative if routine is taking too long to return
- next_play = 0;
- apu.end_frame( cpu_time );
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.h
deleted file mode 100644
index 93fe691e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gbs_Emu.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Nintendo Game Boy GBS music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef GBS_EMU_H
-#define GBS_EMU_H
-
-#include "Classic_Emu.h"
-#include "Gb_Apu.h"
-#include "Gb_Cpu.h"
-
-class Gbs_Emu : private Gb_Cpu, public Classic_Emu {
- typedef Gb_Cpu cpu;
-public:
- // Equalizer profiles for Game Boy Color speaker and headphones
- static equalizer_t const handheld_eq;
- static equalizer_t const headphones_eq;
-
- // GBS file header
- enum { header_size = 112 };
- struct header_t
- {
- char tag [3];
- byte vers;
- byte track_count;
- byte first_track;
- byte load_addr [2];
- byte init_addr [2];
- byte play_addr [2];
- byte stack_ptr [2];
- byte timer_modulo;
- byte timer_mode;
- char game [32];
- char author [32];
- char copyright [32];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return header_; }
-
- static gme_type_t static_type() { return gme_gbs_type; }
-
-public:
- // deprecated
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
-
-public:
- Gbs_Emu();
- ~Gbs_Emu();
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_( Data_Reader& );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
- void unload();
-private:
- // rom
- enum { bank_size = 0x4000 };
- Rom_Data<bank_size> rom;
- void set_bank( int );
-
- // timer
- blip_time_t cpu_time;
- blip_time_t play_period;
- blip_time_t next_play;
- void update_timer();
-
- header_t header_;
- void cpu_jsr( gb_addr_t );
-
-public: private: friend class Gb_Cpu;
- blip_time_t clock() const { return cpu_time - cpu::remain(); }
-
- enum { joypad_addr = 0xFF00 };
- enum { ram_addr = 0xA000 };
- enum { hi_page = 0xFF00 - ram_addr };
- byte ram [0x4000 + 0x2000 + Gb_Cpu::cpu_padding];
- Gb_Apu apu;
-
- int cpu_read( gb_addr_t );
- void cpu_write( gb_addr_t, int );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.h
deleted file mode 100644
index a535633b..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.h
+++ /dev/null
@@ -1,145 +0,0 @@
-// Common interface to game music file loading and information
-
-// Game_Music_Emu 0.5.2
-#ifndef GME_FILE_H
-#define GME_FILE_H
-
-#include "gme.h"
-#include "blargg_common.h"
-#include "Data_Reader.h"
-#include "M3u_Playlist.h"
-
-// Error returned if file is wrong type
-//extern const char gme_wrong_file_type []; // declared in gme.h
-
-struct Gme_File {
-public:
-// File loading
-
- // Each loads game music data from a file and returns an error if
- // file is wrong type or is seriously corrupt. They also set warning
- // string for minor problems.
-
- // Load from file on disk
- blargg_err_t load_file( const char* path );
-
- // Load from custom data source (see Data_Reader.h)
- blargg_err_t load( Data_Reader& );
-
- // Load from file already read into memory. Keeps pointer to data, so you
- // must not free it until you're done with the file.
- blargg_err_t load_mem( void const* data, long size );
-
- // Load an m3u playlist. Must be done after loading main music file.
- blargg_err_t load_m3u( const char* path );
- blargg_err_t load_m3u( Data_Reader& in );
-
- // Clears any loaded m3u playlist and any internal playlist that the music
- // format supports (NSFE for example).
- void clear_playlist();
-
-// Informational
-
- // Type of emulator. For example if this returns gme_nsfe_type, this object
- // is an NSFE emulator, and you can cast to an Nsfe_Emu* if necessary.
- gme_type_t type() const;
-
- // Most recent warning string, or NULL if none. Clears current warning after
- // returning.
- const char* warning();
-
- // Number of tracks or 0 if no file has been loaded
- int track_count() const;
-
- // Get information for a track (length, name, author, etc.)
- // See gme.h for definition of struct track_info_t.
- blargg_err_t track_info( track_info_t* out, int track ) const;
-
-// User data/cleanup
-
- // Set/get pointer to data you want to associate with this emulator.
- // You can use this for whatever you want.
- void set_user_data( void* p ) { user_data_ = p; }
- void* user_data() const { return user_data_; }
-
- // Register cleanup function to be called when deleting emulator, or NULL to
- // clear it. Passes user_data to cleanup function.
- void set_user_cleanup( gme_user_cleanup_t func ) { user_cleanup_ = func; }
-
-public:
- // deprecated
- int error_count() const; // use warning()
-public:
- Gme_File();
- virtual ~Gme_File();
- BLARGG_DISABLE_NOTHROW
- typedef BOOST::uint8_t byte;
-protected:
- // Services
- void set_track_count( int n ) { track_count_ = raw_track_count_ = n; }
- void set_warning( const char* s ) { warning_ = s; }
- void set_type( gme_type_t t ) { type_ = t; }
- blargg_err_t load_remaining_( void const* header, long header_size, Data_Reader& remaining );
-
- // Overridable
- virtual void unload(); // called before loading file and if loading fails
- virtual blargg_err_t load_( Data_Reader& ); // default loads then calls load_mem_()
- virtual blargg_err_t load_mem_( byte const* data, long size ); // use data in memory
- virtual blargg_err_t track_info_( track_info_t* out, int track ) const = 0;
- virtual void pre_load();
- virtual void post_load_();
- virtual void clear_playlist_() { }
-
-public:
- blargg_err_t remap_track_( int* track_io ) const; // need by Music_Emu
-private:
- // noncopyable
- Gme_File( const Gme_File& );
- Gme_File& operator = ( const Gme_File& );
-
- gme_type_t type_;
- int track_count_;
- int raw_track_count_;
- const char* warning_;
- void* user_data_;
- gme_user_cleanup_t user_cleanup_;
- M3u_Playlist playlist;
- char playlist_warning [64];
- blargg_vector<byte> file_data; // only if loaded into memory using default load
-
- blargg_err_t load_m3u_( blargg_err_t );
- blargg_err_t post_load( blargg_err_t err );
-public:
- // track_info field copying
- enum { max_field_ = 255 };
- static void copy_field_( char* out, const char* in );
- static void copy_field_( char* out, const char* in, int len );
-};
-
-Music_Emu* gme_new_( Music_Emu*, long sample_rate );
-
-#define GME_COPY_FIELD( in, out, name ) \
- { Gme_File::copy_field_( out->name, in.name, sizeof in.name ); }
-
-#ifndef GME_FILE_READER
- #ifdef HAVE_ZLIB_H
- #define GME_FILE_READER Gzip_File_Reader
- #else
- #define GME_FILE_READER Std_File_Reader
- #endif
-#elif defined (GME_FILE_READER_INCLUDE)
- #include GME_FILE_READER_INCLUDE
-#endif
-
-inline gme_type_t Gme_File::type() const { return type_; }
-inline int Gme_File::error_count() const { return warning_ != 0; }
-inline int Gme_File::track_count() const { return track_count_; }
-
-inline const char* Gme_File::warning()
-{
- const char* s = warning_;
- warning_ = 0;
- return s;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.cpp
deleted file mode 100644
index 499a9ca2..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.cpp
+++ /dev/null
@@ -1,379 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Gym_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-double const min_tempo = 0.25;
-double const oversample_factor = 5 / 3.0;
-double const fm_gain = 3.0;
-
-const long base_clock = 53700300;
-const long clock_rate = base_clock / 15;
-
-Gym_Emu::Gym_Emu()
-{
- data = 0;
- pos = 0;
- set_type( gme_gym_type );
-
- static const char* const names [] = {
- "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "PCM", "PSG"
- };
- set_voice_names( names );
- set_silence_lookahead( 1 ); // tracks should already be trimmed
-}
-
-Gym_Emu::~Gym_Emu() { }
-
-// Track info
-
-static void get_gym_info( Gym_Emu::header_t const& h, long length, track_info_t* out )
-{
- if ( !memcmp( h.tag, "GYMX", 4 ) )
- {
- length = length * 50 / 3; // 1000 / 60
- long loop = get_le32( h.loop_start );
- if ( loop )
- {
- out->intro_length = loop * 50 / 3;
- out->loop_length = length - out->intro_length;
- }
- else
- {
- out->length = length;
- out->intro_length = length; // make it clear that track is no longer than length
- out->loop_length = 0;
- }
-
- // more stupidity where the field should have been left
- if ( strcmp( h.song, "Unknown Song" ) )
- GME_COPY_FIELD( h, out, song );
-
- if ( strcmp( h.game, "Unknown Game" ) )
- GME_COPY_FIELD( h, out, game );
-
- if ( strcmp( h.copyright, "Unknown Publisher" ) )
- GME_COPY_FIELD( h, out, copyright );
-
- if ( strcmp( h.dumper, "Unknown Person" ) )
- GME_COPY_FIELD( h, out, dumper );
-
- if ( strcmp( h.comment, "Header added by YMAMP" ) )
- GME_COPY_FIELD( h, out, comment );
- }
-}
-
-blargg_err_t Gym_Emu::track_info_( track_info_t* out, int ) const
-{
- get_gym_info( header_, track_length(), out );
- return 0;
-}
-
-static long gym_track_length( byte const* p, byte const* end )
-{
- long time = 0;
- while ( p < end )
- {
- switch ( *p++ )
- {
- case 0:
- time++;
- break;
-
- case 1:
- case 2:
- p += 2;
- break;
-
- case 3:
- p += 1;
- break;
- }
- }
- return time;
-}
-
-long Gym_Emu::track_length() const { return gym_track_length( data, data_end ); }
-
-static blargg_err_t check_header( byte const* in, long size, int* data_offset = 0 )
-{
- if ( size < 4 )
- return gme_wrong_file_type;
-
- if ( memcmp( in, "GYMX", 4 ) == 0 )
- {
- if ( size < Gym_Emu::header_size + 1 )
- return gme_wrong_file_type;
-
- if ( memcmp( ((Gym_Emu::header_t const*) in)->packed, "\0\0\0\0", 4 ) != 0 )
- return "Packed GYM file not supported";
-
- if ( data_offset )
- *data_offset = Gym_Emu::header_size;
- }
- else if ( *in > 3 )
- {
- return gme_wrong_file_type;
- }
-
- return 0;
-}
-
-struct Gym_File : Gme_Info_
-{
- byte const* file_begin;
- byte const* file_end;
- int data_offset;
-
- Gym_File() { set_type( gme_gym_type ); }
-
- blargg_err_t load_mem_( byte const* in, long size )
- {
- file_begin = in;
- file_end = in + size;
- data_offset = 0;
- return check_header( in, size, &data_offset );
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- long length = gym_track_length( &file_begin [data_offset], file_end );
- get_gym_info( *(Gym_Emu::header_t const*) file_begin, length, out );
- return 0;
- }
-};
-
-static Music_Emu* new_gym_emu () { return BLARGG_NEW Gym_Emu ; }
-static Music_Emu* new_gym_file() { return BLARGG_NEW Gym_File; }
-
-gme_type_t_ const gme_gym_type [1] = { "Sega Genesis", 1, &new_gym_emu, &new_gym_file, "GYM", 0 };
-
-// Setup
-
-blargg_err_t Gym_Emu::set_sample_rate_( long sample_rate )
-{
- blip_eq_t eq( -32, 8000, sample_rate );
- apu.treble_eq( eq );
- dac_synth.treble_eq( eq );
- apu.volume( 0.135 * fm_gain * gain() );
- dac_synth.volume( 0.125 / 256 * fm_gain * gain() );
- double factor = Dual_Resampler::setup( oversample_factor, 0.990, fm_gain * gain() );
- fm_sample_rate = sample_rate * factor;
-
- RETURN_ERR( blip_buf.set_sample_rate( sample_rate, int (1000 / 60.0 / min_tempo) ) );
- blip_buf.clock_rate( clock_rate );
-
- RETURN_ERR( fm.set_rate( fm_sample_rate, base_clock / 7.0 ) );
- RETURN_ERR( Dual_Resampler::reset( long (1.0 / 60 / min_tempo * sample_rate) ) );
-
- return 0;
-}
-
-void Gym_Emu::set_tempo_( double t )
-{
- if ( t < min_tempo )
- {
- set_tempo( min_tempo );
- return;
- }
-
- if ( blip_buf.sample_rate() )
- {
- clocks_per_frame = long (clock_rate / 60 / tempo());
- Dual_Resampler::resize( long (sample_rate() / (60.0 * tempo())) );
- }
-}
-
-void Gym_Emu::mute_voices_( int mask )
-{
- Music_Emu::mute_voices_( mask );
- fm.mute_voices( mask );
- dac_muted = (mask & 0x40) != 0;
- apu.output( (mask & 0x80) ? 0 : &blip_buf );
-}
-
-blargg_err_t Gym_Emu::load_mem_( byte const* in, long size )
-{
- assert( offsetof (header_t,packed [4]) == header_size );
- int offset = 0;
- RETURN_ERR( check_header( in, size, &offset ) );
- set_voice_count( 8 );
-
- data = in + offset;
- data_end = in + size;
- loop_begin = 0;
-
- if ( offset )
- header_ = *(header_t const*) in;
- else
- memset( &header_, 0, sizeof header_ );
-
- return 0;
-}
-
-// Emulation
-
-blargg_err_t Gym_Emu::start_track_( int track )
-{
- RETURN_ERR( Music_Emu::start_track_( track ) );
-
- pos = data;
- loop_remain = get_le32( header_.loop_start );
-
- prev_dac_count = 0;
- dac_enabled = false;
- dac_amp = -1;
-
- fm.reset();
- apu.reset();
- blip_buf.clear();
- Dual_Resampler::clear();
- return 0;
-}
-
-void Gym_Emu::run_dac( int dac_count )
-{
- // Guess beginning and end of sample and adjust rate and buffer position accordingly.
-
- // count dac samples in next frame
- int next_dac_count = 0;
- const byte* p = this->pos;
- int cmd;
- while ( (cmd = *p++) != 0 )
- {
- int data = *p++;
- if ( cmd <= 2 )
- ++p;
- if ( cmd == 1 && data == 0x2A )
- next_dac_count++;
- }
-
- // detect beginning and end of sample
- int rate_count = dac_count;
- int start = 0;
- if ( !prev_dac_count && next_dac_count && dac_count < next_dac_count )
- {
- rate_count = next_dac_count;
- start = next_dac_count - dac_count;
- }
- else if ( prev_dac_count && !next_dac_count && dac_count < prev_dac_count )
- {
- rate_count = prev_dac_count;
- }
-
- // Evenly space samples within buffer section being used
- blip_resampled_time_t period = blip_buf.resampled_duration( clocks_per_frame ) / rate_count;
-
- blip_resampled_time_t time = blip_buf.resampled_time( 0 ) +
- period * start + (period >> 1);
-
- int dac_amp = this->dac_amp;
- if ( dac_amp < 0 )
- dac_amp = dac_buf [0];
-
- for ( int i = 0; i < dac_count; i++ )
- {
- int delta = dac_buf [i] - dac_amp;
- dac_amp += delta;
- dac_synth.offset_resampled( time, delta, &blip_buf );
- time += period;
- }
- this->dac_amp = dac_amp;
-}
-
-void Gym_Emu::parse_frame()
-{
- int dac_count = 0;
- const byte* pos = this->pos;
-
- if ( loop_remain && !--loop_remain )
- loop_begin = pos; // find loop on first time through sequence
-
- int cmd;
- while ( (cmd = *pos++) != 0 )
- {
- int data = *pos++;
- if ( cmd == 1 )
- {
- int data2 = *pos++;
- if ( data != 0x2A )
- {
- if ( data == 0x2B )
- dac_enabled = (data2 & 0x80) != 0;
-
- fm.write0( data, data2 );
- }
- else if ( dac_count < (int) sizeof dac_buf )
- {
- dac_buf [dac_count] = data2;
- dac_count += dac_enabled;
- }
- }
- else if ( cmd == 2 )
- {
- fm.write1( data, *pos++ );
- }
- else if ( cmd == 3 )
- {
- apu.write_data( 0, data );
- }
- else
- {
- // to do: many GYM streams are full of errors, and error count should
- // reflect cases where music is really having problems
- //log_error();
- --pos; // put data back
- }
- }
-
- // loop
- if ( pos >= data_end )
- {
- check( pos == data_end );
-
- if ( loop_begin )
- pos = loop_begin;
- else
- set_track_ended();
- }
- this->pos = pos;
-
- // dac
- if ( dac_count && !dac_muted )
- run_dac( dac_count );
- prev_dac_count = dac_count;
-}
-
-int Gym_Emu::play_frame( blip_time_t blip_time, int sample_count, sample_t* buf )
-{
- if ( !track_ended() )
- parse_frame();
-
- apu.end_frame( blip_time );
-
- memset( buf, 0, sample_count * sizeof *buf );
- fm.run( sample_count >> 1, buf );
-
- return sample_count;
-}
-
-blargg_err_t Gym_Emu::play_( long count, sample_t* out )
-{
- Dual_Resampler::dual_play( count, out, blip_buf );
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.h
deleted file mode 100644
index 05419ea2..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gym_Emu.h
+++ /dev/null
@@ -1,82 +0,0 @@
-// Sega Genesis/Mega Drive GYM music file emulator
-// Includes with PCM timing recovery to improve sample quality.
-
-// Game_Music_Emu 0.5.2
-#ifndef GYM_EMU_H
-#define GYM_EMU_H
-
-#include "Dual_Resampler.h"
-#include "Ym2612_Emu.h"
-#include "Music_Emu.h"
-#include "Sms_Apu.h"
-
-class Gym_Emu : public Music_Emu, private Dual_Resampler {
-public:
- // GYM file header
- enum { header_size = 428 };
- struct header_t
- {
- char tag [4];
- char song [32];
- char game [32];
- char copyright [32];
- char emulator [32];
- char dumper [32];
- char comment [256];
- byte loop_start [4]; // in 1/60 seconds, 0 if not looped
- byte packed [4];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return header_; }
-
- static gme_type_t static_type() { return gme_gym_type; }
-
-public:
- // deprecated
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
- enum { gym_rate = 60 };
- long track_length() const; // use track_info()
-
-public:
- Gym_Emu();
- ~Gym_Emu();
-protected:
- blargg_err_t load_mem_( byte const*, long );
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t set_sample_rate_( long sample_rate );
- blargg_err_t start_track_( int );
- blargg_err_t play_( long count, sample_t* );
- void mute_voices_( int );
- void set_tempo_( double );
- int play_frame( blip_time_t blip_time, int sample_count, sample_t* buf );
-private:
- // sequence data begin, loop begin, current position, end
- const byte* data;
- const byte* loop_begin;
- const byte* pos;
- const byte* data_end;
- blargg_long loop_remain; // frames remaining until loop beginning has been located
- header_t header_;
- double fm_sample_rate;
- blargg_long clocks_per_frame;
- void parse_frame();
-
- // dac (pcm)
- int dac_amp;
- int prev_dac_count;
- bool dac_enabled;
- bool dac_muted;
- void run_dac( int );
-
- // sound
- Blip_Buffer blip_buf;
- Ym2612_Emu fm;
- Blip_Synth<blip_med_quality,1> dac_synth;
- Sms_Apu apu;
- byte dac_buf [1024];
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.cpp
deleted file mode 100644
index 22389121..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.cpp
+++ /dev/null
@@ -1,315 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Hes_Apu.h"
-
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-bool const center_waves = true; // reduces asymmetry and clamping when starting notes
-
-Hes_Apu::Hes_Apu()
-{
- Hes_Osc* osc = &oscs [osc_count];
- do
- {
- osc--;
- osc->outputs [0] = 0;
- osc->outputs [1] = 0;
- osc->chans [0] = 0;
- osc->chans [1] = 0;
- osc->chans [2] = 0;
- }
- while ( osc != oscs );
-
- reset();
-}
-
-void Hes_Apu::reset()
-{
- latch = 0;
- balance = 0xFF;
-
- Hes_Osc* osc = &oscs [osc_count];
- do
- {
- osc--;
- memset( osc, 0, offsetof (Hes_Osc,outputs) );
- osc->noise_lfsr = 1;
- osc->control = 0x40;
- osc->balance = 0xFF;
- }
- while ( osc != oscs );
-}
-
-void Hes_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- require( (unsigned) index < osc_count );
- oscs [index].chans [0] = center;
- oscs [index].chans [1] = left;
- oscs [index].chans [2] = right;
-
- Hes_Osc* osc = &oscs [osc_count];
- do
- {
- osc--;
- balance_changed( *osc );
- }
- while ( osc != oscs );
-}
-
-void Hes_Osc::run_until( synth_t& synth_, blip_time_t end_time )
-{
- Blip_Buffer* const osc_outputs_0 = outputs [0]; // cache often-used values
- if ( osc_outputs_0 && control & 0x80 )
- {
- int dac = this->dac;
-
- int const volume_0 = volume [0];
- {
- int delta = dac * volume_0 - last_amp [0];
- if ( delta )
- synth_.offset( last_time, delta, osc_outputs_0 );
- osc_outputs_0->set_modified();
- }
-
- Blip_Buffer* const osc_outputs_1 = outputs [1];
- int const volume_1 = volume [1];
- if ( osc_outputs_1 )
- {
- int delta = dac * volume_1 - last_amp [1];
- if ( delta )
- synth_.offset( last_time, delta, osc_outputs_1 );
- osc_outputs_1->set_modified();
- }
-
- blip_time_t time = last_time + delay;
- if ( time < end_time )
- {
- if ( noise & 0x80 )
- {
- if ( volume_0 | volume_1 )
- {
- // noise
- int const period = (32 - (noise & 0x1F)) * 64; // TODO: correct?
- unsigned noise_lfsr = this->noise_lfsr;
- do
- {
- int new_dac = 0x1F & -(noise_lfsr >> 1 & 1);
- // Implemented using "Galios configuration"
- // TODO: find correct LFSR algorithm
- noise_lfsr = (noise_lfsr >> 1) ^ (0xE008 & -(noise_lfsr & 1));
- //noise_lfsr = (noise_lfsr >> 1) ^ (0x6000 & -(noise_lfsr & 1));
- int delta = new_dac - dac;
- if ( delta )
- {
- dac = new_dac;
- synth_.offset( time, delta * volume_0, osc_outputs_0 );
- if ( osc_outputs_1 )
- synth_.offset( time, delta * volume_1, osc_outputs_1 );
- }
- time += period;
- }
- while ( time < end_time );
-
- this->noise_lfsr = noise_lfsr;
- assert( noise_lfsr );
- }
- }
- else if ( !(control & 0x40) )
- {
- // wave
- int phase = (this->phase + 1) & 0x1F; // pre-advance for optimal inner loop
- int period = this->period * 2;
- if ( period >= 14 && (volume_0 | volume_1) )
- {
- do
- {
- int new_dac = wave [phase];
- phase = (phase + 1) & 0x1F;
- int delta = new_dac - dac;
- if ( delta )
- {
- dac = new_dac;
- synth_.offset( time, delta * volume_0, osc_outputs_0 );
- if ( osc_outputs_1 )
- synth_.offset( time, delta * volume_1, osc_outputs_1 );
- }
- time += period;
- }
- while ( time < end_time );
- }
- else
- {
- if ( !period )
- {
- // TODO: Gekisha Boy assumes that period = 0 silences wave
- //period = 0x1000 * 2;
- period = 1;
- //if ( !(volume_0 | volume_1) )
- // dprintf( "Used period 0\n" );
- }
-
- // maintain phase when silent
- blargg_long count = (end_time - time + period - 1) / period;
- phase += count; // phase will be masked below
- time += count * period;
- }
- this->phase = (phase - 1) & 0x1F; // undo pre-advance
- }
- }
- time -= end_time;
- if ( time < 0 )
- time = 0;
- delay = time;
-
- this->dac = dac;
- last_amp [0] = dac * volume_0;
- last_amp [1] = dac * volume_1;
- }
- last_time = end_time;
-}
-
-void Hes_Apu::balance_changed( Hes_Osc& osc )
-{
- static short const log_table [32] = { // ~1.5 db per step
- #define ENTRY( factor ) short (factor * Hes_Osc::amp_range / 31.0 + 0.5)
- ENTRY( 0.000000 ),ENTRY( 0.005524 ),ENTRY( 0.006570 ),ENTRY( 0.007813 ),
- ENTRY( 0.009291 ),ENTRY( 0.011049 ),ENTRY( 0.013139 ),ENTRY( 0.015625 ),
- ENTRY( 0.018581 ),ENTRY( 0.022097 ),ENTRY( 0.026278 ),ENTRY( 0.031250 ),
- ENTRY( 0.037163 ),ENTRY( 0.044194 ),ENTRY( 0.052556 ),ENTRY( 0.062500 ),
- ENTRY( 0.074325 ),ENTRY( 0.088388 ),ENTRY( 0.105112 ),ENTRY( 0.125000 ),
- ENTRY( 0.148651 ),ENTRY( 0.176777 ),ENTRY( 0.210224 ),ENTRY( 0.250000 ),
- ENTRY( 0.297302 ),ENTRY( 0.353553 ),ENTRY( 0.420448 ),ENTRY( 0.500000 ),
- ENTRY( 0.594604 ),ENTRY( 0.707107 ),ENTRY( 0.840896 ),ENTRY( 1.000000 ),
- #undef ENTRY
- };
-
- int vol = (osc.control & 0x1F) - 0x1E * 2;
-
- int left = vol + (osc.balance >> 3 & 0x1E) + (balance >> 3 & 0x1E);
- if ( left < 0 ) left = 0;
-
- int right = vol + (osc.balance << 1 & 0x1E) + (balance << 1 & 0x1E);
- if ( right < 0 ) right = 0;
-
- left = log_table [left ];
- right = log_table [right];
-
- // optimizing for the common case of being centered also allows easy
- // panning using Effects_Buffer
- osc.outputs [0] = osc.chans [0]; // center
- osc.outputs [1] = 0;
- if ( left != right )
- {
- osc.outputs [0] = osc.chans [1]; // left
- osc.outputs [1] = osc.chans [2]; // right
- }
-
- if ( center_waves )
- {
- osc.last_amp [0] += (left - osc.volume [0]) * 16;
- osc.last_amp [1] += (right - osc.volume [1]) * 16;
- }
-
- osc.volume [0] = left;
- osc.volume [1] = right;
-}
-
-void Hes_Apu::write_data( blip_time_t time, int addr, int data )
-{
- if ( addr == 0x800 )
- {
- latch = data & 7;
- }
- else if ( addr == 0x801 )
- {
- if ( balance != data )
- {
- balance = data;
-
- Hes_Osc* osc = &oscs [osc_count];
- do
- {
- osc--;
- osc->run_until( synth, time );
- balance_changed( *oscs );
- }
- while ( osc != oscs );
- }
- }
- else if ( latch < osc_count )
- {
- Hes_Osc& osc = oscs [latch];
- osc.run_until( synth, time );
- switch ( addr )
- {
- case 0x802:
- osc.period = (osc.period & 0xF00) | data;
- break;
-
- case 0x803:
- osc.period = (osc.period & 0x0FF) | ((data & 0x0F) << 8);
- break;
-
- case 0x804:
- if ( osc.control & 0x40 & ~data )
- osc.phase = 0;
- osc.control = data;
- balance_changed( osc );
- break;
-
- case 0x805:
- osc.balance = data;
- balance_changed( osc );
- break;
-
- case 0x806:
- data &= 0x1F;
- if ( !(osc.control & 0x40) )
- {
- osc.wave [osc.phase] = data;
- osc.phase = (osc.phase + 1) & 0x1F;
- }
- else if ( osc.control & 0x80 )
- {
- osc.dac = data;
- }
- break;
-
- case 0x807:
- if ( &osc >= &oscs [4] )
- osc.noise = data;
- break;
-
- case 0x809:
- if ( !(data & 0x80) && (data & 0x03) != 0 )
- dprintf( "HES LFO not supported\n" );
- }
- }
-}
-
-void Hes_Apu::end_frame( blip_time_t end_time )
-{
- Hes_Osc* osc = &oscs [osc_count];
- do
- {
- osc--;
- if ( end_time > osc->last_time )
- osc->run_until( synth, end_time );
- assert( osc->last_time >= end_time );
- osc->last_time -= end_time;
- }
- while ( osc != oscs );
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.h
deleted file mode 100644
index ca0c932f..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Apu.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Turbo Grafx 16 (PC Engine) PSG sound chip emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef HES_APU_H
-#define HES_APU_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-struct Hes_Osc
-{
- unsigned char wave [32];
- short volume [2];
- int last_amp [2];
- int delay;
- int period;
- unsigned char noise;
- unsigned char phase;
- unsigned char balance;
- unsigned char dac;
- blip_time_t last_time;
-
- Blip_Buffer* outputs [2];
- Blip_Buffer* chans [3];
- unsigned noise_lfsr;
- unsigned char control;
-
- enum { amp_range = 0x8000 };
- typedef Blip_Synth<blip_med_quality,1> synth_t;
-
- void run_until( synth_t& synth, blip_time_t );
-};
-
-class Hes_Apu {
-public:
- void treble_eq( blip_eq_t const& );
- void volume( double );
-
- enum { osc_count = 6 };
- void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right );
-
- void reset();
-
- enum { start_addr = 0x0800 };
- enum { end_addr = 0x0809 };
- void write_data( blip_time_t, int addr, int data );
-
- void end_frame( blip_time_t );
-
-public:
- Hes_Apu();
-private:
- Hes_Osc oscs [osc_count];
- int latch;
- int balance;
- Hes_Osc::synth_t synth;
-
- void balance_changed( Hes_Osc& );
- void recalc_chans();
-};
-
-inline void Hes_Apu::volume( double v ) { synth.volume( 1.8 / osc_count / Hes_Osc::amp_range * v ); }
-
-inline void Hes_Apu::treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.h
deleted file mode 100644
index 437d0908..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.h
+++ /dev/null
@@ -1,125 +0,0 @@
-// PC Engine CPU emulator for use with HES music files
-
-// Game_Music_Emu 0.5.2
-#ifndef HES_CPU_H
-#define HES_CPU_H
-
-#include "blargg_common.h"
-#include <limits.h>
-
-typedef blargg_long hes_time_t; // clock cycle count
-typedef unsigned hes_addr_t; // 16-bit address
-enum { future_hes_time = LONG_MAX / 2 + 1 };
-
-class Hes_Cpu {
-public:
- typedef BOOST::uint8_t uint8_t;
-
- void reset();
-
- enum { page_size = 0x2000 };
- enum { page_shift = 13 };
- enum { page_count = 8 };
- void set_mmr( int reg, int bank );
-
- uint8_t const* get_code( hes_addr_t );
-
- uint8_t ram [page_size];
-
- // not kept updated during a call to run()
- struct registers_t {
- BOOST::uint16_t pc;
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t status;
- uint8_t sp;
- };
- registers_t r;
-
- // page mapping registers
- uint8_t mmr [page_count + 1];
-
- // Set end_time and run CPU from current time. Returns true if any illegal
- // instructions were encountered.
- bool run( hes_time_t end_time );
-
- // Time of beginning of next instruction to be executed
- hes_time_t time() const { return state->time + state->base; }
- void set_time( hes_time_t t ) { state->time = t - state->base; }
- void adjust_time( int delta ) { state->time += delta; }
-
- hes_time_t irq_time() const { return irq_time_; }
- void set_irq_time( hes_time_t );
-
- hes_time_t end_time() const { return end_time_; }
- void set_end_time( hes_time_t );
-
- void end_frame( hes_time_t );
-
- // Attempt to execute instruction here results in CPU advancing time to
- // lesser of irq_time() and end_time() (or end_time() if IRQs are
- // disabled)
- enum { idle_addr = 0x1FFF };
-
- // Can read this many bytes past end of a page
- enum { cpu_padding = 8 };
-
-public:
- Hes_Cpu() { state = &state_; }
- enum { irq_inhibit = 0x04 };
-private:
- // noncopyable
- Hes_Cpu( const Hes_Cpu& );
- Hes_Cpu& operator = ( const Hes_Cpu& );
-
- struct state_t {
- uint8_t const* code_map [page_count + 1];
- hes_time_t base;
- blargg_long time;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
- hes_time_t irq_time_;
- hes_time_t end_time_;
-
- void set_code_page( int, void const* );
- inline int update_end_time( hes_time_t end, hes_time_t irq );
-};
-
-inline BOOST::uint8_t const* Hes_Cpu::get_code( hes_addr_t addr )
-{
- return state->code_map [addr >> page_shift] + addr
- #if !BLARGG_NONPORTABLE
- % (unsigned) page_size
- #endif
- ;
-}
-
-inline int Hes_Cpu::update_end_time( hes_time_t t, hes_time_t irq )
-{
- if ( irq < t && !(r.status & irq_inhibit) ) t = irq;
- int delta = state->base - t;
- state->base = t;
- return delta;
-}
-
-inline void Hes_Cpu::set_irq_time( hes_time_t t )
-{
- state->time += update_end_time( end_time_, (irq_time_ = t) );
-}
-
-inline void Hes_Cpu::set_end_time( hes_time_t t )
-{
- state->time += update_end_time( (end_time_ = t), irq_time_ );
-}
-
-inline void Hes_Cpu::end_frame( hes_time_t t )
-{
- assert( state == &state_ );
- state_.base -= t;
- if ( irq_time_ < future_hes_time ) irq_time_ -= t;
- if ( end_time_ < future_hes_time ) end_time_ -= t;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.cpp
deleted file mode 100644
index fafb2666..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.cpp
+++ /dev/null
@@ -1,529 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Hes_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-int const timer_mask = 0x04;
-int const vdp_mask = 0x02;
-int const i_flag_mask = 0x04;
-int const unmapped = 0xFF;
-
-long const period_60hz = 262 * 455L; // scanlines * clocks per scanline
-
-Hes_Emu::Hes_Emu()
-{
- timer.raw_load = 0;
- set_type( gme_hes_type );
-
- static const char* const names [Hes_Apu::osc_count] = {
- "Wave 1", "Wave 2", "Wave 3", "Wave 4", "Multi 1", "Multi 2"
- };
- set_voice_names( names );
-
- static int const types [Hes_Apu::osc_count] = {
- wave_type | 0, wave_type | 1, wave_type | 2, wave_type | 3,
- mixed_type | 0, mixed_type | 1
- };
- set_voice_types( types );
- set_silence_lookahead( 6 );
- set_gain( 1.11 );
-}
-
-Hes_Emu::~Hes_Emu() { }
-
-void Hes_Emu::unload()
-{
- rom.clear();
- Music_Emu::unload();
-}
-
-// Track info
-
-static byte const* copy_field( byte const* in, char* out )
-{
- if ( in )
- {
- int len = 0x20;
- if ( in [0x1F] && !in [0x2F] )
- len = 0x30; // fields are sometimes 16 bytes longer (ugh)
-
- // since text fields are where any data could be, detect non-text
- // and fields with data after zero byte terminator
-
- int i = 0;
- for ( i = 0; i < len && in [i]; i++ )
- if ( ((in [i] + 1) & 0xFF) < ' ' + 1 ) // also treat 0xFF as non-text
- return 0; // non-ASCII found
-
- for ( ; i < len; i++ )
- if ( in [i] )
- return 0; // data after terminator
-
- Gme_File::copy_field_( out, (char const*) in, len );
- in += len;
- }
- return in;
-}
-
-static void copy_hes_fields( byte const* in, track_info_t* out )
-{
- if ( *in >= ' ' )
- {
- in = copy_field( in, out->game );
- in = copy_field( in, out->author );
- in = copy_field( in, out->copyright );
- }
-}
-
-blargg_err_t Hes_Emu::track_info_( track_info_t* out, int ) const
-{
- copy_hes_fields( rom.begin() + 0x20, out );
- return 0;
-}
-
-static blargg_err_t check_hes_header( void const* header )
-{
- if ( memcmp( header, "HESM", 4 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Hes_File : Gme_Info_
-{
- struct header_t {
- char header [Hes_Emu::header_size];
- char unused [0x20];
- byte fields [0x30 * 3];
- } h;
-
- Hes_File() { set_type( gme_hes_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- assert( offsetof (header_t,fields) == Hes_Emu::header_size + 0x20 );
- blargg_err_t err = in.read( &h, sizeof h );
- if ( err )
- return (err == in.eof_error ? gme_wrong_file_type : err);
- return check_hes_header( &h );
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- copy_hes_fields( h.fields, out );
- return 0;
- }
-};
-
-static Music_Emu* new_hes_emu () { return BLARGG_NEW Hes_Emu ; }
-static Music_Emu* new_hes_file() { return BLARGG_NEW Hes_File; }
-
-gme_type_t_ const gme_hes_type [1] = { "PC Engine", 256, &new_hes_emu, &new_hes_file, "HES", 1 };
-
-// Setup
-
-blargg_err_t Hes_Emu::load_( Data_Reader& in )
-{
- assert( offsetof (header_t,unused [4]) == header_size );
- RETURN_ERR( rom.load( in, header_size, &header_, unmapped ) );
-
- RETURN_ERR( check_hes_header( header_.tag ) );
-
- if ( header_.vers != 0 )
- set_warning( "Unknown file version" );
-
- if ( memcmp( header_.data_tag, "DATA", 4 ) )
- set_warning( "Data header missing" );
-
- if ( memcmp( header_.unused, "\0\0\0\0", 4 ) )
- set_warning( "Unknown header data" );
-
- // File spec supports multiple blocks, but I haven't found any, and
- // many files have bad sizes in the only block, so it's simpler to
- // just try to load the damn data as best as possible.
-
- long addr = get_le32( header_.addr );
- long size = get_le32( header_.size );
- long const rom_max = 0x100000;
- if ( addr & ~(rom_max - 1) )
- {
- set_warning( "Invalid address" );
- addr &= rom_max - 1;
- }
- if ( (unsigned long) (addr + size) > (unsigned long) rom_max )
- set_warning( "Invalid size" );
-
- if ( size != rom.file_size() )
- {
- if ( size <= rom.file_size() - 4 && !memcmp( rom.begin() + size, "DATA", 4 ) )
- set_warning( "Multiple DATA not supported" );
- else if ( size < rom.file_size() )
- set_warning( "Extra file data" );
- else
- set_warning( "Missing file data" );
- }
-
- rom.set_addr( addr );
-
- set_voice_count( apu.osc_count );
-
- apu.volume( gain() );
-
- return setup_buffer( 7159091 );
-}
-
-void Hes_Emu::update_eq( blip_eq_t const& eq )
-{
- apu.treble_eq( eq );
-}
-
-void Hes_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- apu.osc_output( i, center, left, right );
-}
-
-// Emulation
-
-void Hes_Emu::recalc_timer_load()
-{
- timer.load = timer.raw_load * timer_base + 1;
-}
-
-void Hes_Emu::set_tempo_( double t )
-{
- play_period = hes_time_t (period_60hz / t);
- timer_base = int (1024 / t);
- recalc_timer_load();
-}
-
-blargg_err_t Hes_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( ram, 0, sizeof ram ); // some HES music relies on zero fill
- memset( sgx, 0, sizeof sgx );
-
- apu.reset();
- cpu::reset();
-
- for ( unsigned i = 0; i < sizeof header_.banks; i++ )
- set_mmr( i, header_.banks [i] );
- set_mmr( page_count, 0xFF ); // unmapped beyond end of address space
-
- irq.disables = timer_mask | vdp_mask;
- irq.timer = future_hes_time;
- irq.vdp = future_hes_time;
-
- timer.enabled = false;
- timer.raw_load= 0x80;
- timer.count = timer.load;
- timer.fired = false;
- timer.last_time = 0;
-
- vdp.latch = 0;
- vdp.control = 0;
- vdp.next_vbl = 0;
-
- ram [0x1FF] = (idle_addr - 1) >> 8;
- ram [0x1FE] = (idle_addr - 1) & 0xFF;
- r.sp = 0xFD;
- r.pc = get_le16( header_.init_addr );
- r.a = track;
-
- recalc_timer_load();
- last_frame_hook = 0;
-
- return 0;
-}
-
-// Hardware
-
-void Hes_Emu::cpu_write_vdp( int addr, int data )
-{
- switch ( addr )
- {
- case 0:
- vdp.latch = data & 0x1F;
- break;
-
- case 2:
- if ( vdp.latch == 5 )
- {
- if ( data & 0x04 )
- set_warning( "Scanline interrupt unsupported" );
- run_until( time() );
- vdp.control = data;
- irq_changed();
- }
- else
- {
- dprintf( "VDP not supported: $%02X <- $%02X\n", vdp.latch, data );
- }
- break;
-
- case 3:
- dprintf( "VDP MSB not supported: $%02X <- $%02X\n", vdp.latch, data );
- break;
- }
-}
-
-void Hes_Emu::cpu_write_( hes_addr_t addr, int data )
-{
- if ( unsigned (addr - apu.start_addr) <= apu.end_addr - apu.start_addr )
- {
- GME_APU_HOOK( this, addr - apu.start_addr, data );
- // avoid going way past end when a long block xfer is writing to I/O space
- hes_time_t t = min( time(), end_time() + 8 );
- apu.write_data( t, addr, data );
- return;
- }
-
- hes_time_t time = this->time();
- switch ( addr )
- {
- case 0x0000:
- case 0x0002:
- case 0x0003:
- cpu_write_vdp( addr, data );
- return;
-
- case 0x0C00: {
- run_until( time );
- timer.raw_load = (data & 0x7F) + 1;
- recalc_timer_load();
- timer.count = timer.load;
- break;
- }
-
- case 0x0C01:
- data &= 1;
- if ( timer.enabled == data )
- return;
- run_until( time );
- timer.enabled = data;
- if ( data )
- timer.count = timer.load;
- break;
-
- case 0x1402:
- run_until( time );
- irq.disables = data;
- if ( (data & 0xF8) && (data & 0xF8) != 0xF8 ) // flag questionable values
- dprintf( "Int mask: $%02X\n", data );
- break;
-
- case 0x1403:
- run_until( time );
- if ( timer.enabled )
- timer.count = timer.load;
- timer.fired = false;
- break;
-
-#ifndef NDEBUG
- case 0x1000: // I/O port
- case 0x0402: // palette
- case 0x0403:
- case 0x0404:
- case 0x0405:
- return;
-
- default:
- dprintf( "unmapped write $%04X <- $%02X\n", addr, data );
- return;
-#endif
- }
-
- irq_changed();
-}
-
-int Hes_Emu::cpu_read_( hes_addr_t addr )
-{
- hes_time_t time = this->time();
- addr &= page_size - 1;
- switch ( addr )
- {
- case 0x0000:
- if ( irq.vdp > time )
- return 0;
- irq.vdp = future_hes_time;
- run_until( time );
- irq_changed();
- return 0x20;
-
- case 0x0002:
- case 0x0003:
- dprintf( "VDP read not supported: %d\n", addr );
- return 0;
-
- case 0x0C01:
- //return timer.enabled; // TODO: remove?
- case 0x0C00:
- run_until( time );
- dprintf( "Timer count read\n" );
- return (unsigned) (timer.count - 1) / timer_base;
-
- case 0x1402:
- return irq.disables;
-
- case 0x1403:
- {
- int status = 0;
- if ( irq.timer <= time ) status |= timer_mask;
- if ( irq.vdp <= time ) status |= vdp_mask;
- return status;
- }
-
- #ifndef NDEBUG
- case 0x1000: // I/O port
- case 0x180C: // CD-ROM
- case 0x180D:
- break;
-
- default:
- dprintf( "unmapped read $%04X\n", addr );
- #endif
- }
-
- return unmapped;
-}
-
-// see hes_cpu_io.h for core read/write functions
-
-// Emulation
-
-void Hes_Emu::run_until( hes_time_t present )
-{
- while ( vdp.next_vbl < present )
- vdp.next_vbl += play_period;
-
- hes_time_t elapsed = present - timer.last_time;
- if ( elapsed > 0 )
- {
- if ( timer.enabled )
- {
- timer.count -= elapsed;
- if ( timer.count <= 0 )
- timer.count += timer.load;
- }
- timer.last_time = present;
- }
-}
-
-void Hes_Emu::irq_changed()
-{
- hes_time_t present = time();
-
- if ( irq.timer > present )
- {
- irq.timer = future_hes_time;
- if ( timer.enabled && !timer.fired )
- irq.timer = present + timer.count;
- }
-
- if ( irq.vdp > present )
- {
- irq.vdp = future_hes_time;
- if ( vdp.control & 0x08 )
- irq.vdp = vdp.next_vbl;
- }
-
- hes_time_t time = future_hes_time;
- if ( !(irq.disables & timer_mask) ) time = irq.timer;
- if ( !(irq.disables & vdp_mask) ) time = min( time, irq.vdp );
-
- set_irq_time( time );
-}
-
-int Hes_Emu::cpu_done()
-{
- check( time() >= end_time() ||
- (!(r.status & i_flag_mask) && time() >= irq_time()) );
-
- if ( !(r.status & i_flag_mask) )
- {
- hes_time_t present = time();
-
- if ( irq.timer <= present && !(irq.disables & timer_mask) )
- {
- timer.fired = true;
- irq.timer = future_hes_time;
- irq_changed(); // overkill, but not worth writing custom code
- #if GME_FRAME_HOOK_DEFINED
- {
- unsigned const threshold = period_60hz / 30;
- unsigned long elapsed = present - last_frame_hook;
- if ( elapsed - period_60hz + threshold / 2 < threshold )
- {
- last_frame_hook = present;
- GME_FRAME_HOOK( this );
- }
- }
- #endif
- return 0x0A;
- }
-
- if ( irq.vdp <= present && !(irq.disables & vdp_mask) )
- {
- // work around for bugs with music not acknowledging VDP
- //run_until( present );
- //irq.vdp = future_hes_time;
- //irq_changed();
- #if GME_FRAME_HOOK_DEFINED
- last_frame_hook = present;
- GME_FRAME_HOOK( this );
- #endif
- return 0x08;
- }
- }
- return 0;
-}
-
-static void adjust_time( blargg_long& time, hes_time_t delta )
-{
- if ( time < future_hes_time )
- {
- time -= delta;
- if ( time < 0 )
- time = 0;
- }
-}
-
-blargg_err_t Hes_Emu::run_clocks( blip_time_t& duration_, int )
-{
- blip_time_t const duration = duration_; // cache
-
- if ( cpu::run( duration ) )
- set_warning( "Emulation error (illegal instruction)" );
-
- check( time() >= duration );
- //check( time() - duration < 20 ); // Txx instruction could cause going way over
-
- run_until( duration );
-
- // end time frame
- timer.last_time -= duration;
- vdp.next_vbl -= duration;
- #if GME_FRAME_HOOK_DEFINED
- last_frame_hook -= duration;
- #endif
- cpu::end_frame( duration );
- ::adjust_time( irq.timer, duration );
- ::adjust_time( irq.vdp, duration );
- apu.end_frame( duration );
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.h
deleted file mode 100644
index 9951eb6a..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Emu.h
+++ /dev/null
@@ -1,94 +0,0 @@
-// TurboGrafx-16/PC Engine HES music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef HES_EMU_H
-#define HES_EMU_H
-
-#include "Classic_Emu.h"
-#include "Hes_Apu.h"
-#include "Hes_Cpu.h"
-
-class Hes_Emu : private Hes_Cpu, public Classic_Emu {
- typedef Hes_Cpu cpu;
-public:
- // HES file header
- enum { header_size = 0x20 };
- struct header_t
- {
- byte tag [4];
- byte vers;
- byte first_track;
- byte init_addr [2];
- byte banks [8];
- byte data_tag [4];
- byte size [4];
- byte addr [4];
- byte unused [4];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return header_; }
-
- static gme_type_t static_type() { return gme_hes_type; }
-
-public:
- Hes_Emu();
- ~Hes_Emu();
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_( Data_Reader& );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
- void unload();
-public: private: friend class Hes_Cpu;
- byte* write_pages [page_count + 1]; // 0 if unmapped or I/O space
-
- int cpu_read_( hes_addr_t );
- int cpu_read( hes_addr_t );
- void cpu_write_( hes_addr_t, int data );
- void cpu_write( hes_addr_t, int );
- void cpu_write_vdp( int addr, int data );
- byte const* cpu_set_mmr( int page, int bank );
- int cpu_done();
-private:
- Rom_Data<page_size> rom;
- header_t header_;
- hes_time_t play_period;
- hes_time_t last_frame_hook;
- int timer_base;
-
- struct {
- hes_time_t last_time;
- blargg_long count;
- blargg_long load;
- int raw_load;
- byte enabled;
- byte fired;
- } timer;
-
- struct {
- hes_time_t next_vbl;
- byte latch;
- byte control;
- } vdp;
-
- struct {
- hes_time_t timer;
- hes_time_t vdp;
- byte disables;
- } irq;
-
- void recalc_timer_load();
-
- // large items
- Hes_Apu apu;
- byte sgx [3 * page_size + cpu_padding];
-
- void irq_changed();
- void run_until( hes_time_t );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.h
deleted file mode 100644
index 6297d100..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Z80 CPU emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef KSS_CPU_H
-#define KSS_CPU_H
-
-#include "blargg_endian.h"
-
-typedef blargg_long cpu_time_t;
-
-// must be defined by caller
-void kss_cpu_out( class Kss_Cpu*, cpu_time_t, unsigned addr, int data );
-int kss_cpu_in( class Kss_Cpu*, cpu_time_t, unsigned addr );
-void kss_cpu_write( class Kss_Cpu*, unsigned addr, int data );
-
-class Kss_Cpu {
-public:
- typedef BOOST::uint8_t uint8_t;
-
- // Clear registers and map all pages to unmapped
- void reset( void* unmapped_write, void const* unmapped_read );
-
- // Map memory. Start and size must be multiple of page_size.
- enum { page_size = 0x2000 };
- void map_mem( unsigned addr, blargg_ulong size, void* write, void const* read );
-
- // Map address to page
- uint8_t* write( unsigned addr );
- uint8_t const* read( unsigned addr );
-
- // Run until specified time is reached. Returns true if suspicious/unsupported
- // instruction was encountered at any point during run.
- bool run( cpu_time_t end_time );
-
- // Time of beginning of next instruction
- cpu_time_t time() const { return state->time + state->base; }
-
- // Alter current time. Not supported during run() call.
- void set_time( cpu_time_t t ) { state->time = t - state->base; }
- void adjust_time( int delta ) { state->time += delta; }
-
- typedef BOOST::uint16_t uint16_t;
-
- #if BLARGG_BIG_ENDIAN
- struct regs_t { uint8_t b, c, d, e, h, l, flags, a; };
- #else
- struct regs_t { uint8_t c, b, e, d, l, h, a, flags; };
- #endif
- BOOST_STATIC_ASSERT( sizeof (regs_t) == 8 );
-
- struct pairs_t { uint16_t bc, de, hl, fa; };
-
- // Registers are not updated until run() returns
- struct registers_t {
- uint16_t pc;
- uint16_t sp;
- uint16_t ix;
- uint16_t iy;
- union {
- regs_t b; // b.b, b.c, b.d, b.e, b.h, b.l, b.flags, b.a
- pairs_t w; // w.bc, w.de, w.hl. w.fa
- };
- union {
- regs_t b;
- pairs_t w;
- } alt;
- uint8_t iff1;
- uint8_t iff2;
- uint8_t r;
- uint8_t i;
- uint8_t im;
- };
- //registers_t r; (below for efficiency)
-
- enum { idle_addr = 0xFFFF };
-
- // can read this far past end of a page
- enum { cpu_padding = 0x100 };
-
-public:
- Kss_Cpu();
- enum { page_shift = 13 };
- enum { page_count = 0x10000 >> page_shift };
-private:
- uint8_t szpc [0x200];
- cpu_time_t end_time_;
- struct state_t {
- uint8_t const* read [page_count + 1];
- uint8_t * write [page_count + 1];
- cpu_time_t base;
- cpu_time_t time;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
- void set_end_time( cpu_time_t t );
- void set_page( int i, void* write, void const* read );
-public:
- registers_t r;
-};
-
-#if BLARGG_NONPORTABLE
- #define KSS_CPU_PAGE_OFFSET( addr ) (addr)
-#else
- #define KSS_CPU_PAGE_OFFSET( addr ) ((addr) & (page_size - 1))
-#endif
-
-inline BOOST::uint8_t* Kss_Cpu::write( unsigned addr )
-{
- return state->write [addr >> page_shift] + KSS_CPU_PAGE_OFFSET( addr );
-}
-
-inline BOOST::uint8_t const* Kss_Cpu::read( unsigned addr )
-{
- return state->read [addr >> page_shift] + KSS_CPU_PAGE_OFFSET( addr );
-}
-
-inline void Kss_Cpu::set_end_time( cpu_time_t t )
-{
- cpu_time_t delta = state->base - t;
- state->base = t;
- state->time += delta;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.cpp
deleted file mode 100644
index 1b26ef0b..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.cpp
+++ /dev/null
@@ -1,414 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Kss_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-long const clock_rate = 3579545;
-int const osc_count = Ay_Apu::osc_count + Scc_Apu::osc_count;
-
-Kss_Emu::Kss_Emu()
-{
- sn = 0;
- set_type( gme_kss_type );
- set_silence_lookahead( 6 );
- static const char* const names [osc_count] = {
- "Square 1", "Square 2", "Square 3",
- "Wave 1", "Wave 2", "Wave 3", "Wave 4", "Wave 5"
- };
- set_voice_names( names );
-
- static int const types [osc_count] = {
- wave_type | 0, wave_type | 1, wave_type | 2,
- wave_type | 3, wave_type | 4, wave_type | 5, wave_type | 6, wave_type | 7
- };
- set_voice_types( types );
-
- memset( unmapped_read, 0xFF, sizeof unmapped_read );
-}
-
-Kss_Emu::~Kss_Emu() { unload(); }
-
-void Kss_Emu::unload()
-{
- delete sn;
- sn = 0;
- Classic_Emu::unload();
-}
-
-// Track info
-
-static void copy_kss_fields( Kss_Emu::header_t const& h, track_info_t* out )
-{
- const char* system = "MSX";
- if ( h.device_flags & 0x02 )
- {
- system = "Sega Master System";
- if ( h.device_flags & 0x04 )
- system = "Game Gear";
- }
- Gme_File::copy_field_( out->system, system );
-}
-
-blargg_err_t Kss_Emu::track_info_( track_info_t* out, int ) const
-{
- copy_kss_fields( header_, out );
- return 0;
-}
-
-static blargg_err_t check_kss_header( void const* header )
-{
- if ( memcmp( header, "KSCC", 4 ) && memcmp( header, "KSSX", 4 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Kss_File : Gme_Info_
-{
- Kss_Emu::header_t header_;
-
- Kss_File() { set_type( gme_kss_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- blargg_err_t err = in.read( &header_, Kss_Emu::header_size );
- if ( err )
- return (err == in.eof_error ? gme_wrong_file_type : err);
- return check_kss_header( &header_ );
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- copy_kss_fields( header_, out );
- return 0;
- }
-};
-
-static Music_Emu* new_kss_emu () { return BLARGG_NEW Kss_Emu ; }
-static Music_Emu* new_kss_file() { return BLARGG_NEW Kss_File; }
-
-gme_type_t_ const gme_kss_type [1] = { "MSX", 256, &new_kss_emu, &new_kss_file, "KSS", 0x03 };
-
-// Setup
-
-void Kss_Emu::update_gain()
-{
- double g = gain() * 1.4;
- if ( scc_accessed )
- g *= 1.5;
- ay.volume( g );
- scc.volume( g );
- if ( sn )
- sn->volume( g );
-}
-
-blargg_err_t Kss_Emu::load_( Data_Reader& in )
-{
- memset( &header_, 0, sizeof header_ );
- assert( offsetof (header_t,device_flags) == header_size - 1 );
- assert( offsetof (ext_header_t,msx_audio_vol) == ext_header_size - 1 );
- RETURN_ERR( rom.load( in, header_size, STATIC_CAST(header_t*,&header_), 0 ) );
-
- RETURN_ERR( check_kss_header( header_.tag ) );
-
- if ( header_.tag [3] == 'C' )
- {
- if ( header_.extra_header )
- {
- header_.extra_header = 0;
- set_warning( "Unknown data in header" );
- }
- if ( header_.device_flags & ~0x0F )
- {
- header_.device_flags &= 0x0F;
- set_warning( "Unknown data in header" );
- }
- }
- else
- {
- ext_header_t& ext = header_;
- memcpy( &ext, rom.begin(), min( (int) ext_header_size, (int) header_.extra_header ) );
- if ( header_.extra_header > 0x10 )
- set_warning( "Unknown data in header" );
- }
-
- if ( header_.device_flags & 0x09 )
- set_warning( "FM sound not supported" );
-
- scc_enabled = 0xC000;
- if ( header_.device_flags & 0x04 )
- scc_enabled = 0;
-
- if ( header_.device_flags & 0x02 && !sn )
- CHECK_ALLOC( sn = BLARGG_NEW( Sms_Apu ) );
-
- set_voice_count( osc_count );
-
- return setup_buffer( ::clock_rate );
-}
-
-void Kss_Emu::update_eq( blip_eq_t const& eq )
-{
- ay.treble_eq( eq );
- scc.treble_eq( eq );
- if ( sn )
- sn->treble_eq( eq );
-}
-
-void Kss_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- int i2 = i - ay.osc_count;
- if ( i2 >= 0 )
- scc.osc_output( i2, center );
- else
- ay.osc_output( i, center );
- if ( sn && i < sn->osc_count )
- sn->osc_output( i, center, left, right );
-}
-
-// Emulation
-
-void Kss_Emu::set_tempo_( double t )
-{
- blip_time_t period =
- (header_.device_flags & 0x40 ? ::clock_rate / 50 : ::clock_rate / 60);
- play_period = blip_time_t (period / t);
-}
-
-blargg_err_t Kss_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( ram, 0xC9, 0x4000 );
- memset( ram + 0x4000, 0, sizeof ram - 0x4000 );
-
- // copy driver code to lo RAM
- static byte const bios [] = {
- 0xD3, 0xA0, 0xF5, 0x7B, 0xD3, 0xA1, 0xF1, 0xC9, // $0001: WRTPSG
- 0xD3, 0xA0, 0xDB, 0xA2, 0xC9 // $0009: RDPSG
- };
- static byte const vectors [] = {
- 0xC3, 0x01, 0x00, // $0093: WRTPSG vector
- 0xC3, 0x09, 0x00, // $0096: RDPSG vector
- };
- memcpy( ram + 0x01, bios, sizeof bios );
- memcpy( ram + 0x93, vectors, sizeof vectors );
-
- // copy non-banked data into RAM
- unsigned load_addr = get_le16( header_.load_addr );
- long orig_load_size = get_le16( header_.load_size );
- long load_size = min( orig_load_size, rom.file_size() );
- load_size = min( load_size, long (mem_size - load_addr) );
- if ( load_size != orig_load_size )
- set_warning( "Excessive data size" );
- memcpy( ram + load_addr, rom.begin() + header_.extra_header, load_size );
-
- rom.set_addr( -load_size - header_.extra_header );
-
- // check available bank data
- blargg_long const bank_size = this->bank_size();
- int max_banks = (rom.file_size() - load_size + bank_size - 1) / bank_size;
- bank_count = header_.bank_mode & 0x7F;
- if ( bank_count > max_banks )
- {
- bank_count = max_banks;
- set_warning( "Bank data missing" );
- }
- //dprintf( "load_size : $%X\n", load_size );
- //dprintf( "bank_size : $%X\n", bank_size );
- //dprintf( "bank_count: %d (%d claimed)\n", bank_count, header_.bank_mode & 0x7F );
-
- ram [idle_addr] = 0xFF;
- cpu::reset( unmapped_write, unmapped_read );
- cpu::map_mem( 0, mem_size, ram, ram );
-
- ay.reset();
- scc.reset();
- if ( sn )
- sn->reset();
- r.sp = 0xF380;
- ram [--r.sp] = idle_addr >> 8;
- ram [--r.sp] = idle_addr & 0xFF;
- r.b.a = track;
- r.pc = get_le16( header_.init_addr );
- next_play = play_period;
- scc_accessed = false;
- gain_updated = false;
- update_gain();
- ay_latch = 0;
-
- return 0;
-}
-
-void Kss_Emu::set_bank( int logical, int physical )
-{
- unsigned const bank_size = this->bank_size();
-
- unsigned addr = 0x8000;
- if ( logical && bank_size == 8 * 1024 )
- addr = 0xA000;
-
- physical -= header_.first_bank;
- if ( (unsigned) physical >= (unsigned) bank_count )
- {
- byte* data = ram + addr;
- cpu::map_mem( addr, bank_size, data, data );
- }
- else
- {
- long phys = physical * (blargg_long) bank_size;
- for ( unsigned offset = 0; offset < bank_size; offset += page_size )
- cpu::map_mem( addr + offset, page_size,
- unmapped_write, rom.at_addr( phys + offset ) );
- }
-}
-
-void Kss_Emu::cpu_write( unsigned addr, int data )
-{
- data &= 0xFF;
- switch ( addr )
- {
- case 0x9000:
- set_bank( 0, data );
- return;
-
- case 0xB000:
- set_bank( 1, data );
- return;
- }
-
- int scc_addr = (addr & 0xDFFF) ^ 0x9800;
- if ( scc_addr < scc.reg_count )
- {
- scc_accessed = true;
- scc.write( time(), scc_addr, data );
- return;
- }
-
- dprintf( "LD ($%04X),$%02X\n", addr, data );
-}
-
-void kss_cpu_write( Kss_Cpu* cpu, unsigned addr, int data )
-{
- *cpu->write( addr ) = data;
- if ( (addr & STATIC_CAST(Kss_Emu&,*cpu).scc_enabled) == 0x8000 )
- STATIC_CAST(Kss_Emu&,*cpu).cpu_write( addr, data );
-}
-
-void kss_cpu_out( Kss_Cpu* cpu, cpu_time_t time, unsigned addr, int data )
-{
- data &= 0xFF;
- Kss_Emu& emu = STATIC_CAST(Kss_Emu&,*cpu);
- switch ( addr & 0xFF )
- {
- case 0xA0:
- emu.ay_latch = data & 0x0F;
- return;
-
- case 0xA1:
- GME_APU_HOOK( &emu, emu.ay_latch, data );
- emu.ay.write( time, emu.ay_latch, data );
- return;
-
- case 0x06:
- if ( emu.sn && (emu.header_.device_flags & 0x04) )
- {
- emu.sn->write_ggstereo( time, data );
- return;
- }
- break;
-
- case 0x7E:
- case 0x7F:
- if ( emu.sn )
- {
- GME_APU_HOOK( &emu, 16, data );
- emu.sn->write_data( time, data );
- return;
- }
- break;
-
- case 0xFE:
- emu.set_bank( 0, data );
- return;
-
- #ifndef NDEBUG
- case 0xF1: // FM data
- if ( data )
- break; // trap non-zero data
- case 0xF0: // FM addr
- case 0xA8: // PPI
- return;
- #endif
- }
-
- dprintf( "OUT $%04X,$%02X\n", addr, data );
-}
-
-int kss_cpu_in( Kss_Cpu*, cpu_time_t, unsigned addr )
-{
- //Kss_Emu& emu = STATIC_CAST(Kss_Emu&,*cpu);
- //switch ( addr & 0xFF )
- //{
- //}
-
- dprintf( "IN $%04X\n", addr );
- return 0;
-}
-
-// Emulation
-
-blargg_err_t Kss_Emu::run_clocks( blip_time_t& duration, int )
-{
- while ( time() < duration )
- {
- blip_time_t end = min( duration, next_play );
- cpu::run( min( duration, next_play ) );
- if ( r.pc == idle_addr )
- set_time( end );
-
- if ( time() >= next_play )
- {
- next_play += play_period;
- if ( r.pc == idle_addr )
- {
- if ( !gain_updated )
- {
- gain_updated = true;
- if ( scc_accessed )
- update_gain();
- }
-
- ram [--r.sp] = idle_addr >> 8;
- ram [--r.sp] = idle_addr & 0xFF;
- r.pc = get_le16( header_.play_addr );
- GME_FRAME_HOOK( this );
- }
- }
- }
-
- duration = time();
- next_play -= duration;
- check( next_play >= 0 );
- adjust_time( -duration );
- ay.end_frame( duration );
- scc.end_frame( duration );
- if ( sn )
- sn->end_frame( duration );
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.h
deleted file mode 100644
index 4d8463ab..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Emu.h
+++ /dev/null
@@ -1,96 +0,0 @@
-// MSX computer KSS music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef KSS_EMU_H
-#define KSS_EMU_H
-
-#include "Classic_Emu.h"
-#include "Kss_Scc_Apu.h"
-#include "Kss_Cpu.h"
-#include "Sms_Apu.h"
-#include "Ay_Apu.h"
-
-class Kss_Emu : private Kss_Cpu, public Classic_Emu {
- typedef Kss_Cpu cpu;
-public:
- // KSS file header
- enum { header_size = 0x10 };
- struct header_t
- {
- byte tag [4];
- byte load_addr [2];
- byte load_size [2];
- byte init_addr [2];
- byte play_addr [2];
- byte first_bank;
- byte bank_mode;
- byte extra_header;
- byte device_flags;
- };
-
- enum { ext_header_size = 0x10 };
- struct ext_header_t
- {
- byte data_size [4];
- byte unused [4];
- byte first_track [2];
- byte last_tack [2];
- byte psg_vol;
- byte scc_vol;
- byte msx_music_vol;
- byte msx_audio_vol;
- };
-
- struct composite_header_t : header_t, ext_header_t { };
-
- // Header for currently loaded file
- composite_header_t const& header() const { return header_; }
-
- static gme_type_t static_type() { return gme_kss_type; }
-public:
- Kss_Emu();
- ~Kss_Emu();
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_( Data_Reader& );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
- void unload();
-private:
- Rom_Data<page_size> rom;
- composite_header_t header_;
-
- bool scc_accessed;
- bool gain_updated;
- void update_gain();
-
- unsigned scc_enabled; // 0 or 0xC000
- byte const* bank_data;
- int bank_count;
- void set_bank( int logical, int physical );
- blargg_long bank_size() const { return (16 * 1024L) >> (header_.bank_mode >> 7 & 1); }
-
- blip_time_t play_period;
- blip_time_t next_play;
- int ay_latch;
-
- friend void kss_cpu_out( class Kss_Cpu*, cpu_time_t, unsigned addr, int data );
- friend int kss_cpu_in( class Kss_Cpu*, cpu_time_t, unsigned addr );
- void cpu_write( unsigned addr, int data );
- friend void kss_cpu_write( class Kss_Cpu*, unsigned addr, int data );
-
- // large items
- enum { mem_size = 0x10000 };
- byte ram [mem_size + cpu_padding];
-
- Ay_Apu ay;
- Scc_Apu scc;
- Sms_Apu* sn;
- byte unmapped_read [0x100];
- byte unmapped_write [page_size];
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.h
deleted file mode 100644
index 03a6a108..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Konami SCC sound chip emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef KSS_SCC_APU_H
-#define KSS_SCC_APU_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-#include <string.h>
-
-class Scc_Apu {
-public:
- // Set buffer to generate all sound into, or disable sound if NULL
- void output( Blip_Buffer* );
-
- // Reset sound chip
- void reset();
-
- // Write to register at specified time
- enum { reg_count = 0x90 };
- void write( blip_time_t time, int reg, int data );
-
- // Run sound to specified time, end current time frame, then start a new
- // time frame at time 0. Time frames have no effect on emulation and each
- // can be whatever length is convenient.
- void end_frame( blip_time_t length );
-
-// Additional features
-
- // Set sound output of specific oscillator to buffer, where index is
- // 0 to 4. If buffer is NULL, the specified oscillator is muted.
- enum { osc_count = 5 };
- void osc_output( int index, Blip_Buffer* );
-
- // Set overall volume (default is 1.0)
- void volume( double );
-
- // Set treble equalization (see documentation)
- void treble_eq( blip_eq_t const& );
-
-public:
- Scc_Apu();
-private:
- enum { amp_range = 0x8000 };
- struct osc_t
- {
- int delay;
- int phase;
- int last_amp;
- Blip_Buffer* output;
- };
- osc_t oscs [osc_count];
- blip_time_t last_time;
- unsigned char regs [reg_count];
- Blip_Synth<blip_med_quality,1> synth;
-
- void run_until( blip_time_t );
-};
-
-inline void Scc_Apu::volume( double v ) { synth.volume( 0.43 / osc_count / amp_range * v ); }
-
-inline void Scc_Apu::treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
-
-inline void Scc_Apu::osc_output( int index, Blip_Buffer* b )
-{
- assert( (unsigned) index < osc_count );
- oscs [index].output = b;
-}
-
-inline void Scc_Apu::write( blip_time_t time, int addr, int data )
-{
- assert( (unsigned) addr < reg_count );
- run_until( time );
- regs [addr] = data;
-}
-
-inline void Scc_Apu::end_frame( blip_time_t end_time )
-{
- if ( end_time > last_time )
- run_until( end_time );
- last_time -= end_time;
- assert( last_time >= 0 );
-}
-
-inline void Scc_Apu::output( Blip_Buffer* buf )
-{
- for ( int i = 0; i < osc_count; i++ )
- oscs [i].output = buf;
-}
-
-inline Scc_Apu::Scc_Apu()
-{
- output( 0 );
-}
-
-inline void Scc_Apu::reset()
-{
- last_time = 0;
-
- for ( int i = 0; i < osc_count; i++ )
- memset( &oscs [i], 0, offsetof (osc_t,output) );
-
- memset( regs, 0, sizeof regs );
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Makefile.am b/plugins/gme/Game_Music_Emu-0.5.2/gme/Makefile.am
deleted file mode 100644
index d728deea..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Makefile.am
+++ /dev/null
@@ -1,66 +0,0 @@
-noinst_LIBRARIES = libgme.a
-libgme_a_SOURCES = Ay_Apu.cpp Gb_Apu.cpp Hes_Emu.cpp Nes_Fme7_Apu.cpp Sms_Apu.cpp\
-Ay_Cpu.cpp Gb_Cpu.cpp Kss_Cpu.cpp Nes_Namco_Apu.cpp Snes_Spc.cpp\
-Ay_Emu.cpp Gb_Oscs.cpp Kss_Emu.cpp Nes_Oscs.cpp Spc_Cpu.cpp\
-Blip_Buffer.cpp Gbs_Emu.cpp Kss_Scc_Apu.cpp Nes_Vrc6_Apu.cpp Spc_Dsp.cpp\
-Classic_Emu.cpp gme.cpp M3u_Playlist.cpp Nsfe_Emu.cpp Spc_Emu.cpp\
-Data_Reader.cpp Gme_File.cpp Multi_Buffer.cpp Nsf_Emu.cpp Vgm_Emu.cpp\
-Dual_Resampler.cpp Gym_Emu.cpp Music_Emu.cpp Sap_Apu.cpp Vgm_Emu_Impl.cpp\
-Effects_Buffer.cpp Hes_Apu.cpp Nes_Apu.cpp Sap_Cpu.cpp Ym2413_Emu.cpp\
-Fir_Resampler.cpp Hes_Cpu.cpp Nes_Cpu.cpp Sap_Emu.cpp Ym2612_Emu.cpp\
-Ay_Apu.h\
-Ay_Cpu.h\
-Ay_Emu.h\
-blargg_common.h\
-blargg_config.h\
-blargg_endian.h\
-blargg_source.h\
-Blip_Buffer.h\
-Classic_Emu.h\
-Data_Reader.h\
-Dual_Resampler.h\
-Effects_Buffer.h\
-Fir_Resampler.h\
-Gb_Apu.h\
-Gb_Cpu.h\
-gb_cpu_io.h\
-Gb_Oscs.h\
-Gbs_Emu.h\
-Gme_File.h\
-gme.h\
-Gym_Emu.h\
-Hes_Apu.h\
-Hes_Cpu.h\
-hes_cpu_io.h\
-Hes_Emu.h\
-Kss_Cpu.h\
-Kss_Emu.h\
-Kss_Scc_Apu.h\
-M3u_Playlist.h\
-Multi_Buffer.h\
-Music_Emu.h\
-Nes_Apu.h\
-Nes_Cpu.h\
-nes_cpu_io.h\
-Nes_Fme7_Apu.h\
-Nes_Namco_Apu.h\
-Nes_Oscs.h\
-Nes_Vrc6_Apu.h\
-Nsfe_Emu.h\
-Nsf_Emu.h\
-Sap_Apu.h\
-Sap_Cpu.h\
-sap_cpu_io.h\
-Sap_Emu.h\
-Sms_Apu.h\
-Sms_Oscs.h\
-Snes_Spc.h\
-Spc_Cpu.h\
-Spc_Dsp.h\
-Spc_Emu.h\
-Vgm_Emu.h\
-Vgm_Emu_Impl.h\
-Ym2413_Emu.h\
-Ym2612_Emu.h
-
-AM_CPPFLAGS = $(CXXFLAGS) -fPIC
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.cpp
deleted file mode 100644
index ecd8f8ad..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.cpp
+++ /dev/null
@@ -1,232 +0,0 @@
-// Blip_Buffer 0.4.1. http://www.slack.net/~ant/
-
-#include "Multi_Buffer.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-Multi_Buffer::Multi_Buffer( int spf ) : samples_per_frame_( spf )
-{
- length_ = 0;
- sample_rate_ = 0;
- channels_changed_count_ = 1;
-}
-
-blargg_err_t Multi_Buffer::set_channel_count( int ) { return 0; }
-
-// Silent_Buffer
-
-Silent_Buffer::Silent_Buffer() : Multi_Buffer( 1 ) // 0 channels would probably confuse
-{
- // TODO: better to use empty Blip_Buffer so caller never has to check for NULL?
- chan.left = 0;
- chan.center = 0;
- chan.right = 0;
-}
-
-// Mono_Buffer
-
-Mono_Buffer::Mono_Buffer() : Multi_Buffer( 1 )
-{
- chan.center = &buf;
- chan.left = &buf;
- chan.right = &buf;
-}
-
-Mono_Buffer::~Mono_Buffer() { }
-
-blargg_err_t Mono_Buffer::set_sample_rate( long rate, int msec )
-{
- RETURN_ERR( buf.set_sample_rate( rate, msec ) );
- return Multi_Buffer::set_sample_rate( buf.sample_rate(), buf.length() );
-}
-
-// Stereo_Buffer
-
-Stereo_Buffer::Stereo_Buffer() : Multi_Buffer( 2 )
-{
- chan.center = &bufs [0];
- chan.left = &bufs [1];
- chan.right = &bufs [2];
-}
-
-Stereo_Buffer::~Stereo_Buffer() { }
-
-blargg_err_t Stereo_Buffer::set_sample_rate( long rate, int msec )
-{
- for ( int i = 0; i < buf_count; i++ )
- RETURN_ERR( bufs [i].set_sample_rate( rate, msec ) );
- return Multi_Buffer::set_sample_rate( bufs [0].sample_rate(), bufs [0].length() );
-}
-
-void Stereo_Buffer::clock_rate( long rate )
-{
- for ( int i = 0; i < buf_count; i++ )
- bufs [i].clock_rate( rate );
-}
-
-void Stereo_Buffer::bass_freq( int bass )
-{
- for ( unsigned i = 0; i < buf_count; i++ )
- bufs [i].bass_freq( bass );
-}
-
-void Stereo_Buffer::clear()
-{
- stereo_added = 0;
- was_stereo = false;
- for ( int i = 0; i < buf_count; i++ )
- bufs [i].clear();
-}
-
-void Stereo_Buffer::end_frame( blip_time_t clock_count )
-{
- stereo_added = 0;
- for ( unsigned i = 0; i < buf_count; i++ )
- {
- stereo_added |= bufs [i].clear_modified() << i;
- bufs [i].end_frame( clock_count );
- }
-}
-
-long Stereo_Buffer::read_samples( blip_sample_t* out, long count )
-{
- require( !(count & 1) ); // count must be even
- count = (unsigned) count / 2;
-
- long avail = bufs [0].samples_avail();
- if ( count > avail )
- count = avail;
- if ( count )
- {
- int bufs_used = stereo_added | was_stereo;
- //dprintf( "%X\n", bufs_used );
- if ( bufs_used <= 1 )
- {
- mix_mono( out, count );
- bufs [0].remove_samples( count );
- bufs [1].remove_silence( count );
- bufs [2].remove_silence( count );
- }
- else if ( bufs_used & 1 )
- {
- mix_stereo( out, count );
- bufs [0].remove_samples( count );
- bufs [1].remove_samples( count );
- bufs [2].remove_samples( count );
- }
- else
- {
- mix_stereo_no_center( out, count );
- bufs [0].remove_silence( count );
- bufs [1].remove_samples( count );
- bufs [2].remove_samples( count );
- }
-
- // to do: this might miss opportunities for optimization
- if ( !bufs [0].samples_avail() )
- {
- was_stereo = stereo_added;
- stereo_added = 0;
- }
- }
-
- return count * 2;
-}
-
-void Stereo_Buffer::mix_stereo( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [1] );
- BLIP_READER_BEGIN( left, bufs [1] );
- BLIP_READER_BEGIN( right, bufs [2] );
- BLIP_READER_BEGIN( center, bufs [0] );
-
- for ( ; count; --count )
- {
- int c = BLIP_READER_READ( center );
- blargg_long l = c + BLIP_READER_READ( left );
- blargg_long r = c + BLIP_READER_READ( right );
- if ( (BOOST::int16_t) l != l )
- l = 0x7FFF - (l >> 24);
-
- BLIP_READER_NEXT( center, bass );
- if ( (BOOST::int16_t) r != r )
- r = 0x7FFF - (r >> 24);
-
- BLIP_READER_NEXT( left, bass );
- BLIP_READER_NEXT( right, bass );
-
- out [0] = l;
- out [1] = r;
- out += 2;
- }
-
- BLIP_READER_END( center, bufs [0] );
- BLIP_READER_END( right, bufs [2] );
- BLIP_READER_END( left, bufs [1] );
-}
-
-void Stereo_Buffer::mix_stereo_no_center( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [1] );
- BLIP_READER_BEGIN( left, bufs [1] );
- BLIP_READER_BEGIN( right, bufs [2] );
-
- for ( ; count; --count )
- {
- blargg_long l = BLIP_READER_READ( left );
- if ( (BOOST::int16_t) l != l )
- l = 0x7FFF - (l >> 24);
-
- blargg_long r = BLIP_READER_READ( right );
- if ( (BOOST::int16_t) r != r )
- r = 0x7FFF - (r >> 24);
-
- BLIP_READER_NEXT( left, bass );
- BLIP_READER_NEXT( right, bass );
-
- out [0] = l;
- out [1] = r;
- out += 2;
- }
-
- BLIP_READER_END( right, bufs [2] );
- BLIP_READER_END( left, bufs [1] );
-}
-
-void Stereo_Buffer::mix_mono( blip_sample_t* out_, blargg_long count )
-{
- blip_sample_t* BLIP_RESTRICT out = out_;
- int const bass = BLIP_READER_BASS( bufs [0] );
- BLIP_READER_BEGIN( center, bufs [0] );
-
- for ( ; count; --count )
- {
- blargg_long s = BLIP_READER_READ( center );
- if ( (BOOST::int16_t) s != s )
- s = 0x7FFF - (s >> 24);
-
- BLIP_READER_NEXT( center, bass );
- out [0] = s;
- out [1] = s;
- out += 2;
- }
-
- BLIP_READER_END( center, bufs [0] );
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.h
deleted file mode 100644
index a39cca1a..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Multi_Buffer.h
+++ /dev/null
@@ -1,156 +0,0 @@
-// Multi-channel sound buffer interface, and basic mono and stereo buffers
-
-// Blip_Buffer 0.4.1
-#ifndef MULTI_BUFFER_H
-#define MULTI_BUFFER_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-// Interface to one or more Blip_Buffers mapped to one or more channels
-// consisting of left, center, and right buffers.
-class Multi_Buffer {
-public:
- Multi_Buffer( int samples_per_frame );
- virtual ~Multi_Buffer() { }
-
- // Set the number of channels available
- virtual blargg_err_t set_channel_count( int );
-
- // Get indexed channel, from 0 to channel count - 1
- struct channel_t {
- Blip_Buffer* center;
- Blip_Buffer* left;
- Blip_Buffer* right;
- };
- enum { type_index_mask = 0xFF };
- enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
- virtual channel_t channel( int index, int type ) = 0;
-
- // See Blip_Buffer.h
- virtual blargg_err_t set_sample_rate( long rate, int msec = blip_default_length ) = 0;
- virtual void clock_rate( long ) = 0;
- virtual void bass_freq( int ) = 0;
- virtual void clear() = 0;
- long sample_rate() const;
-
- // Length of buffer, in milliseconds
- int length() const;
-
- // See Blip_Buffer.h
- virtual void end_frame( blip_time_t ) = 0;
-
- // Number of samples per output frame (1 = mono, 2 = stereo)
- int samples_per_frame() const;
-
- // Count of changes to channel configuration. Incremented whenever
- // a change is made to any of the Blip_Buffers for any channel.
- unsigned channels_changed_count() { return channels_changed_count_; }
-
- // See Blip_Buffer.h
- virtual long read_samples( blip_sample_t*, long ) = 0;
- virtual long samples_avail() const = 0;
-
-public:
- BLARGG_DISABLE_NOTHROW
-protected:
- void channels_changed() { channels_changed_count_++; }
-private:
- // noncopyable
- Multi_Buffer( const Multi_Buffer& );
- Multi_Buffer& operator = ( const Multi_Buffer& );
-
- unsigned channels_changed_count_;
- long sample_rate_;
- int length_;
- int const samples_per_frame_;
-};
-
-// Uses a single buffer and outputs mono samples.
-class Mono_Buffer : public Multi_Buffer {
- Blip_Buffer buf;
- channel_t chan;
-public:
- // Buffer used for all channels
- Blip_Buffer* center() { return &buf; }
-
-public:
- Mono_Buffer();
- ~Mono_Buffer();
- blargg_err_t set_sample_rate( long rate, int msec = blip_default_length );
- void clock_rate( long rate ) { buf.clock_rate( rate ); }
- void bass_freq( int freq ) { buf.bass_freq( freq ); }
- void clear() { buf.clear(); }
- long samples_avail() const { return buf.samples_avail(); }
- long read_samples( blip_sample_t* p, long s ) { return buf.read_samples( p, s ); }
- channel_t channel( int, int ) { return chan; }
- void end_frame( blip_time_t t ) { buf.end_frame( t ); }
-};
-
-// Uses three buffers (one for center) and outputs stereo sample pairs.
-class Stereo_Buffer : public Multi_Buffer {
-public:
-
- // Buffers used for all channels
- Blip_Buffer* center() { return &bufs [0]; }
- Blip_Buffer* left() { return &bufs [1]; }
- Blip_Buffer* right() { return &bufs [2]; }
-
-public:
- Stereo_Buffer();
- ~Stereo_Buffer();
- blargg_err_t set_sample_rate( long, int msec = blip_default_length );
- void clock_rate( long );
- void bass_freq( int );
- void clear();
- channel_t channel( int, int ) { return chan; }
- void end_frame( blip_time_t );
-
- long samples_avail() const { return bufs [0].samples_avail() * 2; }
- long read_samples( blip_sample_t*, long );
-
-private:
- enum { buf_count = 3 };
- Blip_Buffer bufs [buf_count];
- channel_t chan;
- int stereo_added;
- int was_stereo;
-
- void mix_stereo_no_center( blip_sample_t*, blargg_long );
- void mix_stereo( blip_sample_t*, blargg_long );
- void mix_mono( blip_sample_t*, blargg_long );
-};
-
-// Silent_Buffer generates no samples, useful where no sound is wanted
-class Silent_Buffer : public Multi_Buffer {
- channel_t chan;
-public:
- Silent_Buffer();
- blargg_err_t set_sample_rate( long rate, int msec = blip_default_length )
- {
- return Multi_Buffer::set_sample_rate( rate, msec );
- }
- void clock_rate( long ) { }
- void bass_freq( int ) { }
- void clear() { }
- channel_t channel( int, int ) { return chan; }
- void end_frame( blip_time_t ) { }
- long samples_avail() const { return 0; }
- long read_samples( blip_sample_t*, long ) { return 0; }
-};
-
-
-inline blargg_err_t Multi_Buffer::set_sample_rate( long rate, int msec )
-{
- sample_rate_ = rate;
- length_ = msec;
- return 0;
-}
-
-inline int Multi_Buffer::samples_per_frame() const { return samples_per_frame_; }
-
-inline long Multi_Buffer::sample_rate() const { return sample_rate_; }
-
-inline int Multi_Buffer::length() const { return length_; }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.cpp
deleted file mode 100644
index 31c7233c..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.cpp
+++ /dev/null
@@ -1,410 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Music_Emu.h"
-
-#include "Multi_Buffer.h"
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-int const stereo = 2; // number of channels for stereo
-int const silence_max = 6; // seconds
-int const silence_threshold = 0x10;
-long const fade_block_size = 512;
-int const fade_shift = 8; // fade ends with gain at 1.0 / (1 << fade_shift)
-
-Music_Emu::equalizer_t const Music_Emu::tv_eq = { -8.0, 180 };
-
-void Music_Emu::clear_track_vars()
-{
- current_track_ = -1;
- out_time = 0;
- emu_time = 0;
- emu_track_ended_ = true;
- track_ended_ = true;
- fade_start = LONG_MAX / 2 + 1;
- fade_step = 1;
- silence_time = 0;
- silence_count = 0;
- buf_remain = 0;
- warning(); // clear warning
-}
-
-void Music_Emu::unload()
-{
- voice_count_ = 0;
- clear_track_vars();
- Gme_File::unload();
-}
-
-Music_Emu::Music_Emu()
-{
- effects_buffer = 0;
-
- sample_rate_ = 0;
- mute_mask_ = 0;
- tempo_ = 1.0;
- gain_ = 1.0;
-
- // defaults
- max_initial_silence = 2;
- silence_lookahead = 3;
- ignore_silence_ = false;
- equalizer_.treble = -1.0;
- equalizer_.bass = 60;
-
- static const char* const names [] = {
- "Voice 1", "Voice 2", "Voice 3", "Voice 4",
- "Voice 5", "Voice 6", "Voice 7", "Voice 8"
- };
- set_voice_names( names );
- Music_Emu::unload(); // non-virtual
-}
-
-Music_Emu::~Music_Emu() { delete effects_buffer; }
-
-blargg_err_t Music_Emu::set_sample_rate( long rate )
-{
- require( !sample_rate() ); // sample rate can't be changed once set
- RETURN_ERR( set_sample_rate_( rate ) );
- RETURN_ERR( buf.resize( buf_size ) );
- sample_rate_ = rate;
- return 0;
-}
-
-void Music_Emu::pre_load()
-{
- require( sample_rate() ); // set_sample_rate() must be called before loading a file
- Gme_File::pre_load();
-}
-
-void Music_Emu::set_equalizer( equalizer_t const& eq )
-{
- equalizer_ = eq;
- set_equalizer_( eq );
-}
-
-void Music_Emu::mute_voice( int index, bool mute )
-{
- require( (unsigned) index < (unsigned) voice_count() );
- int bit = 1 << index;
- int mask = mute_mask_ | bit;
- if ( !mute )
- mask ^= bit;
- mute_voices( mask );
-}
-
-void Music_Emu::mute_voices( int mask )
-{
- require( sample_rate() ); // sample rate must be set first
- mute_mask_ = mask;
- mute_voices_( mask );
-}
-
-void Music_Emu::set_tempo( double t )
-{
- require( sample_rate() ); // sample rate must be set first
- double const min = 0.02;
- double const max = 4.00;
- if ( t < min ) t = min;
- if ( t > max ) t = max;
- tempo_ = t;
- set_tempo_( t );
-}
-
-void Music_Emu::post_load_()
-{
- set_tempo( tempo_ );
- remute_voices();
-}
-
-blargg_err_t Music_Emu::start_track( int track )
-{
- clear_track_vars();
-
- int remapped = track;
- RETURN_ERR( remap_track_( &remapped ) );
- current_track_ = track;
- RETURN_ERR( start_track_( remapped ) );
-
- emu_track_ended_ = false;
- track_ended_ = false;
-
- if ( !ignore_silence_ )
- {
- // play until non-silence or end of track
- for ( long end = max_initial_silence * stereo * sample_rate(); emu_time < end; )
- {
- fill_buf();
- if ( buf_remain | (int) emu_track_ended_ )
- break;
- }
-
- emu_time = buf_remain;
- out_time = 0;
- silence_time = 0;
- silence_count = 0;
- }
- return track_ended() ? warning() : 0;
-}
-
-void Music_Emu::end_track_if_error( blargg_err_t err )
-{
- if ( err )
- {
- emu_track_ended_ = true;
- set_warning( err );
- }
-}
-
-// Tell/Seek
-
-blargg_long Music_Emu::msec_to_samples( blargg_long msec ) const
-{
- blargg_long sec = msec / 1000;
- msec -= sec * 1000;
- return (sec * sample_rate() + msec * sample_rate() / 1000) * stereo;
-}
-
-long Music_Emu::tell() const
-{
- blargg_long rate = sample_rate() * stereo;
- blargg_long sec = out_time / rate;
- return sec * 1000 + (out_time - sec * rate) * 1000 / rate;
-}
-
-blargg_err_t Music_Emu::seek( long msec )
-{
- blargg_long time = msec_to_samples( msec );
- if ( time < out_time )
- RETURN_ERR( start_track( current_track_ ) );
- return skip( time - out_time );
-}
-
-blargg_err_t Music_Emu::skip( long count )
-{
- require( current_track() >= 0 ); // start_track() must have been called already
- out_time += count;
-
- // remove from silence and buf first
- {
- long n = min( count, silence_count );
- silence_count -= n;
- count -= n;
-
- n = min( count, buf_remain );
- buf_remain -= n;
- count -= n;
- }
-
- if ( count && !emu_track_ended_ )
- {
- emu_time += count;
- end_track_if_error( skip_( count ) );
- }
-
- if ( !(silence_count | buf_remain) ) // caught up to emulator, so update track ended
- track_ended_ |= emu_track_ended_;
-
- return 0;
-}
-
-blargg_err_t Music_Emu::skip_( long count )
-{
- // for long skip, mute sound
- const long threshold = 30000;
- if ( count > threshold )
- {
- int saved_mute = mute_mask_;
- mute_voices( ~0 );
-
- while ( count > threshold / 2 && !emu_track_ended_ )
- {
- RETURN_ERR( play_( buf_size, buf.begin() ) );
- count -= buf_size;
- }
-
- mute_voices( saved_mute );
- }
-
- while ( count && !emu_track_ended_ )
- {
- long n = buf_size;
- if ( n > count )
- n = count;
- count -= n;
- RETURN_ERR( play_( n, buf.begin() ) );
- }
- return 0;
-}
-
-// Fading
-
-void Music_Emu::set_fade( long start_msec, long length_msec )
-{
- fade_step = sample_rate() * length_msec / (fade_block_size * fade_shift * 1000 / stereo);
- fade_start = msec_to_samples( start_msec );
-}
-
-// unit / pow( 2.0, (double) x / step )
-static int int_log( blargg_long x, int step, int unit )
-{
- int shift = x / step;
- int fraction = (x - shift * step) * unit / step;
- return ((unit - fraction) + (fraction >> 1)) >> shift;
-}
-
-void Music_Emu::handle_fade( long out_count, sample_t* out )
-{
- for ( int i = 0; i < out_count; i += fade_block_size )
- {
- int const shift = 14;
- int const unit = 1 << shift;
- int gain = int_log( (out_time + i - fade_start) / fade_block_size,
- fade_step, unit );
- if ( gain < (unit >> fade_shift) )
- track_ended_ = emu_track_ended_ = true;
-
- sample_t* io = &out [i];
- for ( int count = min( fade_block_size, out_count - i ); count; --count )
- {
- *io = sample_t ((*io * gain) >> shift);
- ++io;
- }
- }
-}
-
-// Silence detection
-
-void Music_Emu::emu_play( long count, sample_t* out )
-{
- check( current_track_ >= 0 );
- emu_time += count;
- if ( current_track_ >= 0 && !emu_track_ended_ )
- end_track_if_error( play_( count, out ) );
- else
- memset( out, 0, count * sizeof *out );
-}
-
-// number of consecutive silent samples at end
-static long count_silence( Music_Emu::sample_t* begin, long size )
-{
- Music_Emu::sample_t first = *begin;
- *begin = silence_threshold; // sentinel
- Music_Emu::sample_t* p = begin + size;
- while ( (unsigned) (*--p + silence_threshold / 2) <= (unsigned) silence_threshold ) { }
- *begin = first;
- return size - (p - begin);
-}
-
-// fill internal buffer and check it for silence
-void Music_Emu::fill_buf()
-{
- assert( !buf_remain );
- if ( !emu_track_ended_ )
- {
- emu_play( buf_size, buf.begin() );
- long silence = count_silence( buf.begin(), buf_size );
- if ( silence < buf_size )
- {
- silence_time = emu_time - silence;
- buf_remain = buf_size;
- return;
- }
- }
- silence_count += buf_size;
-}
-
-blargg_err_t Music_Emu::play( long out_count, sample_t* out )
-{
- if ( track_ended_ )
- {
- memset( out, 0, out_count * sizeof *out );
- }
- else
- {
- require( current_track() >= 0 );
- require( out_count % stereo == 0 );
-
- assert( emu_time >= out_time );
-
- // prints nifty graph of how far ahead we are when searching for silence
- //dprintf( "%*s \n", int ((emu_time - out_time) * 7 / sample_rate()), "*" );
-
- long pos = 0;
- if ( silence_count )
- {
- // during a run of silence, run emulator at >=2x speed so it gets ahead
- long ahead_time = silence_lookahead * (out_time + out_count - silence_time) + silence_time;
- while ( emu_time < ahead_time && !(buf_remain | emu_track_ended_) )
- fill_buf();
-
- // fill with silence
- pos = min( silence_count, out_count );
- memset( out, 0, pos * sizeof *out );
- silence_count -= pos;
-
- if ( emu_time - silence_time > silence_max * stereo * sample_rate() )
- {
- track_ended_ = emu_track_ended_ = true;
- silence_count = 0;
- buf_remain = 0;
- }
- }
-
- if ( buf_remain )
- {
- // empty silence buf
- long n = min( buf_remain, out_count - pos );
- memcpy( &out [pos], buf.begin() + (buf_size - buf_remain), n * sizeof *out );
- buf_remain -= n;
- pos += n;
- }
-
- // generate remaining samples normally
- long remain = out_count - pos;
- if ( remain )
- {
- emu_play( remain, out + pos );
- track_ended_ |= emu_track_ended_;
-
- if ( !ignore_silence_ || out_time > fade_start )
- {
- // check end for a new run of silence
- long silence = count_silence( out + pos, remain );
- if ( silence < remain )
- silence_time = emu_time - silence;
-
- if ( emu_time - silence_time >= buf_size )
- fill_buf(); // cause silence detection on next play()
- }
- }
-
- if ( out_time > fade_start )
- handle_fade( out_count, out );
- }
- out_time += out_count;
- return 0;
-}
-
-// Gme_Info_
-
-blargg_err_t Gme_Info_::set_sample_rate_( long ) { return 0; }
-void Gme_Info_::pre_load() { Gme_File::pre_load(); } // skip Music_Emu
-void Gme_Info_::post_load_() { Gme_File::post_load_(); } // skip Music_Emu
-void Gme_Info_::set_equalizer_( equalizer_t const& ){ check( false ); }
-void Gme_Info_::mute_voices_( int ) { check( false ); }
-void Gme_Info_::set_tempo_( double ) { }
-blargg_err_t Gme_Info_::start_track_( int ) { return "Use full emulator for playback"; }
-blargg_err_t Gme_Info_::play_( long, sample_t* ) { return "Use full emulator for playback"; }
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.h
deleted file mode 100644
index 573403ce..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Music_Emu.h
+++ /dev/null
@@ -1,211 +0,0 @@
-// Common interface to game music file emulators
-
-// Game_Music_Emu 0.5.2
-#ifndef MUSIC_EMU_H
-#define MUSIC_EMU_H
-
-#include "Gme_File.h"
-class Multi_Buffer;
-
-struct Music_Emu : public Gme_File {
-public:
-// Basic functionality (see Gme_File.h for file loading/track info functions)
-
- // Set output sample rate. Must be called only once before loading file.
- blargg_err_t set_sample_rate( long sample_rate );
-
- // Start a track, where 0 is the first track. Also clears warning string.
- blargg_err_t start_track( int );
-
- // Generate 'count' samples info 'buf'. Output is in stereo. Any emulation
- // errors set warning string, and major errors also end track.
- typedef short sample_t;
- blargg_err_t play( long count, sample_t* buf );
-
-// Informational
-
- // Sample rate sound is generated at
- long sample_rate() const;
-
- // Index of current track or -1 if one hasn't been started
- int current_track() const;
-
- // Number of voices used by currently loaded file
- int voice_count() const;
-
- // Names of voices
- const char** voice_names() const;
-
-// Track status/control
-
- // Number of milliseconds (1000 msec = 1 second) played since beginning of track
- long tell() const;
-
- // Seek to new time in track. Seeking backwards or far forward can take a while.
- blargg_err_t seek( long msec );
-
- // Skip n samples
- blargg_err_t skip( long n );
-
- // True if a track has reached its end
- bool track_ended() const;
-
- // Set start time and length of track fade out. Once fade ends track_ended() returns
- // true. Fade time can be changed while track is playing.
- void set_fade( long start_msec, long length_msec = 8000 );
-
- // Disable automatic end-of-track detection and skipping of silence at beginning
- void ignore_silence( bool disable = true );
-
- // Info for current track
- Gme_File::track_info;
- blargg_err_t track_info( track_info_t* out ) const;
-
-// Sound customization
-
- // Adjust song tempo, where 1.0 = normal, 0.5 = half speed, 2.0 = double speed.
- // Track length as returned by track_info() assumes a tempo of 1.0.
- void set_tempo( double );
-
- // Mute/unmute voice i, where voice 0 is first voice
- void mute_voice( int index, bool mute = true );
-
- // Set muting state of all voices at once using a bit mask, where -1 mutes them all,
- // 0 unmutes them all, 0x01 mutes just the first voice, etc.
- void mute_voices( int mask );
-
- // Change overall output amplitude, where 1.0 results in minimal clamping.
- // Must be called before set_sample_rate().
- void set_gain( double );
-
- // Request use of custom multichannel buffer. Only supported by "classic" emulators;
- // on others this has no effect. Should be called only once *before* set_sample_rate().
- virtual void set_buffer( Multi_Buffer* ) { }
-
-// Sound equalization (treble/bass)
-
- // Frequency equalizer parameters (see gme.txt)
- // See gme.h for definition of struct gme_equalizer_t.
- typedef gme_equalizer_t equalizer_t;
-
- // Current frequency equalizater parameters
- equalizer_t const& equalizer() const;
-
- // Set frequency equalizer parameters
- void set_equalizer( equalizer_t const& );
-
- // Equalizer settings for TV speaker
- static equalizer_t const tv_eq;
-
-public:
- Music_Emu();
- ~Music_Emu();
-protected:
- void set_max_initial_silence( int n ) { max_initial_silence = n; }
- void set_silence_lookahead( int n ) { silence_lookahead = n; }
- void set_voice_count( int n ) { voice_count_ = n; }
- void set_voice_names( const char* const* names );
- void set_track_ended() { emu_track_ended_ = true; }
- double gain() const { return gain_; }
- double tempo() const { return tempo_; }
- void remute_voices();
-
- virtual blargg_err_t set_sample_rate_( long sample_rate ) = 0;
- virtual void set_equalizer_( equalizer_t const& ) { };
- virtual void mute_voices_( int mask ) = 0;
- virtual void set_tempo_( double ) = 0;
- virtual blargg_err_t start_track_( int ) = 0; // tempo is set before this
- virtual blargg_err_t play_( long count, sample_t* out ) = 0;
- virtual blargg_err_t skip_( long count );
-protected:
- virtual void unload();
- virtual void pre_load();
- virtual void post_load_();
-private:
- // general
- equalizer_t equalizer_;
- int max_initial_silence;
- const char** voice_names_;
- int voice_count_;
- int mute_mask_;
- double tempo_;
- double gain_;
-
- long sample_rate_;
- blargg_long msec_to_samples( blargg_long msec ) const;
-
- // track-specific
- int current_track_;
- blargg_long out_time; // number of samples played since start of track
- blargg_long emu_time; // number of samples emulator has generated since start of track
- bool emu_track_ended_; // emulator has reached end of track
- volatile bool track_ended_;
- void clear_track_vars();
- void end_track_if_error( blargg_err_t );
-
- // fading
- blargg_long fade_start;
- int fade_step;
- void handle_fade( long count, sample_t* out );
-
- // silence detection
- int silence_lookahead; // speed to run emulator when looking ahead for silence
- bool ignore_silence_;
- long silence_time; // number of samples where most recent silence began
- long silence_count; // number of samples of silence to play before using buf
- long buf_remain; // number of samples left in silence buffer
- enum { buf_size = 2048 };
- blargg_vector<sample_t> buf;
- void fill_buf();
- void emu_play( long count, sample_t* out );
-
- Multi_Buffer* effects_buffer;
- friend Music_Emu* gme_new_emu( gme_type_t, long );
- friend void gme_set_stereo_depth( Music_Emu*, double );
-};
-
-// base class for info-only derivations
-struct Gme_Info_ : Music_Emu
-{
- virtual blargg_err_t set_sample_rate_( long sample_rate );
- virtual void set_equalizer_( equalizer_t const& );
- virtual void mute_voices_( int mask );
- virtual void set_tempo_( double );
- virtual blargg_err_t start_track_( int );
- virtual blargg_err_t play_( long count, sample_t* out );
- virtual void pre_load();
- virtual void post_load_();
-};
-
-inline blargg_err_t Music_Emu::track_info( track_info_t* out ) const
-{
- return track_info( out, current_track_ );
-}
-
-inline long Music_Emu::sample_rate() const { return sample_rate_; }
-inline const char** Music_Emu::voice_names() const { return voice_names_; }
-inline int Music_Emu::voice_count() const { return voice_count_; }
-inline int Music_Emu::current_track() const { return current_track_; }
-inline bool Music_Emu::track_ended() const { return track_ended_; }
-inline const Music_Emu::equalizer_t& Music_Emu::equalizer() const { return equalizer_; }
-
-inline void Music_Emu::set_tempo_( double t ) { tempo_ = t; }
-inline void Music_Emu::remute_voices() { mute_voices( mute_mask_ ); }
-inline void Music_Emu::ignore_silence( bool b ) { ignore_silence_ = b; }
-inline blargg_err_t Music_Emu::start_track_( int ) { return 0; }
-
-inline void Music_Emu::set_voice_names( const char* const* names )
-{
- // Intentional removal of const, so users don't have to remember obscure const in middle
- voice_names_ = (const char**) names;
-}
-
-inline void Music_Emu::mute_voices_( int ) { }
-
-inline void Music_Emu::set_gain( double g )
-{
- assert( !sample_rate() ); // you must set gain before setting sample rate
- gain_ = g;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.h
deleted file mode 100644
index dbd8484c..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.h
+++ /dev/null
@@ -1,179 +0,0 @@
-// NES 2A03 APU sound chip emulator
-
-// Nes_Snd_Emu 0.1.8
-#ifndef NES_APU_H
-#define NES_APU_H
-
-#include "blargg_common.h"
-
-typedef blargg_long nes_time_t; // CPU clock cycle count
-typedef unsigned nes_addr_t; // 16-bit memory address
-
-#include "Nes_Oscs.h"
-
-struct apu_state_t;
-class Nes_Buffer;
-
-class Nes_Apu {
-public:
- // Set buffer to generate all sound into, or disable sound if NULL
- void output( Blip_Buffer* );
-
- // Set memory reader callback used by DMC oscillator to fetch samples.
- // When callback is invoked, 'user_data' is passed unchanged as the
- // first parameter.
- void dmc_reader( int (*callback)( void* user_data, nes_addr_t ), void* user_data = NULL );
-
- // All time values are the number of CPU clock cycles relative to the
- // beginning of the current time frame. Before resetting the CPU clock
- // count, call end_frame( last_cpu_time ).
-
- // Write to register (0x4000-0x4017, except 0x4014 and 0x4016)
- enum { start_addr = 0x4000 };
- enum { end_addr = 0x4017 };
- void write_register( nes_time_t, nes_addr_t, int data );
-
- // Read from status register at 0x4015
- enum { status_addr = 0x4015 };
- int read_status( nes_time_t );
-
- // Run all oscillators up to specified time, end current time frame, then
- // start a new time frame at time 0. Time frames have no effect on emulation
- // and each can be whatever length is convenient.
- void end_frame( nes_time_t );
-
-// Additional optional features (can be ignored without any problem)
-
- // Reset internal frame counter, registers, and all oscillators.
- // Use PAL timing if pal_timing is true, otherwise use NTSC timing.
- // Set the DMC oscillator's initial DAC value to initial_dmc_dac without
- // any audible click.
- void reset( bool pal_mode = false, int initial_dmc_dac = 0 );
-
- // Adjust frame period
- void set_tempo( double );
-
- // Save/load exact emulation state
- void save_state( apu_state_t* out ) const;
- void load_state( apu_state_t const& );
-
- // Set overall volume (default is 1.0)
- void volume( double );
-
- // Set treble equalization (see notes.txt)
- void treble_eq( const blip_eq_t& );
-
- // Set sound output of specific oscillator to buffer. If buffer is NULL,
- // the specified oscillator is muted and emulation accuracy is reduced.
- // The oscillators are indexed as follows: 0) Square 1, 1) Square 2,
- // 2) Triangle, 3) Noise, 4) DMC.
- enum { osc_count = 5 };
- void osc_output( int index, Blip_Buffer* buffer );
-
- // Set IRQ time callback that is invoked when the time of earliest IRQ
- // may have changed, or NULL to disable. When callback is invoked,
- // 'user_data' is passed unchanged as the first parameter.
- void irq_notifier( void (*callback)( void* user_data ), void* user_data = NULL );
-
- // Get time that APU-generated IRQ will occur if no further register reads
- // or writes occur. If IRQ is already pending, returns irq_waiting. If no
- // IRQ will occur, returns no_irq.
- enum { no_irq = LONG_MAX / 2 + 1 };
- enum { irq_waiting = 0 };
- nes_time_t earliest_irq( nes_time_t ) const;
-
- // Count number of DMC reads that would occur if 'run_until( t )' were executed.
- // If last_read is not NULL, set *last_read to the earliest time that
- // 'count_dmc_reads( time )' would result in the same result.
- int count_dmc_reads( nes_time_t t, nes_time_t* last_read = NULL ) const;
-
- // Time when next DMC memory read will occur
- nes_time_t next_dmc_read_time() const;
-
- // Run DMC until specified time, so that any DMC memory reads can be
- // accounted for (i.e. inserting CPU wait states).
- void run_until( nes_time_t );
-
-public:
- Nes_Apu();
- BLARGG_DISABLE_NOTHROW
-private:
- friend class Nes_Nonlinearizer;
- void enable_nonlinear( double volume );
- static double nonlinear_tnd_gain() { return 0.75; }
-private:
- friend struct Nes_Dmc;
-
- // noncopyable
- Nes_Apu( const Nes_Apu& );
- Nes_Apu& operator = ( const Nes_Apu& );
-
- Nes_Osc* oscs [osc_count];
- Nes_Square square1;
- Nes_Square square2;
- Nes_Noise noise;
- Nes_Triangle triangle;
- Nes_Dmc dmc;
-
- double tempo_;
- nes_time_t last_time; // has been run until this time in current frame
- nes_time_t last_dmc_time;
- nes_time_t earliest_irq_;
- nes_time_t next_irq;
- int frame_period;
- int frame_delay; // cycles until frame counter runs next
- int frame; // current frame (0-3)
- int osc_enables;
- int frame_mode;
- bool irq_flag;
- void (*irq_notifier_)( void* user_data );
- void* irq_data;
- Nes_Square::Synth square_synth; // shared by squares
-
- void irq_changed();
- void state_restored();
- void run_until_( nes_time_t );
-
- // TODO: remove
- friend class Nes_Core;
-};
-
-inline void Nes_Apu::osc_output( int osc, Blip_Buffer* buf )
-{
- assert( (unsigned) osc < osc_count );
- oscs [osc]->output = buf;
-}
-
-inline nes_time_t Nes_Apu::earliest_irq( nes_time_t ) const
-{
- return earliest_irq_;
-}
-
-inline void Nes_Apu::dmc_reader( int (*func)( void*, nes_addr_t ), void* user_data )
-{
- dmc.prg_reader_data = user_data;
- dmc.prg_reader = func;
-}
-
-inline void Nes_Apu::irq_notifier( void (*func)( void* user_data ), void* user_data )
-{
- irq_notifier_ = func;
- irq_data = user_data;
-}
-
-inline int Nes_Apu::count_dmc_reads( nes_time_t time, nes_time_t* last_read ) const
-{
- return dmc.count_reads( time, last_read );
-}
-
-inline nes_time_t Nes_Dmc::next_read_time() const
-{
- if ( length_counter == 0 )
- return Nes_Apu::no_irq; // not reading
-
- return apu->last_dmc_time + delay + long (bits_remain - 1) * period;
-}
-
-inline nes_time_t Nes_Apu::next_dmc_read_time() const { return dmc.next_read_time(); }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.cpp
deleted file mode 100644
index 480b4aa4..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.cpp
+++ /dev/null
@@ -1,1084 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Nes_Cpu.h"
-
-#include "blargg_endian.h"
-#include <limits.h>
-
-#define BLARGG_CPU_X86 1
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-#define FLUSH_TIME() (void) (s.time = s_time)
-#define CACHE_TIME() (void) (s_time = s.time)
-
-#include "nes_cpu_io.h"
-
-#include "blargg_source.h"
-
-#ifndef CPU_DONE
- #define CPU_DONE( cpu, time, result_out ) { result_out = -1; }
-#endif
-
-#ifndef CPU_READ_PPU
- #define CPU_READ_PPU( cpu, addr, out, time )\
- {\
- FLUSH_TIME();\
- out = CPU_READ( cpu, addr, time );\
- CACHE_TIME();\
- }
-#endif
-
-#if BLARGG_NONPORTABLE
- #define PAGE_OFFSET( addr ) (addr)
-#else
- #define PAGE_OFFSET( addr ) ((addr) & (page_size - 1))
-#endif
-
-inline void Nes_Cpu::set_code_page( int i, void const* p )
-{
- state->code_map [i] = (uint8_t const*) p - PAGE_OFFSET( i * page_size );
-}
-
-int const st_n = 0x80;
-int const st_v = 0x40;
-int const st_r = 0x20;
-int const st_b = 0x10;
-int const st_d = 0x08;
-int const st_i = 0x04;
-int const st_z = 0x02;
-int const st_c = 0x01;
-
-void Nes_Cpu::reset( void const* unmapped_page )
-{
- check( state == &state_ );
- state = &state_;
- r.status = st_i;
- r.sp = 0xFF;
- r.pc = 0;
- r.a = 0;
- r.x = 0;
- r.y = 0;
- state_.time = 0;
- state_.base = 0;
- irq_time_ = future_nes_time;
- end_time_ = future_nes_time;
- error_count_ = 0;
-
- assert( page_size == 0x800 ); // assumes this
- set_code_page( page_count, unmapped_page );
- map_code( 0x2000, 0xE000, unmapped_page, true );
- map_code( 0x0000, 0x2000, low_mem, true );
-
- blargg_verify_byte_order();
-}
-
-void Nes_Cpu::map_code( nes_addr_t start, unsigned size, void const* data, bool mirror )
-{
- // address range must begin and end on page boundaries
- require( start % page_size == 0 );
- require( size % page_size == 0 );
- require( start + size <= 0x10000 );
-
- unsigned page = start / page_size;
- for ( unsigned n = size / page_size; n; --n )
- {
- set_code_page( page++, data );
- if ( !mirror )
- data = (char const*) data + page_size;
- }
-}
-
-#define TIME (s_time + s.base)
-#define READ_LIKELY_PPU( addr, out ) {CPU_READ_PPU( this, (addr), out, TIME );}
-#define READ( addr ) CPU_READ( this, (addr), TIME )
-#define WRITE( addr, data ) {CPU_WRITE( this, (addr), (data), TIME );}
-#define READ_LOW( addr ) (low_mem [int (addr)])
-#define WRITE_LOW( addr, data ) (void) (READ_LOW( addr ) = (data))
-#define READ_PROG( addr ) (s.code_map [(addr) >> page_bits] [PAGE_OFFSET( addr )])
-
-#define SET_SP( v ) (sp = ((v) + 1) | 0x100)
-#define GET_SP() ((sp - 1) & 0xFF)
-#define PUSH( v ) ((sp = (sp - 1) | 0x100), WRITE_LOW( sp, v ))
-
-// even on x86, using short and unsigned char was slower
-typedef int fint16;
-typedef unsigned fuint16;
-typedef unsigned fuint8;
-
-bool Nes_Cpu::run( nes_time_t end_time )
-{
- set_end_time( end_time );
- state_t s = this->state_;
- this->state = &s;
- // even on x86, using s.time in place of s_time was slower
- fint16 s_time = s.time;
-
- // registers
- fuint16 pc = r.pc;
- fuint8 a = r.a;
- fuint8 x = r.x;
- fuint8 y = r.y;
- fuint16 sp;
- SET_SP( r.sp );
-
- // status flags
- #define IS_NEG (nz & 0x8080)
-
- #define CALC_STATUS( out ) do {\
- out = status & (st_v | st_d | st_i);\
- out |= ((nz >> 8) | nz) & st_n;\
- out |= c >> 8 & st_c;\
- if ( !(nz & 0xFF) ) out |= st_z;\
- } while ( 0 )
-
- #define SET_STATUS( in ) do {\
- status = in & (st_v | st_d | st_i);\
- nz = in << 8;\
- c = nz;\
- nz |= ~in & st_z;\
- } while ( 0 )
-
- fuint8 status;
- fuint16 c; // carry set if (c & 0x100) != 0
- fuint16 nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x8080) != 0
- {
- fuint8 temp = r.status;
- SET_STATUS( temp );
- }
-
- goto loop;
-dec_clock_loop:
- s_time--;
-loop:
-
- check( (unsigned) GET_SP() < 0x100 );
- check( (unsigned) pc < 0x10000 );
- check( (unsigned) a < 0x100 );
- check( (unsigned) x < 0x100 );
- check( (unsigned) y < 0x100 );
- check( -32768 <= s_time && s_time < 32767 );
-
- uint8_t const* instr = s.code_map [pc >> page_bits];
- fuint8 opcode;
-
- // TODO: eliminate this special case
- #if BLARGG_NONPORTABLE
- opcode = instr [pc];
- pc++;
- instr += pc;
- #else
- instr += PAGE_OFFSET( pc );
- opcode = *instr++;
- pc++;
- #endif
-
- static uint8_t const clock_table [256] =
- {// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6,// 0
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 1
- 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6,// 2
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 3
- 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6,// 4
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 5
- 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6,// 6
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 7
- 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// 8
- 3,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5,// 9
- 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// A
- 3,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4,// B
- 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// C
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// D
- 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// E
- 3,5,0,8,4,4,6,6,2,4,2,7,4,4,7,7 // F
- }; // 0x00 was 7 and 0xF2 was 2
-
- fuint16 data;
-
-#if !BLARGG_CPU_X86
- if ( s_time >= 0 )
- goto out_of_time;
- s_time += clock_table [opcode];
-
- data = *instr;
-
- switch ( opcode )
- {
-#else
-
- data = clock_table [opcode];
- if ( (s_time += data) >= 0 )
- goto possibly_out_of_time;
-almost_out_of_time:
-
- data = *instr;
-
- switch ( opcode )
- {
-possibly_out_of_time:
- if ( s_time < (int) data )
- goto almost_out_of_time;
- s_time -= data;
- goto out_of_time;
-#endif
-
-// Macros
-
-#define GET_MSB() (instr [1])
-#define ADD_PAGE() (pc++, data += 0x100 * GET_MSB())
-#define GET_ADDR() GET_LE16( instr )
-
-#define NO_PAGE_CROSSING( lsb )
-#define HANDLE_PAGE_CROSSING( lsb ) s_time += (lsb) >> 8;
-
-#define INC_DEC_XY( reg, n ) reg = uint8_t (nz = reg + n); goto loop;
-
-#define IND_Y( cross, out ) {\
- fuint16 temp = READ_LOW( data ) + y;\
- out = temp + 0x100 * READ_LOW( uint8_t (data + 1) );\
- cross( temp );\
- }
-
-#define IND_X( out ) {\
- fuint16 temp = data + x;\
- out = 0x100 * READ_LOW( uint8_t (temp + 1) ) + READ_LOW( uint8_t (temp) );\
- }
-
-#define ARITH_ADDR_MODES( op )\
-case op - 0x04: /* (ind,x) */\
- IND_X( data )\
- goto ptr##op;\
-case op + 0x0C: /* (ind),y */\
- IND_Y( HANDLE_PAGE_CROSSING, data )\
- goto ptr##op;\
-case op + 0x10: /* zp,X */\
- data = uint8_t (data + x);\
-case op + 0x00: /* zp */\
- data = READ_LOW( data );\
- goto imm##op;\
-case op + 0x14: /* abs,Y */\
- data += y;\
- goto ind##op;\
-case op + 0x18: /* abs,X */\
- data += x;\
-ind##op:\
- HANDLE_PAGE_CROSSING( data );\
-case op + 0x08: /* abs */\
- ADD_PAGE();\
-ptr##op:\
- FLUSH_TIME();\
- data = READ( data );\
- CACHE_TIME();\
-case op + 0x04: /* imm */\
-imm##op:
-
-// TODO: more efficient way to handle negative branch that wraps PC around
-#define BRANCH( cond )\
-{\
- fint16 offset = (BOOST::int8_t) data;\
- fuint16 extra_clock = (++pc & 0xFF) + offset;\
- if ( !(cond) ) goto dec_clock_loop;\
- pc = BOOST::uint16_t (pc + offset);\
- s_time += extra_clock >> 8 & 1;\
- goto loop;\
-}
-
-// Often-Used
-
- case 0xB5: // LDA zp,x
- a = nz = READ_LOW( uint8_t (data + x) );
- pc++;
- goto loop;
-
- case 0xA5: // LDA zp
- a = nz = READ_LOW( data );
- pc++;
- goto loop;
-
- case 0xD0: // BNE
- BRANCH( (uint8_t) nz );
-
- case 0x20: { // JSR
- fuint16 temp = pc + 1;
- pc = GET_ADDR();
- WRITE_LOW( 0x100 | (sp - 1), temp >> 8 );
- sp = (sp - 2) | 0x100;
- WRITE_LOW( sp, temp );
- goto loop;
- }
-
- case 0x4C: // JMP abs
- pc = GET_ADDR();
- goto loop;
-
- case 0xE8: // INX
- INC_DEC_XY( x, 1 )
-
- case 0x10: // BPL
- BRANCH( !IS_NEG )
-
- ARITH_ADDR_MODES( 0xC5 ) // CMP
- nz = a - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0x30: // BMI
- BRANCH( IS_NEG )
-
- case 0xF0: // BEQ
- BRANCH( !(uint8_t) nz );
-
- case 0x95: // STA zp,x
- data = uint8_t (data + x);
- case 0x85: // STA zp
- pc++;
- WRITE_LOW( data, a );
- goto loop;
-
- case 0xC8: // INY
- INC_DEC_XY( y, 1 )
-
- case 0xA8: // TAY
- y = a;
- nz = a;
- goto loop;
-
- case 0x98: // TYA
- a = y;
- nz = y;
- goto loop;
-
- case 0xAD:{// LDA abs
- unsigned addr = GET_ADDR();
- pc += 2;
- READ_LIKELY_PPU( addr, nz );
- a = nz;
- goto loop;
- }
-
- case 0x60: // RTS
- pc = 1 + READ_LOW( sp );
- pc += 0x100 * READ_LOW( 0x100 | (sp - 0xFF) );
- sp = (sp - 0xFE) | 0x100;
- goto loop;
-
- {
- fuint16 addr;
-
- case 0x99: // STA abs,Y
- addr = y + GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- goto sta_ptr;
-
- case 0x8D: // STA abs
- addr = GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- goto sta_ptr;
-
- case 0x9D: // STA abs,X (slightly more common than STA abs)
- addr = x + GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- sta_ptr:
- FLUSH_TIME();
- WRITE( addr, a );
- CACHE_TIME();
- goto loop;
-
- case 0x91: // STA (ind),Y
- IND_Y( NO_PAGE_CROSSING, addr )
- pc++;
- goto sta_ptr;
-
- case 0x81: // STA (ind,X)
- IND_X( addr )
- pc++;
- goto sta_ptr;
-
- }
-
- case 0xA9: // LDA #imm
- pc++;
- a = data;
- nz = data;
- goto loop;
-
- // common read instructions
- {
- fuint16 addr;
-
- case 0xA1: // LDA (ind,X)
- IND_X( addr )
- pc++;
- goto a_nz_read_addr;
-
- case 0xB1:// LDA (ind),Y
- addr = READ_LOW( data ) + y;
- HANDLE_PAGE_CROSSING( addr );
- addr += 0x100 * READ_LOW( (uint8_t) (data + 1) );
- pc++;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- goto a_nz_read_addr;
-
- case 0xB9: // LDA abs,Y
- HANDLE_PAGE_CROSSING( data + y );
- addr = GET_ADDR() + y;
- pc += 2;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- goto a_nz_read_addr;
-
- case 0xBD: // LDA abs,X
- HANDLE_PAGE_CROSSING( data + x );
- addr = GET_ADDR() + x;
- pc += 2;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- a_nz_read_addr:
- FLUSH_TIME();
- a = nz = READ( addr );
- CACHE_TIME();
- goto loop;
-
- }
-
-// Branch
-
- case 0x50: // BVC
- BRANCH( !(status & st_v) )
-
- case 0x70: // BVS
- BRANCH( status & st_v )
-
- case 0xB0: // BCS
- BRANCH( c & 0x100 )
-
- case 0x90: // BCC
- BRANCH( !(c & 0x100) )
-
-// Load/store
-
- case 0x94: // STY zp,x
- data = uint8_t (data + x);
- case 0x84: // STY zp
- pc++;
- WRITE_LOW( data, y );
- goto loop;
-
- case 0x96: // STX zp,y
- data = uint8_t (data + y);
- case 0x86: // STX zp
- pc++;
- WRITE_LOW( data, x );
- goto loop;
-
- case 0xB6: // LDX zp,y
- data = uint8_t (data + y);
- case 0xA6: // LDX zp
- data = READ_LOW( data );
- case 0xA2: // LDX #imm
- pc++;
- x = data;
- nz = data;
- goto loop;
-
- case 0xB4: // LDY zp,x
- data = uint8_t (data + x);
- case 0xA4: // LDY zp
- data = READ_LOW( data );
- case 0xA0: // LDY #imm
- pc++;
- y = data;
- nz = data;
- goto loop;
-
- case 0xBC: // LDY abs,X
- data += x;
- HANDLE_PAGE_CROSSING( data );
- case 0xAC:{// LDY abs
- unsigned addr = data + 0x100 * GET_MSB();
- pc += 2;
- FLUSH_TIME();
- y = nz = READ( addr );
- CACHE_TIME();
- goto loop;
- }
-
- case 0xBE: // LDX abs,y
- data += y;
- HANDLE_PAGE_CROSSING( data );
- case 0xAE:{// LDX abs
- unsigned addr = data + 0x100 * GET_MSB();
- pc += 2;
- FLUSH_TIME();
- x = nz = READ( addr );
- CACHE_TIME();
- goto loop;
- }
-
- {
- fuint8 temp;
- case 0x8C: // STY abs
- temp = y;
- goto store_abs;
-
- case 0x8E: // STX abs
- temp = x;
- store_abs:
- unsigned addr = GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, temp );
- goto loop;
- }
- FLUSH_TIME();
- WRITE( addr, temp );
- CACHE_TIME();
- goto loop;
- }
-
-// Compare
-
- case 0xEC:{// CPX abs
- unsigned addr = GET_ADDR();
- pc++;
- FLUSH_TIME();
- data = READ( addr );
- CACHE_TIME();
- goto cpx_data;
- }
-
- case 0xE4: // CPX zp
- data = READ_LOW( data );
- case 0xE0: // CPX #imm
- cpx_data:
- nz = x - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0xCC:{// CPY abs
- unsigned addr = GET_ADDR();
- pc++;
- FLUSH_TIME();
- data = READ( addr );
- CACHE_TIME();
- goto cpy_data;
- }
-
- case 0xC4: // CPY zp
- data = READ_LOW( data );
- case 0xC0: // CPY #imm
- cpy_data:
- nz = y - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
-// Logical
-
- ARITH_ADDR_MODES( 0x25 ) // AND
- nz = (a &= data);
- pc++;
- goto loop;
-
- ARITH_ADDR_MODES( 0x45 ) // EOR
- nz = (a ^= data);
- pc++;
- goto loop;
-
- ARITH_ADDR_MODES( 0x05 ) // ORA
- nz = (a |= data);
- pc++;
- goto loop;
-
- case 0x2C:{// BIT abs
- unsigned addr = GET_ADDR();
- pc += 2;
- status &= ~st_v;
- READ_LIKELY_PPU( addr, nz );
- status |= nz & st_v;
- if ( a & nz )
- goto loop;
- nz <<= 8; // result must be zero, even if N bit is set
- goto loop;
- }
-
- case 0x24: // BIT zp
- nz = READ_LOW( data );
- pc++;
- status &= ~st_v;
- status |= nz & st_v;
- if ( a & nz )
- goto loop;
- nz <<= 8; // result must be zero, even if N bit is set
- goto loop;
-
-// Add/subtract
-
- ARITH_ADDR_MODES( 0xE5 ) // SBC
- case 0xEB: // unofficial equivalent
- data ^= 0xFF;
- goto adc_imm;
-
- ARITH_ADDR_MODES( 0x65 ) // ADC
- adc_imm: {
- fint16 carry = c >> 8 & 1;
- fint16 ov = (a ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
- status &= ~st_v;
- status |= ov >> 2 & 0x40;
- c = nz = a + data + carry;
- pc++;
- a = (uint8_t) nz;
- goto loop;
- }
-
-// Shift/rotate
-
- case 0x4A: // LSR A
- c = 0;
- case 0x6A: // ROR A
- nz = c >> 1 & 0x80;
- c = a << 8;
- nz |= a >> 1;
- a = nz;
- goto loop;
-
- case 0x0A: // ASL A
- nz = a << 1;
- c = nz;
- a = (uint8_t) nz;
- goto loop;
-
- case 0x2A: { // ROL A
- nz = a << 1;
- fint16 temp = c >> 8 & 1;
- c = nz;
- nz |= temp;
- a = (uint8_t) nz;
- goto loop;
- }
-
- case 0x5E: // LSR abs,X
- data += x;
- case 0x4E: // LSR abs
- c = 0;
- case 0x6E: // ROR abs
- ror_abs: {
- ADD_PAGE();
- FLUSH_TIME();
- int temp = READ( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
- c = temp << 8;
- goto rotate_common;
- }
-
- case 0x3E: // ROL abs,X
- data += x;
- goto rol_abs;
-
- case 0x1E: // ASL abs,X
- data += x;
- case 0x0E: // ASL abs
- c = 0;
- case 0x2E: // ROL abs
- rol_abs:
- ADD_PAGE();
- nz = c >> 8 & 1;
- FLUSH_TIME();
- nz |= (c = READ( data ) << 1);
- rotate_common:
- pc++;
- WRITE( data, (uint8_t) nz );
- CACHE_TIME();
- goto loop;
-
- case 0x7E: // ROR abs,X
- data += x;
- goto ror_abs;
-
- case 0x76: // ROR zp,x
- data = uint8_t (data + x);
- goto ror_zp;
-
- case 0x56: // LSR zp,x
- data = uint8_t (data + x);
- case 0x46: // LSR zp
- c = 0;
- case 0x66: // ROR zp
- ror_zp: {
- int temp = READ_LOW( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
- c = temp << 8;
- goto write_nz_zp;
- }
-
- case 0x36: // ROL zp,x
- data = uint8_t (data + x);
- goto rol_zp;
-
- case 0x16: // ASL zp,x
- data = uint8_t (data + x);
- case 0x06: // ASL zp
- c = 0;
- case 0x26: // ROL zp
- rol_zp:
- nz = c >> 8 & 1;
- nz |= (c = READ_LOW( data ) << 1);
- goto write_nz_zp;
-
-// Increment/decrement
-
- case 0xCA: // DEX
- INC_DEC_XY( x, -1 )
-
- case 0x88: // DEY
- INC_DEC_XY( y, -1 )
-
- case 0xF6: // INC zp,x
- data = uint8_t (data + x);
- case 0xE6: // INC zp
- nz = 1;
- goto add_nz_zp;
-
- case 0xD6: // DEC zp,x
- data = uint8_t (data + x);
- case 0xC6: // DEC zp
- nz = (unsigned) -1;
- add_nz_zp:
- nz += READ_LOW( data );
- write_nz_zp:
- pc++;
- WRITE_LOW( data, nz );
- goto loop;
-
- case 0xFE: // INC abs,x
- data = x + GET_ADDR();
- goto inc_ptr;
-
- case 0xEE: // INC abs
- data = GET_ADDR();
- inc_ptr:
- nz = 1;
- goto inc_common;
-
- case 0xDE: // DEC abs,x
- data = x + GET_ADDR();
- goto dec_ptr;
-
- case 0xCE: // DEC abs
- data = GET_ADDR();
- dec_ptr:
- nz = (unsigned) -1;
- inc_common:
- FLUSH_TIME();
- nz += READ( data );
- pc += 2;
- WRITE( data, (uint8_t) nz );
- CACHE_TIME();
- goto loop;
-
-// Transfer
-
- case 0xAA: // TAX
- x = a;
- nz = a;
- goto loop;
-
- case 0x8A: // TXA
- a = x;
- nz = x;
- goto loop;
-
- case 0x9A: // TXS
- SET_SP( x ); // verified (no flag change)
- goto loop;
-
- case 0xBA: // TSX
- x = nz = GET_SP();
- goto loop;
-
-// Stack
-
- case 0x48: // PHA
- PUSH( a ); // verified
- goto loop;
-
- case 0x68: // PLA
- a = nz = READ_LOW( sp );
- sp = (sp - 0xFF) | 0x100;
- goto loop;
-
- case 0x40:{// RTI
- fuint8 temp = READ_LOW( sp );
- pc = READ_LOW( 0x100 | (sp - 0xFF) );
- pc |= READ_LOW( 0x100 | (sp - 0xFE) ) * 0x100;
- sp = (sp - 0xFD) | 0x100;
- data = status;
- SET_STATUS( temp );
- if ( !((data ^ status) & st_i) ) goto loop; // I flag didn't change
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - irq_time_;
- if ( delta <= 0 ) goto loop;
- if ( status & st_i ) goto loop;
- s_time += delta;
- s.base = irq_time_;
- goto loop;
- }
-
- case 0x28:{// PLP
- fuint8 temp = READ_LOW( sp );
- sp = (sp - 0xFF) | 0x100;
- fuint8 changed = status ^ temp;
- SET_STATUS( temp );
- if ( !(changed & st_i) )
- goto loop; // I flag didn't change
- if ( status & st_i )
- goto handle_sei;
- goto handle_cli;
- }
-
- case 0x08: { // PHP
- fuint8 temp;
- CALC_STATUS( temp );
- PUSH( temp | (st_b | st_r) );
- goto loop;
- }
-
- case 0x6C:{// JMP (ind)
- data = GET_ADDR();
- check( unsigned (data - 0x2000) >= 0x4000 ); // ensure it's outside I/O space
- uint8_t const* page = s.code_map [data >> page_bits];
- pc = page [PAGE_OFFSET( data )];
- data = (data & 0xFF00) | ((data + 1) & 0xFF);
- pc |= page [PAGE_OFFSET( data )] << 8;
- goto loop;
- }
-
- case 0x00: // BRK
- goto handle_brk;
-
-// Flags
-
- case 0x38: // SEC
- c = (unsigned) ~0;
- goto loop;
-
- case 0x18: // CLC
- c = 0;
- goto loop;
-
- case 0xB8: // CLV
- status &= ~st_v;
- goto loop;
-
- case 0xD8: // CLD
- status &= ~st_d;
- goto loop;
-
- case 0xF8: // SED
- status |= st_d;
- goto loop;
-
- case 0x58: // CLI
- if ( !(status & st_i) )
- goto loop;
- status &= ~st_i;
- handle_cli: {
- //dprintf( "CLI at %d\n", TIME );
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - irq_time_;
- if ( delta <= 0 )
- {
- if ( TIME < irq_time_ )
- goto loop;
- goto delayed_cli;
- }
- s.base = irq_time_;
- s_time += delta;
- if ( s_time < 0 )
- goto loop;
-
- if ( delta >= s_time + 1 )
- {
- s.base += s_time + 1;
- s_time = -1;
- goto loop;
- }
-
- // TODO: implement
- delayed_cli:
- dprintf( "Delayed CLI not emulated\n" );
- goto loop;
- }
-
- case 0x78: // SEI
- if ( status & st_i )
- goto loop;
- status |= st_i;
- handle_sei: {
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - end_time_;
- s.base = end_time_;
- s_time += delta;
- if ( s_time < 0 )
- goto loop;
-
- dprintf( "Delayed SEI not emulated\n" );
- goto loop;
- }
-
-// Unofficial
-
- // SKW - Skip word
- case 0x1C: case 0x3C: case 0x5C: case 0x7C: case 0xDC: case 0xFC:
- HANDLE_PAGE_CROSSING( data + x );
- case 0x0C:
- pc++;
- // SKB - Skip byte
- case 0x74: case 0x04: case 0x14: case 0x34: case 0x44: case 0x54: case 0x64:
- case 0x80: case 0x82: case 0x89: case 0xC2: case 0xD4: case 0xE2: case 0xF4:
- pc++;
- goto loop;
-
- // NOP
- case 0xEA: case 0x1A: case 0x3A: case 0x5A: case 0x7A: case 0xDA: case 0xFA:
- goto loop;
-
- case bad_opcode: // HLT
- pc--;
- if ( pc > 0xFFFF )
- {
- // handle wrap-around (assumes caller has put page of HLT at 0x10000)
- pc &= 0xFFFF;
- goto loop;
- }
- case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52:
- case 0x62: case 0x72: case 0x92: case 0xB2: case 0xD2:
- goto stop;
-
-// Unimplemented
-
- case 0xFF: // force 256-entry jump table for optimization purposes
- c |= 1;
- default:
- check( (unsigned) opcode <= 0xFF );
- // skip over proper number of bytes
- static unsigned char const illop_lens [8] = {
- 0x40, 0x40, 0x40, 0x80, 0x40, 0x40, 0x80, 0xA0
- };
- fuint8 opcode = instr [-1];
- fint16 len = illop_lens [opcode >> 2 & 7] >> (opcode << 1 & 6) & 3;
- if ( opcode == 0x9C )
- len = 2;
- pc += len;
- error_count_++;
-
- if ( (opcode >> 4) == 0x0B )
- {
- if ( opcode == 0xB3 )
- data = READ_LOW( data );
- if ( opcode != 0xB7 )
- HANDLE_PAGE_CROSSING( data + y );
- }
- goto loop;
- }
- assert( false );
-
- int result_;
-handle_brk:
- pc++;
- result_ = 4;
-
-interrupt:
- {
- s_time += 7;
-
- WRITE_LOW( 0x100 | (sp - 1), pc >> 8 );
- WRITE_LOW( 0x100 | (sp - 2), pc );
- pc = GET_LE16( &READ_PROG( 0xFFFA ) + result_ );
-
- sp = (sp - 3) | 0x100;
- fuint8 temp;
- CALC_STATUS( temp );
- temp |= st_r;
- if ( result_ )
- temp |= st_b; // TODO: incorrectly sets B flag for IRQ
- WRITE_LOW( sp, temp );
-
- this->r.status = status |= st_i;
- blargg_long delta = s.base - end_time_;
- if ( delta >= 0 ) goto loop;
- s_time += delta;
- s.base = end_time_;
- goto loop;
- }
-
-out_of_time:
- pc--;
- FLUSH_TIME();
- CPU_DONE( this, TIME, result_ );
- CACHE_TIME();
- if ( result_ >= 0 )
- goto interrupt;
- if ( s_time < 0 )
- goto loop;
-
-stop:
-
- s.time = s_time;
-
- r.pc = pc;
- r.sp = GET_SP();
- r.a = a;
- r.x = x;
- r.y = y;
-
- {
- fuint8 temp;
- CALC_STATUS( temp );
- r.status = temp;
- }
-
- this->state_ = s;
- this->state = &this->state_;
-
- return s_time < 0;
-}
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.h
deleted file mode 100644
index d303b57c..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Cpu.h
+++ /dev/null
@@ -1,114 +0,0 @@
-// NES 6502 CPU emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef NES_CPU_H
-#define NES_CPU_H
-
-#include "blargg_common.h"
-
-typedef blargg_long nes_time_t; // clock cycle count
-typedef unsigned nes_addr_t; // 16-bit address
-enum { future_nes_time = LONG_MAX / 2 + 1 };
-
-class Nes_Cpu {
-public:
- typedef BOOST::uint8_t uint8_t;
-
- // Clear registers, map low memory and its three mirrors to address 0,
- // and mirror unmapped_page in remaining memory
- void reset( void const* unmapped_page = 0 );
-
- // Map code memory (memory accessed via the program counter). Start and size
- // must be multiple of page_size. If mirror is true, repeats code page
- // throughout address range.
- enum { page_size = 0x800 };
- void map_code( nes_addr_t start, unsigned size, void const* code, bool mirror = false );
-
- // Access emulated memory as CPU does
- uint8_t const* get_code( nes_addr_t );
-
- // 2KB of RAM at address 0
- uint8_t low_mem [0x800];
-
- // NES 6502 registers. Not kept updated during a call to run().
- struct registers_t {
- BOOST::uint16_t pc;
- BOOST::uint8_t a;
- BOOST::uint8_t x;
- BOOST::uint8_t y;
- BOOST::uint8_t status;
- BOOST::uint8_t sp;
- };
- registers_t r;
-
- // Set end_time and run CPU from current time. Returns true if execution
- // stopped due to encountering bad_opcode.
- bool run( nes_time_t end_time );
-
- // Time of beginning of next instruction to be executed
- nes_time_t time() const { return state->time + state->base; }
- void set_time( nes_time_t t ) { state->time = t - state->base; }
- void adjust_time( int delta ) { state->time += delta; }
-
- nes_time_t irq_time() const { return irq_time_; }
- void set_irq_time( nes_time_t );
-
- nes_time_t end_time() const { return end_time_; }
- void set_end_time( nes_time_t );
-
- // Number of undefined instructions encountered and skipped
- void clear_error_count() { error_count_ = 0; }
- unsigned long error_count() const { return error_count_; }
-
- // CPU invokes bad opcode handler if it encounters this
- enum { bad_opcode = 0xF2 };
-
-public:
- Nes_Cpu() { state = &state_; }
- enum { page_bits = 11 };
- enum { page_count = 0x10000 >> page_bits };
- enum { irq_inhibit = 0x04 };
-private:
- struct state_t {
- uint8_t const* code_map [page_count + 1];
- nes_time_t base;
- int time;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
- nes_time_t irq_time_;
- nes_time_t end_time_;
- unsigned long error_count_;
-
- void set_code_page( int, void const* );
- inline int update_end_time( nes_time_t end, nes_time_t irq );
-};
-
-inline BOOST::uint8_t const* Nes_Cpu::get_code( nes_addr_t addr )
-{
- return state->code_map [addr >> page_bits] + addr
- #if !BLARGG_NONPORTABLE
- % (unsigned) page_size
- #endif
- ;
-}
-
-inline int Nes_Cpu::update_end_time( nes_time_t t, nes_time_t irq )
-{
- if ( irq < t && !(r.status & irq_inhibit) ) t = irq;
- int delta = state->base - t;
- state->base = t;
- return delta;
-}
-
-inline void Nes_Cpu::set_irq_time( nes_time_t t )
-{
- state->time += update_end_time( end_time_, (irq_time_ = t) );
-}
-
-inline void Nes_Cpu::set_end_time( nes_time_t t )
-{
- state->time += update_end_time( (end_time_ = t), irq_time_ );
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.cpp
deleted file mode 100644
index 678bddb2..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.cpp
+++ /dev/null
@@ -1,557 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Nsf_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-#include <stdio.h>
-
-#if !NSF_EMU_APU_ONLY
- #include "Nes_Namco_Apu.h"
- #include "Nes_Vrc6_Apu.h"
- #include "Nes_Fme7_Apu.h"
-#endif
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-int const vrc6_flag = 0x01;
-int const namco_flag = 0x10;
-int const fme7_flag = 0x20;
-
-long const clock_divisor = 12;
-
-Nsf_Emu::equalizer_t const Nsf_Emu::nes_eq = { -1.0, 80 };
-Nsf_Emu::equalizer_t const Nsf_Emu::famicom_eq = { -15.0, 80 };
-
-int Nsf_Emu::pcm_read( void* emu, nes_addr_t addr )
-{
- return *((Nsf_Emu*) emu)->cpu::get_code( addr );
-}
-
-Nsf_Emu::Nsf_Emu()
-{
- vrc6 = 0;
- namco = 0;
- fme7 = 0;
-
- set_type( gme_nsf_type );
- set_silence_lookahead( 6 );
- apu.dmc_reader( pcm_read, this );
- Music_Emu::set_equalizer( nes_eq );
- set_gain( 1.4 );
- memset( unmapped_code, Nes_Cpu::bad_opcode, sizeof unmapped_code );
-}
-
-Nsf_Emu::~Nsf_Emu() { unload(); }
-
-void Nsf_Emu::unload()
-{
- #if !NSF_EMU_APU_ONLY
- {
- delete vrc6;
- vrc6 = 0;
-
- delete namco;
- namco = 0;
-
- delete fme7;
- fme7 = 0;
- }
- #endif
-
- rom.clear();
- Music_Emu::unload();
-}
-
-// Track info
-
-static void copy_nsf_fields( Nsf_Emu::header_t const& h, track_info_t* out )
-{
- GME_COPY_FIELD( h, out, game );
- GME_COPY_FIELD( h, out, author );
- GME_COPY_FIELD( h, out, copyright );
- if ( h.chip_flags )
- Gme_File::copy_field_( out->system, "Famicom" );
-}
-
-blargg_err_t Nsf_Emu::track_info_( track_info_t* out, int ) const
-{
- copy_nsf_fields( header_, out );
- return 0;
-}
-
-static blargg_err_t check_nsf_header( void const* header )
-{
- if ( memcmp( header, "NESM\x1A", 5 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Nsf_File : Gme_Info_
-{
- Nsf_Emu::header_t h;
-
- Nsf_File() { set_type( gme_nsf_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- blargg_err_t err = in.read( &h, Nsf_Emu::header_size );
- if ( err )
- return (err == in.eof_error ? gme_wrong_file_type : err);
-
- if ( h.chip_flags & ~(namco_flag | vrc6_flag | fme7_flag) )
- set_warning( "Uses unsupported audio expansion hardware" );
-
- set_track_count( h.track_count );
- return check_nsf_header( &h );
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- copy_nsf_fields( h, out );
- return 0;
- }
-};
-
-static Music_Emu* new_nsf_emu () { return BLARGG_NEW Nsf_Emu ; }
-static Music_Emu* new_nsf_file() { return BLARGG_NEW Nsf_File; }
-
-gme_type_t_ const gme_nsf_type [1] = { "Nintendo NES", 0, &new_nsf_emu, &new_nsf_file, "NSF", 1 };
-
-// Setup
-
-void Nsf_Emu::set_tempo_( double t )
-{
- unsigned playback_rate = get_le16( header_.ntsc_speed );
- unsigned standard_rate = 0x411A;
- clock_rate_ = 1789772.72727;
- play_period = 262 * 341L * 4 - 2; // two fewer PPU clocks every four frames
-
- if ( pal_only )
- {
- play_period = 33247 * clock_divisor;
- clock_rate_ = 1662607.125;
- standard_rate = 0x4E20;
- playback_rate = get_le16( header_.pal_speed );
- }
-
- if ( !playback_rate )
- playback_rate = standard_rate;
-
- if ( playback_rate != standard_rate || t != 1.0 )
- play_period = long (playback_rate * clock_rate_ / (1000000.0 / clock_divisor * t));
-
- apu.set_tempo( t );
-}
-
-blargg_err_t Nsf_Emu::init_sound()
-{
- if ( header_.chip_flags & ~(namco_flag | vrc6_flag | fme7_flag) )
- set_warning( "Uses unsupported audio expansion hardware" );
-
- {
- #define APU_NAMES "Square 1", "Square 2", "Triangle", "Noise", "DMC"
-
- int const count = Nes_Apu::osc_count;
- static const char* const apu_names [count] = { APU_NAMES };
- set_voice_count( count );
- set_voice_names( apu_names );
-
- }
-
- static int const types [] = {
- wave_type | 1, wave_type | 2, wave_type | 0,
- noise_type | 0, mixed_type | 1,
- wave_type | 3, wave_type | 4, wave_type | 5,
- wave_type | 6, wave_type | 7, wave_type | 8, wave_type | 9,
- wave_type |10, wave_type |11, wave_type |12, wave_type |13
- };
- set_voice_types( types ); // common to all sound chip configurations
-
- double adjusted_gain = gain();
-
- #if NSF_EMU_APU_ONLY
- {
- if ( header_.chip_flags )
- set_warning( "Uses unsupported audio expansion hardware" );
- }
- #else
- {
- if ( header_.chip_flags & (namco_flag | vrc6_flag | fme7_flag) )
- set_voice_count( Nes_Apu::osc_count + 3 );
-
- if ( header_.chip_flags & namco_flag )
- {
- namco = BLARGG_NEW Nes_Namco_Apu;
- CHECK_ALLOC( namco );
- adjusted_gain *= 0.75;
-
- int const count = Nes_Apu::osc_count + Nes_Namco_Apu::osc_count;
- static const char* const names [count] = {
- APU_NAMES,
- "Wave 1", "Wave 2", "Wave 3", "Wave 4",
- "Wave 5", "Wave 6", "Wave 7", "Wave 8"
- };
- set_voice_count( count );
- set_voice_names( names );
- }
-
- if ( header_.chip_flags & vrc6_flag )
- {
- vrc6 = BLARGG_NEW Nes_Vrc6_Apu;
- CHECK_ALLOC( vrc6 );
- adjusted_gain *= 0.75;
-
- {
- int const count = Nes_Apu::osc_count + Nes_Vrc6_Apu::osc_count;
- static const char* const names [count] = {
- APU_NAMES,
- "Saw Wave", "Square 3", "Square 4"
- };
- set_voice_count( count );
- set_voice_names( names );
- }
-
- if ( header_.chip_flags & namco_flag )
- {
- int const count = Nes_Apu::osc_count + Nes_Vrc6_Apu::osc_count +
- Nes_Namco_Apu::osc_count;
- static const char* const names [count] = {
- APU_NAMES,
- "Saw Wave", "Square 3", "Square 4",
- "Wave 1", "Wave 2", "Wave 3", "Wave 4",
- "Wave 5", "Wave 6", "Wave 7", "Wave 8"
- };
- set_voice_count( count );
- set_voice_names( names );
- }
- }
-
- if ( header_.chip_flags & fme7_flag )
- {
- fme7 = BLARGG_NEW Nes_Fme7_Apu;
- CHECK_ALLOC( fme7 );
- adjusted_gain *= 0.75;
-
- int const count = Nes_Apu::osc_count + Nes_Fme7_Apu::osc_count;
- static const char* const names [count] = {
- APU_NAMES,
- "Square 3", "Square 4", "Square 5"
- };
- set_voice_count( count );
- set_voice_names( names );
- }
-
- if ( namco ) namco->volume( adjusted_gain );
- if ( vrc6 ) vrc6 ->volume( adjusted_gain );
- if ( fme7 ) fme7 ->volume( adjusted_gain );
- }
- #endif
-
- apu.volume( adjusted_gain );
-
- return 0;
-}
-
-blargg_err_t Nsf_Emu::load_( Data_Reader& in )
-{
- assert( offsetof (header_t,unused [4]) == header_size );
- RETURN_ERR( rom.load( in, header_size, &header_, 0 ) );
-
- set_track_count( header_.track_count );
- RETURN_ERR( check_nsf_header( &header_ ) );
-
- if ( header_.vers != 1 )
- set_warning( "Unknown file version" );
-
- // sound and memory
- blargg_err_t err = init_sound();
- if ( err )
- return err;
-
- // set up data
- nes_addr_t load_addr = get_le16( header_.load_addr );
- init_addr = get_le16( header_.init_addr );
- play_addr = get_le16( header_.play_addr );
- if ( !load_addr ) load_addr = rom_begin;
- if ( !init_addr ) init_addr = rom_begin;
- if ( !play_addr ) play_addr = rom_begin;
- if ( load_addr < rom_begin || init_addr < rom_begin )
- {
- const char* w = warning();
- if ( !w )
- w = "Corrupt file (invalid load/init/play address)";
- return w;
- }
-
- rom.set_addr( load_addr % bank_size );
- int total_banks = rom.size() / bank_size;
-
- // bank switching
- int first_bank = (load_addr - rom_begin) / bank_size;
- for ( int i = 0; i < bank_count; i++ )
- {
- unsigned bank = i - first_bank;
- if ( bank >= (unsigned) total_banks )
- bank = 0;
- initial_banks [i] = bank;
-
- if ( header_.banks [i] )
- {
- // bank-switched
- memcpy( initial_banks, header_.banks, sizeof initial_banks );
- break;
- }
- }
-
- pal_only = (header_.speed_flags & 3) == 1;
-
- #if !NSF_EMU_EXTRA_FLAGS
- header_.speed_flags = 0;
- #endif
-
- set_tempo( tempo() );
-
- return setup_buffer( (long) (clock_rate_ + 0.5) );
-}
-
-void Nsf_Emu::update_eq( blip_eq_t const& eq )
-{
- apu.treble_eq( eq );
-
- #if !NSF_EMU_APU_ONLY
- {
- if ( namco ) namco->treble_eq( eq );
- if ( vrc6 ) vrc6 ->treble_eq( eq );
- if ( fme7 ) fme7 ->treble_eq( eq );
- }
- #endif
-}
-
-void Nsf_Emu::set_voice( int i, Blip_Buffer* buf, Blip_Buffer*, Blip_Buffer* )
-{
- if ( i < Nes_Apu::osc_count )
- {
- apu.osc_output( i, buf );
- return;
- }
- i -= Nes_Apu::osc_count;
-
- #if !NSF_EMU_APU_ONLY
- {
- if ( fme7 && i < Nes_Fme7_Apu::osc_count )
- {
- fme7->osc_output( i, buf );
- return;
- }
-
- if ( vrc6 )
- {
- if ( i < Nes_Vrc6_Apu::osc_count )
- {
- // put saw first
- if ( --i < 0 )
- i = 2;
- vrc6->osc_output( i, buf );
- return;
- }
- i -= Nes_Vrc6_Apu::osc_count;
- }
-
- if ( namco && i < Nes_Namco_Apu::osc_count )
- {
- namco->osc_output( i, buf );
- return;
- }
- }
- #endif
-}
-
-// Emulation
-
-// see nes_cpu_io.h for read/write functions
-
-void Nsf_Emu::cpu_write_misc( nes_addr_t addr, int data )
-{
- #if !NSF_EMU_APU_ONLY
- {
- if ( namco )
- {
- switch ( addr )
- {
- case Nes_Namco_Apu::data_reg_addr:
- namco->write_data( time(), data );
- return;
-
- case Nes_Namco_Apu::addr_reg_addr:
- namco->write_addr( data );
- return;
- }
- }
-
- if ( addr >= Nes_Fme7_Apu::latch_addr && fme7 )
- {
- switch ( addr & Nes_Fme7_Apu::addr_mask )
- {
- case Nes_Fme7_Apu::latch_addr:
- fme7->write_latch( data );
- return;
-
- case Nes_Fme7_Apu::data_addr:
- fme7->write_data( time(), data );
- return;
- }
- }
-
- if ( vrc6 )
- {
- unsigned reg = addr & (Nes_Vrc6_Apu::addr_step - 1);
- unsigned osc = unsigned (addr - Nes_Vrc6_Apu::base_addr) / Nes_Vrc6_Apu::addr_step;
- if ( osc < Nes_Vrc6_Apu::osc_count && reg < Nes_Vrc6_Apu::reg_count )
- {
- vrc6->write_osc( time(), osc, reg, data );
- return;
- }
- }
- }
- #endif
-
- // unmapped write
-
- #ifndef NDEBUG
- {
- // some games write to $8000 and $8001 repeatedly
- if ( addr == 0x8000 || addr == 0x8001 ) return;
-
- // probably namco sound mistakenly turned on in mck
- if ( addr == 0x4800 || addr == 0xF800 ) return;
-
- // memory mapper?
- if ( addr == 0xFFF8 ) return;
-
- dprintf( "write_unmapped( 0x%04X, 0x%02X )\n", (unsigned) addr, (unsigned) data );
- }
- #endif
-}
-
-blargg_err_t Nsf_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( low_mem, 0, sizeof low_mem );
- memset( sram, 0, sizeof sram );
-
- cpu::reset( unmapped_code ); // also maps low_mem
- cpu::map_code( sram_addr, sizeof sram, sram );
- for ( int i = 0; i < bank_count; ++i )
- cpu_write( bank_select_addr + i, initial_banks [i] );
-
- apu.reset( pal_only, (header_.speed_flags & 0x20) ? 0x3F : 0 );
- apu.write_register( 0, 0x4015, 0x0F );
- apu.write_register( 0, 0x4017, (header_.speed_flags & 0x10) ? 0x80 : 0 );
- #if !NSF_EMU_APU_ONLY
- {
- if ( namco ) namco->reset();
- if ( vrc6 ) vrc6 ->reset();
- if ( fme7 ) fme7 ->reset();
- }
- #endif
-
- play_ready = 4;
- play_extra = 0;
- next_play = play_period / clock_divisor;
-
- saved_state.pc = badop_addr;
- low_mem [0x1FF] = (badop_addr - 1) >> 8;
- low_mem [0x1FE] = (badop_addr - 1) & 0xFF;
- r.sp = 0xFD;
- r.pc = init_addr;
- r.a = track;
- r.x = pal_only;
-
- return 0;
-}
-
-blargg_err_t Nsf_Emu::run_clocks( blip_time_t& duration, int )
-{
- set_time( 0 );
- while ( time() < duration )
- {
- nes_time_t end = min( (blip_time_t) next_play, duration );
- end = min( end, time() + 32767 ); // allows CPU to use 16-bit time delta
- if ( cpu::run( end ) )
- {
- if ( r.pc != badop_addr )
- {
- set_warning( "Emulation error (illegal instruction)" );
- r.pc++;
- }
- else
- {
- play_ready = 1;
- if ( saved_state.pc != badop_addr )
- {
- cpu::r = saved_state;
- saved_state.pc = badop_addr;
- }
- else
- {
- set_time( end );
- }
- }
- }
-
- if ( time() >= next_play )
- {
- nes_time_t period = (play_period + play_extra) / clock_divisor;
- play_extra = play_period - period * clock_divisor;
- next_play += period;
- if ( play_ready && !--play_ready )
- {
- check( saved_state.pc == badop_addr );
- if ( r.pc != badop_addr )
- saved_state = cpu::r;
-
- r.pc = play_addr;
- low_mem [0x100 + r.sp--] = (badop_addr - 1) >> 8;
- low_mem [0x100 + r.sp--] = (badop_addr - 1) & 0xFF;
- GME_FRAME_HOOK( this );
- }
- }
- }
-
- if ( cpu::error_count() )
- {
- cpu::clear_error_count();
- set_warning( "Emulation error (illegal instruction)" );
- }
-
- duration = time();
- next_play -= duration;
- check( next_play >= 0 );
- if ( next_play < 0 )
- next_play = 0;
-
- apu.end_frame( duration );
-
- #if !NSF_EMU_APU_ONLY
- {
- if ( namco ) namco->end_frame( duration );
- if ( vrc6 ) vrc6 ->end_frame( duration );
- if ( fme7 ) fme7 ->end_frame( duration );
- }
- #endif
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.h
deleted file mode 100644
index e06b9172..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsf_Emu.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Nintendo NES/Famicom NSF music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef NSF_EMU_H
-#define NSF_EMU_H
-
-#include "Classic_Emu.h"
-#include "Nes_Apu.h"
-#include "Nes_Cpu.h"
-
-class Nsf_Emu : private Nes_Cpu, public Classic_Emu {
- typedef Nes_Cpu cpu;
-public:
- // Equalizer profiles for US NES and Japanese Famicom
- static equalizer_t const nes_eq;
- static equalizer_t const famicom_eq;
-
- // NSF file header
- enum { header_size = 0x80 };
- struct header_t
- {
- char tag [5];
- byte vers;
- byte track_count;
- byte first_track;
- byte load_addr [2];
- byte init_addr [2];
- byte play_addr [2];
- char game [32];
- char author [32];
- char copyright [32];
- byte ntsc_speed [2];
- byte banks [8];
- byte pal_speed [2];
- byte speed_flags;
- byte chip_flags;
- byte unused [4];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return header_; }
-
- static gme_type_t static_type() { return gme_nsf_type; }
-
-public:
- // deprecated
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
-
-public:
- Nsf_Emu();
- ~Nsf_Emu();
- Nes_Apu* apu_() { return &apu; }
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_( Data_Reader& );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
- void unload();
-protected:
- enum { bank_count = 8 };
- byte initial_banks [bank_count];
- nes_addr_t init_addr;
- nes_addr_t play_addr;
- double clock_rate_;
- bool pal_only;
-
- // timing
- Nes_Cpu::registers_t saved_state;
- nes_time_t next_play;
- nes_time_t play_period;
- int play_extra;
- int play_ready;
-
- enum { rom_begin = 0x8000 };
- enum { bank_select_addr = 0x5FF8 };
- enum { bank_size = 0x1000 };
- Rom_Data<bank_size> rom;
-
-public: private: friend class Nes_Cpu;
- void cpu_jsr( nes_addr_t );
- int cpu_read( nes_addr_t );
- void cpu_write( nes_addr_t, int );
- void cpu_write_misc( nes_addr_t, int );
- enum { badop_addr = bank_select_addr };
-
-private:
- class Nes_Namco_Apu* namco;
- class Nes_Vrc6_Apu* vrc6;
- class Nes_Fme7_Apu* fme7;
- Nes_Apu apu;
- static int pcm_read( void*, nes_addr_t );
- blargg_err_t init_sound();
-
- header_t header_;
-
- enum { sram_addr = 0x6000 };
- byte sram [0x2000];
- byte unmapped_code [Nes_Cpu::page_size + 8];
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.h
deleted file mode 100644
index c71ce31e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Atari POKEY sound chip emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SAP_APU_H
-#define SAP_APU_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-class Sap_Apu_Impl;
-
-class Sap_Apu {
-public:
- enum { osc_count = 4 };
- void osc_output( int index, Blip_Buffer* );
-
- void reset( Sap_Apu_Impl* );
-
- enum { start_addr = 0xD200 };
- enum { end_addr = 0xD209 };
- void write_data( blip_time_t, unsigned addr, int data );
-
- void end_frame( blip_time_t );
-
-public:
- Sap_Apu();
-private:
- struct osc_t
- {
- unsigned char regs [2];
- unsigned char phase;
- unsigned char invert;
- int last_amp;
- blip_time_t delay;
- blip_time_t period; // always recalculated before use; here for convenience
- Blip_Buffer* output;
- };
- osc_t oscs [osc_count];
- Sap_Apu_Impl* impl;
- blip_time_t last_time;
- int poly5_pos;
- int poly4_pos;
- int polym_pos;
- int control;
-
- void calc_periods();
- void run_until( blip_time_t );
-
- enum { poly4_len = (1L << 4) - 1 };
- enum { poly9_len = (1L << 9) - 1 };
- enum { poly17_len = (1L << 17) - 1 };
- friend class Sap_Apu_Impl;
-};
-
-// Common tables and Blip_Synth that can be shared among multiple Sap_Apu objects
-class Sap_Apu_Impl {
-public:
- Blip_Synth<blip_good_quality,1> synth;
-
- Sap_Apu_Impl();
- void volume( double d ) { synth.volume( 1.0 / Sap_Apu::osc_count / 30 * d ); }
-
-private:
- typedef unsigned char byte;
- byte poly4 [Sap_Apu::poly4_len / 8 + 1];
- byte poly9 [Sap_Apu::poly9_len / 8 + 1];
- byte poly17 [Sap_Apu::poly17_len / 8 + 1];
- friend class Sap_Apu;
-};
-
-inline void Sap_Apu::osc_output( int i, Blip_Buffer* b )
-{
- assert( (unsigned) i < osc_count );
- oscs [i].output = b;
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.cpp
deleted file mode 100644
index 10dc6061..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.cpp
+++ /dev/null
@@ -1,1011 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Sap_Cpu.h"
-
-#include <limits.h>
-#include "blargg_endian.h"
-
-//#include "nes_cpu_log.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#define FLUSH_TIME() (void) (s.time = s_time)
-#define CACHE_TIME() (void) (s_time = s.time)
-
-#include "sap_cpu_io.h"
-
-#ifndef CPU_DONE
- #define CPU_DONE( cpu, time, result_out ) { result_out = -1; }
-#endif
-
-#include "blargg_source.h"
-
-int const st_n = 0x80;
-int const st_v = 0x40;
-int const st_r = 0x20;
-int const st_b = 0x10;
-int const st_d = 0x08;
-int const st_i = 0x04;
-int const st_z = 0x02;
-int const st_c = 0x01;
-
-void Sap_Cpu::reset( void* new_mem )
-{
- check( state == &state_ );
- state = &state_;
- mem = (uint8_t*) new_mem;
- r.status = st_i;
- r.sp = 0xFF;
- r.pc = 0;
- r.a = 0;
- r.x = 0;
- r.y = 0;
- state_.time = 0;
- state_.base = 0;
- irq_time_ = future_sap_time;
- end_time_ = future_sap_time;
-
- blargg_verify_byte_order();
-}
-
-#define TIME (s_time + s.base)
-#define READ( addr ) CPU_READ( this, (addr), TIME )
-#define WRITE( addr, data ) {CPU_WRITE( this, (addr), (data), TIME );}
-#define READ_LOW( addr ) (mem [int (addr)])
-#define WRITE_LOW( addr, data ) (void) (READ_LOW( addr ) = (data))
-#define READ_PROG( addr ) (READ_LOW( addr ))
-
-#define SET_SP( v ) (sp = ((v) + 1) | 0x100)
-#define GET_SP() ((sp - 1) & 0xFF)
-#define PUSH( v ) ((sp = (sp - 1) | 0x100), WRITE_LOW( sp, v ))
-
-// even on x86, using short and unsigned char was slower
-typedef int fint16;
-typedef unsigned fuint16;
-typedef unsigned fuint8;
-typedef blargg_long fint32;
-
-bool Sap_Cpu::run( sap_time_t end_time )
-{
- bool illegal_encountered = false;
- set_end_time( end_time );
- state_t s = this->state_;
- this->state = &s;
- fint32 s_time = s.time;
- uint8_t* const mem = this->mem; // cache
-
- // registers
- fuint16 pc = r.pc;
- fuint8 a = r.a;
- fuint8 x = r.x;
- fuint8 y = r.y;
- fuint16 sp;
- SET_SP( r.sp );
-
- // status flags
- #define IS_NEG (nz & 0x8080)
-
- #define CALC_STATUS( out ) do {\
- out = status & (st_v | st_d | st_i);\
- out |= ((nz >> 8) | nz) & st_n;\
- out |= c >> 8 & st_c;\
- if ( !(nz & 0xFF) ) out |= st_z;\
- } while ( 0 )
-
- #define SET_STATUS( in ) do {\
- status = in & (st_v | st_d | st_i);\
- nz = in << 8;\
- c = nz;\
- nz |= ~in & st_z;\
- } while ( 0 )
-
- fuint8 status;
- fuint16 c; // carry set if (c & 0x100) != 0
- fuint16 nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x8080) != 0
- {
- fuint8 temp = r.status;
- SET_STATUS( temp );
- }
-
- goto loop;
-dec_clock_loop:
- s_time--;
-loop:
-
- #ifndef NDEBUG
- {
- sap_time_t correct = end_time_;
- if ( !(status & st_i) && correct > irq_time_ )
- correct = irq_time_;
- check( s.base == correct );
- }
- #endif
-
- check( (unsigned) GET_SP() < 0x100 );
- check( (unsigned) a < 0x100 );
- check( (unsigned) x < 0x100 );
- check( (unsigned) y < 0x100 );
-
- fuint8 opcode = mem [pc];
- pc++;
- uint8_t const* instr = mem + pc;
-
- static uint8_t const clock_table [256] =
- {// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6,// 0
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 1
- 6,6,2,8,3,3,5,5,4,2,2,2,4,4,6,6,// 2
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 3
- 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6,// 4
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 5
- 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6,// 6
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 7
- 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// 8
- 3,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5,// 9
- 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// A
- 3,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4,// B
- 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// C
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// D
- 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// E
- 3,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7 // F
- }; // 0x00 was 7
-
- fuint16 data;
- data = clock_table [opcode];
- if ( (s_time += data) >= 0 )
- goto possibly_out_of_time;
-almost_out_of_time:
-
- data = *instr;
-
- #ifdef NES_CPU_LOG_H
- nes_cpu_log( "cpu_log", pc - 1, opcode, instr [0], instr [1] );
- #endif
-
- switch ( opcode )
- {
-possibly_out_of_time:
- if ( s_time < (int) data )
- goto almost_out_of_time;
- s_time -= data;
- goto out_of_time;
-
-// Macros
-
-#define GET_MSB() (instr [1])
-#define ADD_PAGE() (pc++, data += 0x100 * GET_MSB())
-#define GET_ADDR() GET_LE16( instr )
-
-#define NO_PAGE_CROSSING( lsb )
-#define HANDLE_PAGE_CROSSING( lsb ) s_time += (lsb) >> 8;
-
-#define INC_DEC_XY( reg, n ) reg = uint8_t (nz = reg + n); goto loop;
-
-#define IND_Y( cross, out ) {\
- fuint16 temp = READ_LOW( data ) + y;\
- out = temp + 0x100 * READ_LOW( uint8_t (data + 1) );\
- cross( temp );\
- }
-
-#define IND_X( out ) {\
- fuint16 temp = data + x;\
- out = 0x100 * READ_LOW( uint8_t (temp + 1) ) + READ_LOW( uint8_t (temp) );\
- }
-
-#define ARITH_ADDR_MODES( op )\
-case op - 0x04: /* (ind,x) */\
- IND_X( data )\
- goto ptr##op;\
-case op + 0x0C: /* (ind),y */\
- IND_Y( HANDLE_PAGE_CROSSING, data )\
- goto ptr##op;\
-case op + 0x10: /* zp,X */\
- data = uint8_t (data + x);\
-case op + 0x00: /* zp */\
- data = READ_LOW( data );\
- goto imm##op;\
-case op + 0x14: /* abs,Y */\
- data += y;\
- goto ind##op;\
-case op + 0x18: /* abs,X */\
- data += x;\
-ind##op:\
- HANDLE_PAGE_CROSSING( data );\
-case op + 0x08: /* abs */\
- ADD_PAGE();\
-ptr##op:\
- FLUSH_TIME();\
- data = READ( data );\
- CACHE_TIME();\
-case op + 0x04: /* imm */\
-imm##op:
-
-// TODO: more efficient way to handle negative branch that wraps PC around
-#define BRANCH( cond )\
-{\
- fint16 offset = (BOOST::int8_t) data;\
- fuint16 extra_clock = (++pc & 0xFF) + offset;\
- if ( !(cond) ) goto dec_clock_loop;\
- pc += offset;\
- s_time += extra_clock >> 8 & 1;\
- goto loop;\
-}
-
-// Often-Used
-
- case 0xB5: // LDA zp,x
- a = nz = READ_LOW( uint8_t (data + x) );
- pc++;
- goto loop;
-
- case 0xA5: // LDA zp
- a = nz = READ_LOW( data );
- pc++;
- goto loop;
-
- case 0xD0: // BNE
- BRANCH( (uint8_t) nz );
-
- case 0x20: { // JSR
- fuint16 temp = pc + 1;
- pc = GET_ADDR();
- WRITE_LOW( 0x100 | (sp - 1), temp >> 8 );
- sp = (sp - 2) | 0x100;
- WRITE_LOW( sp, temp );
- goto loop;
- }
-
- case 0x4C: // JMP abs
- pc = GET_ADDR();
- goto loop;
-
- case 0xE8: // INX
- INC_DEC_XY( x, 1 )
-
- case 0x10: // BPL
- BRANCH( !IS_NEG )
-
- ARITH_ADDR_MODES( 0xC5 ) // CMP
- nz = a - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0x30: // BMI
- BRANCH( IS_NEG )
-
- case 0xF0: // BEQ
- BRANCH( !(uint8_t) nz );
-
- case 0x95: // STA zp,x
- data = uint8_t (data + x);
- case 0x85: // STA zp
- pc++;
- WRITE_LOW( data, a );
- goto loop;
-
- case 0xC8: // INY
- INC_DEC_XY( y, 1 )
-
- case 0xA8: // TAY
- y = a;
- nz = a;
- goto loop;
-
- case 0x98: // TYA
- a = y;
- nz = y;
- goto loop;
-
- case 0xAD:{// LDA abs
- unsigned addr = GET_ADDR();
- pc += 2;
- nz = READ( addr );
- a = nz;
- goto loop;
- }
-
- case 0x60: // RTS
- pc = 1 + READ_LOW( sp );
- pc += 0x100 * READ_LOW( 0x100 | (sp - 0xFF) );
- sp = (sp - 0xFE) | 0x100;
- goto loop;
-
- {
- fuint16 addr;
-
- case 0x99: // STA abs,Y
- addr = y + GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- goto sta_ptr;
-
- case 0x8D: // STA abs
- addr = GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- goto sta_ptr;
-
- case 0x9D: // STA abs,X (slightly more common than STA abs)
- addr = x + GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, a );
- goto loop;
- }
- sta_ptr:
- FLUSH_TIME();
- WRITE( addr, a );
- CACHE_TIME();
- goto loop;
-
- case 0x91: // STA (ind),Y
- IND_Y( NO_PAGE_CROSSING, addr )
- pc++;
- goto sta_ptr;
-
- case 0x81: // STA (ind,X)
- IND_X( addr )
- pc++;
- goto sta_ptr;
-
- }
-
- case 0xA9: // LDA #imm
- pc++;
- a = data;
- nz = data;
- goto loop;
-
- // common read instructions
- {
- fuint16 addr;
-
- case 0xA1: // LDA (ind,X)
- IND_X( addr )
- pc++;
- goto a_nz_read_addr;
-
- case 0xB1:// LDA (ind),Y
- addr = READ_LOW( data ) + y;
- HANDLE_PAGE_CROSSING( addr );
- addr += 0x100 * READ_LOW( (uint8_t) (data + 1) );
- pc++;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- goto a_nz_read_addr;
-
- case 0xB9: // LDA abs,Y
- HANDLE_PAGE_CROSSING( data + y );
- addr = GET_ADDR() + y;
- pc += 2;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- goto a_nz_read_addr;
-
- case 0xBD: // LDA abs,X
- HANDLE_PAGE_CROSSING( data + x );
- addr = GET_ADDR() + x;
- pc += 2;
- a = nz = READ_PROG( addr );
- if ( (addr ^ 0x8000) <= 0x9FFF )
- goto loop;
- a_nz_read_addr:
- FLUSH_TIME();
- a = nz = READ( addr );
- CACHE_TIME();
- goto loop;
-
- }
-
-// Branch
-
- case 0x50: // BVC
- BRANCH( !(status & st_v) )
-
- case 0x70: // BVS
- BRANCH( status & st_v )
-
- case 0xB0: // BCS
- BRANCH( c & 0x100 )
-
- case 0x90: // BCC
- BRANCH( !(c & 0x100) )
-
-// Load/store
-
- case 0x94: // STY zp,x
- data = uint8_t (data + x);
- case 0x84: // STY zp
- pc++;
- WRITE_LOW( data, y );
- goto loop;
-
- case 0x96: // STX zp,y
- data = uint8_t (data + y);
- case 0x86: // STX zp
- pc++;
- WRITE_LOW( data, x );
- goto loop;
-
- case 0xB6: // LDX zp,y
- data = uint8_t (data + y);
- case 0xA6: // LDX zp
- data = READ_LOW( data );
- case 0xA2: // LDX #imm
- pc++;
- x = data;
- nz = data;
- goto loop;
-
- case 0xB4: // LDY zp,x
- data = uint8_t (data + x);
- case 0xA4: // LDY zp
- data = READ_LOW( data );
- case 0xA0: // LDY #imm
- pc++;
- y = data;
- nz = data;
- goto loop;
-
- case 0xBC: // LDY abs,X
- data += x;
- HANDLE_PAGE_CROSSING( data );
- case 0xAC:{// LDY abs
- unsigned addr = data + 0x100 * GET_MSB();
- pc += 2;
- FLUSH_TIME();
- y = nz = READ( addr );
- CACHE_TIME();
- goto loop;
- }
-
- case 0xBE: // LDX abs,y
- data += y;
- HANDLE_PAGE_CROSSING( data );
- case 0xAE:{// LDX abs
- unsigned addr = data + 0x100 * GET_MSB();
- pc += 2;
- FLUSH_TIME();
- x = nz = READ( addr );
- CACHE_TIME();
- goto loop;
- }
-
- {
- fuint8 temp;
- case 0x8C: // STY abs
- temp = y;
- goto store_abs;
-
- case 0x8E: // STX abs
- temp = x;
- store_abs:
- unsigned addr = GET_ADDR();
- pc += 2;
- if ( addr <= 0x7FF )
- {
- WRITE_LOW( addr, temp );
- goto loop;
- }
- FLUSH_TIME();
- WRITE( addr, temp );
- CACHE_TIME();
- goto loop;
- }
-
-// Compare
-
- case 0xEC:{// CPX abs
- unsigned addr = GET_ADDR();
- pc++;
- FLUSH_TIME();
- data = READ( addr );
- CACHE_TIME();
- goto cpx_data;
- }
-
- case 0xE4: // CPX zp
- data = READ_LOW( data );
- case 0xE0: // CPX #imm
- cpx_data:
- nz = x - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0xCC:{// CPY abs
- unsigned addr = GET_ADDR();
- pc++;
- FLUSH_TIME();
- data = READ( addr );
- CACHE_TIME();
- goto cpy_data;
- }
-
- case 0xC4: // CPY zp
- data = READ_LOW( data );
- case 0xC0: // CPY #imm
- cpy_data:
- nz = y - data;
- pc++;
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
-// Logical
-
- ARITH_ADDR_MODES( 0x25 ) // AND
- nz = (a &= data);
- pc++;
- goto loop;
-
- ARITH_ADDR_MODES( 0x45 ) // EOR
- nz = (a ^= data);
- pc++;
- goto loop;
-
- ARITH_ADDR_MODES( 0x05 ) // ORA
- nz = (a |= data);
- pc++;
- goto loop;
-
- case 0x2C:{// BIT abs
- unsigned addr = GET_ADDR();
- pc += 2;
- status &= ~st_v;
- nz = READ( addr );
- status |= nz & st_v;
- if ( a & nz )
- goto loop;
- nz <<= 8; // result must be zero, even if N bit is set
- goto loop;
- }
-
- case 0x24: // BIT zp
- nz = READ_LOW( data );
- pc++;
- status &= ~st_v;
- status |= nz & st_v;
- if ( a & nz )
- goto loop;
- nz <<= 8; // result must be zero, even if N bit is set
- goto loop;
-
-// Add/subtract
-
- ARITH_ADDR_MODES( 0xE5 ) // SBC
- case 0xEB: // unofficial equivalent
- data ^= 0xFF;
- goto adc_imm;
-
- ARITH_ADDR_MODES( 0x65 ) // ADC
- adc_imm: {
- check( !(status & st_d) );
- fint16 carry = c >> 8 & 1;
- fint16 ov = (a ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
- status &= ~st_v;
- status |= ov >> 2 & 0x40;
- c = nz = a + data + carry;
- pc++;
- a = (uint8_t) nz;
- goto loop;
- }
-
-// Shift/rotate
-
- case 0x4A: // LSR A
- c = 0;
- case 0x6A: // ROR A
- nz = c >> 1 & 0x80;
- c = a << 8;
- nz |= a >> 1;
- a = nz;
- goto loop;
-
- case 0x0A: // ASL A
- nz = a << 1;
- c = nz;
- a = (uint8_t) nz;
- goto loop;
-
- case 0x2A: { // ROL A
- nz = a << 1;
- fint16 temp = c >> 8 & 1;
- c = nz;
- nz |= temp;
- a = (uint8_t) nz;
- goto loop;
- }
-
- case 0x5E: // LSR abs,X
- data += x;
- case 0x4E: // LSR abs
- c = 0;
- case 0x6E: // ROR abs
- ror_abs: {
- ADD_PAGE();
- FLUSH_TIME();
- int temp = READ( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
- c = temp << 8;
- goto rotate_common;
- }
-
- case 0x3E: // ROL abs,X
- data += x;
- goto rol_abs;
-
- case 0x1E: // ASL abs,X
- data += x;
- case 0x0E: // ASL abs
- c = 0;
- case 0x2E: // ROL abs
- rol_abs:
- ADD_PAGE();
- nz = c >> 8 & 1;
- FLUSH_TIME();
- nz |= (c = READ( data ) << 1);
- rotate_common:
- pc++;
- WRITE( data, (uint8_t) nz );
- CACHE_TIME();
- goto loop;
-
- case 0x7E: // ROR abs,X
- data += x;
- goto ror_abs;
-
- case 0x76: // ROR zp,x
- data = uint8_t (data + x);
- goto ror_zp;
-
- case 0x56: // LSR zp,x
- data = uint8_t (data + x);
- case 0x46: // LSR zp
- c = 0;
- case 0x66: // ROR zp
- ror_zp: {
- int temp = READ_LOW( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
- c = temp << 8;
- goto write_nz_zp;
- }
-
- case 0x36: // ROL zp,x
- data = uint8_t (data + x);
- goto rol_zp;
-
- case 0x16: // ASL zp,x
- data = uint8_t (data + x);
- case 0x06: // ASL zp
- c = 0;
- case 0x26: // ROL zp
- rol_zp:
- nz = c >> 8 & 1;
- nz |= (c = READ_LOW( data ) << 1);
- goto write_nz_zp;
-
-// Increment/decrement
-
- case 0xCA: // DEX
- INC_DEC_XY( x, -1 )
-
- case 0x88: // DEY
- INC_DEC_XY( y, -1 )
-
- case 0xF6: // INC zp,x
- data = uint8_t (data + x);
- case 0xE6: // INC zp
- nz = 1;
- goto add_nz_zp;
-
- case 0xD6: // DEC zp,x
- data = uint8_t (data + x);
- case 0xC6: // DEC zp
- nz = (unsigned) -1;
- add_nz_zp:
- nz += READ_LOW( data );
- write_nz_zp:
- pc++;
- WRITE_LOW( data, nz );
- goto loop;
-
- case 0xFE: // INC abs,x
- data = x + GET_ADDR();
- goto inc_ptr;
-
- case 0xEE: // INC abs
- data = GET_ADDR();
- inc_ptr:
- nz = 1;
- goto inc_common;
-
- case 0xDE: // DEC abs,x
- data = x + GET_ADDR();
- goto dec_ptr;
-
- case 0xCE: // DEC abs
- data = GET_ADDR();
- dec_ptr:
- nz = (unsigned) -1;
- inc_common:
- FLUSH_TIME();
- nz += READ( data );
- pc += 2;
- WRITE( data, (uint8_t) nz );
- CACHE_TIME();
- goto loop;
-
-// Transfer
-
- case 0xAA: // TAX
- x = a;
- nz = a;
- goto loop;
-
- case 0x8A: // TXA
- a = x;
- nz = x;
- goto loop;
-
- case 0x9A: // TXS
- SET_SP( x ); // verified (no flag change)
- goto loop;
-
- case 0xBA: // TSX
- x = nz = GET_SP();
- goto loop;
-
-// Stack
-
- case 0x48: // PHA
- PUSH( a ); // verified
- goto loop;
-
- case 0x68: // PLA
- a = nz = READ_LOW( sp );
- sp = (sp - 0xFF) | 0x100;
- goto loop;
-
- case 0x40:{// RTI
- fuint8 temp = READ_LOW( sp );
- pc = READ_LOW( 0x100 | (sp - 0xFF) );
- pc |= READ_LOW( 0x100 | (sp - 0xFE) ) * 0x100;
- sp = (sp - 0xFD) | 0x100;
- data = status;
- SET_STATUS( temp );
- this->r.status = status; // update externally-visible I flag
- if ( (data ^ status) & st_i )
- {
- sap_time_t new_time = end_time_;
- if ( !(status & st_i) && new_time > irq_time_ )
- new_time = irq_time_;
- blargg_long delta = s.base - new_time;
- s.base = new_time;
- s_time += delta;
- }
- goto loop;
- }
-
- case 0x28:{// PLP
- fuint8 temp = READ_LOW( sp );
- sp = (sp - 0xFF) | 0x100;
- fuint8 changed = status ^ temp;
- SET_STATUS( temp );
- if ( !(changed & st_i) )
- goto loop; // I flag didn't change
- if ( status & st_i )
- goto handle_sei;
- goto handle_cli;
- }
-
- case 0x08: { // PHP
- fuint8 temp;
- CALC_STATUS( temp );
- PUSH( temp | (st_b | st_r) );
- goto loop;
- }
-
- case 0x6C:{// JMP (ind)
- data = GET_ADDR();
- pc = READ_PROG( data );
- data = (data & 0xFF00) | ((data + 1) & 0xFF);
- pc |= 0x100 * READ_PROG( data );
- goto loop;
- }
-
- case 0x00: // BRK
- goto handle_brk;
-
-// Flags
-
- case 0x38: // SEC
- c = (unsigned) ~0;
- goto loop;
-
- case 0x18: // CLC
- c = 0;
- goto loop;
-
- case 0xB8: // CLV
- status &= ~st_v;
- goto loop;
-
- case 0xD8: // CLD
- status &= ~st_d;
- goto loop;
-
- case 0xF8: // SED
- status |= st_d;
- goto loop;
-
- case 0x58: // CLI
- if ( !(status & st_i) )
- goto loop;
- status &= ~st_i;
- handle_cli: {
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - irq_time_;
- if ( delta <= 0 )
- {
- if ( TIME < irq_time_ )
- goto loop;
- goto delayed_cli;
- }
- s.base = irq_time_;
- s_time += delta;
- if ( s_time < 0 )
- goto loop;
-
- if ( delta >= s_time + 1 )
- {
- // delayed irq until after next instruction
- s.base += s_time + 1;
- s_time = -1;
- irq_time_ = s.base; // TODO: remove, as only to satisfy debug check in loop
- goto loop;
- }
- delayed_cli:
- dprintf( "Delayed CLI not emulated\n" );
- goto loop;
- }
-
- case 0x78: // SEI
- if ( status & st_i )
- goto loop;
- status |= st_i;
- handle_sei: {
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - end_time_;
- s.base = end_time_;
- s_time += delta;
- if ( s_time < 0 )
- goto loop;
- dprintf( "Delayed SEI not emulated\n" );
- goto loop;
- }
-
-// Unofficial
-
- // SKW - Skip word
- case 0x1C: case 0x3C: case 0x5C: case 0x7C: case 0xDC: case 0xFC:
- HANDLE_PAGE_CROSSING( data + x );
- case 0x0C:
- pc++;
- // SKB - Skip byte
- case 0x74: case 0x04: case 0x14: case 0x34: case 0x44: case 0x54: case 0x64:
- case 0x80: case 0x82: case 0x89: case 0xC2: case 0xD4: case 0xE2: case 0xF4:
- pc++;
- goto loop;
-
- // NOP
- case 0xEA: case 0x1A: case 0x3A: case 0x5A: case 0x7A: case 0xDA: case 0xFA:
- goto loop;
-
-// Unimplemented
-
- // halt
- //case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52:
- //case 0x62: case 0x72: case 0x92: case 0xB2: case 0xD2: case 0xF2:
-
- default:
- assert( (unsigned) opcode <= 0xFF );
- illegal_encountered = true;
- pc--;
- goto stop;
- }
- assert( false );
-
- int result_;
-handle_brk:
- if ( (pc - 1) >= idle_addr )
- goto idle_done;
- pc++;
- result_ = 4;
- dprintf( "BRK executed\n" );
-
-interrupt:
- {
- s_time += 7;
-
- WRITE_LOW( 0x100 | (sp - 1), pc >> 8 );
- WRITE_LOW( 0x100 | (sp - 2), pc );
- pc = GET_LE16( &READ_PROG( 0xFFFA ) + result_ );
-
- sp = (sp - 3) | 0x100;
- fuint8 temp;
- CALC_STATUS( temp );
- temp |= st_r;
- if ( result_ )
- temp |= st_b; // TODO: incorrectly sets B flag for IRQ
- WRITE_LOW( sp, temp );
-
- status &= ~st_d;
- status |= st_i;
- this->r.status = status; // update externally-visible I flag
-
- blargg_long delta = s.base - end_time_;
- s.base = end_time_;
- s_time += delta;
- goto loop;
- }
-
-idle_done:
- //s_time = 0;
- pc--;
- goto stop;
-out_of_time:
- pc--;
- FLUSH_TIME();
- CPU_DONE( this, TIME, result_ );
- CACHE_TIME();
- if ( result_ >= 0 )
- goto interrupt;
- if ( s_time < 0 )
- goto loop;
-
-stop:
-
- s.time = s_time;
-
- r.pc = pc;
- r.sp = GET_SP();
- r.a = a;
- r.x = x;
- r.y = y;
-
- {
- fuint8 temp;
- CALC_STATUS( temp );
- r.status = temp;
- }
-
- this->state_ = s;
- this->state = &this->state_;
-
- return illegal_encountered;
-}
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.h
deleted file mode 100644
index 712f63cd..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Cpu.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Atari 6502 CPU emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SAP_CPU_H
-#define SAP_CPU_H
-
-#include "blargg_common.h"
-
-typedef blargg_long sap_time_t; // clock cycle count
-typedef unsigned sap_addr_t; // 16-bit address
-enum { future_sap_time = LONG_MAX / 2 + 1 };
-
-class Sap_Cpu {
-public:
- typedef BOOST::uint8_t uint8_t;
-
- // Clear all registers and keep pointer to 64K memory passed in
- void reset( void* mem_64k );
-
- // Run until specified time is reached. Returns true if suspicious/unsupported
- // instruction was encountered at any point during run.
- bool run( sap_time_t end_time );
-
- // Registers are not updated until run() returns (except I flag in status)
- struct registers_t {
- BOOST::uint16_t pc;
- BOOST::uint8_t a;
- BOOST::uint8_t x;
- BOOST::uint8_t y;
- BOOST::uint8_t status;
- BOOST::uint8_t sp;
- };
- registers_t r;
-
- enum { idle_addr = 0xFEFF };
-
- // Time of beginning of next instruction to be executed
- sap_time_t time() const { return state->time + state->base; }
- void set_time( sap_time_t t ) { state->time = t - state->base; }
- void adjust_time( int delta ) { state->time += delta; }
-
- sap_time_t irq_time() const { return irq_time_; }
- void set_irq_time( sap_time_t );
-
- sap_time_t end_time() const { return end_time_; }
- void set_end_time( sap_time_t );
-
-public:
- Sap_Cpu() { state = &state_; }
- enum { irq_inhibit = 0x04 };
-private:
- struct state_t {
- sap_time_t base;
- sap_time_t time;
- };
- state_t* state; // points to state_ or a local copy within run()
- state_t state_;
- sap_time_t irq_time_;
- sap_time_t end_time_;
- uint8_t* mem;
-
- inline sap_time_t update_end_time( sap_time_t end, sap_time_t irq );
-};
-
-inline sap_time_t Sap_Cpu::update_end_time( sap_time_t t, sap_time_t irq )
-{
- if ( irq < t && !(r.status & irq_inhibit) ) t = irq;
- sap_time_t delta = state->base - t;
- state->base = t;
- return delta;
-}
-
-inline void Sap_Cpu::set_irq_time( sap_time_t t )
-{
- state->time += update_end_time( end_time_, (irq_time_ = t) );
-}
-
-inline void Sap_Cpu::set_end_time( sap_time_t t )
-{
- state->time += update_end_time( (end_time_ = t), irq_time_ );
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.h
deleted file mode 100644
index 4878faa6..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Atari XL/XE SAP music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SAP_EMU_H
-#define SAP_EMU_H
-
-#include "Classic_Emu.h"
-#include "Sap_Apu.h"
-#include "Sap_Cpu.h"
-
-class Sap_Emu : private Sap_Cpu, public Classic_Emu {
- typedef Sap_Cpu cpu;
-public:
- static gme_type_t static_type() { return gme_sap_type; }
-public:
- Sap_Emu();
- ~Sap_Emu();
- struct info_t {
- byte const* rom_data;
- const char* warning;
- long init_addr;
- long play_addr;
- long music_addr;
- int type;
- int track_count;
- int fastplay;
- bool stereo;
- char author [256];
- char name [256];
- char copyright [ 32];
- };
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_mem_( byte const*, long );
- blargg_err_t start_track_( int );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
-public: private: friend class Sap_Cpu;
- int cpu_read( sap_addr_t );
- void cpu_write( sap_addr_t, int );
- void cpu_write_( sap_addr_t, int );
-private:
- info_t info;
-
- byte const* file_end;
- sap_time_t scanline_period;
- sap_time_t next_play;
- sap_time_t time_mask;
- Sap_Apu apu;
- Sap_Apu apu2;
-
- // large items
- struct {
- byte padding1 [0x100];
- byte ram [0x10000];
- byte padding2 [0x100];
- } mem;
- Sap_Apu_Impl apu_impl;
-
- sap_time_t play_period() const;
- void call_play();
- void cpu_jsr( sap_addr_t );
- void call_init( int track );
- void run_routine( sap_addr_t );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.cpp
deleted file mode 100644
index e909ea18..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.cpp
+++ /dev/null
@@ -1,489 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Snes_Spc.h"
-
-#include <string.h>
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// always in the future (CPU time can go over 0, but not by this much)
-int const timer_disabled_time = 127;
-
-Snes_Spc::Snes_Spc() : dsp( mem.ram ), cpu( this, mem.ram )
-{
- set_tempo( 1.0 );
-
- // Put STOP instruction around memory to catch PC underflow/overflow.
- memset( mem.padding1, 0xFF, sizeof mem.padding1 );
- memset( mem.padding2, 0xFF, sizeof mem.padding2 );
-
- // A few tracks read from the last four bytes of IPL ROM
- boot_rom [sizeof boot_rom - 2] = 0xC0;
- boot_rom [sizeof boot_rom - 1] = 0xFF;
- memset( boot_rom, 0, sizeof boot_rom - 2 );
-}
-
-void Snes_Spc::set_tempo( double t )
-{
- int unit = (int) (16.0 / t + 0.5);
-
- timer [0].divisor = unit * 8; // 8 kHz
- timer [1].divisor = unit * 8; // 8 kHz
- timer [2].divisor = unit; // 64 kHz
-}
-
-// Load
-
-void Snes_Spc::set_ipl_rom( void const* in )
-{
- memcpy( boot_rom, in, sizeof boot_rom );
-}
-
-blargg_err_t Snes_Spc::load_spc( const void* data, long size )
-{
- struct spc_file_t {
- char signature [27];
- char unused [10];
- uint8_t pc [2];
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t status;
- uint8_t sp;
- char unused2 [212];
- uint8_t ram [0x10000];
- uint8_t dsp [128];
- uint8_t ipl_rom [128];
- };
- assert( offsetof (spc_file_t,ipl_rom) == spc_file_size );
-
- const spc_file_t* spc = (spc_file_t const*) data;
-
- if ( size < spc_file_size )
- return "Not an SPC file";
-
- if ( strncmp( spc->signature, "SNES-SPC700 Sound File Data", 27 ) != 0 )
- return "Not an SPC file";
-
- registers_t regs;
- regs.pc = spc->pc [1] * 0x100 + spc->pc [0];
- regs.a = spc->a;
- regs.x = spc->x;
- regs.y = spc->y;
- regs.status = spc->status;
- regs.sp = spc->sp;
-
- if ( (unsigned long) size >= sizeof *spc )
- set_ipl_rom( spc->ipl_rom );
-
- const char* error = load_state( regs, spc->ram, spc->dsp );
-
- echo_accessed = false;
-
- return error;
-}
-
-void Snes_Spc::clear_echo()
-{
- if ( !(dsp.read( 0x6C ) & 0x20) )
- {
- unsigned addr = 0x100 * dsp.read( 0x6D );
- size_t size = 0x800 * dsp.read( 0x7D );
- memset( mem.ram + addr, 0xFF, min( size, sizeof mem.ram - addr ) );
- }
-}
-
-// Handle other file formats (emulator save states) in user code, not here.
-
-blargg_err_t Snes_Spc::load_state( const registers_t& cpu_state, const void* new_ram,
- const void* dsp_state )
-{
- // cpu
- cpu.r = cpu_state;
-
- // Allow DSP to generate one sample before code starts
- // (Tengai Makyo Zero, Tenjin's Table Toss first notes are lost since it
- // clears KON 31 cycles from starting execution. It works on the SNES
- // since the SPC player adds a few extra cycles delay after restoring
- // KON from the DSP registers at the end of an SPC file).
- extra_cycles = 32;
-
- // ram
- memcpy( mem.ram, new_ram, sizeof mem.ram );
- memcpy( extra_ram, mem.ram + rom_addr, sizeof extra_ram );
-
- // boot rom (have to force enable_rom() to update it)
- rom_enabled = !(mem.ram [0xF1] & 0x80);
- enable_rom( !rom_enabled );
-
- // dsp
- dsp.reset();
- int i;
- for ( i = 0; i < Spc_Dsp::register_count; i++ )
- dsp.write( i, ((uint8_t const*) dsp_state) [i] );
-
- // timers
- for ( i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
-
- t.next_tick = 0;
- t.enabled = (mem.ram [0xF1] >> i) & 1;
- if ( !t.enabled )
- t.next_tick = timer_disabled_time;
- t.count = 0;
- t.counter = mem.ram [0xFD + i] & 15;
-
- int p = mem.ram [0xFA + i];
- t.period = p ? p : 0x100;
- }
-
- // Handle registers which already give 0 when read by setting RAM and not changing it.
- // Put STOP instruction in registers which can be read, to catch attempted CPU execution.
- mem.ram [0xF0] = 0;
- mem.ram [0xF1] = 0;
- mem.ram [0xF3] = 0xFF;
- mem.ram [0xFA] = 0;
- mem.ram [0xFB] = 0;
- mem.ram [0xFC] = 0;
- mem.ram [0xFD] = 0xFF;
- mem.ram [0xFE] = 0xFF;
- mem.ram [0xFF] = 0xFF;
-
- return 0; // success
-}
-
-// Hardware
-
-// Current time starts negative and ends at 0
-inline spc_time_t Snes_Spc::time() const
-{
- return -cpu.remain();
-}
-
-// Keep track of next time to run and avoid a function call if it hasn't been reached.
-
-// Timers
-
-void Snes_Spc::Timer::run_until_( spc_time_t time )
-{
- if ( !enabled )
- dprintf( "next_tick: %ld, time: %ld", (long) next_tick, (long) time );
- assert( enabled ); // when disabled, next_tick should always be in the future
-
- int elapsed = ((time - next_tick) / divisor) + 1;
- next_tick += elapsed * divisor;
-
- elapsed += count;
- if ( elapsed >= period ) // avoid unnecessary division
- {
- int n = elapsed / period;
- elapsed -= n * period;
- counter = (counter + n) & 15;
- }
- count = elapsed;
-}
-
-// DSP
-
-const int clocks_per_sample = 32; // 1.024 MHz CPU clock / 32000 samples per second
-
-void Snes_Spc::run_dsp_( spc_time_t time )
-{
- int count = ((time - next_dsp) >> 5) + 1; // divide by clocks_per_sample
- sample_t* buf = sample_buf;
- if ( buf ) {
- sample_buf = buf + count * 2; // stereo
- assert( sample_buf <= buf_end );
- }
- next_dsp += count * clocks_per_sample;
- dsp.run( count, buf );
-}
-
-inline void Snes_Spc::run_dsp( spc_time_t time )
-{
- if ( time >= next_dsp )
- run_dsp_( time );
-}
-
-// Debug-only check for read/write within echo buffer, since this might result in
-// inaccurate emulation due to the DSP not being caught up to the present.
-inline void Snes_Spc::check_for_echo_access( spc_addr_t addr )
-{
- if ( !echo_accessed && !(dsp.read( 0x6C ) & 0x20) )
- {
- // ** If echo accesses are found that require running the DSP, cache
- // the start and end address on DSP writes to speed up checking.
-
- unsigned start = 0x100 * dsp.read( 0x6D );
- unsigned end = start + 0x800 * dsp.read( 0x7D );
- if ( start <= addr && addr < end ) {
- echo_accessed = true;
- dprintf( "Read/write at $%04X within echo buffer\n", (unsigned) addr );
- }
- }
-}
-
-// Read
-
-int Snes_Spc::read( spc_addr_t addr )
-{
- int result = mem.ram [addr];
-
- if ( (rom_addr <= addr && addr < 0xFFFC || addr >= 0xFFFE) && rom_enabled )
- dprintf( "Read from ROM: %04X -> %02X\n", addr, result );
-
- if ( unsigned (addr - 0xF0) < 0x10 )
- {
- assert( 0xF0 <= addr && addr <= 0xFF );
-
- // counters
- int i = addr - 0xFD;
- if ( i >= 0 )
- {
- Timer& t = timer [i];
- t.run_until( time() );
- int old = t.counter;
- t.counter = 0;
- return old;
- }
-
- // dsp
- if ( addr == 0xF3 )
- {
- run_dsp( time() );
- if ( mem.ram [0xF2] >= Spc_Dsp::register_count )
- dprintf( "DSP read from $%02X\n", (int) mem.ram [0xF2] );
- return dsp.read( mem.ram [0xF2] & 0x7F );
- }
-
- if ( addr == 0xF0 || addr == 0xF1 || addr == 0xF8 ||
- addr == 0xF9 || addr == 0xFA )
- dprintf( "Read from register $%02X\n", (int) addr );
-
- // Registers which always read as 0 are handled by setting mem.ram [reg] to 0
- // at startup then never changing that value.
-
- check(( check_for_echo_access( addr ), true ));
- }
-
- return result;
-}
-
-
-// Write
-
-void Snes_Spc::enable_rom( bool enable )
-{
- if ( rom_enabled != enable )
- {
- rom_enabled = enable;
- memcpy( mem.ram + rom_addr, (enable ? boot_rom : extra_ram), rom_size );
- // TODO: ROM can still get overwritten when DSP writes to echo buffer
- }
-}
-
-void Snes_Spc::write( spc_addr_t addr, int data )
-{
- // first page is very common
- if ( addr < 0xF0 ) {
- mem.ram [addr] = (uint8_t) data;
- }
- else switch ( addr )
- {
- // RAM
- default:
- check(( check_for_echo_access( addr ), true ));
- if ( addr < rom_addr ) {
- mem.ram [addr] = (uint8_t) data;
- }
- else {
- extra_ram [addr - rom_addr] = (uint8_t) data;
- if ( !rom_enabled )
- mem.ram [addr] = (uint8_t) data;
- }
- break;
-
- // DSP
- //case 0xF2: // mapped to RAM
- case 0xF3: {
- run_dsp( time() );
- int reg = mem.ram [0xF2];
- if ( next_dsp > 0 ) {
- // skip mode
-
- // key press
- if ( reg == 0x4C )
- keys_pressed |= data & ~dsp.read( 0x5C );
-
- // key release
- if ( reg == 0x5C ) {
- keys_released |= data;
- keys_pressed &= ~data;
- }
- }
- if ( reg < Spc_Dsp::register_count ) {
- dsp.write( reg, data );
- }
- else {
- dprintf( "DSP write to $%02X\n", (int) reg );
- }
- break;
- }
-
- case 0xF0: // Test register
- dprintf( "Wrote $%02X to $F0\n", (int) data );
- break;
-
- // Config
- case 0xF1:
- {
- // timers
- for ( int i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
- if ( !(data & (1 << i)) ) {
- t.enabled = 0;
- t.next_tick = timer_disabled_time;
- }
- else if ( !t.enabled ) {
- // just enabled
- t.enabled = 1;
- t.counter = 0;
- t.count = 0;
- t.next_tick = time();
- }
- }
-
- // port clears
- if ( data & 0x10 ) {
- mem.ram [0xF4] = 0;
- mem.ram [0xF5] = 0;
- }
- if ( data & 0x20 ) {
- mem.ram [0xF6] = 0;
- mem.ram [0xF7] = 0;
- }
-
- enable_rom( (data & 0x80) != 0 );
-
- break;
- }
-
- // Ports
- case 0xF4:
- case 0xF5:
- case 0xF6:
- case 0xF7:
- // to do: handle output ports
- break;
-
- //case 0xF8: // verified on SNES that these are read/write (RAM)
- //case 0xF9:
-
- // Timers
- case 0xFA:
- case 0xFB:
- case 0xFC: {
- Timer& t = timer [addr - 0xFA];
- if ( (t.period & 0xFF) != data ) {
- t.run_until( time() );
- t.period = data ? data : 0x100;
- }
- break;
- }
-
- // Counters (cleared on write)
- case 0xFD:
- case 0xFE:
- case 0xFF:
- dprintf( "Wrote to counter $%02X\n", (int) addr );
- timer [addr - 0xFD].counter = 0;
- break;
- }
-}
-
-// Play
-
-blargg_err_t Snes_Spc::skip( long count )
-{
- if ( count > 4 * 32000L )
- {
- // don't run DSP for long durations (2-3 times faster)
-
- const long sync_count = 32000L * 2;
-
- // keep track of any keys pressed/released (and not subsequently released)
- keys_pressed = 0;
- keys_released = 0;
- // sentinel tells play to ignore DSP
- RETURN_ERR( play( count - sync_count, skip_sentinel ) );
-
- // press/release keys now
- dsp.write( 0x5C, keys_released & ~keys_pressed );
- dsp.write( 0x4C, keys_pressed );
-
- clear_echo();
-
- // play the last few seconds normally to help synchronize DSP
- count = sync_count;
- }
-
- return play( count );
-}
-
-blargg_err_t Snes_Spc::play( long count, sample_t* out )
-{
- require( count % 2 == 0 ); // output is always in pairs of samples
-
- // CPU time() runs from -duration to 0
- spc_time_t duration = (count / 2) * clocks_per_sample;
-
- // DSP output is made on-the-fly when the CPU reads/writes DSP registers
- sample_buf = out;
- buf_end = out + (out && out != skip_sentinel ? count : 0);
- next_dsp = (out == skip_sentinel) ? clocks_per_sample : -duration + clocks_per_sample;
-
- // Localize timer next_tick times and run them to the present to prevent a running
- // but ignored timer's next_tick from getting too far behind and overflowing.
- for ( int i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
- if ( t.enabled )
- {
- t.next_tick -= duration;
- t.run_until( -duration );
- }
- }
-
- // Run CPU for duration, reduced by any extra cycles from previous run
- int elapsed = cpu.run( duration - extra_cycles );
- if ( elapsed > 0 )
- {
- dprintf( "Unhandled instruction $%02X, pc = $%04X\n",
- (int) cpu.read( cpu.r.pc ), (unsigned) cpu.r.pc );
- return "Emulation error (illegal/unsupported instruction)";
- }
- extra_cycles = -elapsed;
-
- // Catch DSP up to present.
- run_dsp( 0 );
- if ( out ) {
- assert( next_dsp == clocks_per_sample );
- assert( out == skip_sentinel || sample_buf - out == count );
- }
- buf_end = 0;
-
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.h
deleted file mode 100644
index b558fb71..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Snes_Spc.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Super Nintendo (SNES) SPC-700 APU Emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SNES_SPC_H
-#define SNES_SPC_H
-
-#include "blargg_common.h"
-#include "Spc_Cpu.h"
-#include "Spc_Dsp.h"
-
-class Snes_Spc {
-public:
-
- // Load copy of SPC data into emulator. Clear echo buffer if 'clear_echo' is true.
- enum { spc_file_size = 0x10180 };
- blargg_err_t load_spc( const void* spc, long spc_size );
-
- // Generate 'count' samples and optionally write to 'buf'. Count must be even.
- // Sample output is 16-bit 32kHz, signed stereo pairs with the left channel first.
- typedef short sample_t;
- blargg_err_t play( long count, sample_t* buf = NULL );
-
-// Optional functionality
-
- // Load copy of state into emulator.
- typedef Spc_Cpu::registers_t registers_t;
- blargg_err_t load_state( const registers_t& cpu_state, const void* ram_64k,
- const void* dsp_regs_128 );
-
- // Clear echo buffer, useful because many tracks have junk in the buffer.
- void clear_echo();
-
- // Mute voice n if bit n (1 << n) of mask is set
- enum { voice_count = Spc_Dsp::voice_count };
- void mute_voices( int mask );
-
- // Skip forward by the specified number of samples (64000 samples = 1 second)
- blargg_err_t skip( long count );
-
- // Set gain, where 1.0 is normal. When greater than 1.0, output is clamped the
- // 16-bit sample range.
- void set_gain( double );
-
- // If true, prevent channels and global volumes from being phase-negated
- void disable_surround( bool disable = true );
-
- // Set 128 bytes to use for IPL boot ROM. Makes copy. Default is zero filled,
- // to avoid including copyrighted code from the SPC-700.
- void set_ipl_rom( const void* );
-
- void set_tempo( double );
-
-public:
- Snes_Spc();
- typedef BOOST::uint8_t uint8_t;
-private:
- // timers
- struct Timer
- {
- spc_time_t next_tick;
- int period;
- int count;
- int divisor;
- int enabled;
- int counter;
-
- void run_until_( spc_time_t );
- void run_until( spc_time_t time )
- {
- if ( time >= next_tick )
- run_until_( time );
- }
- };
- enum { timer_count = 3 };
- Timer timer [timer_count];
-
- // hardware
- int extra_cycles;
- spc_time_t time() const;
- int read( spc_addr_t );
- void write( spc_addr_t, int );
- friend class Spc_Cpu;
-
- // dsp
- sample_t* sample_buf;
- sample_t* buf_end; // to do: remove this once possible bug resolved
- spc_time_t next_dsp;
- Spc_Dsp dsp;
- int keys_pressed;
- int keys_released;
- sample_t skip_sentinel [1]; // special value for play() passed by skip()
- void run_dsp( spc_time_t );
- void run_dsp_( spc_time_t );
- bool echo_accessed;
- void check_for_echo_access( spc_addr_t );
-
- // boot rom
- enum { rom_size = 64 };
- enum { rom_addr = 0xFFC0 };
- bool rom_enabled;
- void enable_rom( bool );
-
- // CPU and RAM (at end because it's large)
- Spc_Cpu cpu;
- uint8_t extra_ram [rom_size];
- struct {
- // padding to catch jumps before beginning or past end
- uint8_t padding1 [0x100];
- uint8_t ram [0x10000];
- uint8_t padding2 [0x100];
- } mem;
- uint8_t boot_rom [rom_size];
-};
-
-inline void Snes_Spc::disable_surround( bool disable ) { dsp.disable_surround( disable ); }
-
-inline void Snes_Spc::mute_voices( int mask ) { dsp.mute_voices( mask ); }
-
-inline void Snes_Spc::set_gain( double v ) { dsp.set_gain( v ); }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.cpp
deleted file mode 100644
index fb9983b8..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.cpp
+++ /dev/null
@@ -1,1062 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Spc_Cpu.h"
-
-#include "blargg_endian.h"
-#include "Snes_Spc.h"
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// Several instructions are commented out (or not even implemented). These aren't
-// used by the SPC files tested.
-
-// Optimize performance for the most common instructions, and size for the rest:
-//
-// 15% 0xF0 BEQ rel
-// 8% 0xE4 MOV A,dp
-// 4% 0xF5 MOV A,abs+X
-// 4% 0xD0 BNE rel
-// 4% 0x6F RET
-// 4% 0x3F CALL addr
-// 4% 0xF4 MOV A,dp+X
-// 3% 0xC4 MOV dp,A
-// 2% 0xEB MOV Y,dp
-// 2% 0x3D INC X
-// 2% 0xF6 MOV A,abs+Y
-// (1% and below not shown)
-
-Spc_Cpu::Spc_Cpu( Snes_Spc* e, uint8_t* ram_in ) : ram( ram_in ), emu( *e )
-{
- remain_ = 0;
- assert( INT_MAX >= 0x7FFFFFFF ); // requires 32-bit int
- blargg_verify_byte_order();
-}
-
-#define READ( addr ) (emu.read( addr ))
-#define WRITE( addr, value ) (emu.write( addr, value ))
-
-#define READ_DP( addr ) READ( (addr) + dp )
-#define WRITE_DP( addr, value ) WRITE( (addr) + dp, value )
-
-#define READ_PROG( addr ) (ram [addr])
-#define READ_PROG16( addr ) GET_LE16( &READ_PROG( addr ) )
-
-int Spc_Cpu::read( spc_addr_t addr )
-{
- return READ( addr );
-}
-
-void Spc_Cpu::write( spc_addr_t addr, int data )
-{
- WRITE( addr, data );
-}
-
-// Cycle table derived from text copy of SPC-700 manual (using regular expressions)
-static unsigned char const cycle_table [0x100] = {
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 2,8,4,5,3,4,3,6,2,6,5,4,5,4,6,8, // 0
- 2,8,4,5,4,5,5,6,5,5,6,5,2,2,4,6, // 1
- 2,8,4,5,3,4,3,6,2,6,5,4,5,4,5,4, // 2
- 2,8,4,5,4,5,5,6,5,5,6,5,2,2,3,8, // 3
- 2,8,4,5,3,4,3,6,2,6,4,4,5,4,6,6, // 4
- 2,8,4,5,4,5,5,6,5,5,4,5,2,2,4,3, // 5
- 2,8,4,5,3,4,3,6,2,6,4,4,5,4,5,5, // 6
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,6, // 7
- 2,8,4,5,3,4,3,6,2,6,5,4,5,2,4,5, // 8
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,12,5,// 9
- 3,8,4,5,3,4,3,6,2,6,4,4,5,2,4,4, // A
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,4, // B
- 3,8,4,5,4,5,4,7,2,5,6,4,5,2,4,9, // C
- 2,8,4,5,5,6,6,7,4,5,4,5,2,2,6,3, // D
- 2,8,4,5,3,4,3,6,2,4,5,3,4,3,4,3, // E
- 2,8,4,5,4,5,5,6,3,4,5,4,2,2,4,3 // F
-};
-
-// The C,mem instructions are hardly used, so a non-inline function is used for
-// the common access code.
-unsigned Spc_Cpu::mem_bit( spc_addr_t pc )
-{
- unsigned addr = READ_PROG16( pc );
- unsigned t = READ( addr & 0x1FFF ) >> (addr >> 13);
- return (t << 8) & 0x100;
-}
-
-spc_time_t Spc_Cpu::run( spc_time_t cycle_count )
-{
- remain_ = cycle_count;
-
- uint8_t* const ram = this->ram; // cache
-
- // Stack pointer is kept one greater than usual SPC stack pointer to allow
- // common pre-decrement and post-increment memory instructions that some
- // processors have. Address wrap-around isn't supported.
- #define PUSH( v ) (*--sp = uint8_t (v))
- #define PUSH16( v ) (sp -= 2, SET_LE16( sp, v ))
- #define POP() (*sp++)
- #define SET_SP( v ) (sp = ram + 0x101 + (v))
- #define GET_SP() (sp - 0x101 - ram)
-
- uint8_t* sp;
- SET_SP( r.sp );
-
- // registers
- unsigned pc = (unsigned) r.pc;
- int a = r.a;
- int x = r.x;
- int y = r.y;
-
- // status flags
-
- const int st_n = 0x80;
- const int st_v = 0x40;
- const int st_p = 0x20;
- const int st_b = 0x10;
- const int st_h = 0x08;
- const int st_i = 0x04;
- const int st_z = 0x02;
- const int st_c = 0x01;
-
- #define IS_NEG (nz & 0x880)
-
- #define CALC_STATUS( out ) do {\
- out = status & ~(st_n | st_z | st_c);\
- out |= (c >> 8) & st_c;\
- out |= (dp >> 3) & st_p;\
- if ( IS_NEG ) out |= st_n;\
- if ( !(nz & 0xFF) ) out |= st_z;\
- } while ( 0 )
-
- #define SET_STATUS( in ) do {\
- status = in & ~(st_n | st_z | st_c | st_p);\
- c = in << 8;\
- nz = (in << 4) & 0x800;\
- nz |= ~in & st_z;\
- dp = (in << 3) & 0x100;\
- } while ( 0 )
-
- int status;
- int c; // store C as 'c' & 0x100.
- int nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x880) != 0
- unsigned dp; // direct page base
- {
- int temp = r.status;
- SET_STATUS( temp );
- }
-
- goto loop;
-
- unsigned data; // first operand of instruction and temporary across function calls
-
- // Common endings for instructions
-cbranch_taken_loop: // compare and branch
- pc += (BOOST::int8_t) READ_PROG( pc );
- remain_ -= 2;
-inc_pc_loop: // end of instruction with an operand
- pc++;
-loop:
-
- check( (unsigned) pc < 0x10000 );
- check( (unsigned) GET_SP() < 0x100 );
-
- check( (unsigned) a < 0x100 );
- check( (unsigned) x < 0x100 );
- check( (unsigned) y < 0x100 );
-
- unsigned opcode = READ_PROG( pc );
- pc++;
- // to do: if pc is at end of memory, this will get wrong byte
- data = READ_PROG( pc );
-
- if ( remain_ <= 0 )
- goto stop;
-
- remain_ -= cycle_table [opcode];
-
- // Use 'data' for temporaries whose lifetime crosses read/write calls, otherwise
- // use a local temporary.
- switch ( opcode )
- {
-
- #define BRANCH( cond ) {\
- pc++;\
- int offset = (BOOST::int8_t) data;\
- if ( cond ) {\
- pc += offset;\
- remain_ -= 2;\
- }\
- goto loop;\
- }
-
-// Most-Common
-
- case 0xF0: // BEQ (most common)
- BRANCH( !(uint8_t) nz )
-
- case 0xD0: // BNE
- BRANCH( (uint8_t) nz )
-
- case 0x3F: // CALL
- PUSH16( pc + 2 );
- pc = READ_PROG16( pc );
- goto loop;
-
- case 0x6F: // RET
- pc = POP();
- pc += POP() * 0x100;
- goto loop;
-
-#define CASE( n ) case n:
-
-// Define common address modes based on opcode for immediate mode. Execution
-// ends with data set to the address of the operand.
-#define ADDR_MODES( op )\
- CASE( op - 0x02 ) /* (X) */\
- data = x + dp;\
- pc--;\
- goto end_##op;\
- CASE( op + 0x0F ) /* (dp)+Y */\
- data = READ_PROG16( data + dp ) + y;\
- goto end_##op;\
- CASE( op - 0x01 ) /* (dp+X) */\
- data = READ_PROG16( uint8_t (data + x) + dp );\
- goto end_##op;\
- CASE( op + 0x0E ) /* abs+Y */\
- data += y;\
- goto abs_##op;\
- CASE( op + 0x0D ) /* abs+X */\
- data += x;\
- CASE( op - 0x03 ) /* abs */\
- abs_##op:\
- pc++;\
- data += 0x100 * READ_PROG( pc );\
- goto end_##op;\
- CASE( op + 0x0C ) /* dp+X */\
- data = uint8_t (data + x);\
- CASE( op - 0x04 ) /* dp */\
- data += dp;\
- end_##op:
-
-// 1. 8-bit Data Transmission Commands. Group I
-
- ADDR_MODES( 0xE8 ) // MOV A,addr
- // case 0xE4: // MOV a,dp (most common)
- mov_a_addr:
- a = nz = READ( data );
- goto inc_pc_loop;
- case 0xBF: // MOV A,(X)+
- data = x + dp;
- x = uint8_t (x + 1);
- pc--;
- goto mov_a_addr;
-
- case 0xE8: // MOV A,imm
- a = data;
- nz = data;
- goto inc_pc_loop;
-
- case 0xF9: // MOV X,dp+Y
- data = uint8_t (data + y);
- case 0xF8: // MOV X,dp
- data += dp;
- goto mov_x_addr;
- case 0xE9: // MOV X,abs
- data = READ_PROG16( pc );
- pc++;
- mov_x_addr:
- data = READ( data );
- case 0xCD: // MOV X,imm
- x = data;
- nz = data;
- goto inc_pc_loop;
-
- case 0xFB: // MOV Y,dp+X
- data = uint8_t (data + x);
- case 0xEB: // MOV Y,dp
- data += dp;
- goto mov_y_addr;
- case 0xEC: // MOV Y,abs
- data = READ_PROG16( pc );
- pc++;
- mov_y_addr:
- data = READ( data );
- case 0x8D: // MOV Y,imm
- y = data;
- nz = data;
- goto inc_pc_loop;
-
-// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2
-
- ADDR_MODES( 0xC8 ) // MOV addr,A
- WRITE( data, a );
- goto inc_pc_loop;
-
- {
- int temp;
- case 0xCC: // MOV abs,Y
- temp = y;
- goto mov_abs_temp;
- case 0xC9: // MOV abs,X
- temp = x;
- mov_abs_temp:
- WRITE( READ_PROG16( pc ), temp );
- pc += 2;
- goto loop;
- }
-
- case 0xD9: // MOV dp+Y,X
- data = uint8_t (data + y);
- case 0xD8: // MOV dp,X
- WRITE( data + dp, x );
- goto inc_pc_loop;
-
- case 0xDB: // MOV dp+X,Y
- data = uint8_t (data + x);
- case 0xCB: // MOV dp,Y
- WRITE( data + dp, y );
- goto inc_pc_loop;
-
- case 0xFA: // MOV dp,dp
- data = READ( data + dp );
- case 0x8F: // MOV dp,#imm
- pc++;
- WRITE_DP( READ_PROG( pc ), data );
- goto inc_pc_loop;
-
-// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3.
-
- case 0x7D: // MOV A,X
- a = x;
- nz = x;
- goto loop;
-
- case 0xDD: // MOV A,Y
- a = y;
- nz = y;
- goto loop;
-
- case 0x5D: // MOV X,A
- x = a;
- nz = a;
- goto loop;
-
- case 0xFD: // MOV Y,A
- y = a;
- nz = a;
- goto loop;
-
- case 0x9D: // MOV X,SP
- x = nz = GET_SP();
- goto loop;
-
- case 0xBD: // MOV SP,X
- SET_SP( x );
- goto loop;
-
- //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2)
-
- case 0xAF: // MOV (X)+,A
- WRITE_DP( x, a );
- x++;
- goto loop;
-
-// 5. 8-BIT LOGIC OPERATION COMMANDS
-
-#define LOGICAL_OP( op, func )\
- ADDR_MODES( op ) /* addr */\
- data = READ( data );\
- case op: /* imm */\
- nz = a func##= data;\
- goto inc_pc_loop;\
- { unsigned addr;\
- case op + 0x11: /* X,Y */\
- data = READ_DP( y );\
- addr = x + dp;\
- pc--;\
- goto addr_##op;\
- case op + 0x01: /* dp,dp */\
- data = READ_DP( data );\
- case op + 0x10: /*dp,imm*/\
- pc++;\
- addr = READ_PROG( pc ) + dp;\
- addr_##op:\
- nz = data func READ( addr );\
- WRITE( addr, nz );\
- goto inc_pc_loop;\
- }
-
- LOGICAL_OP( 0x28, & ); // AND
-
- LOGICAL_OP( 0x08, | ); // OR
-
- LOGICAL_OP( 0x48, ^ ); // EOR
-
-// 4. 8-BIT ARITHMETIC OPERATION COMMANDS
-
- ADDR_MODES( 0x68 ) // CMP addr
- data = READ( data );
- case 0x68: // CMP imm
- nz = a - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x79: // CMP (X),(Y)
- data = READ_DP( x );
- nz = data - READ_DP( y );
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0x69: // CMP (dp),(dp)
- data = READ_DP( data );
- case 0x78: // CMP dp,imm
- pc++;
- nz = READ_DP( READ_PROG( pc ) ) - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x3E: // CMP X,dp
- data += dp;
- goto cmp_x_addr;
- case 0x1E: // CMP X,abs
- data = READ_PROG16( pc );
- pc++;
- cmp_x_addr:
- data = READ( data );
- case 0xC8: // CMP X,imm
- nz = x - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x7E: // CMP Y,dp
- data += dp;
- goto cmp_y_addr;
- case 0x5E: // CMP Y,abs
- data = READ_PROG16( pc );
- pc++;
- cmp_y_addr:
- data = READ( data );
- case 0xAD: // CMP Y,imm
- nz = y - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- {
- int addr;
- case 0xB9: // SBC (x),(y)
- case 0x99: // ADC (x),(y)
- pc--; // compensate for inc later
- data = READ_DP( x );
- addr = y + dp;
- goto adc_addr;
- case 0xA9: // SBC dp,dp
- case 0x89: // ADC dp,dp
- data = READ_DP( data );
- case 0xB8: // SBC dp,imm
- case 0x98: // ADC dp,imm
- pc++;
- addr = READ_PROG( pc ) + dp;
- adc_addr:
- nz = READ( addr );
- goto adc_data;
-
-// catch ADC and SBC together, then decode later based on operand
-#undef CASE
-#define CASE( n ) case n: case (n) + 0x20:
- ADDR_MODES( 0x88 ) // ADC/SBC addr
- data = READ( data );
- case 0xA8: // SBC imm
- case 0x88: // ADC imm
- addr = -1; // A
- nz = a;
- adc_data: {
- if ( opcode & 0x20 )
- data ^= 0xFF; // SBC
- int carry = (c >> 8) & 1;
- int ov = (nz ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
- int hc = (nz & 15) + carry;
- c = nz += data + carry;
- hc = (nz & 15) - hc;
- status = (status & ~(st_v | st_h)) | ((ov >> 2) & st_v) | ((hc >> 1) & st_h);
- if ( addr < 0 ) {
- a = (uint8_t) nz;
- goto inc_pc_loop;
- }
- WRITE( addr, (uint8_t) nz );
- goto inc_pc_loop;
- }
-
- }
-
-// 6. ADDITION & SUBTRACTION COMMANDS
-
-#define INC_DEC_REG( reg, n )\
- nz = reg + n;\
- reg = (uint8_t) nz;\
- goto loop;
-
- case 0xBC: INC_DEC_REG( a, 1 ) // INC A
- case 0x3D: INC_DEC_REG( x, 1 ) // INC X
- case 0xFC: INC_DEC_REG( y, 1 ) // INC Y
-
- case 0x9C: INC_DEC_REG( a, -1 ) // DEC A
- case 0x1D: INC_DEC_REG( x, -1 ) // DEC X
- case 0xDC: INC_DEC_REG( y, -1 ) // DEC Y
-
- case 0x9B: // DEC dp+X
- case 0xBB: // INC dp+X
- data = uint8_t (data + x);
- case 0x8B: // DEC dp
- case 0xAB: // INC dp
- data += dp;
- goto inc_abs;
- case 0x8C: // DEC abs
- case 0xAC: // INC abs
- data = READ_PROG16( pc );
- pc++;
- inc_abs:
- nz = ((opcode >> 4) & 2) - 1;
- nz += READ( data );
- WRITE( data, (uint8_t) nz );
- goto inc_pc_loop;
-
-// 7. SHIFT, ROTATION COMMANDS
-
- case 0x5C: // LSR A
- c = 0;
- case 0x7C:{// ROR A
- nz = ((c >> 1) & 0x80) | (a >> 1);
- c = a << 8;
- a = nz;
- goto loop;
- }
-
- case 0x1C: // ASL A
- c = 0;
- case 0x3C:{// ROL A
- int temp = (c >> 8) & 1;
- c = a << 1;
- nz = c | temp;
- a = (uint8_t) nz;
- goto loop;
- }
-
- case 0x0B: // ASL dp
- c = 0;
- data += dp;
- goto rol_mem;
- case 0x1B: // ASL dp+X
- c = 0;
- case 0x3B: // ROL dp+X
- data = uint8_t (data + x);
- case 0x2B: // ROL dp
- data += dp;
- goto rol_mem;
- case 0x0C: // ASL abs
- c = 0;
- case 0x2C: // ROL abs
- data = READ_PROG16( pc );
- pc++;
- rol_mem:
- nz = (c >> 8) & 1;
- nz |= (c = READ( data ) << 1);
- WRITE( data, (uint8_t) nz );
- goto inc_pc_loop;
-
- case 0x4B: // LSR dp
- c = 0;
- data += dp;
- goto ror_mem;
- case 0x5B: // LSR dp+X
- c = 0;
- case 0x7B: // ROR dp+X
- data = uint8_t (data + x);
- case 0x6B: // ROR dp
- data += dp;
- goto ror_mem;
- case 0x4C: // LSR abs
- c = 0;
- case 0x6C: // ROR abs
- data = READ_PROG16( pc );
- pc++;
- ror_mem: {
- int temp = READ( data );
- nz = ((c >> 1) & 0x80) | (temp >> 1);
- c = temp << 8;
- WRITE( data, nz );
- goto inc_pc_loop;
- }
-
- case 0x9F: // XCN
- nz = a = (a >> 4) | uint8_t (a << 4);
- goto loop;
-
-// 8. 16-BIT TRANSMISION COMMANDS
-
- case 0xBA: // MOVW YA,dp
- a = READ_DP( data );
- nz = (a & 0x7F) | (a >> 1);
- y = READ_DP( uint8_t (data + 1) );
- nz |= y;
- goto inc_pc_loop;
-
- case 0xDA: // MOVW dp,YA
- WRITE_DP( data, a );
- WRITE_DP( uint8_t (data + 1), y );
- goto inc_pc_loop;
-
-// 9. 16-BIT OPERATION COMMANDS
-
- case 0x3A: // INCW dp
- case 0x1A:{// DECW dp
- data += dp;
-
- // low byte
- int temp = READ( data );
- temp += ((opcode >> 4) & 2) - 1; // +1 for INCW, -1 for DECW
- nz = ((temp >> 1) | temp) & 0x7F;
- WRITE( data, (uint8_t) temp );
-
- // high byte
- data = uint8_t (data + 1) + dp;
- temp >>= 8;
- temp = uint8_t (temp + READ( data ));
- nz |= temp;
- WRITE( data, temp );
-
- goto inc_pc_loop;
- }
-
- case 0x9A: // SUBW YA,dp
- case 0x7A: // ADDW YA,dp
- {
- // read 16-bit addend
- int temp = READ_DP( data );
- int sign = READ_DP( uint8_t (data + 1) );
- temp += 0x100 * sign;
- status &= ~(st_v | st_h);
-
- // to do: fix half-carry for SUBW (it's probably wrong)
-
- // for SUBW, negate and truncate to 16 bits
- if ( opcode & 0x80 ) {
- temp = (temp ^ 0xFFFF) + 1;
- sign = temp >> 8;
- }
-
- // add low byte (A)
- temp += a;
- a = (uint8_t) temp;
- nz = (temp | (temp >> 1)) & 0x7F;
-
- // add high byte (Y)
- temp >>= 8;
- c = y + temp;
- nz = (nz | c) & 0xFF;
-
- // half-carry (temporary avoids CodeWarrior optimizer bug)
- unsigned hc = (c & 15) - (y & 15);
- status |= (hc >> 4) & st_h;
-
- // overflow if sign of YA changed when previous sign and addend sign were same
- status |= (((c ^ y) & ~(y ^ sign)) >> 1) & st_v;
-
- y = (uint8_t) c;
-
- goto inc_pc_loop;
- }
-
- case 0x5A: { // CMPW YA,dp
- int temp = a - READ_DP( data );
- nz = ((temp >> 1) | temp) & 0x7F;
- temp = y + (temp >> 8);
- temp -= READ_DP( uint8_t (data + 1) );
- nz |= temp;
- c = ~temp;
- nz &= 0xFF;
- goto inc_pc_loop;
- }
-
-// 10. MULTIPLICATION & DIVISON COMMANDS
-
- case 0xCF: { // MUL YA
- unsigned temp = y * a;
- a = (uint8_t) temp;
- nz = ((temp >> 1) | temp) & 0x7F;
- y = temp >> 8;
- nz |= y;
- goto loop;
- }
-
- case 0x9E: // DIV YA,X
- {
- // behavior based on SPC CPU tests
-
- status &= ~(st_h | st_v);
-
- if ( (y & 15) >= (x & 15) )
- status |= st_h;
-
- if ( y >= x )
- status |= st_v;
-
- unsigned ya = y * 0x100 + a;
- if ( y < x * 2 )
- {
- a = ya / x;
- y = ya - a * x;
- }
- else
- {
- a = 255 - (ya - x * 0x200) / (256 - x);
- y = x + (ya - x * 0x200) % (256 - x);
- }
-
- nz = (uint8_t) a;
- a = (uint8_t) a;
-
- goto loop;
- }
-
-// 11. DECIMAL COMPENSATION COMMANDS
-
- // seem unused
- // case 0xDF: // DAA
- // case 0xBE: // DAS
-
-// 12. BRANCHING COMMANDS
-
- case 0x2F: // BRA rel
- pc += (BOOST::int8_t) data;
- goto inc_pc_loop;
-
- case 0x30: // BMI
- BRANCH( IS_NEG )
-
- case 0x10: // BPL
- BRANCH( !IS_NEG )
-
- case 0xB0: // BCS
- BRANCH( c & 0x100 )
-
- case 0x90: // BCC
- BRANCH( !(c & 0x100) )
-
- case 0x70: // BVS
- BRANCH( status & st_v )
-
- case 0x50: // BVC
- BRANCH( !(status & st_v) )
-
- case 0x03: // BBS dp.bit,rel
- case 0x23:
- case 0x43:
- case 0x63:
- case 0x83:
- case 0xA3:
- case 0xC3:
- case 0xE3:
- pc++;
- if ( (READ_DP( data ) >> (opcode >> 5)) & 1 )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0x13: // BBC dp.bit,rel
- case 0x33:
- case 0x53:
- case 0x73:
- case 0x93:
- case 0xB3:
- case 0xD3:
- case 0xF3:
- pc++;
- if ( !((READ_DP( data ) >> (opcode >> 5)) & 1) )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0xDE: // CBNE dp+X,rel
- data = uint8_t (data + x);
- // fall through
- case 0x2E: // CBNE dp,rel
- pc++;
- if ( READ_DP( data ) != a )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0xFE: // DBNZ Y,rel
- y = uint8_t (y - 1);
- BRANCH( y )
-
- case 0x6E: { // DBNZ dp,rel
- pc++;
- unsigned temp = READ_DP( data ) - 1;
- WRITE_DP( (uint8_t) data, (uint8_t) temp );
- if ( temp )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
- }
-
- case 0x1F: // JMP (abs+X)
- pc = READ_PROG16( pc ) + x;
- // fall through
- case 0x5F: // JMP abs
- pc = READ_PROG16( pc );
- goto loop;
-
-// 13. SUB-ROUTINE CALL RETURN COMMANDS
-
- case 0x0F:{// BRK
- check( false ); // untested
- PUSH16( pc + 1 );
- pc = READ_PROG16( 0xFFDE ); // vector address verified
- int temp;
- CALC_STATUS( temp );
- PUSH( temp );
- status = (status | st_b) & ~st_i;
- goto loop;
- }
-
- case 0x4F: // PCALL offset
- pc++;
- PUSH16( pc );
- pc = 0xFF00 + data;
- goto loop;
-
- case 0x01: // TCALL n
- case 0x11:
- case 0x21:
- case 0x31:
- case 0x41:
- case 0x51:
- case 0x61:
- case 0x71:
- case 0x81:
- case 0x91:
- case 0xA1:
- case 0xB1:
- case 0xC1:
- case 0xD1:
- case 0xE1:
- case 0xF1:
- PUSH16( pc );
- pc = READ_PROG16( 0xFFDE - (opcode >> 3) );
- goto loop;
-
-// 14. STACK OPERATION COMMANDS
-
- {
- int temp;
- case 0x7F: // RET1
- temp = POP();
- pc = POP();
- pc |= POP() << 8;
- goto set_status;
- case 0x8E: // POP PSW
- temp = POP();
- set_status:
- SET_STATUS( temp );
- goto loop;
- }
-
- case 0x0D: { // PUSH PSW
- int temp;
- CALC_STATUS( temp );
- PUSH( temp );
- goto loop;
- }
-
- case 0x2D: // PUSH A
- PUSH( a );
- goto loop;
-
- case 0x4D: // PUSH X
- PUSH( x );
- goto loop;
-
- case 0x6D: // PUSH Y
- PUSH( y );
- goto loop;
-
- case 0xAE: // POP A
- a = POP();
- goto loop;
-
- case 0xCE: // POP X
- x = POP();
- goto loop;
-
- case 0xEE: // POP Y
- y = POP();
- goto loop;
-
-// 15. BIT OPERATION COMMANDS
-
- case 0x02: // SET1
- case 0x22:
- case 0x42:
- case 0x62:
- case 0x82:
- case 0xA2:
- case 0xC2:
- case 0xE2:
- case 0x12: // CLR1
- case 0x32:
- case 0x52:
- case 0x72:
- case 0x92:
- case 0xB2:
- case 0xD2:
- case 0xF2: {
- data += dp;
- int bit = 1 << (opcode >> 5);
- int mask = ~bit;
- if ( opcode & 0x10 )
- bit = 0;
- WRITE( data, (READ( data ) & mask) | bit );
- goto inc_pc_loop;
- }
-
- case 0x0E: // TSET1 abs
- case 0x4E:{// TCLR1 abs
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data );
- nz = temp & a;
- temp &= ~a;
- if ( !(opcode & 0x40) )
- temp |= a;
- WRITE( data, temp );
- goto loop;
- }
-
- case 0x4A: // AND1 C,mem.bit
- c &= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x6A: // AND1 C,/mem.bit
- check( false ); // untested
- c &= ~mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x0A: // OR1 C,mem.bit
- check( false ); // untested
- c |= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x2A: // OR1 C,/mem.bit
- check( false ); // untested
- c |= ~mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x8A: // EOR1 C,mem.bit
- c ^= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0xEA: { // NOT1 mem.bit
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data & 0x1FFF );
- temp ^= 1 << (data >> 13);
- WRITE( data & 0x1FFF, temp );
- goto loop;
- }
-
- case 0xCA: { // MOV1 mem.bit,C
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data & 0x1FFF );
- unsigned bit = data >> 13;
- temp = (temp & ~(1 << bit)) | (((c >> 8) & 1) << bit);
- WRITE( data & 0x1FFF, temp );
- goto loop;
- }
-
- case 0xAA: // MOV1 C,mem.bit
- c = mem_bit( pc );
- pc += 2;
- goto loop;
-
-// 16. PROGRAM STATUS FLAG OPERATION COMMANDS
-
- case 0x60: // CLRC
- c = 0;
- goto loop;
-
- case 0x80: // SETC
- c = ~0;
- goto loop;
-
- case 0xED: // NOTC
- c ^= 0x100;
- goto loop;
-
- case 0xE0: // CLRV
- status &= ~(st_v | st_h);
- goto loop;
-
- case 0x20: // CLRP
- dp = 0;
- goto loop;
-
- case 0x40: // SETP
- dp = 0x100;
- goto loop;
-
- case 0xA0: // EI
- check( false ); // untested
- status |= st_i;
- goto loop;
-
- case 0xC0: // DI
- check( false ); // untested
- status &= ~st_i;
- goto loop;
-
-// 17. OTHER COMMANDS
-
- case 0x00: // NOP
- goto loop;
-
- //case 0xEF: // SLEEP
- //case 0xFF: // STOP
-
- } // switch
-
- // unhandled instructions fall out of switch so emulator can catch them
-
-stop:
- pc--;
-
- {
- int temp;
- CALC_STATUS( temp );
- r.status = (uint8_t) temp;
- }
-
- r.pc = pc;
- r.sp = (uint8_t) GET_SP();
- r.a = (uint8_t) a;
- r.x = (uint8_t) x;
- r.y = (uint8_t) y;
-
- return remain_;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.h
deleted file mode 100644
index 2252663b..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Cpu.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Super Nintendo (SNES) SPC-700 CPU emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SPC_CPU_H
-#define SPC_CPU_H
-
-#include "blargg_common.h"
-
-typedef unsigned spc_addr_t;
-typedef blargg_long spc_time_t;
-
-class Snes_Spc;
-
-class Spc_Cpu {
- typedef BOOST::uint8_t uint8_t;
- uint8_t* const ram;
-public:
- // Keeps pointer to 64K RAM
- Spc_Cpu( Snes_Spc* spc, uint8_t* ram );
-
- // SPC-700 registers. *Not* kept updated during a call to run().
- struct registers_t {
- long pc; // more than 16 bits to allow overflow detection
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t status;
- uint8_t sp;
- } r;
-
- // Run CPU for at least 'count' cycles. Return the number of cycles remaining
- // when emulation stopped (negative if extra cycles were emulated). Emulation
- // stops when there are no more remaining cycles or an unhandled instruction
- // is encountered (STOP, SLEEP, and any others not yet implemented). In the
- // latter case, the return value is greater than zero.
- spc_time_t run( spc_time_t count );
-
- // Number of clock cycles remaining for current run() call
- spc_time_t remain() const;
-
- // Access memory as the emulated CPU does
- int read ( spc_addr_t );
- void write( spc_addr_t, int );
-
-private:
- // noncopyable
- Spc_Cpu( const Spc_Cpu& );
- Spc_Cpu& operator = ( const Spc_Cpu& );
- unsigned mem_bit( spc_addr_t );
-
- spc_time_t remain_;
- Snes_Spc& emu;
-};
-
-inline spc_time_t Spc_Cpu::remain() const { return remain_; }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.cpp
deleted file mode 100644
index 3d934f63..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.cpp
+++ /dev/null
@@ -1,666 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-// Based on Brad Martin's OpenSPC DSP emulator
-
-#include "Spc_Dsp.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2002 Brad Martin */
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-Spc_Dsp::Spc_Dsp( uint8_t* ram_ ) : ram( ram_ )
-{
- set_gain( 1.0 );
- mute_voices( 0 );
- disable_surround( false );
-
- assert( offsetof (globals_t,unused9 [2]) == register_count );
- assert( sizeof (voice) == register_count );
- blargg_verify_byte_order();
-}
-
-void Spc_Dsp::mute_voices( int mask )
-{
- for ( int i = 0; i < voice_count; i++ )
- voice_state [i].enabled = (mask >> i & 1) ? 31 : 7;
-}
-
-void Spc_Dsp::reset()
-{
- keys = 0;
- echo_ptr = 0;
- noise_count = 0;
- noise = 1;
- fir_offset = 0;
-
- g.flags = 0xE0; // reset, mute, echo off
- g.key_ons = 0;
-
- for ( int i = 0; i < voice_count; i++ )
- {
- voice_t& v = voice_state [i];
- v.on_cnt = 0;
- v.volume [0] = 0;
- v.volume [1] = 0;
- v.envstate = state_release;
- }
-
- memset( fir_buf, 0, sizeof fir_buf );
-}
-
-void Spc_Dsp::write( int i, int data )
-{
- require( (unsigned) i < register_count );
-
- reg [i] = data;
- int high = i >> 4;
- switch ( i & 0x0F )
- {
- // voice volume
- case 0:
- case 1: {
- short* volume = voice_state [high].volume;
- int left = (int8_t) reg [i & ~1];
- int right = (int8_t) reg [i | 1];
- volume [0] = left;
- volume [1] = right;
- // kill surround only if enabled and signs of volumes differ
- if ( left * right < surround_threshold )
- {
- if ( left < 0 )
- volume [0] = -left;
- else
- volume [1] = -right;
- }
- break;
- }
-
- // fir coefficients
- case 0x0F:
- fir_coeff [high] = (int8_t) data; // sign-extend
- break;
- }
-}
-
-// This table is for envelope timing. It represents the number of counts
-// that should be subtracted from the counter each sample period (32kHz).
-// The counter starts at 30720 (0x7800). Each count divides exactly into
-// 0x7800 without remainder.
-const int env_rate_init = 0x7800;
-static short const env_rates [0x20] =
-{
- 0x0000, 0x000F, 0x0014, 0x0018, 0x001E, 0x0028, 0x0030, 0x003C,
- 0x0050, 0x0060, 0x0078, 0x00A0, 0x00C0, 0x00F0, 0x0140, 0x0180,
- 0x01E0, 0x0280, 0x0300, 0x03C0, 0x0500, 0x0600, 0x0780, 0x0A00,
- 0x0C00, 0x0F00, 0x1400, 0x1800, 0x1E00, 0x2800, 0x3C00, 0x7800
-};
-
-const int env_range = 0x800;
-
-inline int Spc_Dsp::clock_envelope( int v )
-{ /* Return value is current
- * ENVX */
- raw_voice_t& raw_voice = this->voice [v];
- voice_t& voice = voice_state [v];
-
- int envx = voice.envx;
- if ( voice.envstate == state_release )
- {
- /*
- * Docs: "When in the state of "key off". the "click" sound is
- * prevented by the addition of the fixed value 1/256" WTF???
- * Alright, I'm going to choose to interpret that this way:
- * When a note is keyed off, start the RELEASE state, which
- * subtracts 1/256th each sample period (32kHz). Note there's
- * no need for a count because it always happens every update.
- */
- envx -= env_range / 256;
- if ( envx <= 0 )
- {
- envx = 0;
- keys &= ~(1 << v);
- return -1;
- }
- voice.envx = envx;
- raw_voice.envx = envx >> 8;
- return envx;
- }
-
- int cnt = voice.envcnt;
- int adsr1 = raw_voice.adsr [0];
- if ( adsr1 & 0x80 )
- {
- switch ( voice.envstate )
- {
- case state_attack: {
- // increase envelope by 1/64 each step
- int t = adsr1 & 15;
- if ( t == 15 )
- {
- envx += env_range / 2;
- }
- else
- {
- cnt -= env_rates [t * 2 + 1];
- if ( cnt > 0 )
- break;
- envx += env_range / 64;
- cnt = env_rate_init;
- }
- if ( envx >= env_range )
- {
- envx = env_range - 1;
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- }
-
- case state_decay: {
- // Docs: "DR... [is multiplied] by the fixed value
- // 1-1/256." Well, at least that makes some sense.
- // Multiplying ENVX by 255/256 every time DECAY is
- // updated.
- cnt -= env_rates [((adsr1 >> 3) & 0xE) + 0x10];
- if ( cnt <= 0 )
- {
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- voice.envx = envx;
- }
- int sustain_level = raw_voice.adsr [1] >> 5;
-
- if ( envx <= (sustain_level + 1) * 0x100 )
- voice.envstate = state_sustain;
- break;
- }
-
- case state_sustain:
- // Docs: "SR [is multiplied] by the fixed value 1-1/256."
- // Multiplying ENVX by 255/256 every time SUSTAIN is
- // updated.
- cnt -= env_rates [raw_voice.adsr [1] & 0x1F];
- if ( cnt <= 0 )
- {
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- voice.envx = envx;
- }
- break;
-
- case state_release:
- // handled above
- break;
- }
- }
- else
- { /* GAIN mode is set */
- /*
- * Note: if the game switches between ADSR and GAIN modes
- * partway through, should the count be reset, or should it
- * continue from where it was? Does the DSP actually watch for
- * that bit to change, or does it just go along with whatever
- * it sees when it performs the update? I'm going to assume
- * the latter and not update the count, unless I see a game
- * that obviously wants the other behavior. The effect would
- * be pretty subtle, in any case.
- */
- int t = raw_voice.gain;
- if (t < 0x80)
- {
- envx = voice.envx = t << 4;
- }
- else switch (t >> 5)
- {
- case 4: /* Docs: "Decrease (linear): Subtraction
- * of the fixed value 1/64." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx -= env_range / 64;
- if ( envx < 0 )
- {
- envx = 0;
- if ( voice.envstate == state_attack )
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- case 5: /* Docs: "Drecrease <sic> (exponential):
- * Multiplication by the fixed value
- * 1-1/256." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- if ( envx < 0 )
- {
- envx = 0;
- if ( voice.envstate == state_attack )
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- case 6: /* Docs: "Increase (linear): Addition of
- * the fixed value 1/64." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx += env_range / 64;
- if ( envx >= env_range )
- envx = env_range - 1;
- voice.envx = envx;
- break;
- case 7: /* Docs: "Increase (bent line): Addition
- * of the constant 1/64 up to .75 of the
- * constaint <sic> 1/256 from .75 to 1." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- if ( envx < env_range * 3 / 4 )
- envx += env_range / 64;
- else
- envx += env_range / 256;
- if ( envx >= env_range )
- envx = env_range - 1;
- voice.envx = envx;
- break;
- }
- }
- voice.envcnt = cnt;
- raw_voice.envx = envx >> 4;
- return envx;
-}
-
-// Clamp n into range -32768 <= n <= 32767
-inline int clamp_16( int n )
-{
- if ( (BOOST::int16_t) n != n )
- n = BOOST::int16_t (0x7FFF - (n >> 31));
- return n;
-}
-
-void Spc_Dsp::run( long count, short* out_buf )
-{
- // to do: make clock_envelope() inline so that this becomes a leaf function?
-
- // Should we just fill the buffer with silence? Flags won't be cleared
- // during this run so it seems it should keep resetting every sample.
- if ( g.flags & 0x80 )
- reset();
-
- struct src_dir {
- char start [2];
- char loop [2];
- };
-
- const src_dir* const sd = (src_dir*) &ram [g.wave_page * 0x100];
-
- int left_volume = g.left_volume;
- int right_volume = g.right_volume;
- if ( left_volume * right_volume < surround_threshold )
- right_volume = -right_volume; // kill global surround
- left_volume *= emu_gain;
- right_volume *= emu_gain;
-
- while ( --count >= 0 )
- {
- // Here we check for keys on/off. Docs say that successive writes
- // to KON/KOF must be separated by at least 2 Ts periods or risk
- // being neglected. Therefore DSP only looks at these during an
- // update, and not at the time of the write. Only need to do this
- // once however, since the regs haven't changed over the whole
- // period we need to catch up with.
-
- g.wave_ended &= ~g.key_ons; // Keying on a voice resets that bit in ENDX.
-
- if ( g.noise_enables )
- {
- noise_count -= env_rates [g.flags & 0x1F];
- if ( noise_count <= 0 )
- {
- noise_count = env_rate_init;
-
- noise_amp = BOOST::int16_t (noise * 2);
-
- // TODO: switch to Galios style
- int feedback = (noise << 13) ^ (noise << 14);
- noise = (feedback & 0x4000) | (noise >> 1);
- }
- }
-
- // What is the expected behavior when pitch modulation is enabled on
- // voice 0? Jurassic Park 2 does this. Assume 0 for now.
- blargg_long prev_outx = 0;
-
- int echol = 0;
- int echor = 0;
- int left = 0;
- int right = 0;
- for ( int vidx = 0; vidx < voice_count; vidx++ )
- {
- const int vbit = 1 << vidx;
- raw_voice_t& raw_voice = voice [vidx];
- voice_t& voice = voice_state [vidx];
-
- if ( voice.on_cnt && !--voice.on_cnt )
- {
- // key on
- keys |= vbit;
- voice.addr = GET_LE16( sd [raw_voice.waveform].start );
- voice.block_remain = 1;
- voice.envx = 0;
- voice.block_header = 0;
- voice.fraction = 0x3FFF; // decode three samples immediately
- voice.interp0 = 0; // BRR decoder filter uses previous two samples
- voice.interp1 = 0;
-
- // NOTE: Real SNES does *not* appear to initialize the
- // envelope counter to anything in particular. The first
- // cycle always seems to come at a random time sooner than
- // expected; as yet, I have been unable to find any
- // pattern. I doubt it will matter though, so we'll go
- // ahead and do the full time for now.
- voice.envcnt = env_rate_init;
- voice.envstate = state_attack;
- }
-
- if ( g.key_ons & vbit & ~g.key_offs )
- {
- // voice doesn't come on if key off is set
- g.key_ons &= ~vbit;
- voice.on_cnt = 8;
- }
-
- if ( keys & g.key_offs & vbit )
- {
- // key off
- voice.envstate = state_release;
- voice.on_cnt = 0;
- }
-
- int envx;
- if ( !(keys & vbit) || (envx = clock_envelope( vidx )) < 0 )
- {
- raw_voice.envx = 0;
- raw_voice.outx = 0;
- prev_outx = 0;
- continue;
- }
-
- // Decode samples when fraction >= 1.0 (0x1000)
- for ( int n = voice.fraction >> 12; --n >= 0; )
- {
- if ( !--voice.block_remain )
- {
- if ( voice.block_header & 1 )
- {
- g.wave_ended |= vbit;
-
- if ( voice.block_header & 2 )
- {
- // verified (played endless looping sample and ENDX was set)
- voice.addr = GET_LE16( sd [raw_voice.waveform].loop );
- }
- else
- {
- // first block was end block; don't play anything (verified)
- goto sample_ended; // to do: find alternative to goto
- }
- }
-
- voice.block_header = ram [voice.addr++];
- voice.block_remain = 16; // nybbles
- }
-
- // if next block has end flag set, *this* block ends *early* (verified)
- if ( voice.block_remain == 9 && (ram [voice.addr + 5] & 3) == 1 &&
- (voice.block_header & 3) != 3 )
- {
- sample_ended:
- g.wave_ended |= vbit;
- keys &= ~vbit;
- raw_voice.envx = 0;
- voice.envx = 0;
- // add silence samples to interpolation buffer
- do
- {
- voice.interp3 = voice.interp2;
- voice.interp2 = voice.interp1;
- voice.interp1 = voice.interp0;
- voice.interp0 = 0;
- }
- while ( --n >= 0 );
- break;
- }
-
- int delta = ram [voice.addr];
- if ( voice.block_remain & 1 )
- {
- delta <<= 4; // use lower nybble
- voice.addr++;
- }
-
- // Use sign-extended upper nybble
- delta = int8_t (delta) >> 4;
-
- // For invalid ranges (D,E,F): if the nybble is negative,
- // the result is F000. If positive, 0000. Nothing else
- // like previous range, etc seems to have any effect. If
- // range is valid, do the shift normally. Note these are
- // both shifted right once to do the filters properly, but
- // the output will be shifted back again at the end.
- int shift = voice.block_header >> 4;
- delta = (delta << shift) >> 1;
- if ( shift > 0x0C )
- delta = (delta >> 14) & ~0x7FF;
-
- // One, two and three point IIR filters
- int smp1 = voice.interp0;
- int smp2 = voice.interp1;
- if ( voice.block_header & 8 )
- {
- delta += smp1;
- delta -= smp2 >> 1;
- if ( !(voice.block_header & 4) )
- {
- delta += (-smp1 - (smp1 >> 1)) >> 5;
- delta += smp2 >> 5;
- }
- else
- {
- delta += (-smp1 * 13) >> 7;
- delta += (smp2 + (smp2 >> 1)) >> 4;
- }
- }
- else if ( voice.block_header & 4 )
- {
- delta += smp1 >> 1;
- delta += (-smp1) >> 5;
- }
-
- voice.interp3 = voice.interp2;
- voice.interp2 = smp2;
- voice.interp1 = smp1;
- voice.interp0 = BOOST::int16_t (clamp_16( delta ) * 2); // sign-extend
- }
-
- // rate (with possible modulation)
- int rate = GET_LE16( raw_voice.rate ) & 0x3FFF;
- if ( g.pitch_mods & vbit )
- rate = (rate * (prev_outx + 32768)) >> 15;
-
- // Gaussian interpolation using most recent 4 samples
- int index = voice.fraction >> 2 & 0x3FC;
- voice.fraction = (voice.fraction & 0x0FFF) + rate;
- const BOOST::int16_t* table = (BOOST::int16_t const*) ((char const*) gauss + index);
- const BOOST::int16_t* table2 = (BOOST::int16_t const*) ((char const*) gauss + (255*4 - index));
- int s = ((table [0] * voice.interp3) >> 12) +
- ((table [1] * voice.interp2) >> 12) +
- ((table2 [1] * voice.interp1) >> 12);
- s = (BOOST::int16_t) (s * 2);
- s += (table2 [0] * voice.interp0) >> 11 & ~1;
- int output = clamp_16( s );
- if ( g.noise_enables & vbit )
- output = noise_amp;
-
- // scale output and set outx values
- output = (output * envx) >> 11 & ~1;
-
- // output and apply muting (by setting voice.enabled to 31)
- // if voice is externally disabled (not a SNES feature)
- int l = (voice.volume [0] * output) >> voice.enabled;
- int r = (voice.volume [1] * output) >> voice.enabled;
- prev_outx = output;
- raw_voice.outx = int8_t (output >> 8);
- if ( g.echo_ons & vbit )
- {
- echol += l;
- echor += r;
- }
- left += l;
- right += r;
- }
- // end of channel loop
-
- // main volume control
- left = (left * left_volume ) >> (7 + emu_gain_bits);
- right = (right * right_volume) >> (7 + emu_gain_bits);
-
- // Echo FIR filter
-
- // read feedback from echo buffer
- int echo_ptr = this->echo_ptr;
- uint8_t* echo_buf = &ram [(g.echo_page * 0x100 + echo_ptr) & 0xFFFF];
- echo_ptr += 4;
- if ( echo_ptr >= (g.echo_delay & 15) * 0x800 )
- echo_ptr = 0;
- int fb_left = (BOOST::int16_t) GET_LE16( echo_buf ); // sign-extend
- int fb_right = (BOOST::int16_t) GET_LE16( echo_buf + 2 ); // sign-extend
- this->echo_ptr = echo_ptr;
-
- // put samples in history ring buffer
- const int fir_offset = this->fir_offset;
- short (*fir_pos) [2] = &fir_buf [fir_offset];
- this->fir_offset = (fir_offset + 7) & 7; // move backwards one step
- fir_pos [0] [0] = (short) fb_left;
- fir_pos [0] [1] = (short) fb_right;
- fir_pos [8] [0] = (short) fb_left; // duplicate at +8 eliminates wrap checking below
- fir_pos [8] [1] = (short) fb_right;
-
- // FIR
- fb_left = fb_left * fir_coeff [7] +
- fir_pos [1] [0] * fir_coeff [6] +
- fir_pos [2] [0] * fir_coeff [5] +
- fir_pos [3] [0] * fir_coeff [4] +
- fir_pos [4] [0] * fir_coeff [3] +
- fir_pos [5] [0] * fir_coeff [2] +
- fir_pos [6] [0] * fir_coeff [1] +
- fir_pos [7] [0] * fir_coeff [0];
-
- fb_right = fb_right * fir_coeff [7] +
- fir_pos [1] [1] * fir_coeff [6] +
- fir_pos [2] [1] * fir_coeff [5] +
- fir_pos [3] [1] * fir_coeff [4] +
- fir_pos [4] [1] * fir_coeff [3] +
- fir_pos [5] [1] * fir_coeff [2] +
- fir_pos [6] [1] * fir_coeff [1] +
- fir_pos [7] [1] * fir_coeff [0];
-
- left += (fb_left * g.left_echo_volume ) >> 14;
- right += (fb_right * g.right_echo_volume) >> 14;
-
- // echo buffer feedback
- if ( !(g.flags & 0x20) )
- {
- echol += (fb_left * g.echo_feedback) >> 14;
- echor += (fb_right * g.echo_feedback) >> 14;
- SET_LE16( echo_buf , clamp_16( echol ) );
- SET_LE16( echo_buf + 2, clamp_16( echor ) );
- }
-
- if ( out_buf )
- {
- // write final samples
-
- left = clamp_16( left );
- right = clamp_16( right );
-
- int mute = g.flags & 0x40;
-
- out_buf [0] = (short) left;
- out_buf [1] = (short) right;
- out_buf += 2;
-
- // muting
- if ( mute )
- {
- out_buf [-2] = 0;
- out_buf [-1] = 0;
- }
- }
- }
-}
-
-// Base normal_gauss table is almost exactly (with an error of 0 or -1 for each entry):
-// int normal_gauss [512];
-// normal_gauss [i] = exp((i-511)*(i-511)*-9.975e-6)*pow(sin(0.00307096*i),1.7358)*1304.45
-
-// Interleved gauss table (to improve cache coherency).
-// gauss [i * 2 + j] = normal_gauss [(1 - j) * 256 + i]
-const BOOST::int16_t Spc_Dsp::gauss [512] =
-{
- 370,1305, 366,1305, 362,1304, 358,1304, 354,1304, 351,1304, 347,1304, 343,1303,
- 339,1303, 336,1303, 332,1302, 328,1302, 325,1301, 321,1300, 318,1300, 314,1299,
- 311,1298, 307,1297, 304,1297, 300,1296, 297,1295, 293,1294, 290,1293, 286,1292,
- 283,1291, 280,1290, 276,1288, 273,1287, 270,1286, 267,1284, 263,1283, 260,1282,
- 257,1280, 254,1279, 251,1277, 248,1275, 245,1274, 242,1272, 239,1270, 236,1269,
- 233,1267, 230,1265, 227,1263, 224,1261, 221,1259, 218,1257, 215,1255, 212,1253,
- 210,1251, 207,1248, 204,1246, 201,1244, 199,1241, 196,1239, 193,1237, 191,1234,
- 188,1232, 186,1229, 183,1227, 180,1224, 178,1221, 175,1219, 173,1216, 171,1213,
- 168,1210, 166,1207, 163,1205, 161,1202, 159,1199, 156,1196, 154,1193, 152,1190,
- 150,1186, 147,1183, 145,1180, 143,1177, 141,1174, 139,1170, 137,1167, 134,1164,
- 132,1160, 130,1157, 128,1153, 126,1150, 124,1146, 122,1143, 120,1139, 118,1136,
- 117,1132, 115,1128, 113,1125, 111,1121, 109,1117, 107,1113, 106,1109, 104,1106,
- 102,1102, 100,1098, 99,1094, 97,1090, 95,1086, 94,1082, 92,1078, 90,1074,
- 89,1070, 87,1066, 86,1061, 84,1057, 83,1053, 81,1049, 80,1045, 78,1040,
- 77,1036, 76,1032, 74,1027, 73,1023, 71,1019, 70,1014, 69,1010, 67,1005,
- 66,1001, 65, 997, 64, 992, 62, 988, 61, 983, 60, 978, 59, 974, 58, 969,
- 56, 965, 55, 960, 54, 955, 53, 951, 52, 946, 51, 941, 50, 937, 49, 932,
- 48, 927, 47, 923, 46, 918, 45, 913, 44, 908, 43, 904, 42, 899, 41, 894,
- 40, 889, 39, 884, 38, 880, 37, 875, 36, 870, 36, 865, 35, 860, 34, 855,
- 33, 851, 32, 846, 32, 841, 31, 836, 30, 831, 29, 826, 29, 821, 28, 816,
- 27, 811, 27, 806, 26, 802, 25, 797, 24, 792, 24, 787, 23, 782, 23, 777,
- 22, 772, 21, 767, 21, 762, 20, 757, 20, 752, 19, 747, 19, 742, 18, 737,
- 17, 732, 17, 728, 16, 723, 16, 718, 15, 713, 15, 708, 15, 703, 14, 698,
- 14, 693, 13, 688, 13, 683, 12, 678, 12, 674, 11, 669, 11, 664, 11, 659,
- 10, 654, 10, 649, 10, 644, 9, 640, 9, 635, 9, 630, 8, 625, 8, 620,
- 8, 615, 7, 611, 7, 606, 7, 601, 6, 596, 6, 592, 6, 587, 6, 582,
- 5, 577, 5, 573, 5, 568, 5, 563, 4, 559, 4, 554, 4, 550, 4, 545,
- 4, 540, 3, 536, 3, 531, 3, 527, 3, 522, 3, 517, 2, 513, 2, 508,
- 2, 504, 2, 499, 2, 495, 2, 491, 2, 486, 1, 482, 1, 477, 1, 473,
- 1, 469, 1, 464, 1, 460, 1, 456, 1, 451, 1, 447, 1, 443, 1, 439,
- 0, 434, 0, 430, 0, 426, 0, 422, 0, 418, 0, 414, 0, 410, 0, 405,
- 0, 401, 0, 397, 0, 393, 0, 389, 0, 385, 0, 381, 0, 378, 0, 374,
-};
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.h
deleted file mode 100644
index 36492275..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Dsp.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Super Nintendo (SNES) SPC DSP emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SPC_DSP_H
-#define SPC_DSP_H
-
-#include "blargg_common.h"
-
-class Spc_Dsp {
- typedef BOOST::int8_t int8_t;
- typedef BOOST::uint8_t uint8_t;
-public:
-
- // Keeps pointer to 64K ram
- Spc_Dsp( uint8_t* ram );
-
- // Mute voice n if bit n (1 << n) of mask is clear.
- enum { voice_count = 8 };
- void mute_voices( int mask );
-
- // Clear state and silence everything.
- void reset();
-
- // Set gain, where 1.0 is normal. When greater than 1.0, output is clamped to
- // the 16-bit sample range.
- void set_gain( double );
-
- // If true, prevent channels and global volumes from being phase-negated
- void disable_surround( bool disable );
-
- // Read/write register 'n', where n ranges from 0 to register_count - 1.
- enum { register_count = 128 };
- int read ( int n );
- void write( int n, int );
-
- // Run DSP for 'count' samples. Write resulting samples to 'buf' if not NULL.
- void run( long count, short* buf = NULL );
-
-
-// End of public interface
-private:
-
- struct raw_voice_t {
- int8_t left_vol;
- int8_t right_vol;
- uint8_t rate [2];
- uint8_t waveform;
- uint8_t adsr [2]; // envelope rates for attack, decay, and sustain
- uint8_t gain; // envelope gain (if not using ADSR)
- int8_t envx; // current envelope level
- int8_t outx; // current sample
- int8_t unused [6];
- };
-
- struct globals_t {
- int8_t unused1 [12];
- int8_t left_volume; // 0C Main Volume Left (-.7)
- int8_t echo_feedback; // 0D Echo Feedback (-.7)
- int8_t unused2 [14];
- int8_t right_volume; // 1C Main Volume Right (-.7)
- int8_t unused3 [15];
- int8_t left_echo_volume; // 2C Echo Volume Left (-.7)
- uint8_t pitch_mods; // 2D Pitch Modulation on/off for each voice
- int8_t unused4 [14];
- int8_t right_echo_volume; // 3C Echo Volume Right (-.7)
- uint8_t noise_enables; // 3D Noise output on/off for each voice
- int8_t unused5 [14];
- uint8_t key_ons; // 4C Key On for each voice
- uint8_t echo_ons; // 4D Echo on/off for each voice
- int8_t unused6 [14];
- uint8_t key_offs; // 5C key off for each voice (instantiates release mode)
- uint8_t wave_page; // 5D source directory (wave table offsets)
- int8_t unused7 [14];
- uint8_t flags; // 6C flags and noise freq
- uint8_t echo_page; // 6D
- int8_t unused8 [14];
- uint8_t wave_ended; // 7C
- uint8_t echo_delay; // 7D ms >> 4
- char unused9 [2];
- };
-
- union {
- raw_voice_t voice [voice_count];
- uint8_t reg [register_count];
- globals_t g;
- };
-
- uint8_t* const ram;
-
- // Cache of echo FIR values for faster access
- short fir_coeff [voice_count];
-
- // fir_buf [i + 8] == fir_buf [i], to avoid wrap checking in FIR code
- short fir_buf [16] [2];
- int fir_offset; // (0 to 7)
-
- enum { emu_gain_bits = 8 };
- int emu_gain;
-
- int keyed_on; // 8-bits for 8 voices
- int keys;
-
- int echo_ptr;
- int noise_amp;
- int noise;
- int noise_count;
-
- int surround_threshold;
-
- static BOOST::int16_t const gauss [];
-
- enum state_t {
- state_attack,
- state_decay,
- state_sustain,
- state_release
- };
-
- struct voice_t {
- short volume [2];
- short fraction;// 12-bit fractional position
- short interp3; // most recent four decoded samples
- short interp2;
- short interp1;
- short interp0;
- short block_remain; // number of nybbles remaining in current block
- unsigned short addr;
- short block_header; // header byte from current block
- short envcnt;
- short envx;
- short on_cnt;
- short enabled; // 7 if enabled, 31 if disabled
- short envstate;
- short unused; // pad to power of 2
- };
-
- voice_t voice_state [voice_count];
-
- int clock_envelope( int );
-};
-
-inline void Spc_Dsp::disable_surround( bool disable ) { surround_threshold = disable ? 0 : -0x7FFF; }
-
-inline void Spc_Dsp::set_gain( double v ) { emu_gain = (int) (v * (1 << emu_gain_bits)); }
-
-inline int Spc_Dsp::read( int i )
-{
- assert( (unsigned) i < register_count );
- return reg [i];
-}
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.h
deleted file mode 100644
index 44b54c30..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Super Nintendo SPC music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef SPC_EMU_H
-#define SPC_EMU_H
-
-#include "Fir_Resampler.h"
-#include "Music_Emu.h"
-#include "Snes_Spc.h"
-
-class Spc_Emu : public Music_Emu {
-public:
- // The Super Nintendo hardware samples at 32kHz. Other sample rates are
- // handled by resampling the 32kHz output; emulation accuracy is not affected.
- enum { native_sample_rate = 32000 };
-
- // SPC file header
- enum { header_size = 0x100 };
- struct header_t
- {
- char tag [35];
- byte format;
- byte version;
- byte pc [2];
- byte a, x, y, psw, sp;
- byte unused [2];
- char song [32];
- char game [32];
- char dumper [16];
- char comment [32];
- byte date [11];
- byte len_secs [3];
- byte fade_msec [4];
- char author [32]; // sometimes first char should be skipped (see official SPC spec)
- byte mute_mask;
- byte emulator;
- byte unused2 [46];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return *(header_t const*) file_data; }
-
- // Prevents channels and global volumes from being phase-negated
- void disable_surround( bool disable = true );
-
- static gme_type_t static_type() { return gme_spc_type; }
-
-public:
- // deprecated
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
- byte const* trailer() const; // use track_info()
- long trailer_size() const;
-
-public:
- Spc_Emu();
- ~Spc_Emu();
-protected:
- blargg_err_t load_mem_( byte const*, long );
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t set_sample_rate_( long );
- blargg_err_t start_track_( int );
- blargg_err_t play_( long, sample_t* );
- blargg_err_t skip_( long );
- void mute_voices_( int );
- void set_tempo_( double );
-private:
- byte const* file_data;
- long file_size;
- Fir_Resampler<24> resampler;
- Snes_Spc apu;
-};
-
-inline void Spc_Emu::disable_surround( bool b ) { apu.disable_surround( b ); }
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.cpp
deleted file mode 100644
index 0fef6bd9..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.cpp
+++ /dev/null
@@ -1,412 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Vgm_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-#include <math.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-double const fm_gain = 3.0; // FM emulators are internally quieter to avoid 16-bit overflow
-double const rolloff = 0.990;
-double const oversample_factor = 1.5;
-
-Vgm_Emu::Vgm_Emu()
-{
- disable_oversampling_ = false;
- psg_rate = 0;
- set_type( gme_vgm_type );
-
- static int const types [8] = {
- wave_type | 1, wave_type | 0, wave_type | 2, noise_type | 0
- };
- set_voice_types( types );
-
- set_silence_lookahead( 1 ); // tracks should already be trimmed
-
- static equalizer_t const eq = { -14.0, 80 };
- set_equalizer( eq );
-}
-
-Vgm_Emu::~Vgm_Emu() { }
-
-// Track info
-
-static byte const* skip_gd3_str( byte const* in, byte const* end )
-{
- while ( end - in >= 2 )
- {
- in += 2;
- if ( !(in [-2] | in [-1]) )
- break;
- }
- return in;
-}
-
-static byte const* get_gd3_str( byte const* in, byte const* end, char* field )
-{
- byte const* mid = skip_gd3_str( in, end );
- int len = (mid - in) / 2 - 1;
- if ( len > 0 )
- {
- len = min( len, (int) Gme_File::max_field_ );
- field [len] = 0;
- for ( int i = 0; i < len; i++ )
- field [i] = (in [i * 2 + 1] ? '?' : in [i * 2]); // TODO: convert to utf-8
- }
- return mid;
-}
-
-static byte const* get_gd3_pair( byte const* in, byte const* end, char* field )
-{
- return skip_gd3_str( get_gd3_str( in, end, field ), end );
-}
-
-static void parse_gd3( byte const* in, byte const* end, track_info_t* out )
-{
- in = get_gd3_pair( in, end, out->song );
- in = get_gd3_pair( in, end, out->game );
- in = get_gd3_pair( in, end, out->system );
- in = get_gd3_pair( in, end, out->author );
- in = get_gd3_str ( in, end, out->copyright );
- in = get_gd3_pair( in, end, out->dumper );
- in = get_gd3_str ( in, end, out->comment );
-}
-
-int const gd3_header_size = 12;
-
-static long check_gd3_header( byte const* h, long remain )
-{
- if ( remain < gd3_header_size ) return 0;
- if ( memcmp( h, "Gd3 ", 4 ) ) return 0;
- if ( get_le32( h + 4 ) >= 0x200 ) return 0;
-
- long gd3_size = get_le32( h + 8 );
- if ( gd3_size > remain - gd3_header_size ) return 0;
-
- return gd3_size;
-}
-
-byte const* Vgm_Emu::gd3_data( int* size ) const
-{
- if ( size )
- *size = 0;
-
- long gd3_offset = get_le32( header().gd3_offset ) - 0x2C;
- if ( gd3_offset < 0 )
- return 0;
-
- byte const* gd3 = data + header_size + gd3_offset;
- long gd3_size = check_gd3_header( gd3, data_end - gd3 );
- if ( !gd3_size )
- return 0;
-
- if ( size )
- *size = gd3_size + gd3_header_size;
-
- return gd3;
-}
-
-static void get_vgm_length( Vgm_Emu::header_t const& h, track_info_t* out )
-{
- long length = get_le32( h.track_duration ) * 10 / 441;
- if ( length > 0 )
- {
- long loop = get_le32( h.loop_duration );
- if ( loop > 0 && get_le32( h.loop_offset ) )
- {
- out->loop_length = loop * 10 / 441;
- out->intro_length = length - out->loop_length;
- }
- else
- {
- out->length = length; // 1000 / 44100 (VGM files used 44100 as timebase)
- out->intro_length = length; // make it clear that track is no longer than length
- out->loop_length = 0;
- }
- }
-}
-
-blargg_err_t Vgm_Emu::track_info_( track_info_t* out, int ) const
-{
- get_vgm_length( header(), out );
-
- int size;
- byte const* gd3 = gd3_data( &size );
- if ( gd3 )
- parse_gd3( gd3 + gd3_header_size, gd3 + size, out );
-
- return 0;
-}
-
-static blargg_err_t check_vgm_header( Vgm_Emu::header_t const& h )
-{
- if ( memcmp( h.tag, "Vgm ", 4 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Vgm_File : Gme_Info_
-{
- Vgm_Emu::header_t h;
- blargg_vector<byte> gd3;
-
- Vgm_File() { set_type( gme_vgm_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- long file_size = in.remain();
- if ( file_size <= Vgm_Emu::header_size )
- return gme_wrong_file_type;
-
- RETURN_ERR( in.read( &h, Vgm_Emu::header_size ) );
- RETURN_ERR( check_vgm_header( h ) );
-
- long gd3_offset = get_le32( h.gd3_offset ) - 0x2C;
- long remain = file_size - Vgm_Emu::header_size - gd3_offset;
- byte gd3_h [gd3_header_size];
- if ( gd3_offset > 0 && remain >= gd3_header_size )
- {
- RETURN_ERR( in.skip( gd3_offset ) );
- RETURN_ERR( in.read( gd3_h, sizeof gd3_h ) );
- long gd3_size = check_gd3_header( gd3_h, remain );
- if ( gd3_size )
- {
- RETURN_ERR( gd3.resize( gd3_size ) );
- RETURN_ERR( in.read( gd3.begin(), gd3.size() ) );
- }
- }
- return 0;
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- get_vgm_length( h, out );
- if ( gd3.size() )
- parse_gd3( gd3.begin(), gd3.end(), out );
- return 0;
- }
-};
-
-static Music_Emu* new_vgm_emu () { return BLARGG_NEW Vgm_Emu ; }
-static Music_Emu* new_vgm_file() { return BLARGG_NEW Vgm_File; }
-
-gme_type_t_ const gme_vgm_type [1] = { "Sega SMS/Genesis", 1, &new_vgm_emu, &new_vgm_file, "VGM", 1 };
-gme_type_t_ const gme_vgz_type [1] = { "Sega SMS/Genesis", 1, &new_vgm_emu, &new_vgm_file, "VGZ", 1 };
-
-// Setup
-
-void Vgm_Emu::set_tempo_( double t )
-{
- if ( psg_rate )
- {
- vgm_rate = (long) (44100 * t + 0.5);
- blip_time_factor = (long) floor( double (1L << blip_time_bits) / vgm_rate * psg_rate + 0.5 );
- //dprintf( "blip_time_factor: %ld\n", blip_time_factor );
- //dprintf( "vgm_rate: %ld\n", vgm_rate );
- // TODO: remove? calculates vgm_rate more accurately (above differs at most by one Hz only)
- //blip_time_factor = (long) floor( double (1L << blip_time_bits) * psg_rate / 44100 / t + 0.5 );
- //vgm_rate = (long) floor( double (1L << blip_time_bits) * psg_rate / blip_time_factor + 0.5 );
-
- fm_time_factor = 2 + (long) floor( fm_rate * (1L << fm_time_bits) / vgm_rate + 0.5 );
- }
-}
-
-blargg_err_t Vgm_Emu::set_sample_rate_( long sample_rate )
-{
- RETURN_ERR( blip_buf.set_sample_rate( sample_rate, 1000 / 30 ) );
- return Classic_Emu::set_sample_rate_( sample_rate );
-}
-
-void Vgm_Emu::update_eq( blip_eq_t const& eq )
-{
- psg.treble_eq( eq );
- dac_synth.treble_eq( eq );
-}
-
-void Vgm_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
-{
- if ( i < psg.osc_count )
- psg.osc_output( i, c, l, r );
-}
-
-void Vgm_Emu::mute_voices_( int mask )
-{
- Classic_Emu::mute_voices_( mask );
- dac_synth.output( &blip_buf );
- if ( uses_fm )
- {
- psg.output( (mask & 0x80) ? 0 : &blip_buf );
- if ( ym2612.enabled() )
- {
- dac_synth.volume( (mask & 0x40) ? 0.0 : 0.1115 / 256 * fm_gain * gain() );
- ym2612.mute_voices( mask );
- }
-
- if ( ym2413.enabled() )
- {
- int m = mask & 0x3F;
- if ( mask & 0x20 )
- m |= 0x01E0; // channels 5-8
- if ( mask & 0x40 )
- m |= 0x3E00;
- ym2413.mute_voices( m );
- }
- }
-}
-
-blargg_err_t Vgm_Emu::load_mem_( byte const* new_data, long new_size )
-{
- assert( offsetof (header_t,unused2 [8]) == header_size );
-
- if ( new_size <= header_size )
- return gme_wrong_file_type;
-
- header_t const& h = *(header_t const*) new_data;
-
- RETURN_ERR( check_vgm_header( h ) );
-
- check( get_le32( h.version ) <= 0x150 );
-
- // psg rate
- psg_rate = get_le32( h.psg_rate );
- if ( !psg_rate )
- psg_rate = 3579545;
- blip_buf.clock_rate( psg_rate );
-
- data = new_data;
- data_end = new_data + new_size;
-
- // get loop
- loop_begin = data_end;
- if ( get_le32( h.loop_offset ) )
- loop_begin = &data [get_le32( h.loop_offset ) + offsetof (header_t,loop_offset)];
-
- set_voice_count( psg.osc_count );
-
- RETURN_ERR( setup_fm() );
-
- static const char* const fm_names [] = {
- "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "PCM", "PSG"
- };
- static const char* const psg_names [] = { "Square 1", "Square 2", "Square 3", "Noise" };
- set_voice_names( uses_fm ? fm_names : psg_names );
-
- // do after FM in case output buffer is changed
- return Classic_Emu::setup_buffer( psg_rate );
-}
-
-blargg_err_t Vgm_Emu::setup_fm()
-{
- long ym2612_rate = get_le32( header().ym2612_rate );
- long ym2413_rate = get_le32( header().ym2413_rate );
- if ( ym2413_rate && get_le32( header().version ) < 0x110 )
- update_fm_rates( &ym2413_rate, &ym2612_rate );
-
- uses_fm = false;
-
- fm_rate = blip_buf.sample_rate() * oversample_factor;
-
- if ( ym2612_rate )
- {
- uses_fm = true;
- if ( disable_oversampling_ )
- fm_rate = ym2612_rate / 144.0;
- Dual_Resampler::setup( fm_rate / blip_buf.sample_rate(), rolloff, fm_gain * gain() );
- RETURN_ERR( ym2612.set_rate( fm_rate, ym2612_rate ) );
- ym2612.enable( true );
- set_voice_count( 8 );
- }
-
- if ( !uses_fm && ym2413_rate )
- {
- uses_fm = true;
- if ( disable_oversampling_ )
- fm_rate = ym2413_rate / 72.0;
- Dual_Resampler::setup( fm_rate / blip_buf.sample_rate(), rolloff, fm_gain * gain() );
- int result = ym2413.set_rate( fm_rate, ym2413_rate );
- if ( result == 2 )
- return "YM2413 FM sound isn't supported";
- CHECK_ALLOC( !result );
- ym2413.enable( true );
- set_voice_count( 8 );
- }
-
- if ( uses_fm )
- {
- RETURN_ERR( Dual_Resampler::reset( blip_buf.length() * blip_buf.sample_rate() / 1000 ) );
- psg.volume( 0.135 * fm_gain * gain() );
- }
- else
- {
- ym2612.enable( false );
- ym2413.enable( false );
- psg.volume( gain() );
- }
-
- return 0;
-}
-
-// Emulation
-
-blargg_err_t Vgm_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
- psg.reset( get_le16( header().noise_feedback ), header().noise_width );
-
- dac_disabled = -1;
- pos = data + header_size;
- pcm_data = pos;
- pcm_pos = pos;
- dac_amp = -1;
- vgm_time = 0;
- if ( get_le32( header().version ) >= 0x150 )
- {
- long data_offset = get_le32( header().data_offset );
- check( data_offset );
- if ( data_offset )
- pos += data_offset + offsetof (header_t,data_offset) - 0x40;
- }
-
- if ( uses_fm )
- {
- if ( ym2413.enabled() )
- ym2413.reset();
-
- if ( ym2612.enabled() )
- ym2612.reset();
-
- fm_time_offset = 0;
- blip_buf.clear();
- Dual_Resampler::clear();
- }
- return 0;
-}
-
-blargg_err_t Vgm_Emu::run_clocks( blip_time_t& time_io, int msec )
-{
- time_io = run_commands( msec * vgm_rate / 1000 );
- psg.end_frame( time_io );
- return 0;
-}
-
-blargg_err_t Vgm_Emu::play_( long count, sample_t* out )
-{
- if ( !uses_fm )
- return Classic_Emu::play_( count, out );
-
- Dual_Resampler::dual_play( count, out, blip_buf );
- return 0;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.h
deleted file mode 100644
index bcb784d5..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu.h
+++ /dev/null
@@ -1,84 +0,0 @@
-// Sega Master System/Mark III, Sega Genesis/Mega Drive, BBC Micro VGM music file emulator
-
-// Game_Music_Emu 0.5.2
-#ifndef VGM_EMU_H
-#define VGM_EMU_H
-
-#include "Vgm_Emu_Impl.h"
-
-// Emulates VGM music using SN76489/SN76496 PSG, YM2612, and YM2413 FM sound chips.
-// Supports custom sound buffer and frequency equalization when VGM uses just the PSG.
-// FM sound chips can be run at their proper rates, or slightly higher to reduce
-// aliasing on high notes. Currently YM2413 support requires that you supply a
-// YM2413 sound chip emulator. I can provide one I've modified to work with the library.
-class Vgm_Emu : public Vgm_Emu_Impl {
-public:
- // True if custom buffer and custom equalization are supported
- // TODO: move into Music_Emu and rename to something like supports_custom_buffer()
- bool is_classic_emu() const { return !uses_fm; }
-
- // Disable running FM chips at higher than normal rate. Will result in slightly
- // more aliasing of high notes.
- void disable_oversampling( bool disable = true ) { disable_oversampling_ = disable; }
-
- // VGM header format
- enum { header_size = 0x40 };
- struct header_t
- {
- char tag [4];
- byte data_size [4];
- byte version [4];
- byte psg_rate [4];
- byte ym2413_rate [4];
- byte gd3_offset [4];
- byte track_duration [4];
- byte loop_offset [4];
- byte loop_duration [4];
- byte frame_rate [4];
- byte noise_feedback [2];
- byte noise_width;
- byte unused1;
- byte ym2612_rate [4];
- byte ym2151_rate [4];
- byte data_offset [4];
- byte unused2 [8];
- };
-
- // Header for currently loaded file
- header_t const& header() const { return *(header_t const*) data; }
-
- static gme_type_t static_type() { return gme_vgm_type; }
-
-public:
- // deprecated
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
- byte const* gd3_data( int* size_out = 0 ) const; // use track_info()
-
-public:
- Vgm_Emu();
- ~Vgm_Emu();
-protected:
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t load_mem_( byte const*, long );
- blargg_err_t set_sample_rate_( long sample_rate );
- blargg_err_t start_track_( int );
- blargg_err_t play_( long count, sample_t* );
- blargg_err_t run_clocks( blip_time_t&, int );
- void set_tempo_( double );
- void mute_voices_( int mask );
- void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
- void update_eq( blip_eq_t const& );
-private:
- // removed; use disable_oversampling() and set_tempo() instead
- Vgm_Emu( bool oversample, double tempo = 1.0 );
- double fm_rate;
- long psg_rate;
- long vgm_rate;
- bool disable_oversampling_;
- bool uses_fm;
- blargg_err_t setup_fm();
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.cpp
deleted file mode 100644
index a2d7c93e..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Vgm_Emu.h"
-
-#include <math.h>
-#include <string.h>
-#include "blargg_endian.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-enum {
- cmd_gg_stereo = 0x4F,
- cmd_psg = 0x50,
- cmd_ym2413 = 0x51,
- cmd_ym2612_port0 = 0x52,
- cmd_ym2612_port1 = 0x53,
- cmd_ym2151 = 0x54,
- cmd_delay = 0x61,
- cmd_delay_735 = 0x62,
- cmd_delay_882 = 0x63,
- cmd_byte_delay = 0x64,
- cmd_end = 0x66,
- cmd_data_block = 0x67,
- cmd_short_delay = 0x70,
- cmd_pcm_delay = 0x80,
- cmd_pcm_seek = 0xE0,
-
- pcm_block_type = 0x00,
- ym2612_dac_port = 0x2A
-};
-
-inline int command_len( int command )
-{
- switch ( command >> 4 )
- {
- case 0x03:
- case 0x04:
- return 2;
-
- case 0x05:
- case 0x0A:
- case 0x0B:
- return 3;
-
- case 0x0C:
- case 0x0D:
- return 4;
-
- case 0x0E:
- case 0x0F:
- return 5;
- }
-
- check( false );
- return 1;
-}
-
-template<class Emu>
-inline void Ym_Emu<Emu>::begin_frame( short* p )
-{
- require( enabled() );
- out = p;
- last_time = 0;
-}
-
-template<class Emu>
-inline int Ym_Emu<Emu>::run_until( int time )
-{
- int count = time - last_time;
- if ( count > 0 )
- {
- if ( last_time < 0 )
- return false;
- last_time = time;
- short* p = out;
- out += count * Emu::out_chan_count;
- Emu::run( count, p );
- }
- return true;
-}
-
-inline Vgm_Emu_Impl::fm_time_t Vgm_Emu_Impl::to_fm_time( vgm_time_t t ) const
-{
- return (t * fm_time_factor + fm_time_offset) >> fm_time_bits;
-}
-
-inline blip_time_t Vgm_Emu_Impl::to_blip_time( vgm_time_t t ) const
-{
- return (t * blip_time_factor) >> blip_time_bits;
-}
-
-void Vgm_Emu_Impl::write_pcm( vgm_time_t vgm_time, int amp )
-{
- blip_time_t blip_time = to_blip_time( vgm_time );
- int old = dac_amp;
- int delta = amp - old;
- dac_amp = amp;
- if ( old >= 0 )
- dac_synth.offset_inline( blip_time, delta, &blip_buf );
- else
- dac_amp |= dac_disabled;
-}
-
-blip_time_t Vgm_Emu_Impl::run_commands( vgm_time_t end_time )
-{
- vgm_time_t vgm_time = this->vgm_time;
- byte const* pos = this->pos;
- if ( pos >= data_end )
- {
- set_track_ended();
- if ( pos > data_end )
- set_warning( "Stream lacked end event" );
- }
-
- while ( vgm_time < end_time && pos < data_end )
- {
- // TODO: be sure there are enough bytes left in stream for particular command
- // so we don't read past end
- switch ( *pos++ )
- {
- case cmd_end:
- pos = loop_begin; // if not looped, loop_begin == data_end
- break;
-
- case cmd_delay_735:
- vgm_time += 735;
- break;
-
- case cmd_delay_882:
- vgm_time += 882;
- break;
-
- case cmd_gg_stereo:
- psg.write_ggstereo( to_blip_time( vgm_time ), *pos++ );
- break;
-
- case cmd_psg:
- psg.write_data( to_blip_time( vgm_time ), *pos++ );
- break;
-
- case cmd_delay:
- vgm_time += pos [1] * 0x100L + pos [0];
- pos += 2;
- break;
-
- case cmd_byte_delay:
- vgm_time += *pos++;
- break;
-
- case cmd_ym2413:
- if ( ym2413.run_until( to_fm_time( vgm_time ) ) )
- ym2413.write( pos [0], pos [1] );
- pos += 2;
- break;
-
- case cmd_ym2612_port0:
- if ( pos [0] == ym2612_dac_port )
- {
- write_pcm( vgm_time, pos [1] );
- }
- else if ( ym2612.run_until( to_fm_time( vgm_time ) ) )
- {
- if ( pos [0] == 0x2B )
- {
- dac_disabled = (pos [1] >> 7 & 1) - 1;
- dac_amp |= dac_disabled;
- }
- ym2612.write0( pos [0], pos [1] );
- }
- pos += 2;
- break;
-
- case cmd_ym2612_port1:
- if ( ym2612.run_until( to_fm_time( vgm_time ) ) )
- ym2612.write1( pos [0], pos [1] );
- pos += 2;
- break;
-
- case cmd_data_block: {
- check( *pos == cmd_end );
- int type = pos [1];
- long size = get_le32( pos + 2 );
- pos += 6;
- if ( type == pcm_block_type )
- pcm_data = pos;
- pos += size;
- break;
- }
-
- case cmd_pcm_seek:
- pcm_pos = pcm_data + pos [3] * 0x1000000L + pos [2] * 0x10000L +
- pos [1] * 0x100L + pos [0];
- pos += 4;
- break;
-
- default:
- int cmd = pos [-1];
- switch ( cmd & 0xF0 )
- {
- case cmd_pcm_delay:
- write_pcm( vgm_time, *pcm_pos++ );
- vgm_time += cmd & 0x0F;
- break;
-
- case cmd_short_delay:
- vgm_time += (cmd & 0x0F) + 1;
- break;
-
- case 0x50:
- pos += 2;
- break;
-
- default:
- pos += command_len( cmd ) - 1;
- set_warning( "Unknown stream event" );
- }
- }
- }
- vgm_time -= end_time;
- this->pos = pos;
- this->vgm_time = vgm_time;
-
- return to_blip_time( end_time );
-}
-
-int Vgm_Emu_Impl::play_frame( blip_time_t blip_time, int sample_count, sample_t* buf )
-{
- // to do: timing is working mostly by luck
-
- int min_pairs = sample_count >> 1;
- int vgm_time = ((long) min_pairs << fm_time_bits) / fm_time_factor - 1;
- assert( to_fm_time( vgm_time ) <= min_pairs );
- int pairs = min_pairs;
- while ( (pairs = to_fm_time( vgm_time )) < min_pairs )
- vgm_time++;
- //dprintf( "pairs: %d, min_pairs: %d\n", pairs, min_pairs );
-
- if ( ym2612.enabled() )
- {
- ym2612.begin_frame( buf );
- memset( buf, 0, pairs * stereo * sizeof *buf );
- }
- else if ( ym2413.enabled() )
- {
- ym2413.begin_frame( buf );
- }
-
- run_commands( vgm_time );
- ym2612.run_until( pairs );
- ym2413.run_until( pairs );
-
- fm_time_offset = (vgm_time * fm_time_factor + fm_time_offset) -
- ((long) pairs << fm_time_bits);
-
- psg.end_frame( blip_time );
-
- return pairs * stereo;
-}
-
-// Update pre-1.10 header FM rates by scanning commands
-void Vgm_Emu_Impl::update_fm_rates( long* ym2413_rate, long* ym2612_rate ) const
-{
- byte const* p = data + 0x40;
- while ( p < data_end )
- {
- switch ( *p )
- {
- case cmd_end:
- return;
-
- case cmd_psg:
- case cmd_byte_delay:
- p += 2;
- break;
-
- case cmd_delay:
- p += 3;
- break;
-
- case cmd_data_block:
- p += 7 + get_le32( p + 3 );
- break;
-
- case cmd_ym2413:
- *ym2612_rate = 0;
- return;
-
- case cmd_ym2612_port0:
- case cmd_ym2612_port1:
- *ym2612_rate = *ym2413_rate;
- *ym2413_rate = 0;
- return;
-
- case cmd_ym2151:
- *ym2413_rate = 0;
- *ym2612_rate = 0;
- return;
-
- default:
- p += command_len( *p );
- }
- }
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.h
deleted file mode 100644
index 4d387d09..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Vgm_Emu_Impl.h
+++ /dev/null
@@ -1,71 +0,0 @@
-// Low-level parts of Vgm_Emu
-
-// Game_Music_Emu 0.5.2
-#ifndef VGM_EMU_IMPL_H
-#define VGM_EMU_IMPL_H
-
-#include "Dual_Resampler.h"
-#include "Classic_Emu.h"
-#include "Ym2413_Emu.h"
-#include "Ym2612_Emu.h"
-#include "Sms_Apu.h"
-
-template<class Emu>
-class Ym_Emu : public Emu {
-protected:
- int last_time;
- short* out;
- enum { disabled_time = -1 };
-public:
- Ym_Emu() : last_time( disabled_time ), out( NULL ) { }
- void enable( bool b ) { last_time = b ? 0 : disabled_time; }
- bool enabled() const { return last_time != disabled_time; }
- void begin_frame( short* p );
- int run_until( int time );
-};
-
-class Vgm_Emu_Impl : public Classic_Emu, private Dual_Resampler {
-public:
- typedef Classic_Emu::sample_t sample_t;
-protected:
- enum { stereo = 2 };
-
- typedef int vgm_time_t;
-
- enum { fm_time_bits = 12 };
- typedef int fm_time_t;
- long fm_time_offset;
- int fm_time_factor;
- fm_time_t to_fm_time( vgm_time_t ) const;
-
- enum { blip_time_bits = 12 };
- int blip_time_factor;
- blip_time_t to_blip_time( vgm_time_t ) const;
-
- byte const* data;
- byte const* loop_begin;
- byte const* data_end;
- void update_fm_rates( long* ym2413_rate, long* ym2612_rate ) const;
-
- vgm_time_t vgm_time;
- byte const* pos;
- blip_time_t run_commands( vgm_time_t );
- int play_frame( blip_time_t blip_time, int sample_count, sample_t* buf );
-
- byte const* pcm_data;
- byte const* pcm_pos;
- int dac_amp;
- int dac_disabled; // -1 if disabled
- void write_pcm( vgm_time_t, int amp );
-
- Ym_Emu<Ym2612_Emu> ym2612;
- Ym_Emu<Ym2413_Emu> ym2413;
-
- Blip_Buffer blip_buf;
- Sms_Apu psg;
- Blip_Synth<blip_med_quality,1> dac_synth;
-
- friend class Vgm_Emu;
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.cpp
deleted file mode 100644
index ede67304..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-
-// Use in place of Ym2413_Emu.cpp and ym2413.c to disable support for this chip
-
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Ym2413_Emu.h"
-
-Ym2413_Emu::Ym2413_Emu() { }
-
-Ym2413_Emu::~Ym2413_Emu() { }
-
-int Ym2413_Emu::set_rate( double, double ) { return 2; }
-
-void Ym2413_Emu::reset() { }
-
-void Ym2413_Emu::write( int, int ) { }
-
-void Ym2413_Emu::mute_voices( int ) { }
-
-void Ym2413_Emu::run( int, sample_t* ) { }
-
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.cpp
deleted file mode 100644
index 41ebb093..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.cpp
+++ /dev/null
@@ -1,1319 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-// Based on Gens 2.10 ym2612.c
-
-#include "Ym2612_Emu.h"
-
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <stdio.h>
-#include <math.h>
-
-/* Copyright (C) 2002 Stphane Dallongeville (gens AT consolemul.com) */
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-// This is mostly the original source in its C style and all.
-//
-// Somewhat optimized and simplified. Uses a template to generate the many
-// variants of Update_Chan. Rewrote header file. In need of full rewrite by
-// someone more familiar with FM sound and the YM2612. Has some inaccuracies
-// compared to the Sega Genesis sound, particularly being mixed at such a
-// high sample accuracy (the Genesis sounds like it has only 8 bit samples).
-// - Shay
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-const int output_bits = 14;
-
-struct slot_t
-{
- const int *DT; // parametre detune
- int MUL; // parametre "multiple de frequence"
- int TL; // Total Level = volume lorsque l'enveloppe est au plus haut
- int TLL; // Total Level ajusted
- int SLL; // Sustin Level (ajusted) = volume o l'enveloppe termine sa premiere phase de regression
- int KSR_S; // Key Scale Rate Shift = facteur de prise en compte du KSL dans la variations de l'enveloppe
- int KSR; // Key Scale Rate = cette valeur est calculee par rapport la frequence actuelle, elle va influer
- // sur les differents parametres de l'enveloppe comme l'attaque, le decay ... comme dans la realite !
- int SEG; // Type enveloppe SSG
- int env_xor;
- int env_max;
-
- const int *AR; // Attack Rate (table pointeur) = Taux d'attaque (AR[KSR])
- const int *DR; // Decay Rate (table pointeur) = Taux pour la regression (DR[KSR])
- const int *SR; // Sustin Rate (table pointeur) = Taux pour le maintien (SR[KSR])
- const int *RR; // Release Rate (table pointeur) = Taux pour le rel'chement (RR[KSR])
- int Fcnt; // Frequency Count = compteur-frequence pour determiner l'amplitude actuelle (SIN[Finc >> 16])
- int Finc; // frequency step = pas d'incrementation du compteur-frequence
- // plus le pas est grand, plus la frequence est agu (ou haute)
- int Ecurp; // Envelope current phase = cette variable permet de savoir dans quelle phase
- // de l'enveloppe on se trouve, par exemple phase d'attaque ou phase de maintenue ...
- // en fonction de la valeur de cette variable, on va appeler une fonction permettant
- // de mettre jour l'enveloppe courante.
- int Ecnt; // Envelope counter = le compteur-enveloppe permet de savoir o l'on se trouve dans l'enveloppe
- int Einc; // Envelope step courant
- int Ecmp; // Envelope counter limite pour la prochaine phase
- int EincA; // Envelope step for Attack = pas d'incrementation du compteur durant la phase d'attaque
- // cette valeur est egal AR[KSR]
- int EincD; // Envelope step for Decay = pas d'incrementation du compteur durant la phase de regression
- // cette valeur est egal DR[KSR]
- int EincS; // Envelope step for Sustain = pas d'incrementation du compteur durant la phase de maintenue
- // cette valeur est egal SR[KSR]
- int EincR; // Envelope step for Release = pas d'incrementation du compteur durant la phase de rel'chement
- // cette valeur est egal RR[KSR]
- int *OUTp; // pointeur of SLOT output = pointeur permettant de connecter la sortie de ce slot l'entree
- // d'un autre ou carrement la sortie de la voie
- int INd; // input data of the slot = donnees en entree du slot
- int ChgEnM; // Change envelop mask.
- int AMS; // AMS depth level of this SLOT = degre de modulation de l'amplitude par le LFO
- int AMSon; // AMS enable flag = drapeau d'activation de l'AMS
-};
-
-struct channel_t
-{
- int S0_OUT[4]; // anciennes sorties slot 0 (pour le feed back)
- int LEFT; // LEFT enable flag
- int RIGHT; // RIGHT enable flag
- int ALGO; // Algorythm = determine les connections entre les operateurs
- int FB; // shift count of self feed back = degre de "Feed-Back" du SLOT 1 (il est son unique entree)
- int FMS; // Frequency Modulation Sensitivity of channel = degre de modulation de la frequence sur la voie par le LFO
- int AMS; // Amplitude Modulation Sensitivity of channel = degre de modulation de l'amplitude sur la voie par le LFO
- int FNUM[4]; // hauteur frequence de la voie (+ 3 pour le mode special)
- int FOCT[4]; // octave de la voie (+ 3 pour le mode special)
- int KC[4]; // Key Code = valeur fonction de la frequence (voir KSR pour les slots, KSR = KC >> KSR_S)
- slot_t SLOT[4]; // four slot.operators = les 4 slots de la voie
- int FFlag; // Frequency step recalculation flag
-};
-
-struct state_t
-{
- int TimerBase; // TimerBase calculation
- int Status; // YM2612 Status (timer overflow)
- int TimerA; // timerA limit = valeur jusqu' laquelle le timer A doit compter
- int TimerAL;
- int TimerAcnt; // timerA counter = valeur courante du Timer A
- int TimerB; // timerB limit = valeur jusqu' laquelle le timer B doit compter
- int TimerBL;
- int TimerBcnt; // timerB counter = valeur courante du Timer B
- int Mode; // Mode actuel des voie 3 et 6 (normal / special)
- int DAC; // DAC enabled flag
- channel_t CHANNEL[Ym2612_Emu::channel_count]; // Les 6 voies du YM2612
- int REG[2][0x100]; // Sauvegardes des valeurs de tout les registres, c'est facultatif
- // cela nous rend le debuggage plus facile
-};
-
-#ifndef PI
-#define PI 3.14159265358979323846
-#endif
-
-#define ATTACK 0
-#define DECAY 1
-#define SUBSTAIN 2
-#define RELEASE 3
-
-// SIN_LBITS <= 16
-// LFO_HBITS <= 16
-// (SIN_LBITS + SIN_HBITS) <= 26
-// (ENV_LBITS + ENV_HBITS) <= 28
-// (LFO_LBITS + LFO_HBITS) <= 28
-
-#define SIN_HBITS 12 // Sinus phase counter int part
-#define SIN_LBITS (26 - SIN_HBITS) // Sinus phase counter float part (best setting)
-
-#if (SIN_LBITS > 16)
-#define SIN_LBITS 16 // Can't be greater than 16 bits
-#endif
-
-#define ENV_HBITS 12 // Env phase counter int part
-#define ENV_LBITS (28 - ENV_HBITS) // Env phase counter float part (best setting)
-
-#define LFO_HBITS 10 // LFO phase counter int part
-#define LFO_LBITS (28 - LFO_HBITS) // LFO phase counter float part (best setting)
-
-#define SIN_LENGHT (1 << SIN_HBITS)
-#define ENV_LENGHT (1 << ENV_HBITS)
-#define LFO_LENGHT (1 << LFO_HBITS)
-
-#define TL_LENGHT (ENV_LENGHT * 3) // Env + TL scaling + LFO
-
-#define SIN_MASK (SIN_LENGHT - 1)
-#define ENV_MASK (ENV_LENGHT - 1)
-#define LFO_MASK (LFO_LENGHT - 1)
-
-#define ENV_STEP (96.0 / ENV_LENGHT) // ENV_MAX = 96 dB
-
-#define ENV_ATTACK ((ENV_LENGHT * 0) << ENV_LBITS)
-#define ENV_DECAY ((ENV_LENGHT * 1) << ENV_LBITS)
-#define ENV_END ((ENV_LENGHT * 2) << ENV_LBITS)
-
-#define MAX_OUT_BITS (SIN_HBITS + SIN_LBITS + 2) // Modulation = -4 <--> +4
-#define MAX_OUT ((1 << MAX_OUT_BITS) - 1)
-
-#define PG_CUT_OFF ((int) (78.0 / ENV_STEP))
-#define ENV_CUT_OFF ((int) (68.0 / ENV_STEP))
-
-#define AR_RATE 399128
-#define DR_RATE 5514396
-
-//#define AR_RATE 426136
-//#define DR_RATE (AR_RATE * 12)
-
-#define LFO_FMS_LBITS 9 // FIXED (LFO_FMS_BASE gives somethink as 1)
-#define LFO_FMS_BASE ((int) (0.05946309436 * 0.0338 * (double) (1 << LFO_FMS_LBITS)))
-
-#define S0 0 // Stupid typo of the YM2612
-#define S1 2
-#define S2 1
-#define S3 3
-
-inline void set_seg( slot_t& s, int seg )
-{
- s.env_xor = 0;
- s.env_max = INT_MAX;
- s.SEG = seg;
- if ( seg & 4 )
- {
- s.env_xor = ENV_MASK;
- s.env_max = ENV_MASK;
- }
-}
-
-struct tables_t
-{
- short SIN_TAB [SIN_LENGHT]; // SINUS TABLE (offset into TL TABLE)
- int LFOcnt; // LFO counter = compteur-frequence pour le LFO
- int LFOinc; // LFO step counter = pas d'incrementation du compteur-frequence du LFO
- // plus le pas est grand, plus la frequence est grande
- unsigned int AR_TAB [128]; // Attack rate table
- unsigned int DR_TAB [96]; // Decay rate table
- unsigned int DT_TAB [8] [32]; // Detune table
- unsigned int SL_TAB [16]; // Substain level table
- unsigned int NULL_RATE [32]; // Table for NULL rate
- int LFO_INC_TAB [8]; // LFO step table
-
- short ENV_TAB [2 * ENV_LENGHT + 8]; // ENV CURVE TABLE (attack & decay)
-
- short LFO_ENV_TAB [LFO_LENGHT]; // LFO AMS TABLE (adjusted for 11.8 dB)
- short LFO_FREQ_TAB [LFO_LENGHT]; // LFO FMS TABLE
- int TL_TAB [TL_LENGHT * 2]; // TOTAL LEVEL TABLE (positif and minus)
- unsigned int DECAY_TO_ATTACK [ENV_LENGHT]; // Conversion from decay to attack phase
- unsigned int FINC_TAB [2048]; // Frequency step table
-};
-
-static const unsigned char DT_DEF_TAB [4 * 32] =
-{
-// FD = 0
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
-// FD = 1
- 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
- 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8,
-
-// FD = 2
- 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
- 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 16, 16, 16, 16,
-
-// FD = 3
- 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
- 8 , 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 20, 22, 22, 22, 22
-};
-
-static const unsigned char FKEY_TAB [16] =
-{
- 0, 0, 0, 0,
- 0, 0, 0, 1,
- 2, 3, 3, 3,
- 3, 3, 3, 3
-};
-
-static const unsigned char LFO_AMS_TAB [4] =
-{
- 31, 4, 1, 0
-};
-
-static const unsigned char LFO_FMS_TAB [8] =
-{
- LFO_FMS_BASE * 0, LFO_FMS_BASE * 1,
- LFO_FMS_BASE * 2, LFO_FMS_BASE * 3,
- LFO_FMS_BASE * 4, LFO_FMS_BASE * 6,
- LFO_FMS_BASE * 12, LFO_FMS_BASE * 24
-};
-
-inline void YM2612_Special_Update() { }
-
-struct Ym2612_Impl
-{
- enum { channel_count = Ym2612_Emu::channel_count };
-
- state_t YM2612;
- int mute_mask;
- tables_t g;
-
- void KEY_ON( channel_t&, int );
- void KEY_OFF( channel_t&, int );
- int SLOT_SET( int, int );
- int CHANNEL_SET( int, int );
- int YM_SET( int, int );
-
- void set_rate( double sample_rate, double clock_factor );
- void reset();
- void write0( int addr, int data );
- void write1( int addr, int data );
- void run_timer( int );
- void run( int pair_count, Ym2612_Emu::sample_t* );
-};
-
-void Ym2612_Impl::KEY_ON( channel_t& ch, int nsl)
-{
- slot_t *SL = &(ch.SLOT [nsl]); // on recupere le bon pointeur de slot
-
- if (SL->Ecurp == RELEASE) // la touche est-elle rel'chee ?
- {
- SL->Fcnt = 0;
-
- // Fix Ecco 2 splash sound
-
- SL->Ecnt = (g.DECAY_TO_ATTACK [g.ENV_TAB [SL->Ecnt >> ENV_LBITS]] + ENV_ATTACK) & SL->ChgEnM;
- SL->ChgEnM = ~0;
-
-// SL->Ecnt = g.DECAY_TO_ATTACK [g.ENV_TAB [SL->Ecnt >> ENV_LBITS]] + ENV_ATTACK;
-// SL->Ecnt = 0;
-
- SL->Einc = SL->EincA;
- SL->Ecmp = ENV_DECAY;
- SL->Ecurp = ATTACK;
- }
-}
-
-
-void Ym2612_Impl::KEY_OFF(channel_t& ch, int nsl)
-{
- slot_t *SL = &(ch.SLOT [nsl]); // on recupere le bon pointeur de slot
-
- if (SL->Ecurp != RELEASE) // la touche est-elle appuyee ?
- {
- if (SL->Ecnt < ENV_DECAY) // attack phase ?
- {
- SL->Ecnt = (g.ENV_TAB [SL->Ecnt >> ENV_LBITS] << ENV_LBITS) + ENV_DECAY;
- }
-
- SL->Einc = SL->EincR;
- SL->Ecmp = ENV_END;
- SL->Ecurp = RELEASE;
- }
-}
-
-
-int Ym2612_Impl::SLOT_SET( int Adr, int data )
-{
- int nch = Adr & 3;
- if ( nch == 3 )
- return 1;
-
- channel_t& ch = YM2612.CHANNEL [nch + (Adr & 0x100 ? 3 : 0)];
- slot_t& sl = ch.SLOT [(Adr >> 2) & 3];
-
- switch ( Adr & 0xF0 )
- {
- case 0x30:
- if ( (sl.MUL = (data & 0x0F)) != 0 ) sl.MUL <<= 1;
- else sl.MUL = 1;
-
- sl.DT = (int*) g.DT_TAB [(data >> 4) & 7];
-
- ch.SLOT [0].Finc = -1;
-
- break;
-
- case 0x40:
- sl.TL = data & 0x7F;
-
- // SOR2 do a lot of TL adjustement and this fix R.Shinobi jump sound...
- YM2612_Special_Update();
-
-#if ((ENV_HBITS - 7) < 0)
- sl.TLL = sl.TL >> (7 - ENV_HBITS);
-#else
- sl.TLL = sl.TL << (ENV_HBITS - 7);
-#endif
-
- break;
-
- case 0x50:
- sl.KSR_S = 3 - (data >> 6);
-
- ch.SLOT [0].Finc = -1;
-
- if (data &= 0x1F) sl.AR = (int*) &g.AR_TAB [data << 1];
- else sl.AR = (int*) &g.NULL_RATE [0];
-
- sl.EincA = sl.AR [sl.KSR];
- if (sl.Ecurp == ATTACK) sl.Einc = sl.EincA;
- break;
-
- case 0x60:
- if ( (sl.AMSon = (data & 0x80)) != 0 ) sl.AMS = ch.AMS;
- else sl.AMS = 31;
-
- if (data &= 0x1F) sl.DR = (int*) &g.DR_TAB [data << 1];
- else sl.DR = (int*) &g.NULL_RATE [0];
-
- sl.EincD = sl.DR [sl.KSR];
- if (sl.Ecurp == DECAY) sl.Einc = sl.EincD;
- break;
-
- case 0x70:
- if (data &= 0x1F) sl.SR = (int*) &g.DR_TAB [data << 1];
- else sl.SR = (int*) &g.NULL_RATE [0];
-
- sl.EincS = sl.SR [sl.KSR];
- if ((sl.Ecurp == SUBSTAIN) && (sl.Ecnt < ENV_END)) sl.Einc = sl.EincS;
- break;
-
- case 0x80:
- sl.SLL = g.SL_TAB [data >> 4];
-
- sl.RR = (int*) &g.DR_TAB [((data & 0xF) << 2) + 2];
-
- sl.EincR = sl.RR [sl.KSR];
- if ((sl.Ecurp == RELEASE) && (sl.Ecnt < ENV_END)) sl.Einc = sl.EincR;
- break;
-
- case 0x90:
- // SSG-EG envelope shapes :
- /*
- E At Al H
-
- 1 0 0 0 \\\\
- 1 0 0 1 \___
- 1 0 1 0 \/\/
- 1 0 1 1 \
- 1 1 0 0 ////
- 1 1 0 1 /
- 1 1 1 0 /\/\
- 1 1 1 1 /___
-
- E = SSG-EG enable
- At = Start negate
- Al = Altern
- H = Hold */
-
- set_seg( sl, (data & 8) ? (data & 0x0F) : 0 );
- break;
- }
-
- return 0;
-}
-
-
-int Ym2612_Impl::CHANNEL_SET( int Adr, int data )
-{
- int num = Adr & 3;
- if ( num == 3 )
- return 1;
-
- channel_t& ch = YM2612.CHANNEL [num + (Adr & 0x100 ? 3 : 0)];
-
- switch ( Adr & 0xFC )
- {
- case 0xA0:
- YM2612_Special_Update();
-
- ch.FNUM [0] = (ch.FNUM [0] & 0x700) + data;
- ch.KC [0] = (ch.FOCT [0] << 2) | FKEY_TAB [ch.FNUM [0] >> 7];
-
- ch.SLOT [0].Finc = -1;
- break;
-
- case 0xA4:
- YM2612_Special_Update();
-
- ch.FNUM [0] = (ch.FNUM [0] & 0x0FF) + ((data & 0x07) << 8);
- ch.FOCT [0] = (data & 0x38) >> 3;
- ch.KC [0] = (ch.FOCT [0] << 2) | FKEY_TAB [ch.FNUM [0] >> 7];
-
- ch.SLOT [0].Finc = -1;
- break;
-
- case 0xA8:
- if ( Adr < 0x100 )
- {
- num++;
-
- YM2612_Special_Update();
-
- YM2612.CHANNEL [2].FNUM [num] = (YM2612.CHANNEL [2].FNUM [num] & 0x700) + data;
- YM2612.CHANNEL [2].KC [num] = (YM2612.CHANNEL [2].FOCT [num] << 2) |
- FKEY_TAB [YM2612.CHANNEL [2].FNUM [num] >> 7];
-
- YM2612.CHANNEL [2].SLOT [0].Finc = -1;
- }
- break;
-
- case 0xAC:
- if ( Adr < 0x100 )
- {
- num++;
-
- YM2612_Special_Update();
-
- YM2612.CHANNEL [2].FNUM [num] = (YM2612.CHANNEL [2].FNUM [num] & 0x0FF) + ((data & 0x07) << 8);
- YM2612.CHANNEL [2].FOCT [num] = (data & 0x38) >> 3;
- YM2612.CHANNEL [2].KC [num] = (YM2612.CHANNEL [2].FOCT [num] << 2) |
- FKEY_TAB [YM2612.CHANNEL [2].FNUM [num] >> 7];
-
- YM2612.CHANNEL [2].SLOT [0].Finc = -1;
- }
- break;
-
- case 0xB0:
- if ( ch.ALGO != (data & 7) )
- {
- // Fix VectorMan 2 heli sound (level 1)
- YM2612_Special_Update();
-
- ch.ALGO = data & 7;
-
- ch.SLOT [0].ChgEnM = 0;
- ch.SLOT [1].ChgEnM = 0;
- ch.SLOT [2].ChgEnM = 0;
- ch.SLOT [3].ChgEnM = 0;
- }
-
- ch.FB = 9 - ((data >> 3) & 7); // Real thing ?
-
-// if (ch.FB = ((data >> 3) & 7)) ch.FB = 9 - ch.FB; // Thunder force 4 (music stage 8), Gynoug, Aladdin bug sound...
-// else ch.FB = 31;
- break;
-
- case 0xB4: {
- YM2612_Special_Update();
-
- ch.LEFT = 0 - ((data >> 7) & 1);
- ch.RIGHT = 0 - ((data >> 6) & 1);
-
- ch.AMS = LFO_AMS_TAB [(data >> 4) & 3];
- ch.FMS = LFO_FMS_TAB [data & 7];
-
- for ( int i = 0; i < 4; i++ )
- {
- slot_t& sl = ch.SLOT [i];
- sl.AMS = (sl.AMSon ? ch.AMS : 31);
- }
- break;
- }
- }
-
- return 0;
-}
-
-
-int Ym2612_Impl::YM_SET(int Adr, int data)
-{
- switch ( Adr )
- {
- case 0x22:
- if (data & 8) // LFO enable
- {
- // Cool Spot music 1, LFO modified severals time which
- // distord the sound, have to check that on a real genesis...
-
- g.LFOinc = g.LFO_INC_TAB [data & 7];
- }
- else
- {
- g.LFOinc = g.LFOcnt = 0;
- }
- break;
-
- case 0x24:
- YM2612.TimerA = (YM2612.TimerA & 0x003) | (((int) data) << 2);
-
- if (YM2612.TimerAL != (1024 - YM2612.TimerA) << 12)
- {
- YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA) << 12;
- }
- break;
-
- case 0x25:
- YM2612.TimerA = (YM2612.TimerA & 0x3FC) | (data & 3);
-
- if (YM2612.TimerAL != (1024 - YM2612.TimerA) << 12)
- {
- YM2612.TimerAcnt = YM2612.TimerAL = (1024 - YM2612.TimerA) << 12;
- }
- break;
-
- case 0x26:
- YM2612.TimerB = data;
-
- if (YM2612.TimerBL != (256 - YM2612.TimerB) << (4 + 12))
- {
- YM2612.TimerBcnt = YM2612.TimerBL = (256 - YM2612.TimerB) << (4 + 12);
- }
- break;
-
- case 0x27:
- // Parametre divers
- // b7 = CSM MODE
- // b6 = 3 slot mode
- // b5 = reset b
- // b4 = reset a
- // b3 = timer enable b
- // b2 = timer enable a
- // b1 = load b
- // b0 = load a
-
- if ((data ^ YM2612.Mode) & 0x40)
- {
- // We changed the channel 2 mode, so recalculate phase step
- // This fix the punch sound in Street of Rage 2
-
- YM2612_Special_Update();
-
- YM2612.CHANNEL [2].SLOT [0].Finc = -1; // recalculate phase step
- }
-
-// if ((data & 2) && (YM2612.Status & 2)) YM2612.TimerBcnt = YM2612.TimerBL;
-// if ((data & 1) && (YM2612.Status & 1)) YM2612.TimerAcnt = YM2612.TimerAL;
-
-// YM2612.Status &= (~data >> 4); // Reset du Status au cas ou c'est demande
- YM2612.Status &= (~data >> 4) & (data >> 2); // Reset Status
-
- YM2612.Mode = data;
- break;
-
- case 0x28: {
- int nch = data & 3;
- if ( nch == 3 )
- return 1;
- if ( data & 4 )
- nch += 3;
- channel_t& ch = YM2612.CHANNEL [nch];
-
- YM2612_Special_Update();
-
- if (data & 0x10) KEY_ON(ch, S0); // On appuie sur la touche pour le slot 1
- else KEY_OFF(ch, S0); // On rel'che la touche pour le slot 1
- if (data & 0x20) KEY_ON(ch, S1); // On appuie sur la touche pour le slot 3
- else KEY_OFF(ch, S1); // On rel'che la touche pour le slot 3
- if (data & 0x40) KEY_ON(ch, S2); // On appuie sur la touche pour le slot 2
- else KEY_OFF(ch, S2); // On rel'che la touche pour le slot 2
- if (data & 0x80) KEY_ON(ch, S3); // On appuie sur la touche pour le slot 4
- else KEY_OFF(ch, S3); // On rel'che la touche pour le slot 4
- break;
- }
-
- case 0x2B:
- if (YM2612.DAC ^ (data & 0x80)) YM2612_Special_Update();
-
- YM2612.DAC = data & 0x80; // activation/desactivation du DAC
- break;
- }
-
- return 0;
-}
-
-void Ym2612_Impl::set_rate( double sample_rate, double clock_rate )
-{
- assert( sample_rate );
- assert( clock_rate > sample_rate );
-
- int i;
-
- // 144 = 12 * (prescale * 2) = 12 * 6 * 2
- // prescale set to 6 by default
-
- double Frequence = clock_rate / sample_rate / 144.0;
- if ( fabs( Frequence - 1.0 ) < 0.0000001 )
- Frequence = 1.0;
- YM2612.TimerBase = int (Frequence * 4096.0);
-
- // Tableau TL :
- // [0 - 4095] = +output [4095 - ...] = +output overflow (fill with 0)
- // [12288 - 16383] = -output [16384 - ...] = -output overflow (fill with 0)
-
- for(i = 0; i < TL_LENGHT; i++)
- {
- if (i >= PG_CUT_OFF) // YM2612 cut off sound after 78 dB (14 bits output ?)
- {
- g.TL_TAB [TL_LENGHT + i] = g.TL_TAB [i] = 0;
- }
- else
- {
- double x = MAX_OUT; // Max output
- x /= pow( 10.0, (ENV_STEP * i) / 20.0 ); // Decibel -> Voltage
-
- g.TL_TAB [i] = (int) x;
- g.TL_TAB [TL_LENGHT + i] = -g.TL_TAB [i];
- }
- }
-
- // Tableau SIN :
- // g.SIN_TAB [x] [y] = sin(x) * y;
- // x = phase and y = volume
-
- g.SIN_TAB [0] = g.SIN_TAB [SIN_LENGHT / 2] = PG_CUT_OFF;
-
- for(i = 1; i <= SIN_LENGHT / 4; i++)
- {
- double x = sin(2.0 * PI * (double) (i) / (double) (SIN_LENGHT)); // Sinus
- x = 20 * log10(1 / x); // convert to dB
-
- int j = (int) (x / ENV_STEP); // Get TL range
-
- if (j > PG_CUT_OFF) j = (int) PG_CUT_OFF;
-
- g.SIN_TAB [i] = g.SIN_TAB [(SIN_LENGHT / 2) - i] = j;
- g.SIN_TAB [(SIN_LENGHT / 2) + i] = g.SIN_TAB [SIN_LENGHT - i] = TL_LENGHT + j;
- }
-
- // Tableau LFO (LFO wav) :
-
- for(i = 0; i < LFO_LENGHT; i++)
- {
- double x = sin(2.0 * PI * (double) (i) / (double) (LFO_LENGHT)); // Sinus
- x += 1.0;
- x /= 2.0; // positive only
- x *= 11.8 / ENV_STEP; // ajusted to MAX enveloppe modulation
-
- g.LFO_ENV_TAB [i] = (int) x;
-
- x = sin(2.0 * PI * (double) (i) / (double) (LFO_LENGHT)); // Sinus
- x *= (double) ((1 << (LFO_HBITS - 1)) - 1);
-
- g.LFO_FREQ_TAB [i] = (int) x;
-
- }
-
- // Tableau Enveloppe :
- // g.ENV_TAB [0] -> g.ENV_TAB [ENV_LENGHT - 1] = attack curve
- // g.ENV_TAB [ENV_LENGHT] -> g.ENV_TAB [2 * ENV_LENGHT - 1] = decay curve
-
- for(i = 0; i < ENV_LENGHT; i++)
- {
- // Attack curve (x^8 - music level 2 Vectorman 2)
- double x = pow(((double) ((ENV_LENGHT - 1) - i) / (double) (ENV_LENGHT)), 8);
- x *= ENV_LENGHT;
-
- g.ENV_TAB [i] = (int) x;
-
- // Decay curve (just linear)
- x = pow(((double) (i) / (double) (ENV_LENGHT)), 1);
- x *= ENV_LENGHT;
-
- g.ENV_TAB [ENV_LENGHT + i] = (int) x;
- }
- for ( i = 0; i < 8; i++ )
- g.ENV_TAB [i + ENV_LENGHT * 2] = 0;
-
- g.ENV_TAB [ENV_END >> ENV_LBITS] = ENV_LENGHT - 1; // for the stopped state
-
- // Tableau pour la conversion Attack -> Decay and Decay -> Attack
-
- int j = ENV_LENGHT - 1;
- for ( i = 0; i < ENV_LENGHT; i++ )
- {
- while ( j && g.ENV_TAB [j] < i )
- j--;
-
- g.DECAY_TO_ATTACK [i] = j << ENV_LBITS;
- }
-
- // Tableau pour le Substain Level
-
- for(i = 0; i < 15; i++)
- {
- double x = i * 3; // 3 and not 6 (Mickey Mania first music for test)
- x /= ENV_STEP;
-
- g.SL_TAB [i] = ((int) x << ENV_LBITS) + ENV_DECAY;
- }
-
- g.SL_TAB [15] = ((ENV_LENGHT - 1) << ENV_LBITS) + ENV_DECAY; // special case : volume off
-
- // Tableau Frequency Step
-
- for(i = 0; i < 2048; i++)
- {
- double x = (double) (i) * Frequence;
-
-#if ((SIN_LBITS + SIN_HBITS - (21 - 7)) < 0)
- x /= (double) (1 << ((21 - 7) - SIN_LBITS - SIN_HBITS));
-#else
- x *= (double) (1 << (SIN_LBITS + SIN_HBITS - (21 - 7)));
-#endif
-
- x /= 2.0; // because MUL = value * 2
-
- g.FINC_TAB [i] = (unsigned int) x;
- }
-
- // Tableaux Attack & Decay Rate
-
- for(i = 0; i < 4; i++)
- {
- g.AR_TAB [i] = 0;
- g.DR_TAB [i] = 0;
- }
-
- for(i = 0; i < 60; i++)
- {
- double x = Frequence;
-
- x *= 1.0 + ((i & 3) * 0.25); // bits 0-1 : x1.00, x1.25, x1.50, x1.75
- x *= (double) (1 << ((i >> 2))); // bits 2-5 : shift bits (x2^0 - x2^15)
- x *= (double) (ENV_LENGHT << ENV_LBITS); // on ajuste pour le tableau g.ENV_TAB
-
- g.AR_TAB [i + 4] = (unsigned int) (x / AR_RATE);
- g.DR_TAB [i + 4] = (unsigned int) (x / DR_RATE);
- }
-
- for(i = 64; i < 96; i++)
- {
- g.AR_TAB [i] = g.AR_TAB [63];
- g.DR_TAB [i] = g.DR_TAB [63];
-
- g.NULL_RATE [i - 64] = 0;
- }
-
- for ( i = 96; i < 128; i++ )
- g.AR_TAB [i] = 0;
-
- // Tableau Detune
-
- for(i = 0; i < 4; i++)
- {
- for (int j = 0; j < 32; j++)
- {
-#if ((SIN_LBITS + SIN_HBITS - 21) < 0)
- double y = (double) DT_DEF_TAB [(i << 5) + j] * Frequence / (double) (1 << (21 - SIN_LBITS - SIN_HBITS));
-#else
- double y = (double) DT_DEF_TAB [(i << 5) + j] * Frequence * (double) (1 << (SIN_LBITS + SIN_HBITS - 21));
-#endif
-
- g.DT_TAB [i + 0] [j] = (int) y;
- g.DT_TAB [i + 4] [j] = (int) -y;
- }
- }
-
- // Tableau LFO
- g.LFO_INC_TAB [0] = (unsigned int) (3.98 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [1] = (unsigned int) (5.56 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [2] = (unsigned int) (6.02 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [3] = (unsigned int) (6.37 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [4] = (unsigned int) (6.88 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [5] = (unsigned int) (9.63 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [6] = (unsigned int) (48.1 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
- g.LFO_INC_TAB [7] = (unsigned int) (72.2 * (double) (1 << (LFO_HBITS + LFO_LBITS)) / sample_rate);
-
- reset();
-}
-
-const char* Ym2612_Emu::set_rate( double sample_rate, double clock_rate )
-{
- if ( !impl )
- {
- impl = (Ym2612_Impl*) malloc( sizeof *impl );
- if ( !impl )
- return "Out of memory";
- impl->mute_mask = 0;
- }
- memset( &impl->YM2612, 0, sizeof impl->YM2612 );
-
- impl->set_rate( sample_rate, clock_rate );
-
- return 0;
-}
-
-Ym2612_Emu::~Ym2612_Emu()
-{
- free( impl );
-}
-
-inline void Ym2612_Impl::write0( int opn_addr, int data )
-{
- assert( (unsigned) data <= 0xFF );
-
- if ( opn_addr < 0x30 )
- {
- YM2612.REG [0] [opn_addr] = data;
- YM_SET( opn_addr, data );
- }
- else if ( YM2612.REG [0] [opn_addr] != data )
- {
- YM2612.REG [0] [opn_addr] = data;
-
- if ( opn_addr < 0xA0 )
- SLOT_SET( opn_addr, data );
- else
- CHANNEL_SET( opn_addr, data );
- }
-}
-
-inline void Ym2612_Impl::write1( int opn_addr, int data )
-{
- assert( (unsigned) data <= 0xFF );
-
- if ( opn_addr >= 0x30 && YM2612.REG [1] [opn_addr] != data )
- {
- YM2612.REG [1] [opn_addr] = data;
-
- if ( opn_addr < 0xA0 )
- SLOT_SET( opn_addr + 0x100, data );
- else
- CHANNEL_SET( opn_addr + 0x100, data );
- }
-}
-
-void Ym2612_Emu::reset()
-{
- impl->reset();
-}
-
-void Ym2612_Impl::reset()
-{
- g.LFOcnt = 0;
- YM2612.TimerA = 0;
- YM2612.TimerAL = 0;
- YM2612.TimerAcnt = 0;
- YM2612.TimerB = 0;
- YM2612.TimerBL = 0;
- YM2612.TimerBcnt = 0;
- YM2612.DAC = 0;
-
- YM2612.Status = 0;
-
- int i;
- for ( i = 0; i < channel_count; i++ )
- {
- channel_t& ch = YM2612.CHANNEL [i];
-
- ch.LEFT = ~0;
- ch.RIGHT = ~0;
- ch.ALGO = 0;
- ch.FB = 31;
- ch.FMS = 0;
- ch.AMS = 0;
-
- for ( int j = 0 ;j < 4 ; j++ )
- {
- ch.S0_OUT [j] = 0;
- ch.FNUM [j] = 0;
- ch.FOCT [j] = 0;
- ch.KC [j] = 0;
-
- ch.SLOT [j].Fcnt = 0;
- ch.SLOT [j].Finc = 0;
- ch.SLOT [j].Ecnt = ENV_END; // Put it at the end of Decay phase...
- ch.SLOT [j].Einc = 0;
- ch.SLOT [j].Ecmp = 0;
- ch.SLOT [j].Ecurp = RELEASE;
-
- ch.SLOT [j].ChgEnM = 0;
- }
- }
-
- for ( i = 0; i < 0x100; i++ )
- {
- YM2612.REG [0] [i] = -1;
- YM2612.REG [1] [i] = -1;
- }
-
- for ( i = 0xB6; i >= 0xB4; i-- )
- {
- write0( i, 0xC0 );
- write1( i, 0xC0 );
- }
-
- for ( i = 0xB2; i >= 0x22; i-- )
- {
- write0( i, 0 );
- write1( i, 0 );
- }
-
- write0( 0x2A, 0x80 );
-}
-
-void Ym2612_Emu::write0( int addr, int data )
-{
- impl->write0( addr, data );
-}
-
-void Ym2612_Emu::write1( int addr, int data )
-{
- impl->write1( addr, data );
-}
-
-void Ym2612_Emu::mute_voices( int mask ) { impl->mute_mask = mask; }
-
-static void update_envelope_( slot_t* sl )
-{
- switch ( sl->Ecurp )
- {
- case 0:
- // Env_Attack_Next
-
- // Verified with Gynoug even in HQ (explode SFX)
- sl->Ecnt = ENV_DECAY;
-
- sl->Einc = sl->EincD;
- sl->Ecmp = sl->SLL;
- sl->Ecurp = DECAY;
- break;
-
- case 1:
- // Env_Decay_Next
-
- // Verified with Gynoug even in HQ (explode SFX)
- sl->Ecnt = sl->SLL;
-
- sl->Einc = sl->EincS;
- sl->Ecmp = ENV_END;
- sl->Ecurp = SUBSTAIN;
- break;
-
- case 2:
- // Env_Substain_Next(slot_t *SL)
- if (sl->SEG & 8) // SSG envelope type
- {
- int release = sl->SEG & 1;
-
- if ( !release )
- {
- // re KEY ON
-
- // sl->Fcnt = 0;
- // sl->ChgEnM = ~0;
-
- sl->Ecnt = 0;
- sl->Einc = sl->EincA;
- sl->Ecmp = ENV_DECAY;
- sl->Ecurp = ATTACK;
- }
-
- set_seg( *sl, (sl->SEG << 1) & 4 );
-
- if ( !release )
- break;
- }
- // fall through
-
- case 3:
- // Env_Release_Next
- sl->Ecnt = ENV_END;
- sl->Einc = 0;
- sl->Ecmp = ENV_END + 1;
- break;
-
- // default: no op
- }
-}
-
-inline void update_envelope( slot_t& sl )
-{
- int ecmp = sl.Ecmp;
- if ( (sl.Ecnt += sl.Einc) >= ecmp )
- update_envelope_( &sl );
-}
-
-template<int algo>
-struct ym2612_update_chan {
- static void func( tables_t&, channel_t&, Ym2612_Emu::sample_t*, int );
-};
-
-typedef void (*ym2612_update_chan_t)( tables_t&, channel_t&, Ym2612_Emu::sample_t*, int );
-
-template<int algo>
-void ym2612_update_chan<algo>::func( tables_t& g, channel_t& ch,
- Ym2612_Emu::sample_t* buf, int length )
-{
- int not_end = ch.SLOT [S3].Ecnt - ENV_END;
-
- // algo is a compile-time constant, so all conditions based on it are resolved
- // during compilation
-
- // special cases
- if ( algo == 7 )
- not_end |= ch.SLOT [S0].Ecnt - ENV_END;
-
- if ( algo >= 5 )
- not_end |= ch.SLOT [S2].Ecnt - ENV_END;
-
- if ( algo >= 4 )
- not_end |= ch.SLOT [S1].Ecnt - ENV_END;
-
- int CH_S0_OUT_1 = ch.S0_OUT [1];
-
- int in0 = ch.SLOT [S0].Fcnt;
- int in1 = ch.SLOT [S1].Fcnt;
- int in2 = ch.SLOT [S2].Fcnt;
- int in3 = ch.SLOT [S3].Fcnt;
-
- int YM2612_LFOinc = g.LFOinc;
- int YM2612_LFOcnt = g.LFOcnt + YM2612_LFOinc;
-
- if ( !not_end )
- return;
-
- do
- {
- // envelope
- int const env_LFO = g.LFO_ENV_TAB [YM2612_LFOcnt >> LFO_LBITS & LFO_MASK];
-
- short const* const ENV_TAB = g.ENV_TAB;
-
- #define CALC_EN( x ) \
- int temp##x = ENV_TAB [ch.SLOT [S##x].Ecnt >> ENV_LBITS] + ch.SLOT [S##x].TLL; \
- int en##x = ((temp##x ^ ch.SLOT [S##x].env_xor) + (env_LFO >> ch.SLOT [S##x].AMS)) & \
- ((temp##x - ch.SLOT [S##x].env_max) >> 31);
-
- CALC_EN( 0 )
- CALC_EN( 1 )
- CALC_EN( 2 )
- CALC_EN( 3 )
-
- int const* const TL_TAB = g.TL_TAB;
-
- #define SINT( i, o ) (TL_TAB [g.SIN_TAB [(i)] + (o)])
-
- // feedback
- int CH_S0_OUT_0 = ch.S0_OUT [0];
- {
- int temp = in0 + ((CH_S0_OUT_0 + CH_S0_OUT_1) >> ch.FB);
- CH_S0_OUT_1 = CH_S0_OUT_0;
- CH_S0_OUT_0 = SINT( (temp >> SIN_LBITS) & SIN_MASK, en0 );
- }
-
- int CH_OUTd;
- if ( algo == 0 )
- {
- int temp = in1 + CH_S0_OUT_1;
- temp = in2 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en1 );
- temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 );
- CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 );
- }
- else if ( algo == 1 )
- {
- int temp = in2 + CH_S0_OUT_1 + SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 );
- temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 );
- CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 );
- }
- else if ( algo == 2 )
- {
- int temp = in2 + SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 );
- temp = in3 + CH_S0_OUT_1 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en2 );
- CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 );
- }
- else if ( algo == 3 )
- {
- int temp = in1 + CH_S0_OUT_1;
- temp = in3 + SINT( (temp >> SIN_LBITS) & SIN_MASK, en1 ) +
- SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 );
- CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 );
- }
- else if ( algo == 4 )
- {
- int temp = in3 + SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 );
- CH_OUTd = SINT( (temp >> SIN_LBITS) & SIN_MASK, en3 ) +
- SINT( ((in1 + CH_S0_OUT_1) >> SIN_LBITS) & SIN_MASK, en1 );
- //DO_LIMIT
- }
- else if ( algo == 5 )
- {
- int temp = CH_S0_OUT_1;
- CH_OUTd = SINT( ((in3 + temp) >> SIN_LBITS) & SIN_MASK, en3 ) +
- SINT( ((in1 + temp) >> SIN_LBITS) & SIN_MASK, en1 ) +
- SINT( ((in2 + temp) >> SIN_LBITS) & SIN_MASK, en2 );
- //DO_LIMIT
- }
- else if ( algo == 6 )
- {
- CH_OUTd = SINT( (in3 >> SIN_LBITS) & SIN_MASK, en3 ) +
- SINT( ((in1 + CH_S0_OUT_1) >> SIN_LBITS) & SIN_MASK, en1 ) +
- SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 );
- //DO_LIMIT
- }
- else if ( algo == 7 )
- {
- CH_OUTd = SINT( (in3 >> SIN_LBITS) & SIN_MASK, en3 ) +
- SINT( (in1 >> SIN_LBITS) & SIN_MASK, en1 ) +
- SINT( (in2 >> SIN_LBITS) & SIN_MASK, en2 ) + CH_S0_OUT_1;
- //DO_LIMIT
- }
-
- CH_OUTd >>= MAX_OUT_BITS - output_bits + 2;
-
- // update phase
- unsigned freq_LFO = ((g.LFO_FREQ_TAB [YM2612_LFOcnt >> LFO_LBITS & LFO_MASK] *
- ch.FMS) >> (LFO_HBITS - 1 + 1)) + (1L << (LFO_FMS_LBITS - 1));
- YM2612_LFOcnt += YM2612_LFOinc;
- in0 += (ch.SLOT [S0].Finc * freq_LFO) >> (LFO_FMS_LBITS - 1);
- in1 += (ch.SLOT [S1].Finc * freq_LFO) >> (LFO_FMS_LBITS - 1);
- in2 += (ch.SLOT [S2].Finc * freq_LFO) >> (LFO_FMS_LBITS - 1);
- in3 += (ch.SLOT [S3].Finc * freq_LFO) >> (LFO_FMS_LBITS - 1);
-
- int t0 = buf [0] + (CH_OUTd & ch.LEFT);
- int t1 = buf [1] + (CH_OUTd & ch.RIGHT);
-
- update_envelope( ch.SLOT [0] );
- update_envelope( ch.SLOT [1] );
- update_envelope( ch.SLOT [2] );
- update_envelope( ch.SLOT [3] );
-
- ch.S0_OUT [0] = CH_S0_OUT_0;
- buf [0] = t0;
- buf [1] = t1;
- buf += 2;
- }
- while ( --length );
-
- ch.S0_OUT [1] = CH_S0_OUT_1;
-
- ch.SLOT [S0].Fcnt = in0;
- ch.SLOT [S1].Fcnt = in1;
- ch.SLOT [S2].Fcnt = in2;
- ch.SLOT [S3].Fcnt = in3;
-}
-
-static const ym2612_update_chan_t UPDATE_CHAN [8] = {
- &ym2612_update_chan<0>::func,
- &ym2612_update_chan<1>::func,
- &ym2612_update_chan<2>::func,
- &ym2612_update_chan<3>::func,
- &ym2612_update_chan<4>::func,
- &ym2612_update_chan<5>::func,
- &ym2612_update_chan<6>::func,
- &ym2612_update_chan<7>::func
-};
-
-void Ym2612_Impl::run_timer( int length )
-{
- int const step = 6;
- int remain = length;
- do
- {
- int n = step;
- if ( n > remain )
- n = remain;
- remain -= n;
-
- long i = n * YM2612.TimerBase;
- if (YM2612.Mode & 1) // Timer A ON ?
- {
- // if ((YM2612.TimerAcnt -= 14073) <= 0) // 13879=NTSC (old: 14475=NTSC 14586=PAL)
- if ((YM2612.TimerAcnt -= i) <= 0)
- {
- // timer a overflow
-
- YM2612.Status |= (YM2612.Mode & 0x04) >> 2;
- YM2612.TimerAcnt += YM2612.TimerAL;
-
- if (YM2612.Mode & 0x80)
- {
- KEY_ON( YM2612.CHANNEL [2], 0 );
- KEY_ON( YM2612.CHANNEL [2], 1 );
- KEY_ON( YM2612.CHANNEL [2], 2 );
- KEY_ON( YM2612.CHANNEL [2], 3 );
- }
- }
- }
-
- if (YM2612.Mode & 2) // Timer B ON ?
- {
- // if ((YM2612.TimerBcnt -= 14073) <= 0) // 13879=NTSC (old: 14475=NTSC 14586=PAL)
- if ((YM2612.TimerBcnt -= i) <= 0)
- {
- // timer b overflow
- YM2612.Status |= (YM2612.Mode & 0x08) >> 2;
- YM2612.TimerBcnt += YM2612.TimerBL;
- }
- }
- }
- while ( remain > 0 );
-}
-
-void Ym2612_Impl::run( int pair_count, Ym2612_Emu::sample_t* out )
-{
- if ( pair_count <= 0 )
- return;
-
- if ( YM2612.Mode & 3 )
- run_timer( pair_count );
-
- // Mise jour des pas des compteurs-frequences s'ils ont ete modifies
-
- for ( int chi = 0; chi < channel_count; chi++ )
- {
- channel_t& ch = YM2612.CHANNEL [chi];
- if ( ch.SLOT [0].Finc != -1 )
- continue;
-
- int i2 = 0;
- if ( chi == 2 && (YM2612.Mode & 0x40) )
- i2 = 2;
-
- for ( int i = 0; i < 4; i++ )
- {
- // static int seq [4] = { 2, 1, 3, 0 };
- // if ( i2 ) i2 = seq [i];
-
- slot_t& sl = ch.SLOT [i];
- int finc = g.FINC_TAB [ch.FNUM [i2]] >> (7 - ch.FOCT [i2]);
- int ksr = ch.KC [i2] >> sl.KSR_S; // keycode attenuation
- sl.Finc = (finc + sl.DT [ch.KC [i2]]) * sl.MUL;
- if (sl.KSR != ksr) // si le KSR a change alors
- { // les differents taux pour l'enveloppe sont mis jour
- sl.KSR = ksr;
-
- sl.EincA = sl.AR [ksr];
- sl.EincD = sl.DR [ksr];
- sl.EincS = sl.SR [ksr];
- sl.EincR = sl.RR [ksr];
-
- if (sl.Ecurp == ATTACK)
- {
- sl.Einc = sl.EincA;
- }
- else if (sl.Ecurp == DECAY)
- {
- sl.Einc = sl.EincD;
- }
- else if (sl.Ecnt < ENV_END)
- {
- if (sl.Ecurp == SUBSTAIN)
- sl.Einc = sl.EincS;
- else if (sl.Ecurp == RELEASE)
- sl.Einc = sl.EincR;
- }
- }
-
- if ( i2 )
- i2 = (i2 ^ 2) ^ (i2 >> 1);
- }
- }
-
- for ( int i = 0; i < channel_count; i++ )
- {
- if ( !(mute_mask & (1 << i)) && (i != 5 || !YM2612.DAC) )
- UPDATE_CHAN [YM2612.CHANNEL [i].ALGO]( g, YM2612.CHANNEL [i], out, pair_count );
- }
-
- g.LFOcnt += g.LFOinc * pair_count;
-}
-
-void Ym2612_Emu::run( int pair_count, sample_t* out ) { impl->run( pair_count, out ); }
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.h
deleted file mode 100644
index 383ac72d..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2612_Emu.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// YM2612 FM sound chip emulator interface
-
-// Game_Music_Emu 0.5.2
-#ifndef YM2612_EMU_H
-#define YM2612_EMU_H
-
-struct Ym2612_Impl;
-
-class Ym2612_Emu {
- Ym2612_Impl* impl;
-public:
- Ym2612_Emu() { impl = 0; }
- ~Ym2612_Emu();
-
- // Set output sample rate and chip clock rates, in Hz. Returns non-zero
- // if error.
- const char* set_rate( double sample_rate, double clock_rate );
-
- // Reset to power-up state
- void reset();
-
- // Mute voice n if bit n (1 << n) of mask is set
- enum { channel_count = 6 };
- void mute_voices( int mask );
-
- // Write addr to register 0 then data to register 1
- void write0( int addr, int data );
-
- // Write addr to register 2 then data to register 3
- void write1( int addr, int data );
-
- // Run and add pair_count samples into current output buffer contents
- typedef short sample_t;
- enum { out_chan_count = 2 }; // stereo
- void run( int pair_count, sample_t* out );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_source.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_source.h
deleted file mode 100644
index 945bf349..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_source.h
+++ /dev/null
@@ -1,78 +0,0 @@
-// Included at the beginning of library source files, after all other #include lines
-#ifndef BLARGG_SOURCE_H
-#define BLARGG_SOURCE_H
-
-// If debugging is enabled, abort program if expr is false. Meant for checking
-// internal state and consistency. A failed assertion indicates a bug in the module.
-// void assert( bool expr );
-#include <assert.h>
-
-// If debugging is enabled and expr is false, abort program. Meant for checking
-// caller-supplied parameters and operations that are outside the control of the
-// module. A failed requirement indicates a bug outside the module.
-// void require( bool expr );
-#undef require
-#define require( expr ) assert( expr )
-
-// Like printf() except output goes to debug log file. Might be defined to do
-// nothing (not even evaluate its arguments).
-// void dprintf( const char* format, ... );
-inline void blargg_dprintf_( const char*, ... ) { }
-#undef dprintf
-#define dprintf (1) ? (void) 0 : blargg_dprintf_
-
-// If enabled, evaluate expr and if false, make debug log entry with source file
-// and line. Meant for finding situations that should be examined further, but that
-// don't indicate a problem. In all cases, execution continues normally.
-#undef check
-#define check( expr ) ((void) 0)
-
-// If expr yields error string, return it from current function, otherwise continue.
-#undef RETURN_ERR
-#define RETURN_ERR( expr ) do { \
- blargg_err_t blargg_return_err_ = (expr); \
- if ( blargg_return_err_ ) return blargg_return_err_; \
- } while ( 0 )
-
-// If ptr is 0, return out of memory error string.
-#undef CHECK_ALLOC
-#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 )
-
-// Avoid any macros which evaluate their arguments multiple times
-#undef min
-#undef max
-
-// using const references generates crappy code, and I am currenly only using these
-// for built-in types, so they take arguments by value
-
-template<class T>
-inline T min( T x, T y )
-{
- if ( x < y )
- return x;
- return y;
-}
-
-template<class T>
-inline T max( T x, T y )
-{
- if ( x < y )
- return y;
- return x;
-}
-
-// TODO: good idea? bad idea?
-#undef byte
-#define byte byte_
-typedef unsigned char byte;
-
-// deprecated
-#define BLARGG_CHECK_ALLOC CHECK_ALLOC
-#define BLARGG_RETURN_ERR RETURN_ERR
-
-// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check
-#ifdef BLARGG_SOURCE_BEGIN
- #include BLARGG_SOURCE_BEGIN
-#endif
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/gb_cpu_io.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/gb_cpu_io.h
deleted file mode 100644
index ada99ead..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/gb_cpu_io.h
+++ /dev/null
@@ -1,72 +0,0 @@
-
-#include "Gbs_Emu.h"
-
-#include "blargg_source.h"
-
-int Gbs_Emu::cpu_read( gb_addr_t addr )
-{
- int result = *cpu::get_code( addr );
- if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )
- result = apu.read_register( clock(), addr );
-#ifndef NDEBUG
- else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
- dprintf( "Read from unmapped memory $%.4x\n", (unsigned) addr );
- else if ( unsigned (addr - 0xFF01) < 0xFF80 - 0xFF01 )
- dprintf( "Unhandled I/O read 0x%4X\n", (unsigned) addr );
-#endif
- return result;
-}
-
-void Gbs_Emu::cpu_write( gb_addr_t addr, int data )
-{
- unsigned offset = addr - ram_addr;
- if ( offset <= 0xFFFF - ram_addr )
- {
- ram [offset] = data;
- if ( (addr ^ 0xE000) <= 0x1F80 - 1 )
- {
- if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )
- {
- GME_APU_HOOK( this, addr - Gb_Apu::start_addr, data );
- apu.write_register( clock(), addr, data );
- }
- else if ( (addr ^ 0xFF06) < 2 )
- update_timer();
- else if ( addr == joypad_addr )
- ram [offset] = 0; // keep joypad return value 0
- else
- ram [offset] = 0xFF;
-
- //if ( addr == 0xFFFF )
- // dprintf( "Wrote interrupt mask\n" );
- }
- }
- else if ( (addr ^ 0x2000) <= 0x2000 - 1 )
- {
- set_bank( data );
- }
-#ifndef NDEBUG
- else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
- {
- dprintf( "Wrote to unmapped memory $%.4x\n", (unsigned) addr );
- }
-#endif
-}
-
-#define CPU_READ_FAST( cpu, addr, time, out ) \
- CPU_READ_FAST_( STATIC_CAST(Gbs_Emu*,cpu), addr, time, out )
-
-#define CPU_READ_FAST_( emu, addr, time, out ) \
-{\
- out = READ_PROG( addr );\
- if ( unsigned (addr - Gb_Apu::start_addr) <= Gb_Apu::register_count )\
- out = emu->apu.read_register( emu->cpu_time - time * clocks_per_instr, addr );\
- else\
- check( out == emu->cpu_read( addr ) );\
-}
-
-#define CPU_READ( cpu, addr, time ) \
- STATIC_CAST(Gbs_Emu*,cpu)->cpu_read( addr )
-
-#define CPU_WRITE( cpu, addr, data, time ) \
- STATIC_CAST(Gbs_Emu*,cpu)->cpu_write( addr, data )
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.cpp b/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.cpp
deleted file mode 100644
index d6cebfa8..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Music_Emu.h"
-
-#if !GME_DISABLE_STEREO_DEPTH
-#include "Effects_Buffer.h"
-#endif
-#include "blargg_endian.h"
-#include <string.h>
-#include <ctype.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#ifndef GME_TYPE_LIST
-
-// Default list of all supported game music types (copy this to blargg_config.h
-// if you want to modify it)
-#define GME_TYPE_LIST \
- gme_ay_type,\
- gme_gbs_type,\
- gme_gym_type,\
- gme_hes_type,\
- gme_kss_type,\
- gme_nsf_type,\
- gme_nsfe_type,\
- gme_sap_type,\
- gme_spc_type,\
- gme_vgm_type,\
- gme_vgz_type
-
-#endif
-
-static gme_type_t const gme_type_list_ [] = { GME_TYPE_LIST, 0 };
-
-gme_type_t const* gme_type_list()
-{
- return gme_type_list_;
-}
-
-const char* gme_identify_header( void const* header )
-{
- switch ( get_be32( header ) )
- {
- case BLARGG_4CHAR('Z','X','A','Y'): return "AY";
- case BLARGG_4CHAR('G','B','S',0x01): return "GBS";
- case BLARGG_4CHAR('G','Y','M','X'): return "GYM";
- case BLARGG_4CHAR('H','E','S','M'): return "HES";
- case BLARGG_4CHAR('K','S','C','C'):
- case BLARGG_4CHAR('K','S','S','X'): return "KSS";
- case BLARGG_4CHAR('N','E','S','M'): return "NSF";
- case BLARGG_4CHAR('N','S','F','E'): return "NSFE";
- case BLARGG_4CHAR('S','A','P',0x0D): return "SAP";
- case BLARGG_4CHAR('S','N','E','S'): return "SPC";
- case BLARGG_4CHAR('V','g','m',' '): return "VGM";
- }
- return "";
-}
-
-static void to_uppercase( const char* in, int len, char* out )
-{
- for ( int i = 0; i < len; i++ )
- {
- if ( !(out [i] = toupper( in [i] )) )
- return;
- }
- *out = 0; // extension too long
-}
-
-gme_type_t gme_identify_extension( const char* extension_ )
-{
- char const* end = strrchr( extension_, '.' );
- if ( end )
- extension_ = end + 1;
-
- char extension [6];
- to_uppercase( extension_, sizeof extension, extension );
-
- for ( gme_type_t const* types = gme_type_list_; *types; types++ )
- if ( !strcmp( extension, (*types)->extension_ ) )
- return *types;
- return 0;
-}
-
-gme_err_t gme_identify_file( const char* path, gme_type_t* type_out )
-{
- *type_out = gme_identify_extension( path );
- // TODO: don't examine header if file has extension?
- if ( !*type_out )
- {
- char header [4];
- GME_FILE_READER in;
- RETURN_ERR( in.open( path ) );
- RETURN_ERR( in.read( header, sizeof header ) );
- *type_out = gme_identify_extension( gme_identify_header( header ) );
- }
- return 0;
-}
-
-gme_err_t gme_open_data( void const* data, long size, Music_Emu** out, long sample_rate )
-{
- require( (data || !size) && out );
- *out = 0;
-
- gme_type_t file_type = 0;
- if ( size >= 4 )
- file_type = gme_identify_extension( gme_identify_header( data ) );
- if ( !file_type )
- return gme_wrong_file_type;
-
- Music_Emu* emu = gme_new_emu( file_type, sample_rate );
- CHECK_ALLOC( emu );
-
- gme_err_t err = gme_load_data( emu, data, size );
-
- if ( err )
- delete emu;
- else
- *out = emu;
-
- return err;
-}
-
-gme_err_t gme_open_file( const char* path, Music_Emu** out, long sample_rate )
-{
- require( path && out );
- *out = 0;
-
- GME_FILE_READER in;
- RETURN_ERR( in.open( path ) );
-
- char header [4];
- int header_size = 0;
-
- gme_type_t file_type = gme_identify_extension( path );
- if ( !file_type )
- {
- header_size = sizeof header;
- RETURN_ERR( in.read( header, sizeof header ) );
- file_type = gme_identify_extension( gme_identify_header( header ) );
- }
- if ( !file_type )
- return gme_wrong_file_type;
-
- Music_Emu* emu = gme_new_emu( file_type, sample_rate );
- CHECK_ALLOC( emu );
-
- // optimization: avoids seeking/re-reading header
- Remaining_Reader rem( header, header_size, &in );
- gme_err_t err = emu->load( rem );
- in.close();
-
- if ( err )
- delete emu;
- else
- *out = emu;
-
- return err;
-}
-
-Music_Emu* gme_new_emu( gme_type_t type, long rate )
-{
- if ( type )
- {
- if ( rate == gme_info_only )
- return type->new_info();
-
- Music_Emu* me = type->new_emu();
- if ( me )
- {
- #if !GME_DISABLE_STEREO_DEPTH
- if ( type->flags_ & 1 )
- {
- me->effects_buffer = BLARGG_NEW Effects_Buffer;
- if ( me->effects_buffer )
- me->set_buffer( me->effects_buffer );
- }
-
- if ( !(type->flags_ & 1) || me->effects_buffer )
- #endif
- {
- if ( !me->set_sample_rate( rate ) )
- {
- check( me->type() == type );
- return me;
- }
- }
- delete me;
- }
- }
- return 0;
-}
-
-gme_err_t gme_load_file( Music_Emu* me, const char* path ) { return me->load_file( path ); }
-
-gme_err_t gme_load_data( Music_Emu* me, void const* data, long size )
-{
- Mem_File_Reader in( data, size );
- return me->load( in );
-}
-
-gme_err_t gme_load_custom( Music_Emu* me, gme_reader_t func, long size, void* data )
-{
- Callback_Reader in( func, size, data );
- return me->load( in );
-}
-
-void gme_delete( Music_Emu* me ) { delete me; }
-
-gme_type_t gme_type( Music_Emu const* me ) { return me->type(); }
-
-const char* gme_warning( Music_Emu* me ) { return me->warning(); }
-
-int gme_track_count( Music_Emu const* me ) { return me->track_count(); }
-
-const char* gme_track_info( Music_Emu const* me, track_info_t* out, int track )
-{
- return me->track_info( out, track );
-}
-
-void gme_set_stereo_depth( Music_Emu* me, double depth )
-{
-#if !GME_DISABLE_STEREO_DEPTH
- if ( me->effects_buffer )
- STATIC_CAST(Effects_Buffer*,me->effects_buffer)->set_depth( depth );
-#endif
-}
-
-void* gme_user_data ( Music_Emu const* me ) { return me->user_data(); }
-void gme_set_user_data ( Music_Emu* me, void* new_user_data ) { me->set_user_data( new_user_data ); }
-void gme_set_user_cleanup(Music_Emu* me, gme_user_cleanup_t func ) { me->set_user_cleanup( func ); }
-
-gme_err_t gme_start_track ( Music_Emu* me, int index ) { return me->start_track( index ); }
-gme_err_t gme_play ( Music_Emu* me, long n, short* p ) { return me->play( n, p ); }
-void gme_set_fade ( Music_Emu* me, long start_msec ) { me->set_fade( start_msec ); }
-int gme_track_ended ( Music_Emu const* me ) { return me->track_ended(); }
-long gme_tell ( Music_Emu const* me ) { return me->tell(); }
-gme_err_t gme_seek ( Music_Emu* me, long msec ) { return me->seek( msec ); }
-int gme_voice_count ( Music_Emu const* me ) { return me->voice_count(); }
-void gme_ignore_silence ( Music_Emu* me, int disable ) { me->ignore_silence( disable != 0 ); }
-void gme_set_tempo ( Music_Emu* me, double t ) { me->set_tempo( t ); }
-void gme_mute_voice ( Music_Emu* me, int index, int mute ) { me->mute_voice( index, mute != 0 ); }
-void gme_mute_voices ( Music_Emu* me, int mask ) { me->mute_voices( mask ); }
-void gme_set_equalizer ( Music_Emu* me, gme_equalizer_t const* eq ) { me->set_equalizer( *eq ); }
-gme_equalizer_t gme_equalizer( Music_Emu const* me ) { return me->equalizer(); }
-const char** gme_voice_names ( Music_Emu const* me ) { return me->voice_names(); }
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.h
deleted file mode 100644
index 469c901c..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/gme.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/* Game music emulator library C interface (also usable from C++) */
-
-/* Game_Music_Emu 0.5.2 */
-#ifndef GME_H
-#define GME_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Error string returned by library functions, or NULL if no error (success) */
-typedef const char* gme_err_t;
-
-/* First parameter of most gme_ functions is a pointer to the Music_Emu */
-typedef struct Music_Emu Music_Emu;
-
-
-/******** Basic operations ********/
-
-/* Create emulator and load game music file/data into it. Sets *out to new emulator. */
-gme_err_t gme_open_file( const char* path, Music_Emu** out, long sample_rate );
-
-/* Number of tracks available */
-int gme_track_count( Music_Emu const* );
-
-/* Start a track, where 0 is the first track */
-gme_err_t gme_start_track( Music_Emu*, int index );
-
-/* Generate 'count' 16-bit signed samples info 'out'. Output is in stereo. */
-gme_err_t gme_play( Music_Emu*, long count, short* out );
-
-/* Finish using emulator and free memory */
-void gme_delete( Music_Emu* );
-
-
-/******** Track position/length ********/
-
-/* Set time to start fading track out. Once fade ends track_ended() returns true.
-Fade time can be changed while track is playing. */
-void gme_set_fade( Music_Emu*, long start_msec );
-
-/* True if a track has reached its end */
-int gme_track_ended( Music_Emu const* );
-
-/* Number of milliseconds (1000 = one second) played since beginning of track */
-long gme_tell( Music_Emu const* );
-
-/* Seek to new time in track. Seeking backwards or far forward can take a while. */
-gme_err_t gme_seek( Music_Emu*, long msec );
-
-
-/******** Informational ********/
-
-/* If you only need track information from a music file, pass gme_info_only for
-sample_rate to open/load. */
-enum { gme_info_only = -1 };
-
-/* Most recent warning string, or NULL if none. Clears current warning after returning.
-Warning is also cleared when loading a file and starting a track. */
-const char* gme_warning( Music_Emu* );
-
-/* Load m3u playlist file (must be done after loading music) */
-gme_err_t gme_load_m3u( Music_Emu*, const char* path );
-
-/* Clear any loaded m3u playlist and any internal playlist that the music format
-supports (NSFE for example). */
-void gme_clear_playlist( Music_Emu* );
-
-/* Get information for a particular track (length, name, author, etc.) */
-typedef struct track_info_t track_info_t;
-gme_err_t gme_track_info( Music_Emu const*, track_info_t* out, int track );
-
-struct track_info_t
-{
- long track_count;
-
- /* times in milliseconds; -1 if unknown */
- long length;
- long intro_length;
- long loop_length;
-
- /* empty string if not available */
- char system [256];
- char game [256];
- char song [256];
- char author [256];
- char copyright [256];
- char comment [256];
- char dumper [256];
-};
-enum { gme_max_field = 255 };
-
-
-/******** Advanced playback ********/
-
-/* Adjust stereo echo depth, where 0.0 = off and 1.0 = maximum. Has no effect for
-GYM, SPC, and Sega Genesis VGM music */
-void gme_set_stereo_depth( Music_Emu*, double depth );
-
-/* Disable automatic end-of-track detection and skipping of silence at beginning
-if ignore is true */
-void gme_ignore_silence( Music_Emu*, int ignore );
-
-/* Adjust song tempo, where 1.0 = normal, 0.5 = half speed, 2.0 = double speed.
-Track length as returned by track_info() assumes a tempo of 1.0. */
-void gme_set_tempo( Music_Emu*, double tempo );
-
-/* Number of voices used by currently loaded file */
-int gme_voice_count( Music_Emu const* );
-
-/* Names of voices */
-const char** gme_voice_names( Music_Emu const* );
-
-/* Mute/unmute voice i, where voice 0 is first voice */
-void gme_mute_voice( Music_Emu*, int index, int mute );
-
-/* Set muting state of all voices at once using a bit mask, where -1 mutes all
-voices, 0 unmutes them all, 0x01 mutes just the first voice, etc. */
-void gme_mute_voices( Music_Emu*, int muting_mask );
-
-/* Frequency equalizer parameters (see gme.txt) */
-typedef struct gme_equalizer_t
-{
- double treble; /* -50.0 = muffled, 0 = flat, +5.0 = extra-crisp */
- long bass; /* 1 = full bass, 90 = average, 16000 = almost no bass */
-} gme_equalizer_t;
-
-/* Get current frequency equalizater parameters */
-gme_equalizer_t gme_equalizer( Music_Emu const* );
-
-/* Change frequency equalizer parameters */
-void gme_set_equalizer( Music_Emu*, gme_equalizer_t const* eq );
-
-
-
-/******** Game music types ********/
-
-/* gme_type_t is a pointer to this structure. For example, gme_nsf_type->system is
-"Nintendo NES" and gme_nsf_type->new_emu() is equilvant to new Nsf_Emu (in C++). */
-typedef struct gme_type_t_ const* gme_type_t;
-struct gme_type_t_
-{
- const char* system; /* name of system this music file type is generally for */
- int track_count; /* non-zero for formats with a fixed number of tracks */
- Music_Emu* (*new_emu)(); /* Create new emulator for this type (useful in C++ only) */
- Music_Emu* (*new_info)(); /* Create new info reader for this type */
-
- /* internal */
- const char* extension_;
- int flags_;
-};
-
-/* Emulator type constants for each supported file type */
-extern struct gme_type_t_ const gme_ay_type [], gme_gbs_type [], gme_gym_type [],
- gme_hes_type [], gme_kss_type [], gme_nsf_type [], gme_nsfe_type [],
- gme_sap_type [], gme_spc_type [], gme_vgm_type [], gme_vgz_type [];
-
-/* Type of this emulator */
-gme_type_t gme_type( Music_Emu const* );
-
-/* Pointer to array of all music types, with NULL entry at end. Allows a player linked
-to this library to support new music types without having to be updated. */
-gme_type_t const* gme_type_list();
-
-
-/******** Advanced file loading ********/
-
-/* Error returned if file type is not supported */
-extern const char gme_wrong_file_type [];
-
-/* Same as gme_open_file(), but uses file data already in memory. Makes copy of data. */
-gme_err_t gme_open_data( void const* data, long size, Music_Emu** out, long sample_rate );
-
-/* Determine likely game music type based on first four bytes of file. Returns
-string containing proper file suffix (i.e. "NSF", "SPC", etc.) or "" if
-file header is not recognized. */
-const char* gme_identify_header( void const* header );
-
-/* Get corresponding music type for file path or extension passed in. */
-gme_type_t gme_identify_extension( const char* path_or_extension );
-
-/* Determine file type based on file's extension or header (if extension isn't recognized).
-Sets *type_out to type, or 0 if unrecognized or error. */
-gme_err_t gme_identify_file( const char* path, gme_type_t* type_out );
-
-/* Create new emulator and set sample rate. Returns NULL if out of memory. If you only need
-track information, pass gme_info_only for sample_rate. */
-Music_Emu* gme_new_emu( gme_type_t, long sample_rate );
-
-/* Load music file into emulator */
-gme_err_t gme_load_file( Music_Emu*, const char* path );
-
-/* Load music file from memory into emulator. Makes a copy of data passed. */
-gme_err_t gme_load_data( Music_Emu*, void const* data, long size );
-
-/* Load music file using custom data reader function that will be called to
-read file data. Most emulators load the entire file in one read call. */
-typedef gme_err_t (*gme_reader_t)( void* your_data, void* out, long count );
-gme_err_t gme_load_custom( Music_Emu*, gme_reader_t, long file_size, void* your_data );
-
-/* Load m3u playlist file from memory (must be done after loading music) */
-gme_err_t gme_load_m3u_data( Music_Emu*, void const* data, long size );
-
-
-/******** User data ********/
-
-/* Set/get pointer to data you want to associate with this emulator.
-You can use this for whatever you want. */
-void gme_set_user_data( Music_Emu*, void* new_user_data );
-void* gme_user_data( Music_Emu const* );
-
-/* Register cleanup function to be called when deleting emulator, or NULL to
-clear it. Passes user_data to cleanup function. */
-typedef void (*gme_user_cleanup_t)( void* user_data );
-void gme_set_user_cleanup( Music_Emu*, gme_user_cleanup_t func );
-
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/hes_cpu_io.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/hes_cpu_io.h
deleted file mode 100644
index b3d71dad..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/hes_cpu_io.h
+++ /dev/null
@@ -1,101 +0,0 @@
-
-#include "Hes_Emu.h"
-
-#include "blargg_source.h"
-
-int Hes_Emu::cpu_read( hes_addr_t addr )
-{
- check( addr <= 0xFFFF );
- int result = *cpu::get_code( addr );
- if ( mmr [addr >> page_shift] == 0xFF )
- result = cpu_read_( addr );
- return result;
-}
-
-void Hes_Emu::cpu_write( hes_addr_t addr, int data )
-{
- check( addr <= 0xFFFF );
- byte* out = write_pages [addr >> page_shift];
- addr &= page_size - 1;
- if ( out )
- out [addr] = data;
- else if ( mmr [addr >> page_shift] == 0xFF )
- cpu_write_( addr, data );
-}
-
-inline byte const* Hes_Emu::cpu_set_mmr( int page, int bank )
-{
- write_pages [page] = 0;
- if ( bank < 0x80 )
- return rom.at_addr( bank * (blargg_long) page_size );
-
- byte* data = 0;
- switch ( bank )
- {
- case 0xF8:
- data = cpu::ram;
- break;
-
- case 0xF9:
- case 0xFA:
- case 0xFB:
- data = &sgx [(bank - 0xF9) * page_size];
- break;
-
- default:
- if ( bank != 0xFF )
- dprintf( "Unmapped bank $%02X\n", bank );
- return rom.unmapped();
- }
-
- write_pages [page] = data;
- return data;
-}
-
-#define CPU_READ_FAST( cpu, addr, time, out ) \
- CPU_READ_FAST_( STATIC_CAST(Hes_Emu*,cpu), addr, time, out )
-
-#define CPU_READ_FAST_( cpu, addr, time, out ) \
-{\
- out = READ_PROG( addr );\
- if ( mmr [addr >> page_shift] == 0xFF )\
- {\
- FLUSH_TIME();\
- out = cpu->cpu_read_( addr );\
- CACHE_TIME();\
- }\
-}
-
-#define CPU_WRITE_FAST( cpu, addr, data, time ) \
- CPU_WRITE_FAST_( STATIC_CAST(Hes_Emu*,cpu), addr, data, time )
-
-#define CPU_WRITE_FAST_( cpu, addr, data, time ) \
-{\
- byte* out = cpu->write_pages [addr >> page_shift];\
- addr &= page_size - 1;\
- if ( out )\
- {\
- out [addr] = data;\
- }\
- else if ( mmr [addr >> page_shift] == 0xFF )\
- {\
- FLUSH_TIME();\
- cpu->cpu_write_( addr, data );\
- CACHE_TIME();\
- }\
-}
-
-#define CPU_READ( cpu, addr, time ) \
- STATIC_CAST(Hes_Emu*,cpu)->cpu_read( addr )
-
-#define CPU_WRITE( cpu, addr, data, time ) \
- STATIC_CAST(Hes_Emu*,cpu)->cpu_write( addr, data )
-
-#define CPU_WRITE_VDP( cpu, addr, data, time ) \
- STATIC_CAST(Hes_Emu*,cpu)->cpu_write_vdp( addr, data )
-
-#define CPU_SET_MMR( cpu, page, bank ) \
- STATIC_CAST(Hes_Emu*,cpu)->cpu_set_mmr( page, bank )
-
-#define CPU_DONE( cpu, time, result_out ) \
- result_out = STATIC_CAST(Hes_Emu*,cpu)->cpu_done()
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/nes_cpu_io.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/nes_cpu_io.h
deleted file mode 100644
index 4bae3793..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/nes_cpu_io.h
+++ /dev/null
@@ -1,83 +0,0 @@
-
-#include "Nsf_Emu.h"
-
-#if !NSF_EMU_APU_ONLY
- #include "Nes_Namco_Apu.h"
-#endif
-
-#include "blargg_source.h"
-
-int Nsf_Emu::cpu_read( nes_addr_t addr )
-{
- int result;
-
- result = cpu::low_mem [addr & 0x7FF];
- if ( !(addr & 0xE000) )
- goto exit;
-
- result = *cpu::get_code( addr );
- if ( addr > 0x7FFF )
- goto exit;
-
- result = sram [addr & (sizeof sram - 1)];
- if ( addr > 0x5FFF )
- goto exit;
-
- if ( addr == Nes_Apu::status_addr )
- return apu.read_status( cpu::time() );
-
- #if !NSF_EMU_APU_ONLY
- if ( addr == Nes_Namco_Apu::data_reg_addr && namco )
- return namco->read_data();
- #endif
-
- result = addr >> 8; // simulate open bus
-
- if ( addr != 0x2002 )
- dprintf( "Read unmapped $%.4X\n", (unsigned) addr );
-
-exit:
- return result;
-}
-
-void Nsf_Emu::cpu_write( nes_addr_t addr, int data )
-{
- {
- nes_addr_t offset = addr ^ sram_addr;
- if ( offset < sizeof sram )
- {
- sram [offset] = data;
- return;
- }
- }
- {
- int temp = addr & 0x7FF;
- if ( !(addr & 0xE000) )
- {
- cpu::low_mem [temp] = data;
- return;
- }
- }
-
- if ( unsigned (addr - Nes_Apu::start_addr) <= Nes_Apu::end_addr - Nes_Apu::start_addr )
- {
- GME_APU_HOOK( this, addr - Nes_Apu::start_addr, data );
- apu.write_register( cpu::time(), addr, data );
- return;
- }
-
- unsigned bank = addr - bank_select_addr;
- if ( bank < bank_count )
- {
- blargg_long offset = rom.mask_addr( data * (blargg_long) bank_size );
- if ( offset >= rom.size() )
- set_warning( "Invalid bank" );
- cpu::map_code( (bank + 8) * bank_size, bank_size, rom.at_addr( offset ) );
- return;
- }
-
- cpu_write_misc( addr, data );
-}
-
-#define CPU_READ( cpu, addr, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_read( addr )
-#define CPU_WRITE( cpu, addr, data, time ) STATIC_CAST(Nsf_Emu&,*cpu).cpu_write( addr, data )
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/sap_cpu_io.h b/plugins/gme/Game_Music_Emu-0.5.2/gme/sap_cpu_io.h
deleted file mode 100644
index 8c2f6dd0..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/sap_cpu_io.h
+++ /dev/null
@@ -1,26 +0,0 @@
-
-#include "Sap_Emu.h"
-
-#include "blargg_source.h"
-
-#define CPU_WRITE( cpu, addr, data, time ) STATIC_CAST(Sap_Emu&,*cpu).cpu_write( addr, data )
-
-void Sap_Emu::cpu_write( sap_addr_t addr, int data )
-{
- mem.ram [addr] = data;
- if ( (addr >> 8) == 0xD2 )
- cpu_write_( addr, data );
-}
-
-#ifdef NDEBUG
- #define CPU_READ( cpu, addr, time ) READ_LOW( addr )
-#else
- #define CPU_READ( cpu, addr, time ) STATIC_CAST(Sap_Emu&,*cpu).cpu_read( addr )
-
- int Sap_Emu::cpu_read( sap_addr_t addr )
- {
- if ( (addr & 0xF900) == 0xD000 )
- dprintf( "Unmapped read $%04X\n", addr );
- return mem.ram [addr];
- }
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.cpp b/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.cpp
deleted file mode 100644
index 74cb2c32..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Audio_Scope.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-/* Copyright (C) 2005-2006 by Shay Green. Permission is hereby granted, free of
-charge, to any person obtaining a copy of this software module and associated
-documentation files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-to permit persons to whom the Software is furnished to do so, subject to the
-following conditions: The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software. THE
-SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-int const step_bits = 8;
-int const step_unit = 1 << step_bits;
-int const erase_color = 1;
-int const draw_color = 2;
-
-Audio_Scope::Audio_Scope()
-{
- surface = 0;
- buf = 0;
-}
-
-Audio_Scope::~Audio_Scope()
-{
- free( buf );
-
- if ( surface )
- SDL_FreeSurface( surface );
-}
-
-const char* Audio_Scope::init( int width, int height )
-{
- assert( height <= 256 );
- assert( !buf ); // can only call init() once
-
- buf = (byte*) calloc( width * sizeof *buf, 1 );
- if ( !buf )
- return "Out of memory";
-
- low_y = 0;
- high_y = height;
- buf_size = width;
-
- for ( sample_shift = 6; sample_shift < 14; )
- if ( ((0x7FFFL * 2) >> sample_shift++) < height )
- break;
-
- v_offset = height / 2 - (0x10000 >> sample_shift);
-
- screen = SDL_SetVideoMode( width, height, 0, 0 );
- if ( !screen )
- return "Couldn't set video mode";
-
- surface = SDL_CreateRGBSurface( SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0 );
- if ( !screen )
- return "Couldn't create surface";
-
- static SDL_Color palette [2] = { {0, 0, 0}, {0, 255, 0} };
- SDL_SetColors( surface, palette, 1, 2 );
-
- return 0; // success
-}
-
-const char* Audio_Scope::draw( const short* in, long count, double step )
-{
- int low = low_y;
- int high = high_y;
-
- if ( count >= buf_size )
- {
- count = buf_size;
- low_y = 0x7FFF;
- high_y = 0;
- }
-
- if ( SDL_LockSurface( surface ) < 0 )
- return "Couldn't lock surface";
- render( in, count, (long) (step * step_unit) );
- SDL_UnlockSurface( surface );
-
- if ( low > low_y )
- low = low_y;
-
- if ( high < high_y )
- high = high_y;
-
- SDL_Rect r;
- r.x = 0;
- r.w = buf_size;
- r.y = low + v_offset;
- r.h = high - low + 1;
-
- if ( SDL_BlitSurface( surface, &r, screen, &r ) < 0 )
- return "Blit to screen failed";
-
- if ( SDL_Flip( screen ) < 0 )
- return "Couldn't flip screen";
-
- return 0; // success
-}
-
-void Audio_Scope::render( short const* in, long count, long step )
-{
- byte* old_pos = buf;
- long surface_pitch = surface->pitch;
- byte* out = (byte*) surface->pixels + v_offset * surface_pitch;
- int old_erase = *old_pos;
- int old_draw = 0;
- long in_pos = 0;
-
- int low_y = this->low_y;
- int high_y = this->high_y;
- int half_step = (step + step_unit / 2) >> (step_bits + 1);
-
- while ( count-- )
- {
- // Line drawing/erasing starts at previous sample and ends one short of
- // current sample, except when previous and current are the same.
-
- // Extra read on the last iteration of line loops will always be at the
- // height of the next sample, and thus within the gworld bounds.
-
- // Erase old line
- {
- int delta = *old_pos - old_erase;
- int offset = old_erase * surface_pitch;
- old_erase += delta;
-
- int next_line = surface_pitch;
- if ( delta < 0 )
- {
- delta = -delta;
- next_line = -surface_pitch;
- }
-
- do
- {
- out [offset] = erase_color;
- offset += next_line;
- }
- while ( delta-- > 1 );
- }
-
- // Draw new line and put in old_buf
- {
-
- int in_whole = in_pos >> step_bits;
- int sample = (0x7FFF * 2 - in [in_whole] - in [in_whole + half_step]) >> sample_shift;
- if ( !in_pos )
- old_draw = sample;
- in_pos += step;
-
- int delta = sample - old_draw;
- int offset = old_draw * surface_pitch;
- old_draw += delta;
-
- int next_line = surface_pitch;
- if ( delta < 0 )
- {
- delta = -delta;
- next_line = -surface_pitch;
- }
-
- *old_pos++ = sample;
-
- // min/max updating can be interleved anywhere
-
- if ( low_y > sample )
- low_y = sample;
-
- do
- {
- out [offset] = draw_color;
- offset += next_line;
- }
- while ( delta-- > 1 );
-
- if ( high_y < sample )
- high_y = sample;
- }
-
- out++;
- }
-
- this->low_y = low_y;
- this->high_y = high_y;
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.h b/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.h
deleted file mode 100644
index 75334676..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/player/Audio_Scope.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Simple audio waveform scope in a window, using SDL multimedia library
-
-#ifndef AUDIO_SCOPE_H
-#define AUDIO_SCOPE_H
-
-#include "SDL.h"
-
-class Audio_Scope {
-public:
- typedef const char* error_t;
-
- // Initialize scope window of specified size. Height must be 256 or less.
- error_t init( int width, int height );
-
- // Draw at most 'count' samples from 'in', skipping 'step' samples after
- // each sample drawn. Step can be less than 1.0.
- error_t draw( const short* in, long count, double step = 1.0 );
-
- Audio_Scope();
- ~Audio_Scope();
-
-private:
- typedef unsigned char byte;
- SDL_Surface* screen;
- SDL_Surface* surface;
- byte* buf;
- int buf_size;
- int sample_shift;
- int low_y;
- int high_y;
- int v_offset;
-
- void render( short const* in, long count, long step );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.cpp b/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.cpp
deleted file mode 100644
index a39819f1..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Music_Player.h"
-
-#include "gme/Music_Emu.h"
-
-#include <string.h>
-#include <ctype.h>
-
-/* Copyright (C) 2005-2006 by Shay Green. Permission is hereby granted, free of
-charge, to any person obtaining a copy of this software module and associated
-documentation files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-to permit persons to whom the Software is furnished to do so, subject to the
-following conditions: The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software. THE
-SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#include "blargg_source.h"
-
-// Number of audio buffers per second. Adjust if you encounter audio skipping.
-const int fill_rate = 45;
-
-// Simple sound driver using SDL
-typedef void (*sound_callback_t)( void* data, short* out, int count );
-static const char* sound_init( long sample_rate, int buf_size, sound_callback_t, void* data );
-static void sound_start();
-static void sound_stop();
-static void sound_cleanup();
-
-Music_Player::Music_Player()
-{
- emu_ = 0;
- scope_buf = 0;
- paused = false;
-}
-
-blargg_err_t Music_Player::init( long rate )
-{
- sample_rate = rate;
-
- int min_size = sample_rate * 2 / fill_rate;
- int buf_size = 512;
- while ( buf_size < min_size )
- buf_size *= 2;
-
- return sound_init( sample_rate, buf_size, fill_buffer, this );
-}
-
-void Music_Player::stop()
-{
- sound_stop();
- delete emu_;
- emu_ = 0;
-}
-
-Music_Player::~Music_Player()
-{
- stop();
- sound_cleanup();
-}
-
-blargg_err_t Music_Player::load_file( const char* path )
-{
- stop();
-
- RETURN_ERR( gme_open_file( path, &emu_, sample_rate ) );
-
- char m3u_path [256 + 5];
- strncpy( m3u_path, path, 256 );
- m3u_path [256] = 0;
- char* p = strrchr( m3u_path, '.' );
- if ( !p )
- p = m3u_path + strlen( m3u_path );
- strcpy( p, ".m3u" );
- if ( emu_->load_m3u( m3u_path ) ) { } // ignore error
-
- return 0;
-}
-
-int Music_Player::track_count() const
-{
- return emu_ ? emu_->track_count() : false;
-}
-
-blargg_err_t Music_Player::start_track( int track )
-{
- if ( emu_ )
- {
- // Sound must not be running when operating on emulator
- sound_stop();
- RETURN_ERR( emu_->start_track( track ) );
-
- // Calculate track length
- if ( !emu_->track_info( &track_info_ ) )
- {
- if ( track_info_.length <= 0 )
- track_info_.length = track_info_.intro_length +
- track_info_.loop_length * 2;
- }
- if ( track_info_.length <= 0 )
- track_info_.length = (long) (2.5 * 60 * 1000);
- emu_->set_fade( track_info_.length );
-
- paused = false;
- sound_start();
- }
- return 0;
-}
-
-void Music_Player::pause( int b )
-{
- paused = b;
- if ( b )
- sound_stop();
- else
- sound_start();
-}
-
-void Music_Player::suspend()
-{
- if ( !paused )
- sound_stop();
-}
-
-void Music_Player::resume()
-{
- if ( !paused )
- sound_start();
-}
-
-bool Music_Player::track_ended() const
-{
- return emu_ ? emu_->track_ended() : false;
-}
-
-void Music_Player::set_stereo_depth( double tempo )
-{
- suspend();
- gme_set_stereo_depth( emu_, tempo );
- resume();
-}
-
-void Music_Player::set_tempo( double tempo )
-{
- suspend();
- emu_->set_tempo( tempo );
- resume();
-}
-
-void Music_Player::mute_voices( int mask )
-{
- suspend();
- emu_->mute_voices( mask );
- emu_->ignore_silence( mask != 0 );
- resume();
-}
-
-void Music_Player::fill_buffer( void* data, sample_t* out, int count )
-{
- Music_Player* self = (Music_Player*) data;
- if ( self->emu_ )
- {
- if ( self->emu_->play( count, out ) ) { } // ignore error
-
- if ( self->scope_buf )
- memcpy( self->scope_buf, out, self->scope_buf_size * sizeof *self->scope_buf );
- }
-}
-
-// Sound output driver using SDL
-
-#include "SDL.h"
-
-static sound_callback_t sound_callback;
-static void* sound_callback_data;
-
-static void sdl_callback( void* data, Uint8* out, int count )
-{
- if ( sound_callback )
- sound_callback( sound_callback_data, (short*) out, count / 2 );
-}
-
-static const char* sound_init( long sample_rate, int buf_size,
- sound_callback_t cb, void* data )
-{
- sound_callback = cb;
- sound_callback_data = data;
-
- static SDL_AudioSpec as; // making static clears all fields to 0
- as.freq = sample_rate;
- as.format = AUDIO_S16SYS;
- as.channels = 2;
- as.callback = sdl_callback;
- as.samples = buf_size;
- if ( SDL_OpenAudio( &as, 0 ) < 0 )
- {
- const char* err = SDL_GetError();
- if ( !err )
- err = "Couldn't open SDL audio";
- return err;
- }
-
- return 0;
-}
-
-static void sound_start()
-{
- SDL_PauseAudio( false );
-}
-
-static void sound_stop()
-{
- SDL_PauseAudio( true );
-
- // be sure audio thread is not active
- SDL_LockAudio();
- SDL_UnlockAudio();
-}
-
-static void sound_cleanup()
-{
- sound_stop();
- SDL_CloseAudio();
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.h b/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.h
deleted file mode 100644
index 7a573c45..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/player/Music_Player.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Simple game music file player
-
-// Game_Music_Emu 0.5.2
-#ifndef MUSIC_PLAYER_H
-#define MUSIC_PLAYER_H
-
-#include "gme/Music_Emu.h"
-
-class Music_Player {
-public:
- // Initialize player and set sample rate
- blargg_err_t init( long sample_rate = 44100 );
-
- // Load game music file. NULL on success, otherwise error string.
- blargg_err_t load_file( const char* path );
-
- // (Re)start playing track. Tracks are numbered from 0 to track_count() - 1.
- blargg_err_t start_track( int track );
-
- // Stop playing current file
- void stop();
-
-// Optional functions
-
- // Number of tracks in current file, or 0 if no file loaded.
- int track_count() const;
-
- // Info for current track
- track_info_t const& track_info() const { return track_info_; }
-
- // Pause/resume playing current track.
- void pause( int );
-
- // True if track ended
- bool track_ended() const;
-
- // Pointer to emulator
- Music_Emu* emu() const { return emu_; }
-
- // Set stereo depth, where 0.0 = none and 1.0 = maximum
- void set_stereo_depth( double );
-
- // Set tempo, where 0.5 = half speed, 1.0 = normal, 2.0 = double speed
- void set_tempo( double );
-
- // Set voice muting bitmask
- void mute_voices( int );
-
- // Set buffer to copy samples from each buffer into, or NULL to disable
- typedef short sample_t;
- void set_scope_buffer( sample_t* buf, int size ) { scope_buf = buf; scope_buf_size = size; }
-
-public:
- Music_Player();
- ~Music_Player();
-private:
- Music_Emu* emu_;
- sample_t* scope_buf;
- long sample_rate;
- int scope_buf_size;
- bool paused;
- track_info_t track_info_;
-
- void suspend();
- void resume();
- static void fill_buffer( void*, sample_t*, int );
-};
-
-#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/player/player.cpp b/plugins/gme/Game_Music_Emu-0.5.2/player/player.cpp
deleted file mode 100644
index a0685997..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/player/player.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/* How to play game music files with Music_Player (requires SDL library)
-
-Run program with path to a game music file.
-
-Left/Right Change track
-Space Pause/unpause
-E Normal/slight stereo echo/more stereo echo
--/= Adjust tempo
-1-9 Toggle channel on/off
-0 Reset tempo and turn channels back on */
-
-int const scope_width = 512;
-
-#include "Music_Player.h"
-#include "Audio_Scope.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "SDL.h"
-
-void handle_error( const char* );
-
-static bool paused;
-static Audio_Scope* scope;
-static Music_Player* player;
-static short scope_buf [scope_width * 2];
-
-static void init()
-{
- // Start SDL
- if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 )
- exit( EXIT_FAILURE );
- atexit( SDL_Quit );
- SDL_EnableKeyRepeat( 500, 80 );
-
- // Init scope
- scope = new Audio_Scope;
- if ( !scope )
- handle_error( "Out of memory" );
- if ( scope->init( scope_width, 256 ) )
- handle_error( "Couldn't initialize scope" );
- memset( scope_buf, 0, sizeof scope_buf );
-
- // Create player
- player = new Music_Player;
- if ( !player )
- handle_error( "Out of memory" );
- handle_error( player->init() );
- player->set_scope_buffer( scope_buf, scope_width * 2 );
-}
-
-static void start_track( int track, const char* path )
-{
- paused = false;
- handle_error( player->start_track( track - 1 ) );
-
- // update window title with track info
-
- long seconds = player->track_info().length / 1000;
- const char* game = player->track_info().game;
- if ( !*game )
- {
- // extract filename
- game = strrchr( path, '\\' ); // DOS
- if ( !game )
- game = strrchr( path, '/' ); // UNIX
- if ( !game )
- game = path;
- else
- game++; // skip path separator
- }
-
- char title [512];
- sprintf( title, "%s: %d/%d %s (%ld:%02ld)",
- game, track, player->track_count(), player->track_info().song,
- seconds / 60, seconds % 60 );
- SDL_WM_SetCaption( title, title );
-}
-
-int main( int argc, char** argv )
-{
- init();
-
- // Load file
- const char* path = (argc > 1 ? argv [argc - 1] : "test.nsf");
- handle_error( player->load_file( path ) );
- start_track( 1, path );
-
- // Main loop
- int track = 1;
- double tempo = 1.0;
- bool running = true;
- double stereo_depth = 0.0;
- int muting_mask = 0;
- while ( running )
- {
- SDL_Delay( 1000 / 100 );
-
- // Update scope
- scope->draw( scope_buf, scope_width, 2 );
-
- // Automatically go to next track when current one ends
- if ( player->track_ended() )
- {
- if ( track < player->track_count() )
- start_track( ++track, path );
- else
- player->pause( paused = true );
- }
-
- // Handle keyboard input
- SDL_Event e;
- while ( SDL_PollEvent( &e ) )
- {
- switch ( e.type )
- {
- case SDL_QUIT:
- running = false;
- break;
-
- case SDL_KEYDOWN:
- int key = e.key.keysym.sym;
- switch ( key )
- {
- case SDLK_q:
- case SDLK_ESCAPE: // quit
- running = false;
- break;
-
- case SDLK_LEFT: // prev track
- if ( !paused && !--track )
- track = 1;
- start_track( track, path );
- break;
-
- case SDLK_RIGHT: // next track
- if ( track < player->track_count() )
- start_track( ++track, path );
- break;
-
- case SDLK_MINUS: // reduce tempo
- tempo -= 0.1;
- if ( tempo < 0.1 )
- tempo = 0.1;
- player->set_tempo( tempo );
- break;
-
- case SDLK_EQUALS: // increase tempo
- tempo += 0.1;
- if ( tempo > 2.0 )
- tempo = 2.0;
- player->set_tempo( tempo );
- break;
-
- case SDLK_SPACE: // toggle pause
- paused = !paused;
- player->pause( paused );
- break;
-
- case SDLK_e: // toggle echo
- stereo_depth += 0.2;
- if ( stereo_depth > 0.5 )
- stereo_depth = 0;
- player->set_stereo_depth( stereo_depth );
- break;
-
- case SDLK_0: // reset tempo and muting
- tempo = 1.0;
- muting_mask = 0;
- player->set_tempo( tempo );
- player->mute_voices( muting_mask );
- break;
-
- default:
- if ( SDLK_1 <= key && key <= SDLK_9 ) // toggle muting
- {
- muting_mask ^= 1 << (key - SDLK_1);
- player->mute_voices( muting_mask );
- }
- }
- }
- }
- }
-
- // Cleanup
- delete player;
- delete scope;
-
- return 0;
-}
-
-void handle_error( const char* error )
-{
- if ( error )
- {
- // put error in window title
- char str [256];
- sprintf( str, "Error: %s", error );
- fprintf( stderr, str );
- SDL_WM_SetCaption( str, str );
-
- // wait for keyboard or mouse activity
- SDL_Event e;
- do
- {
- while ( !SDL_PollEvent( &e ) ) { }
- }
- while ( e.type != SDL_QUIT && e.type != SDL_KEYDOWN && e.type != SDL_MOUSEBUTTONDOWN );
-
- exit( EXIT_FAILURE );
- }
-}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/readme.txt b/plugins/gme/Game_Music_Emu-0.5.2/readme.txt
deleted file mode 100644
index e3470bfa..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/readme.txt
+++ /dev/null
@@ -1,205 +0,0 @@
-Game_Music_Emu 0.5.2: Game Music Emulators
-------------------------------------------
-Game_Music_Emu is a collection of video game music file emulators that
-support the following formats and systems:
-
-AY ZX Spectrum/Amstrad CPC
-GBS Nintendo Game Boy
-GYM Sega Genesis/Mega Drive
-HES NEC TurboGrafx-16/PC Engine
-KSS MSX Home Computer/other Z80 systems (doesn't support FM sound)
-NSF/NSFE Nintendo NES/Famicom (with VRC 6, Namco 106, and FME-7 sound)
-SAP Atari systems using POKEY sound chip
-SPC Super Nintendo/Super Famicom
-VGM/VGZ Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro
-
-Features:
-* Can be used in C and C++ code
-* High emphasis has been placed on making the library very easy to use
-* One set of common functions work with all emulators the same way
-* Several code examples, including music player using SDL
-* Portable code for use on any system with modern or older C++ compilers
-* Adjustable output sample rate using quality band-limited resampling
-* Uniform access to text information fields and track timing information
-* End-of-track fading and automatic look ahead silence detection
-* Treble/bass and stereo echo for AY/GBS/HES/KSS/NSF/NSFE/SAP/VGM
-* Tempo can be adjusted and individual voices can be muted while playing
-* Can read music data from file, memory, or custom reader function/class
-* Can access track information without having to load into full emulator
-* M3U track listing support for multi-track formats
-* Modular design allows elimination of unneeded emulators/features
-
-This library has been used in game music players for Windows, Linux on
-several architectures, Mac OS, MorphOS, Xbox, PlayStation Portable,
-GP2X, and Nintendo DS.
-
-Author : Shay Green <gblargg@gmail.com>
-Website: http://www.slack.net/~ant/
-Forum : http://groups.google.com/group/blargg-sound-libs
-License: GNU Lesser General Public License (LGPL)
-
-
-Getting Started
----------------
-Build a program consisting of demo/basics.c, demo/Wave_Writer.cpp, and
-all source files in gme/. Be sure "test.nsf" is in the same directory.
-Running the program should generate the recording "out.wav".
-
-Read gme.txt for more information. Post to the discussion forum for
-assistance.
-
-
-Files
------
-gme.txt General notes about the library
-changes.txt Changes made since previous releases
-design.txt Library design notes
-license.txt GNU Lesser General Public License
-
-test.nsf Test file for NSF emulator
-test.m3u Test m3u playlist for features.c demo
-
-demo/
- basics.c Records NSF file to wave sound file
- cpp_basics.cpp C++ version of basics.c
- features.c Demonstrates many additional features
- Wave_Writer.h WAVE sound file writer used for demo output
- Wave_Writer.cpp
-
-player/ Player using the SDL multimedia library
- player.cpp Simple music player with waveform display
- Music_Player.cpp Stand alone player for background music
- Music_Player.h
- Audio_Scope.cpp Audio waveform scope
- Audio_Scope.h
-
-gme/
- blargg_config.h Library configuration (modify this file as needed)
-
- gme.h C interface (also usable in C++, and simpler too)
- gme.cpp
-
- Gme_File.h File loading and track information
- Music_Emu.h Track playback and adjustments
- Data_Reader.h Custom data readers
-
- Effects_Buffer.h Sound buffer with stereo echo and panning
- Effects_Buffer.cpp
-
- M3u_Playlist.h M3U playlist support
- M3u_Playlist.cpp
-
- Ay_Emu.h ZX Spectrum AY emulator
- Ay_Emu.cpp
- Ay_Apu.cpp
- Ay_Apu.h
- Ay_Cpu.cpp
- Ay_Cpu.h
-
- Gbs_Emu.h Nintendo Game Boy GBS emulator
- Gbs_Emu.cpp
- Gb_Apu.cpp
- Gb_Apu.h
- Gb_Cpu.cpp
- Gb_Cpu.h
- gb_cpu_io.h
- Gb_Oscs.cpp
- Gb_Oscs.h
-
- Hes_Emu.h TurboGrafx-16/PC Engine HES emulator
- Hes_Apu.cpp
- Hes_Apu.h
- Hes_Cpu.cpp
- Hes_Cpu.h
- hes_cpu_io.h
- Hes_Emu.cpp
-
- Kss_Emu.h MSX Home Computer/other Z80 systems KSS emulator
- Kss_Emu.cpp
- Kss_Cpu.cpp
- Kss_Cpu.h
- Kss_Scc_Apu.cpp
- Kss_Scc_Apu.h
- Ay_Apu.h
- Ay_Apu.cpp
- Sms_Apu.h
- Sms_Apu.cpp
- Sms_Oscs.h
-
- Nsf_Emu.h Nintendo NES NSF/NSFE emulator
- Nsf_Emu.cpp
- Nes_Apu.cpp
- Nes_Apu.h
- Nes_Cpu.cpp
- Nes_Cpu.h
- nes_cpu_io.h
- Nes_Oscs.cpp
- Nes_Oscs.h
- Nes_Fme7_Apu.cpp
- Nes_Fme7_Apu.h
- Nes_Namco_Apu.cpp
- Nes_Namco_Apu.h
- Nes_Vrc6_Apu.cpp
- Nes_Vrc6_Apu.h
- Nsfe_Emu.h NSFE support
- Nsfe_Emu.cpp
-
- Spc_Emu.h Super Nintendo SPC emulator
- Spc_Emu.cpp
- Snes_Spc.cpp
- Snes_Spc.h
- Spc_Cpu.cpp
- Spc_Cpu.h
- Spc_Dsp.cpp
- Spc_Dsp.h
- Fir_Resampler.cpp
- Fir_Resampler.h
-
- Sap_Emu.h Atari SAP emulator
- Sap_Emu.cpp
- Sap_Apu.cpp
- Sap_Apu.h
- Sap_Cpu.cpp
- Sap_Cpu.h
- sap_cpu_io.h
-
- Vgm_Emu.h Sega VGM emulator
- Vgm_Emu_Impl.cpp
- Vgm_Emu_Impl.h
- Vgm_Emu.cpp
- Ym2413_Emu.cpp
- Ym2413_Emu.h
- Gym_Emu.h Sega Genesis GYM emulator
- Gym_Emu.cpp
- Sms_Apu.cpp Common Sega emulator files
- Sms_Apu.h
- Sms_Oscs.h
- Ym2612_Emu.cpp
- Ym2612_Emu.h
- Dual_Resampler.cpp
- Dual_Resampler.h
- Fir_Resampler.cpp
- Fir_Resampler.h
-
- blargg_common.h Common files needed by all emulators
- blargg_endian.h
- blargg_source.h
- Blip_Buffer.cpp
- Blip_Buffer.h
- Gme_File.cpp
- Music_Emu.cpp
- Classic_Emu.h
- Classic_Emu.cpp
- Multi_Buffer.h
- Multi_Buffer.cpp
- Data_Reader.cpp
-
-
-Legal
------
-Game_Music_Emu library copyright (C) 2003-2006 Shay Green.
-SNES SPC DSP emulator based on OpenSPC, copyright (C) 2002 Brad Martin.
-Sega Genesis YM2612 emulator copyright (C) 2002 Stephane Dallongeville.
-
---
-Shay Green <gblargg@gmail.com>
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/test.m3u b/plugins/gme/Game_Music_Emu-0.5.2/test.m3u
deleted file mode 100644
index fd46bfe1..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/test.m3u
+++ /dev/null
@@ -1,2 +0,0 @@
-# filename,track number,track name,track time
-test.nsf,$00,BGM C,1:16
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/test.nsf b/plugins/gme/Game_Music_Emu-0.5.2/test.nsf
deleted file mode 100644
index da5fcedd..00000000
--- a/plugins/gme/Game_Music_Emu-0.5.2/test.nsf
+++ /dev/null
Binary files differ
diff --git a/plugins/gme/Makefile.am b/plugins/gme/Makefile.am
index fff96fdd..cc506737 100644
--- a/plugins/gme/Makefile.am
+++ b/plugins/gme/Makefile.am
@@ -2,7 +2,9 @@ if HAVE_GME
#gmeversion=Game_Music_Emu-0.5.2
#gmeversion=game-music-emu-0.5.5
-gmeversion=game-music-emu-svn
+#gmeversion=game-music-emu-svn
+#gmeversion=game-music-emu-0.6.0
+gmeversion=game-music-emu-0.6pre
gmepath=@top_srcdir@/plugins/gme/$(gmeversion)
EXTRA_DIST = $(gmepath)/changes.txt $(gmepath)/design.txt $(gmepath)/gme.txt $(gmepath)/license.txt $(gmepath)/readme.txt
@@ -11,78 +13,130 @@ gmedir = $(libdir)/$(PACKAGE)
pkglib_LTLIBRARIES = gme.la
+# 0.6pre (foo_gep) files
gme_la_SOURCES = cgme.c\
$(gmeversion)/gme/Ay_Apu.cpp\
- $(gmeversion)/gme/Gb_Apu.cpp\
- $(gmeversion)/gme/Hes_Emu.cpp\
- $(gmeversion)/gme/Nes_Fme7_Apu.cpp\
- $(gmeversion)/gme/Sms_Apu.cpp\
+ $(gmeversion)/gme/Ay_Core.cpp\
$(gmeversion)/gme/Ay_Cpu.cpp\
- $(gmeversion)/gme/Gb_Cpu.cpp\
- $(gmeversion)/gme/Kss_Cpu.cpp\
- $(gmeversion)/gme/Nes_Namco_Apu.cpp\
- $(gmeversion)/gme/Snes_Spc.cpp\
$(gmeversion)/gme/Ay_Emu.cpp\
- $(gmeversion)/gme/Gb_Oscs.cpp\
- $(gmeversion)/gme/Kss_Emu.cpp\
- $(gmeversion)/gme/Nes_Oscs.cpp\
- $(gmeversion)/gme/Spc_Cpu.cpp\
+ $(gmeversion)/gme/blargg_common.cpp\
+ $(gmeversion)/gme/blargg_errors.cpp\
$(gmeversion)/gme/Blip_Buffer.cpp\
- $(gmeversion)/gme/Gbs_Emu.cpp\
- $(gmeversion)/gme/Kss_Scc_Apu.cpp\
- $(gmeversion)/gme/Nes_Vrc6_Apu.cpp\
- $(gmeversion)/gme/Spc_Dsp.cpp\
$(gmeversion)/gme/Classic_Emu.cpp\
+ $(gmeversion)/gme/Downsampler.cpp\
+ $(gmeversion)/gme/Dual_Resampler.cpp\
+ $(gmeversion)/gme/Effects_Buffer.cpp\
+ $(gmeversion)/gme/emu2413.cpp\
+ $(gmeversion)/gme/Fir_Resampler.cpp\
+ $(gmeversion)/gme/fmopl.cpp\
+ $(gmeversion)/gme/Gb_Apu.cpp\
+ $(gmeversion)/gme/Gb_Cpu.cpp\
+ $(gmeversion)/gme/Gb_Oscs.cpp\
+ $(gmeversion)/gme/Gbs_Core.cpp\
+ $(gmeversion)/gme/Gbs_Cpu.cpp\
+ $(gmeversion)/gme/Gbs_Emu.cpp\
$(gmeversion)/gme/gme.cpp\
- $(gmeversion)/gme/M3u_Playlist.cpp\
- $(gmeversion)/gme/Nsfe_Emu.cpp\
- $(gmeversion)/gme/Spc_Emu.cpp\
- $(gmeversion)/gme/Data_Reader.cpp\
$(gmeversion)/gme/Gme_File.cpp\
- $(gmeversion)/gme/Multi_Buffer.cpp\
- $(gmeversion)/gme/Nsf_Emu.cpp\
- $(gmeversion)/gme/Vgm_Emu.cpp\
- $(gmeversion)/gme/Dual_Resampler.cpp\
+ $(gmeversion)/gme/Gme_Loader.cpp\
$(gmeversion)/gme/Gym_Emu.cpp\
- $(gmeversion)/gme/Music_Emu.cpp\
- $(gmeversion)/gme/Sap_Apu.cpp\
- $(gmeversion)/gme/Vgm_Emu_Impl.cpp\
- $(gmeversion)/gme/Effects_Buffer.cpp\
+ $(gmeversion)/gme/Hes_Apu_Adpcm.cpp\
$(gmeversion)/gme/Hes_Apu.cpp\
- $(gmeversion)/gme/Nes_Apu.cpp\
- $(gmeversion)/gme/Sap_Cpu.cpp\
- $(gmeversion)/gme/Ym2413_Emu.cpp\
- $(gmeversion)/gme/Fir_Resampler.cpp\
+ $(gmeversion)/gme/Hes_Core.cpp\
$(gmeversion)/gme/Hes_Cpu.cpp\
+ $(gmeversion)/gme/Hes_Emu.cpp\
+ $(gmeversion)/gme/Kss_Core.cpp\
+ $(gmeversion)/gme/Kss_Cpu.cpp\
+ $(gmeversion)/gme/Kss_Emu.cpp\
+ $(gmeversion)/gme/Kss_Scc_Apu.cpp\
+ $(gmeversion)/gme/M3u_Playlist.cpp\
+ $(gmeversion)/gme/Multi_Buffer.cpp\
+ $(gmeversion)/gme/Music_Emu.cpp\
+ $(gmeversion)/gme/Nes_Apu.cpp\
$(gmeversion)/gme/Nes_Cpu.cpp\
+ $(gmeversion)/gme/Nes_Fds_Apu.cpp\
+ $(gmeversion)/gme/Nes_Fme7_Apu.cpp\
+ $(gmeversion)/gme/Nes_Namco_Apu.cpp\
+ $(gmeversion)/gme/Nes_Oscs.cpp\
+ $(gmeversion)/gme/Nes_Vrc6_Apu.cpp\
+ $(gmeversion)/gme/Nes_Vrc7_Apu.cpp\
+ $(gmeversion)/gme/Nsf_Core.cpp\
+ $(gmeversion)/gme/Nsf_Cpu.cpp\
+ $(gmeversion)/gme/Nsfe_Emu.cpp\
+ $(gmeversion)/gme/Nsf_Emu.cpp\
+ $(gmeversion)/gme/Nsf_Impl.cpp\
+ $(gmeversion)/gme/Opl_Apu.cpp\
+ $(gmeversion)/gme/Resampler.cpp\
+ $(gmeversion)/gme/Rom_Data.cpp\
+ $(gmeversion)/gme/Sap_Apu.cpp\
+ $(gmeversion)/gme/Sap_Core.cpp\
+ $(gmeversion)/gme/Sap_Cpu.cpp\
$(gmeversion)/gme/Sap_Emu.cpp\
+ $(gmeversion)/gme/Sgc_Core.cpp\
+ $(gmeversion)/gme/Sgc_Cpu.cpp\
+ $(gmeversion)/gme/Sgc_Emu.cpp\
+ $(gmeversion)/gme/Sgc_Impl.cpp\
+ $(gmeversion)/gme/Sms_Apu.cpp\
+ $(gmeversion)/gme/Sms_Fm_Apu.cpp\
+ $(gmeversion)/gme/Snes_Spc.cpp\
+ $(gmeversion)/gme/Spc_Cpu.cpp\
+ $(gmeversion)/gme/Spc_Dsp.cpp\
+ $(gmeversion)/gme/Spc_Emu.cpp\
+ $(gmeversion)/gme/SPC_Filter.cpp\
+ $(gmeversion)/gme/Track_Filter.cpp\
+ $(gmeversion)/gme/Upsampler.cpp\
+ $(gmeversion)/gme/Vgm_Core.cpp\
+ $(gmeversion)/gme/Vgm_Emu.cpp\
+ $(gmeversion)/gme/Ym2413_Emu.cpp\
$(gmeversion)/gme/Ym2612_Emu.cpp\
+ $(gmeversion)/gme/ymdeltat.cpp\
+ $(gmeversion)/gme/Z80_Cpu.cpp\
+ $(gmeversion)/gme/Data_Reader.cpp\
+ $(gmeversion)/gme/s_deltat.c\
+ $(gmeversion)/gme/s_logtbl.c\
+ $(gmeversion)/gme/s_opl.c\
+ $(gmeversion)/gme/s_opltbl.c\
+ $(gmeversion)/gme/ym2413.c\
$(gmeversion)/gme/Ay_Apu.h\
- $(gmeversion)/gme/Ay_Cpu.h\
+ $(gmeversion)/gme/Ay_Core.h\
$(gmeversion)/gme/Ay_Emu.h\
$(gmeversion)/gme/blargg_common.h\
$(gmeversion)/gme/blargg_config.h\
$(gmeversion)/gme/blargg_endian.h\
+ $(gmeversion)/gme/blargg_errors.h\
$(gmeversion)/gme/blargg_source.h\
$(gmeversion)/gme/Blip_Buffer.h\
+ $(gmeversion)/gme/Blip_Buffer_impl2.h\
+ $(gmeversion)/gme/Blip_Buffer_impl.h\
$(gmeversion)/gme/Classic_Emu.h\
+ $(gmeversion)/gme/divfix.h\
$(gmeversion)/gme/Data_Reader.h\
+ $(gmeversion)/gme/Downsampler.h\
$(gmeversion)/gme/Dual_Resampler.h\
$(gmeversion)/gme/Effects_Buffer.h\
+ $(gmeversion)/gme/emu2413.h\
$(gmeversion)/gme/Fir_Resampler.h\
+ $(gmeversion)/gme/fmopl.h\
$(gmeversion)/gme/Gb_Apu.h\
$(gmeversion)/gme/Gb_Cpu.h\
- $(gmeversion)/gme/gb_cpu_io.h\
+ $(gmeversion)/gme/Gb_Cpu_run.h\
$(gmeversion)/gme/Gb_Oscs.h\
+ $(gmeversion)/gme/Gbs_Core.h\
$(gmeversion)/gme/Gbs_Emu.h\
$(gmeversion)/gme/Gme_File.h\
$(gmeversion)/gme/gme.h\
+ $(gmeversion)/gme/Gme_Loader.h\
$(gmeversion)/gme/Gym_Emu.h\
+ $(gmeversion)/gme/Hes_Apu_Adpcm.h\
$(gmeversion)/gme/Hes_Apu.h\
+ $(gmeversion)/gme/Hes_Core.h\
$(gmeversion)/gme/Hes_Cpu.h\
- $(gmeversion)/gme/hes_cpu_io.h\
+ $(gmeversion)/gme/Hes_Cpu_run.h\
$(gmeversion)/gme/Hes_Emu.h\
- $(gmeversion)/gme/Kss_Cpu.h\
+ $(gmeversion)/gme/i_fmpac.h\
+ $(gmeversion)/gme/i_fmunit.h\
+ $(gmeversion)/gme/i_vrc7.h\
+ $(gmeversion)/gme/kmsnddev.h\
+ $(gmeversion)/gme/Kss_Core.h\
$(gmeversion)/gme/Kss_Emu.h\
$(gmeversion)/gme/Kss_Scc_Apu.h\
$(gmeversion)/gme/M3u_Playlist.h\
@@ -90,30 +144,259 @@ gme_la_SOURCES = cgme.c\
$(gmeversion)/gme/Music_Emu.h\
$(gmeversion)/gme/Nes_Apu.h\
$(gmeversion)/gme/Nes_Cpu.h\
- $(gmeversion)/gme/nes_cpu_io.h\
+ $(gmeversion)/gme/Nes_Cpu_run.h\
+ $(gmeversion)/gme/Nes_Fds_Apu.h\
$(gmeversion)/gme/Nes_Fme7_Apu.h\
+ $(gmeversion)/gme/Nes_Mmc5_Apu.h\
$(gmeversion)/gme/Nes_Namco_Apu.h\
$(gmeversion)/gme/Nes_Oscs.h\
+ $(gmeversion)/gme/nestypes.h\
$(gmeversion)/gme/Nes_Vrc6_Apu.h\
+ $(gmeversion)/gme/Nes_Vrc7_Apu.h\
+ $(gmeversion)/gme/Nsf_Core.h\
$(gmeversion)/gme/Nsfe_Emu.h\
$(gmeversion)/gme/Nsf_Emu.h\
+ $(gmeversion)/gme/Nsf_Impl.h\
+ $(gmeversion)/gme/Opl_Apu.h\
+ $(gmeversion)/gme/Resampler.h\
+ $(gmeversion)/gme/Rom_Data.h\
$(gmeversion)/gme/Sap_Apu.h\
- $(gmeversion)/gme/Sap_Cpu.h\
- $(gmeversion)/gme/sap_cpu_io.h\
+ $(gmeversion)/gme/Sap_Core.h\
$(gmeversion)/gme/Sap_Emu.h\
+ $(gmeversion)/gme/s_deltat.h\
+ $(gmeversion)/gme/Sgc_Core.h\
+ $(gmeversion)/gme/Sgc_Emu.h\
+ $(gmeversion)/gme/Sgc_Impl.h\
+ $(gmeversion)/gme/s_logtbl.h\
$(gmeversion)/gme/Sms_Apu.h\
- $(gmeversion)/gme/Sms_Oscs.h\
+ $(gmeversion)/gme/Sms_Fm_Apu.h\
$(gmeversion)/gme/Snes_Spc.h\
+ $(gmeversion)/gme/s_opl.h\
+ $(gmeversion)/gme/s_opltbl.h\
$(gmeversion)/gme/Spc_Cpu.h\
$(gmeversion)/gme/Spc_Dsp.h\
$(gmeversion)/gme/Spc_Emu.h\
+ $(gmeversion)/gme/Spc_Filter.h\
+ $(gmeversion)/gme/Track_Filter.h\
+ $(gmeversion)/gme/Upsampler.h\
+ $(gmeversion)/gme/Vgm_Core.h\
$(gmeversion)/gme/Vgm_Emu.h\
- $(gmeversion)/gme/Vgm_Emu_Impl.h\
$(gmeversion)/gme/Ym2413_Emu.h\
+ $(gmeversion)/gme/ym2413.h\
$(gmeversion)/gme/Ym2612_Emu.h\
- $(gmeversion)/gme/gme_types.h\
- $(gmeversion)/gme/Spc_Filter.cpp\
- $(gmeversion)/gme/Spc_Filter.h
+ $(gmeversion)/gme/ymdeltat.h\
+ $(gmeversion)/gme/Z80_Cpu.h\
+ $(gmeversion)/gme/Z80_Cpu_run.h
+
+# 0.6.0 files
+#gme_la_SOURCES = cgme.c\
+# $(gmeversion)/gme/Ay_Apu.cpp\
+# $(gmeversion)/gme/Ay_Cpu.cpp\
+# $(gmeversion)/gme/Ay_Emu.cpp\
+# $(gmeversion)/gme/Blip_Buffer.cpp\
+# $(gmeversion)/gme/Classic_Emu.cpp\
+# $(gmeversion)/gme/Data_Reader.cpp\
+# $(gmeversion)/gme/Dual_Resampler.cpp\
+# $(gmeversion)/gme/Effects_Buffer.cpp\
+# $(gmeversion)/gme/Fir_Resampler.cpp\
+# $(gmeversion)/gme/Gb_Apu.cpp\
+# $(gmeversion)/gme/Gb_Cpu.cpp\
+# $(gmeversion)/gme/Gb_Oscs.cpp\
+# $(gmeversion)/gme/Gbs_Emu.cpp\
+# $(gmeversion)/gme/gme.cpp\
+# $(gmeversion)/gme/Gme_File.cpp\
+# $(gmeversion)/gme/Gym_Emu.cpp\
+# $(gmeversion)/gme/Hes_Apu.cpp\
+# $(gmeversion)/gme/Hes_Cpu.cpp\
+# $(gmeversion)/gme/Hes_Emu.cpp\
+# $(gmeversion)/gme/Kss_Cpu.cpp\
+# $(gmeversion)/gme/Kss_Emu.cpp\
+# $(gmeversion)/gme/Kss_Scc_Apu.cpp\
+# $(gmeversion)/gme/M3u_Playlist.cpp\
+# $(gmeversion)/gme/Multi_Buffer.cpp\
+# $(gmeversion)/gme/Music_Emu.cpp\
+# $(gmeversion)/gme/Nes_Apu.cpp\
+# $(gmeversion)/gme/Nes_Cpu.cpp\
+# $(gmeversion)/gme/Nes_Fme7_Apu.cpp\
+# $(gmeversion)/gme/Nes_Namco_Apu.cpp\
+# $(gmeversion)/gme/Nes_Oscs.cpp\
+# $(gmeversion)/gme/Nes_Vrc6_Apu.cpp\
+# $(gmeversion)/gme/Nsfe_Emu.cpp\
+# $(gmeversion)/gme/Nsf_Emu.cpp\
+# $(gmeversion)/gme/Sap_Apu.cpp\
+# $(gmeversion)/gme/Sap_Cpu.cpp\
+# $(gmeversion)/gme/Sap_Emu.cpp\
+# $(gmeversion)/gme/Sms_Apu.cpp\
+# $(gmeversion)/gme/Snes_Spc.cpp\
+# $(gmeversion)/gme/Spc_Cpu.cpp\
+# $(gmeversion)/gme/Spc_Dsp.cpp\
+# $(gmeversion)/gme/Spc_Emu.cpp\
+# $(gmeversion)/gme/Spc_Filter.cpp\
+# $(gmeversion)/gme/Vgm_Emu.cpp\
+# $(gmeversion)/gme/Vgm_Emu_Impl.cpp\
+# $(gmeversion)/gme/Ym2413_Emu.cpp\
+# $(gmeversion)/gme/Ym2612_Emu.cpp\
+# $(gmeversion)/gme/Ay_Apu.h\
+# $(gmeversion)/gme/Ay_Cpu.h\
+# $(gmeversion)/gme/Ay_Emu.h\
+# $(gmeversion)/gme/blargg_common.h\
+# $(gmeversion)/gme/blargg_config.h\
+# $(gmeversion)/gme/blargg_endian.h\
+# $(gmeversion)/gme/blargg_source.h\
+# $(gmeversion)/gme/Blip_Buffer.h\
+# $(gmeversion)/gme/Classic_Emu.h\
+# $(gmeversion)/gme/Data_Reader.h\
+# $(gmeversion)/gme/Dual_Resampler.h\
+# $(gmeversion)/gme/Effects_Buffer.h\
+# $(gmeversion)/gme/Fir_Resampler.h\
+# $(gmeversion)/gme/Gb_Apu.h\
+# $(gmeversion)/gme/Gb_Cpu.h\
+# $(gmeversion)/gme/gb_cpu_io.h\
+# $(gmeversion)/gme/Gb_Oscs.h\
+# $(gmeversion)/gme/Gbs_Emu.h\
+# $(gmeversion)/gme/Gme_File.h\
+# $(gmeversion)/gme/gme.h\
+# $(gmeversion)/gme/gme_types.h\
+# $(gmeversion)/gme/Gym_Emu.h\
+# $(gmeversion)/gme/Hes_Apu.h\
+# $(gmeversion)/gme/Hes_Cpu.h\
+# $(gmeversion)/gme/hes_cpu_io.h\
+# $(gmeversion)/gme/Hes_Emu.h\
+# $(gmeversion)/gme/Kss_Cpu.h\
+# $(gmeversion)/gme/Kss_Emu.h\
+# $(gmeversion)/gme/Kss_Scc_Apu.h\
+# $(gmeversion)/gme/M3u_Playlist.h\
+# $(gmeversion)/gme/Multi_Buffer.h\
+# $(gmeversion)/gme/Music_Emu.h\
+# $(gmeversion)/gme/Nes_Apu.h\
+# $(gmeversion)/gme/Nes_Cpu.h\
+# $(gmeversion)/gme/nes_cpu_io.h\
+# $(gmeversion)/gme/Nes_Fme7_Apu.h\
+# $(gmeversion)/gme/Nes_Namco_Apu.h\
+# $(gmeversion)/gme/Nes_Oscs.h\
+# $(gmeversion)/gme/Nes_Vrc6_Apu.h\
+# $(gmeversion)/gme/Nsfe_Emu.h\
+# $(gmeversion)/gme/Nsf_Emu.h\
+# $(gmeversion)/gme/Sap_Apu.h\
+# $(gmeversion)/gme/Sap_Cpu.h\
+# $(gmeversion)/gme/sap_cpu_io.h\
+# $(gmeversion)/gme/Sap_Emu.h\
+# $(gmeversion)/gme/Sms_Apu.h\
+# $(gmeversion)/gme/Sms_Oscs.h\
+# $(gmeversion)/gme/Snes_Spc.h\
+# $(gmeversion)/gme/Spc_Cpu.h\
+# $(gmeversion)/gme/Spc_Dsp.h\
+# $(gmeversion)/gme/Spc_Emu.h\
+# $(gmeversion)/gme/Spc_Filter.h\
+# $(gmeversion)/gme/Vgm_Emu.h\
+# $(gmeversion)/gme/Vgm_Emu_Impl.h\
+# $(gmeversion)/gme/Ym2413_Emu.h\
+# $(gmeversion)/gme/Ym2612_Emu.h
+
+# 0.5.2 and 0.5.5 files
+#gme_la_SOURCES = cgme.c\
+# $(gmeversion)/gme/Ay_Apu.cpp\
+# $(gmeversion)/gme/Gb_Apu.cpp\
+# $(gmeversion)/gme/Hes_Emu.cpp\
+# $(gmeversion)/gme/Nes_Fme7_Apu.cpp\
+# $(gmeversion)/gme/Sms_Apu.cpp\
+# $(gmeversion)/gme/Ay_Cpu.cpp\
+# $(gmeversion)/gme/Gb_Cpu.cpp\
+# $(gmeversion)/gme/Kss_Cpu.cpp\
+# $(gmeversion)/gme/Nes_Namco_Apu.cpp\
+# $(gmeversion)/gme/Snes_Spc.cpp\
+# $(gmeversion)/gme/Ay_Emu.cpp\
+# $(gmeversion)/gme/Gb_Oscs.cpp\
+# $(gmeversion)/gme/Kss_Emu.cpp\
+# $(gmeversion)/gme/Nes_Oscs.cpp\
+# $(gmeversion)/gme/Spc_Cpu.cpp\
+# $(gmeversion)/gme/Blip_Buffer.cpp\
+# $(gmeversion)/gme/Gbs_Emu.cpp\
+# $(gmeversion)/gme/Kss_Scc_Apu.cpp\
+# $(gmeversion)/gme/Nes_Vrc6_Apu.cpp\
+# $(gmeversion)/gme/Spc_Dsp.cpp\
+# $(gmeversion)/gme/Classic_Emu.cpp\
+# $(gmeversion)/gme/gme.cpp\
+# $(gmeversion)/gme/M3u_Playlist.cpp\
+# $(gmeversion)/gme/Nsfe_Emu.cpp\
+# $(gmeversion)/gme/Spc_Emu.cpp\
+# $(gmeversion)/gme/Data_Reader.cpp\
+# $(gmeversion)/gme/Gme_File.cpp\
+# $(gmeversion)/gme/Multi_Buffer.cpp\
+# $(gmeversion)/gme/Nsf_Emu.cpp\
+# $(gmeversion)/gme/Vgm_Emu.cpp\
+# $(gmeversion)/gme/Dual_Resampler.cpp\
+# $(gmeversion)/gme/Gym_Emu.cpp\
+# $(gmeversion)/gme/Music_Emu.cpp\
+# $(gmeversion)/gme/Sap_Apu.cpp\
+# $(gmeversion)/gme/Vgm_Emu_Impl.cpp\
+# $(gmeversion)/gme/Effects_Buffer.cpp\
+# $(gmeversion)/gme/Hes_Apu.cpp\
+# $(gmeversion)/gme/Nes_Apu.cpp\
+# $(gmeversion)/gme/Sap_Cpu.cpp\
+# $(gmeversion)/gme/Ym2413_Emu.cpp\
+# $(gmeversion)/gme/Fir_Resampler.cpp\
+# $(gmeversion)/gme/Hes_Cpu.cpp\
+# $(gmeversion)/gme/Nes_Cpu.cpp\
+# $(gmeversion)/gme/Sap_Emu.cpp\
+# $(gmeversion)/gme/Ym2612_Emu.cpp\
+# $(gmeversion)/gme/Ay_Apu.h\
+# $(gmeversion)/gme/Ay_Cpu.h\
+# $(gmeversion)/gme/Ay_Emu.h\
+# $(gmeversion)/gme/blargg_common.h\
+# $(gmeversion)/gme/blargg_config.h\
+# $(gmeversion)/gme/blargg_endian.h\
+# $(gmeversion)/gme/blargg_source.h\
+# $(gmeversion)/gme/Blip_Buffer.h\
+# $(gmeversion)/gme/Classic_Emu.h\
+# $(gmeversion)/gme/Data_Reader.h\
+# $(gmeversion)/gme/Dual_Resampler.h\
+# $(gmeversion)/gme/Effects_Buffer.h\
+# $(gmeversion)/gme/Fir_Resampler.h\
+# $(gmeversion)/gme/Gb_Apu.h\
+# $(gmeversion)/gme/Gb_Cpu.h\
+# $(gmeversion)/gme/gb_cpu_io.h\
+# $(gmeversion)/gme/Gb_Oscs.h\
+# $(gmeversion)/gme/Gbs_Emu.h\
+# $(gmeversion)/gme/Gme_File.h\
+# $(gmeversion)/gme/gme.h\
+# $(gmeversion)/gme/Gym_Emu.h\
+# $(gmeversion)/gme/Hes_Apu.h\
+# $(gmeversion)/gme/Hes_Cpu.h\
+# $(gmeversion)/gme/hes_cpu_io.h\
+# $(gmeversion)/gme/Hes_Emu.h\
+# $(gmeversion)/gme/Kss_Cpu.h\
+# $(gmeversion)/gme/Kss_Emu.h\
+# $(gmeversion)/gme/Kss_Scc_Apu.h\
+# $(gmeversion)/gme/M3u_Playlist.h\
+# $(gmeversion)/gme/Multi_Buffer.h\
+# $(gmeversion)/gme/Music_Emu.h\
+# $(gmeversion)/gme/Nes_Apu.h\
+# $(gmeversion)/gme/Nes_Cpu.h\
+# $(gmeversion)/gme/nes_cpu_io.h\
+# $(gmeversion)/gme/Nes_Fme7_Apu.h\
+# $(gmeversion)/gme/Nes_Namco_Apu.h\
+# $(gmeversion)/gme/Nes_Oscs.h\
+# $(gmeversion)/gme/Nes_Vrc6_Apu.h\
+# $(gmeversion)/gme/Nsfe_Emu.h\
+# $(gmeversion)/gme/Nsf_Emu.h\
+# $(gmeversion)/gme/Sap_Apu.h\
+# $(gmeversion)/gme/Sap_Cpu.h\
+# $(gmeversion)/gme/sap_cpu_io.h\
+# $(gmeversion)/gme/Sap_Emu.h\
+# $(gmeversion)/gme/Sms_Apu.h\
+# $(gmeversion)/gme/Sms_Oscs.h\
+# $(gmeversion)/gme/Snes_Spc.h\
+# $(gmeversion)/gme/Spc_Cpu.h\
+# $(gmeversion)/gme/Spc_Dsp.h\
+# $(gmeversion)/gme/Spc_Emu.h\
+# $(gmeversion)/gme/Vgm_Emu.h\
+# $(gmeversion)/gme/Vgm_Emu_Impl.h\
+# $(gmeversion)/gme/Ym2413_Emu.h\
+# $(gmeversion)/gme/Ym2612_Emu.h\
+# $(gmeversion)/gme/gme_types.h\
+# $(gmeversion)/gme/Spc_Filter.cpp\
+# $(gmeversion)/gme/Spc_Filter.h
gme_la_LDFLAGS = -module -nostdlib -lsupc++
gme_la_LIBADD = $(ZLIB_LIBS)
diff --git a/plugins/gme/cgme.c b/plugins/gme/cgme.c
index 48622266..773b3736 100644
--- a/plugins/gme/cgme.c
+++ b/plugins/gme/cgme.c
@@ -116,35 +116,47 @@ cgme_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
int samplerate = deadbeef->conf_get_int ("synth.samplerate", 44100);
gme_err_t res = "gme uninitialized";
- const char *ext = strrchr (deadbeef->pl_find_meta (it, ":URI"), '.');
- char *buffer;
- int sz;
- if (!read_gzfile (deadbeef->pl_find_meta (it, ":URI"), &buffer, &sz)) {
- res = gme_open_data (deadbeef->pl_find_meta (it, ":URI"), buffer, sz, &info->emu, samplerate);
- free (buffer);
- }
- if (res) {
- DB_FILE *f = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
- int64_t sz = deadbeef->fgetlength (f);
- if (sz <= 0) {
- deadbeef->fclose (f);
- return -1;
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+ const char *ext = strrchr (fname, '.');
+ char *buffer;
+ int sz;
+ if (!read_gzfile (fname, &buffer, &sz)) {
+ res = gme_open_data (fname, buffer, sz, &info->emu, samplerate);
+ free (buffer);
}
- char *buf = malloc (sz);
- if (!buf) {
- deadbeef->fclose (f);
- return -1;
- }
- int64_t rb = deadbeef->fread (buf, 1, sz, f);
- deadbeef->fclose(f);
- if (rb != sz) {
+ if (res) {
+ DB_FILE *f = deadbeef->fopen (fname);
+ if (!f) {
+ deadbeef->pl_unlock ();
+ return -1;
+ }
+ int64_t sz = deadbeef->fgetlength (f);
+ if (sz <= 0) {
+ deadbeef->fclose (f);
+ deadbeef->pl_unlock ();
+ return -1;
+ }
+ char *buf = malloc (sz);
+ if (!buf) {
+ deadbeef->fclose (f);
+ deadbeef->pl_unlock ();
+ return -1;
+ }
+ int64_t rb = deadbeef->fread (buf, 1, sz, f);
+ deadbeef->fclose(f);
+ if (rb != sz) {
+ free (buf);
+ deadbeef->pl_unlock ();
+ return -1;
+ }
+
+ res = gme_open_data (fname, buf, sz, &info->emu, samplerate);
free (buf);
- return -1;
}
-
- res = gme_open_data (deadbeef->pl_find_meta (it, ":URI"), buf, sz, &info->emu, samplerate);
- free (buf);
}
+ deadbeef->pl_unlock ();
if (res) {
trace ("failed with error %d\n", res);
@@ -489,6 +501,7 @@ static DB_decoder_t plugin = {
.seek = cgme_seek,
.insert = cgme_insert,
.exts = exts,
+ .plugin.message = cgme_message,
};
DB_plugin_t *
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.orig b/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.orig
deleted file mode 100644
index 9dc89ea8..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.orig
+++ /dev/null
@@ -1,446 +0,0 @@
-// Blip_Buffer 0.4.1. http://www.slack.net/~ant/
-
-#include "Blip_Buffer.h"
-
-#include <assert.h>
-#include <limits.h>
-#include <string.h>
-#include <stdlib.h>
-#include <math.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-int const silent_buf_size = 1; // size used for Silent_Blip_Buffer
-
-Blip_Buffer::Blip_Buffer()
-{
- factor_ = (blip_ulong)-1 / 2;
- offset_ = 0;
- buffer_ = 0;
- buffer_size_ = 0;
- sample_rate_ = 0;
- reader_accum_ = 0;
- bass_shift_ = 0;
- clock_rate_ = 0;
- bass_freq_ = 16;
- length_ = 0;
-
- // assumptions code makes about implementation-defined features
- #ifndef NDEBUG
- // right shift of negative value preserves sign
- buf_t_ i = -0x7FFFFFFE;
- assert( (i >> 1) == -0x3FFFFFFF );
-
- // casting to short truncates to 16 bits and sign-extends
- i = 0x18000;
- assert( (short) i == -0x8000 );
- #endif
-}
-
-Blip_Buffer::~Blip_Buffer()
-{
- if ( buffer_size_ != silent_buf_size )
- free( buffer_ );
-}
-
-Silent_Blip_Buffer::Silent_Blip_Buffer()
-{
- factor_ = 0;
- buffer_ = buf;
- buffer_size_ = silent_buf_size;
- memset( buf, 0, sizeof buf ); // in case machine takes exception for signed overflow
-}
-
-void Blip_Buffer::clear( int entire_buffer )
-{
- offset_ = 0;
- reader_accum_ = 0;
- modified_ = 0;
- if ( buffer_ )
- {
- long count = (entire_buffer ? buffer_size_ : samples_avail());
- memset( buffer_, 0, (count + blip_buffer_extra_) * sizeof (buf_t_) );
- }
-}
-
-Blip_Buffer::blargg_err_t Blip_Buffer::set_sample_rate( long new_rate, int msec )
-{
- if ( buffer_size_ == silent_buf_size )
- {
- assert( 0 );
- return "Internal (tried to resize Silent_Blip_Buffer)";
- }
-
- // start with maximum length that resampled time can represent
- long new_size = (UINT_MAX >> BLIP_BUFFER_ACCURACY) - blip_buffer_extra_ - 64;
- if ( msec != blip_max_length )
- {
- long s = (new_rate * (msec + 1) + 999) / 1000;
- if ( s < new_size )
- new_size = s;
- else
- assert( 0 ); // fails if requested buffer length exceeds limit
- }
-
- if ( buffer_size_ != new_size )
- {
- void* p = realloc( buffer_, (new_size + blip_buffer_extra_) * sizeof *buffer_ );
- if ( !p )
- return "Out of memory";
- buffer_ = (buf_t_*) p;
- }
-
- buffer_size_ = new_size;
- assert( buffer_size_ != silent_buf_size );
-
- // update things based on the sample rate
- sample_rate_ = new_rate;
- length_ = new_size * 1000 / new_rate - 1;
- if ( msec )
- assert( length_ == msec ); // ensure length is same as that passed in
- if ( clock_rate_ )
- clock_rate( clock_rate_ );
- bass_freq( bass_freq_ );
-
- clear();
-
- return 0; // success
-}
-
-blip_resampled_time_t Blip_Buffer::clock_rate_factor( long rate ) const
-{
- double ratio = (double) sample_rate_ / rate;
- blip_long factor = (blip_long) floor( ratio * (1L << BLIP_BUFFER_ACCURACY) + 0.5 );
- assert( factor > 0 || !sample_rate_ ); // fails if clock/output ratio is too large
- return (blip_resampled_time_t) factor;
-}
-
-void Blip_Buffer::bass_freq( int freq )
-{
- bass_freq_ = freq;
- int shift = 31;
- if ( freq > 0 )
- {
- shift = 13;
- long f = (freq << 16) / sample_rate_;
- while ( (f >>= 1) && --shift ) { }
- }
- bass_shift_ = shift;
-}
-
-void Blip_Buffer::end_frame( blip_time_t t )
-{
- offset_ += t * factor_;
- assert( samples_avail() <= (long) buffer_size_ ); // time outside buffer length
-}
-
-void Blip_Buffer::remove_silence( long count )
-{
- assert( count <= samples_avail() ); // tried to remove more samples than available
- offset_ -= (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
-}
-
-long Blip_Buffer::count_samples( blip_time_t t ) const
-{
- unsigned long last_sample = resampled_time( t ) >> BLIP_BUFFER_ACCURACY;
- unsigned long first_sample = offset_ >> BLIP_BUFFER_ACCURACY;
- return (long) (last_sample - first_sample);
-}
-
-blip_time_t Blip_Buffer::count_clocks( long count ) const
-{
- if ( !factor_ )
- {
- assert( 0 ); // sample rate and clock rates must be set first
- return 0;
- }
-
- if ( count > buffer_size_ )
- count = buffer_size_;
- blip_resampled_time_t time = (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
- return (blip_time_t) ((time - offset_ + factor_ - 1) / factor_);
-}
-
-void Blip_Buffer::remove_samples( long count )
-{
- if ( count )
- {
- remove_silence( count );
-
- // copy remaining samples to beginning and clear old samples
- long remain = samples_avail() + blip_buffer_extra_;
- memmove( buffer_, buffer_ + count, remain * sizeof *buffer_ );
- memset( buffer_ + remain, 0, count * sizeof *buffer_ );
- }
-}
-
-// Blip_Synth_
-
-Blip_Synth_Fast_::Blip_Synth_Fast_()
-{
- buf = 0;
- last_amp = 0;
- delta_factor = 0;
-}
-
-void Blip_Synth_Fast_::volume_unit( double new_unit )
-{
- delta_factor = int (new_unit * (1L << blip_sample_bits) + 0.5);
-}
-
-#if !BLIP_BUFFER_FAST
-
-Blip_Synth_::Blip_Synth_( short* p, int w ) :
- impulses( p ),
- width( w )
-{
- volume_unit_ = 0.0;
- kernel_unit = 0;
- buf = 0;
- last_amp = 0;
- delta_factor = 0;
-}
-
-#undef PI
-#define PI 3.1415926535897932384626433832795029
-
-static void gen_sinc( float* out, int count, double oversample, double treble, double cutoff )
-{
- if ( cutoff >= 0.999 )
- cutoff = 0.999;
-
- if ( treble < -300.0 )
- treble = -300.0;
- if ( treble > 5.0 )
- treble = 5.0;
-
- double const maxh = 4096.0;
- double const rolloff = pow( 10.0, 1.0 / (maxh * 20.0) * treble / (1.0 - cutoff) );
- double const pow_a_n = pow( rolloff, maxh - maxh * cutoff );
- double const to_angle = PI / 2 / maxh / oversample;
- for ( int i = 0; i < count; i++ )
- {
- double angle = ((i - count) * 2 + 1) * to_angle;
- double c = rolloff * cos( (maxh - 1.0) * angle ) - cos( maxh * angle );
- double cos_nc_angle = cos( maxh * cutoff * angle );
- double cos_nc1_angle = cos( (maxh * cutoff - 1.0) * angle );
- double cos_angle = cos( angle );
-
- c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle;
- double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle);
- double b = 2.0 - cos_angle - cos_angle;
- double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle;
-
- out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d
- }
-}
-
-void blip_eq_t::generate( float* out, int count ) const
-{
- // lower cutoff freq for narrow kernels with their wider transition band
- // (8 points->1.49, 16 points->1.15)
- double oversample = blip_res * 2.25 / count + 0.85;
- double half_rate = sample_rate * 0.5;
- if ( cutoff_freq )
- oversample = half_rate / cutoff_freq;
- double cutoff = rolloff_freq * oversample / half_rate;
-
- gen_sinc( out, count, blip_res * oversample, treble, cutoff );
-
- // apply (half of) hamming window
- double to_fraction = PI / (count - 1);
- for ( int i = count; i--; )
- out [i] *= 0.54f - 0.46f * (float) cos( i * to_fraction );
-}
-
-void Blip_Synth_::adjust_impulse()
-{
- // sum pairs for each phase and add error correction to end of first half
- int const size = impulses_size();
- for ( int p = blip_res; p-- >= blip_res / 2; )
- {
- int p2 = blip_res - 2 - p;
- long error = kernel_unit;
- for ( int i = 1; i < size; i += blip_res )
- {
- error -= impulses [i + p ];
- error -= impulses [i + p2];
- }
- if ( p == p2 )
- error /= 2; // phase = 0.5 impulse uses same half for both sides
- impulses [size - blip_res + p] += (short) error;
- //printf( "error: %ld\n", error );
- }
-
- //for ( int i = blip_res; i--; printf( "\n" ) )
- // for ( int j = 0; j < width / 2; j++ )
- // printf( "%5ld,", impulses [j * blip_res + i + 1] );
-}
-
-void Blip_Synth_::treble_eq( blip_eq_t const& eq )
-{
- float fimpulse [blip_res / 2 * (blip_widest_impulse_ - 1) + blip_res * 2];
-
- int const half_size = blip_res / 2 * (width - 1);
- eq.generate( &fimpulse [blip_res], half_size );
-
- int i;
-
- // need mirror slightly past center for calculation
- for ( i = blip_res; i--; )
- fimpulse [blip_res + half_size + i] = fimpulse [blip_res + half_size - 1 - i];
-
- // starts at 0
- for ( i = 0; i < blip_res; i++ )
- fimpulse [i] = 0.0f;
-
- // find rescale factor
- double total = 0.0;
- for ( i = 0; i < half_size; i++ )
- total += fimpulse [blip_res + i];
-
- //double const base_unit = 44800.0 - 128 * 18; // allows treble up to +0 dB
- //double const base_unit = 37888.0; // allows treble to +5 dB
- double const base_unit = 32768.0; // necessary for blip_unscaled to work
- double rescale = base_unit / 2 / total;
- kernel_unit = (long) base_unit;
-
- // integrate, first difference, rescale, convert to int
- double sum = 0.0;
- double next = 0.0;
- int const impulses_size = this->impulses_size();
- for ( i = 0; i < impulses_size; i++ )
- {
- impulses [i] = (short) floor( (next - sum) * rescale + 0.5 );
- sum += fimpulse [i];
- next += fimpulse [i + blip_res];
- }
- adjust_impulse();
-
- // volume might require rescaling
- double vol = volume_unit_;
- if ( vol )
- {
- volume_unit_ = 0.0;
- volume_unit( vol );
- }
-}
-
-void Blip_Synth_::volume_unit( double new_unit )
-{
- if ( new_unit != volume_unit_ )
- {
- // use default eq if it hasn't been set yet
- if ( !kernel_unit )
- treble_eq( -8.0 );
-
- volume_unit_ = new_unit;
- double factor = new_unit * (1L << blip_sample_bits) / kernel_unit;
-
- if ( factor > 0.0 )
- {
- int shift = 0;
-
- // if unit is really small, might need to attenuate kernel
- while ( factor < 2.0 )
- {
- shift++;
- factor *= 2.0;
- }
-
- if ( shift )
- {
- kernel_unit >>= shift;
- assert( kernel_unit > 0 ); // fails if volume unit is too low
-
- // keep values positive to avoid round-towards-zero of sign-preserving
- // right shift for negative values
- long offset = 0x8000 + (1 << (shift - 1));
- long offset2 = 0x8000 >> shift;
- for ( int i = impulses_size(); i--; )
- impulses [i] = (short) (((impulses [i] + offset) >> shift) - offset2);
- adjust_impulse();
- }
- }
- delta_factor = (int) floor( factor + 0.5 );
- //printf( "delta_factor: %d, kernel_unit: %d\n", delta_factor, kernel_unit );
- }
-}
-#endif
-
-long Blip_Buffer::read_samples( blip_sample_t* BLIP_RESTRICT out, long max_samples, int stereo )
-{
- long count = samples_avail();
- if ( count > max_samples )
- count = max_samples;
-
- if ( count )
- {
- int const bass = BLIP_READER_BASS( *this );
- BLIP_READER_BEGIN( reader, *this );
-
- if ( !stereo )
- {
- for ( blip_long n = count; n; --n )
- {
- blip_long s = BLIP_READER_READ( reader );
- if ( (blip_sample_t) s != s )
- s = 0x7FFF - (s >> 24);
- *out++ = (blip_sample_t) s;
- BLIP_READER_NEXT( reader, bass );
- }
- }
- else
- {
- for ( blip_long n = count; n; --n )
- {
- blip_long s = BLIP_READER_READ( reader );
- if ( (blip_sample_t) s != s )
- s = 0x7FFF - (s >> 24);
- *out = (blip_sample_t) s;
- out += 2;
- BLIP_READER_NEXT( reader, bass );
- }
- }
- BLIP_READER_END( reader, *this );
-
- remove_samples( count );
- }
- return count;
-}
-
-void Blip_Buffer::mix_samples( blip_sample_t const* in, long count )
-{
- if ( buffer_size_ == silent_buf_size )
- {
- assert( 0 );
- return;
- }
-
- buf_t_* out = buffer_ + (offset_ >> BLIP_BUFFER_ACCURACY) + blip_widest_impulse_ / 2;
-
- int const sample_shift = blip_sample_bits - 16;
- int prev = 0;
- while ( count-- )
- {
- blip_long s = (blip_long) *in++ << sample_shift;
- *out += s - prev;
- prev = s;
- ++out;
- }
- *out -= prev;
-}
-
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.rej b/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.rej
deleted file mode 100644
index 64b81cab..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp.rej
+++ /dev/null
@@ -1,11 +0,0 @@
---- /home/waker/Downloads/Game_Music_Emu-0.5.2//gme/Blip_Buffer.cpp 2006-12-11 17:13:57.000000000 +0100
-+++ .//gme/Blip_Buffer.cpp 2010-05-09 20:40:36.000000000 +0200
-@@ -27,7 +27,7 @@
-
- Blip_Buffer::Blip_Buffer()
- {
-- factor_ = LONG_MAX;
-+ factor_ = 0x7fffffff;
- offset_ = 0;
- buffer_ = 0;
- buffer_size_ = 0;
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.orig b/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.orig
deleted file mode 100644
index 4cc526d2..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.orig
+++ /dev/null
@@ -1,488 +0,0 @@
-// Band-limited sound synthesis buffer
-
-// Blip_Buffer 0.4.1
-#ifndef BLIP_BUFFER_H
-#define BLIP_BUFFER_H
-
- // internal
- #include <limits.h>
- #if INT_MAX < 0x7FFFFFFF
- #error "int must be at least 32 bits"
- #endif
-
- typedef int blip_long;
- typedef unsigned blip_ulong;
-
-// Time unit at source clock rate
-typedef blip_long blip_time_t;
-
-// Output samples are 16-bit signed, with a range of -32768 to 32767
-typedef short blip_sample_t;
-enum { blip_sample_max = 32767 };
-
-class Blip_Buffer {
-public:
- typedef const char* blargg_err_t;
-
- // Set output sample rate and buffer length in milliseconds (1/1000 sec, defaults
- // to 1/4 second), then clear buffer. Returns NULL on success, otherwise if there
- // isn't enough memory, returns error without affecting current buffer setup.
- blargg_err_t set_sample_rate( long samples_per_sec, int msec_length = 1000 / 4 );
-
- // Set number of source time units per second
- void clock_rate( long );
-
- // End current time frame of specified duration and make its samples available
- // (along with any still-unread samples) for reading with read_samples(). Begins
- // a new time frame at the end of the current frame.
- void end_frame( blip_time_t time );
-
- // Read at most 'max_samples' out of buffer into 'dest', removing them from from
- // the buffer. Returns number of samples actually read and removed. If stereo is
- // true, increments 'dest' one extra time after writing each sample, to allow
- // easy interleving of two channels into a stereo output buffer.
- long read_samples( blip_sample_t* dest, long max_samples, int stereo = 0 );
-
-// Additional optional features
-
- // Current output sample rate
- long sample_rate() const;
-
- // Length of buffer, in milliseconds
- int length() const;
-
- // Number of source time units per second
- long clock_rate() const;
-
- // Set frequency high-pass filter frequency, where higher values reduce bass more
- void bass_freq( int frequency );
-
- // Number of samples delay from synthesis to samples read out
- int output_latency() const;
-
- // Remove all available samples and clear buffer to silence. If 'entire_buffer' is
- // false, just clears out any samples waiting rather than the entire buffer.
- void clear( int entire_buffer = 1 );
-
- // Number of samples available for reading with read_samples()
- long samples_avail() const;
-
- // Remove 'count' samples from those waiting to be read
- void remove_samples( long count );
-
-// Experimental features
-
- // Count number of clocks needed until 'count' samples will be available.
- // If buffer can't even hold 'count' samples, returns number of clocks until
- // buffer becomes full.
- blip_time_t count_clocks( long count ) const;
-
- // Number of raw samples that can be mixed within frame of specified duration.
- long count_samples( blip_time_t duration ) const;
-
- // Mix 'count' samples from 'buf' into buffer.
- void mix_samples( blip_sample_t const* buf, long count );
-
- // not documented yet
- void set_modified() { modified_ = 1; }
- int clear_modified() { int b = modified_; modified_ = 0; return b; }
- typedef blip_ulong blip_resampled_time_t;
- void remove_silence( long count );
- blip_resampled_time_t resampled_duration( int t ) const { return t * factor_; }
- blip_resampled_time_t resampled_time( blip_time_t t ) const { return t * factor_ + offset_; }
- blip_resampled_time_t clock_rate_factor( long clock_rate ) const;
-public:
- Blip_Buffer();
- ~Blip_Buffer();
-
- // Deprecated
- typedef blip_resampled_time_t resampled_time_t;
- blargg_err_t sample_rate( long r ) { return set_sample_rate( r ); }
- blargg_err_t sample_rate( long r, int msec ) { return set_sample_rate( r, msec ); }
-private:
- // noncopyable
- Blip_Buffer( const Blip_Buffer& );
- Blip_Buffer& operator = ( const Blip_Buffer& );
-public:
- typedef blip_time_t buf_t_;
- blip_ulong factor_;
- blip_resampled_time_t offset_;
- buf_t_* buffer_;
- blip_long buffer_size_;
- blip_long reader_accum_;
- int bass_shift_;
-private:
- long sample_rate_;
- long clock_rate_;
- int bass_freq_;
- int length_;
- int modified_;
- friend class Blip_Reader;
-};
-
-#ifdef HAVE_CONFIG_H
- #include "config.h"
-#endif
-
-// Number of bits in resample ratio fraction. Higher values give a more accurate ratio
-// but reduce maximum buffer size.
-#ifndef BLIP_BUFFER_ACCURACY
- #define BLIP_BUFFER_ACCURACY 16
-#endif
-
-// Number bits in phase offset. Fewer than 6 bits (64 phase offsets) results in
-// noticeable broadband noise when synthesizing high frequency square waves.
-// Affects size of Blip_Synth objects since they store the waveform directly.
-#ifndef BLIP_PHASE_BITS
- #if BLIP_BUFFER_FAST
- #define BLIP_PHASE_BITS 8
- #else
- #define BLIP_PHASE_BITS 6
- #endif
-#endif
-
- // Internal
- typedef blip_ulong blip_resampled_time_t;
- int const blip_widest_impulse_ = 16;
- int const blip_buffer_extra_ = blip_widest_impulse_ + 2;
- int const blip_res = 1 << BLIP_PHASE_BITS;
- class blip_eq_t;
-
- class Blip_Synth_Fast_ {
- public:
- Blip_Buffer* buf;
- int last_amp;
- int delta_factor;
-
- void volume_unit( double );
- Blip_Synth_Fast_();
- void treble_eq( blip_eq_t const& ) { }
- };
-
- class Blip_Synth_ {
- public:
- Blip_Buffer* buf;
- int last_amp;
- int delta_factor;
-
- void volume_unit( double );
- Blip_Synth_( short* impulses, int width );
- void treble_eq( blip_eq_t const& );
- private:
- double volume_unit_;
- short* const impulses;
- int const width;
- blip_long kernel_unit;
- int impulses_size() const { return blip_res / 2 * width + 1; }
- void adjust_impulse();
- };
-
-// Quality level. Start with blip_good_quality.
-const int blip_med_quality = 8;
-const int blip_good_quality = 12;
-const int blip_high_quality = 16;
-
-// Range specifies the greatest expected change in amplitude. Calculate it
-// by finding the difference between the maximum and minimum expected
-// amplitudes (max - min).
-template<int quality,int range>
-class Blip_Synth {
-public:
- // Set overall volume of waveform
- void volume( double v ) { impl.volume_unit( v * (1.0 / (range < 0 ? -range : range)) ); }
-
- // Configure low-pass filter (see blip_buffer.txt)
- void treble_eq( blip_eq_t const& eq ) { impl.treble_eq( eq ); }
-
- // Get/set Blip_Buffer used for output
- Blip_Buffer* output() const { return impl.buf; }
- void output( Blip_Buffer* b ) { impl.buf = b; impl.last_amp = 0; }
-
- // Update amplitude of waveform at given time. Using this requires a separate
- // Blip_Synth for each waveform.
- void update( blip_time_t time, int amplitude );
-
-// Low-level interface
-
- // Add an amplitude transition of specified delta, optionally into specified buffer
- // rather than the one set with output(). Delta can be positive or negative.
- // The actual change in amplitude is delta * (volume / range)
- void offset( blip_time_t, int delta, Blip_Buffer* ) const;
- void offset( blip_time_t t, int delta ) const { offset( t, delta, impl.buf ); }
-
- // Works directly in terms of fractional output samples. Contact author for more info.
- void offset_resampled( blip_resampled_time_t, int delta, Blip_Buffer* ) const;
-
- // Same as offset(), except code is inlined for higher performance
- void offset_inline( blip_time_t t, int delta, Blip_Buffer* buf ) const {
- offset_resampled( t * buf->factor_ + buf->offset_, delta, buf );
- }
- void offset_inline( blip_time_t t, int delta ) const {
- offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf );
- }
-
-private:
-#if BLIP_BUFFER_FAST
- Blip_Synth_Fast_ impl;
-#else
- Blip_Synth_ impl;
- typedef short imp_t;
- imp_t impulses [blip_res * (quality / 2) + 1];
-public:
- Blip_Synth() : impl( impulses, quality ) { }
-#endif
-};
-
-// Low-pass equalization parameters
-class blip_eq_t {
-public:
- // Logarithmic rolloff to treble dB at half sampling rate. Negative values reduce
- // treble, small positive values (0 to 5.0) increase treble.
- blip_eq_t( double treble_db = 0 );
-
- // See blip_buffer.txt
- blip_eq_t( double treble, long rolloff_freq, long sample_rate, long cutoff_freq = 0 );
-
-private:
- double treble;
- long rolloff_freq;
- long sample_rate;
- long cutoff_freq;
- void generate( float* out, int count ) const;
- friend class Blip_Synth_;
-};
-
-int const blip_sample_bits = 30;
-
-// Dummy Blip_Buffer to direct sound output to, for easy muting without
-// having to stop sound code.
-class Silent_Blip_Buffer : public Blip_Buffer {
- buf_t_ buf [blip_buffer_extra_ + 1];
-public:
- // The following cannot be used (an assertion will fail if attempted):
- blargg_err_t set_sample_rate( long samples_per_sec, int msec_length );
- blip_time_t count_clocks( long count ) const;
- void mix_samples( blip_sample_t const* buf, long count );
-
- Silent_Blip_Buffer();
-};
-
- #if defined (__GNUC__) || _MSC_VER >= 1100
- #define BLIP_RESTRICT __restrict
- #else
- #define BLIP_RESTRICT
- #endif
-
-// Optimized reading from Blip_Buffer, for use in custom sample output
-
-// Begin reading from buffer. Name should be unique to the current block.
-#define BLIP_READER_BEGIN( name, blip_buffer ) \
- const Blip_Buffer::buf_t_* BLIP_RESTRICT name##_reader_buf = (blip_buffer).buffer_;\
- blip_long name##_reader_accum = (blip_buffer).reader_accum_
-
-// Get value to pass to BLIP_READER_NEXT()
-#define BLIP_READER_BASS( blip_buffer ) ((blip_buffer).bass_shift_)
-
-// Constant value to use instead of BLIP_READER_BASS(), for slightly more optimal
-// code at the cost of having no bass control
-int const blip_reader_default_bass = 9;
-
-// Current sample
-#define BLIP_READER_READ( name ) (name##_reader_accum >> (blip_sample_bits - 16))
-
-// Current raw sample in full internal resolution
-#define BLIP_READER_READ_RAW( name ) (name##_reader_accum)
-
-// Advance to next sample
-#define BLIP_READER_NEXT( name, bass ) \
- (void) (name##_reader_accum += *name##_reader_buf++ - (name##_reader_accum >> (bass)))
-
-// End reading samples from buffer. The number of samples read must now be removed
-// using Blip_Buffer::remove_samples().
-#define BLIP_READER_END( name, blip_buffer ) \
- (void) ((blip_buffer).reader_accum_ = name##_reader_accum)
-
-
-// Compatibility with older version
-const long blip_unscaled = 65535;
-const int blip_low_quality = blip_med_quality;
-const int blip_best_quality = blip_high_quality;
-
-// Deprecated; use BLIP_READER macros as follows:
-// Blip_Reader r; r.begin( buf ); -> BLIP_READER_BEGIN( r, buf );
-// int bass = r.begin( buf ) -> BLIP_READER_BEGIN( r, buf ); int bass = BLIP_READER_BASS( buf );
-// r.read() -> BLIP_READER_READ( r )
-// r.read_raw() -> BLIP_READER_READ_RAW( r )
-// r.next( bass ) -> BLIP_READER_NEXT( r, bass )
-// r.next() -> BLIP_READER_NEXT( r, blip_reader_default_bass )
-// r.end( buf ) -> BLIP_READER_END( r, buf )
-class Blip_Reader {
-public:
- int begin( Blip_Buffer& );
- blip_long read() const { return accum >> (blip_sample_bits - 16); }
- blip_long read_raw() const { return accum; }
- void next( int bass_shift = 9 ) { accum += *buf++ - (accum >> bass_shift); }
- void end( Blip_Buffer& b ) { b.reader_accum_ = accum; }
-
-private:
- const Blip_Buffer::buf_t_* buf;
- blip_long accum;
-};
-
-// End of public interface
-
-#include <assert.h>
-
-template<int quality,int range>
-inline void Blip_Synth<quality,range>::offset_resampled( blip_resampled_time_t time,
- int delta, Blip_Buffer* blip_buf ) const
-{
- // Fails if time is beyond end of Blip_Buffer, due to a bug in caller code or the
- // need for a longer buffer as set by set_sample_rate().
- assert( (blip_long) (time >> BLIP_BUFFER_ACCURACY) < blip_buf->buffer_size_ );
- delta *= impl.delta_factor;
- blip_long* BLIP_RESTRICT buf = blip_buf->buffer_ + (time >> BLIP_BUFFER_ACCURACY);
- int phase = (int) (time >> (BLIP_BUFFER_ACCURACY - BLIP_PHASE_BITS) & (blip_res - 1));
-
-#if BLIP_BUFFER_FAST
- blip_long left = buf [0] + delta;
-
- // Kind of crappy, but doing shift after multiply results in overflow.
- // Alternate way of delaying multiply by delta_factor results in worse
- // sub-sample resolution.
- blip_long right = (delta >> BLIP_PHASE_BITS) * phase;
- left -= right;
- right += buf [1];
-
- buf [0] = left;
- buf [1] = right;
-#else
-
- int const fwd = (blip_widest_impulse_ - quality) / 2;
- int const rev = fwd + quality - 2;
- int const mid = quality / 2 - 1;
-
- imp_t const* BLIP_RESTRICT imp = impulses + blip_res - phase;
-
- #if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \
- defined (__x86_64__) || defined (__ia64__) || defined (__i386__)
-
- // straight forward implementation resulted in better code on GCC for x86
-
- #define ADD_IMP( out, in ) \
- buf [out] += (blip_long) imp [blip_res * (in)] * delta
-
- #define BLIP_FWD( i ) {\
- ADD_IMP( fwd + i, i );\
- ADD_IMP( fwd + 1 + i, i + 1 );\
- }
- #define BLIP_REV( r ) {\
- ADD_IMP( rev - r, r + 1 );\
- ADD_IMP( rev + 1 - r, r );\
- }
-
- BLIP_FWD( 0 )
- if ( quality > 8 ) BLIP_FWD( 2 )
- if ( quality > 12 ) BLIP_FWD( 4 )
- {
- ADD_IMP( fwd + mid - 1, mid - 1 );
- ADD_IMP( fwd + mid , mid );
- imp = impulses + phase;
- }
- if ( quality > 12 ) BLIP_REV( 6 )
- if ( quality > 8 ) BLIP_REV( 4 )
- BLIP_REV( 2 )
-
- ADD_IMP( rev , 1 );
- ADD_IMP( rev + 1, 0 );
-
- #else
-
- // for RISC processors, help compiler by reading ahead of writes
-
- #define BLIP_FWD( i ) {\
- blip_long t0 = i0 * delta + buf [fwd + i];\
- blip_long t1 = imp [blip_res * (i + 1)] * delta + buf [fwd + 1 + i];\
- i0 = imp [blip_res * (i + 2)];\
- buf [fwd + i] = t0;\
- buf [fwd + 1 + i] = t1;\
- }
- #define BLIP_REV( r ) {\
- blip_long t0 = i0 * delta + buf [rev - r];\
- blip_long t1 = imp [blip_res * r] * delta + buf [rev + 1 - r];\
- i0 = imp [blip_res * (r - 1)];\
- buf [rev - r] = t0;\
- buf [rev + 1 - r] = t1;\
- }
-
- blip_long i0 = *imp;
- BLIP_FWD( 0 )
- if ( quality > 8 ) BLIP_FWD( 2 )
- if ( quality > 12 ) BLIP_FWD( 4 )
- {
- blip_long t0 = i0 * delta + buf [fwd + mid - 1];
- blip_long t1 = imp [blip_res * mid] * delta + buf [fwd + mid ];
- imp = impulses + phase;
- i0 = imp [blip_res * mid];
- buf [fwd + mid - 1] = t0;
- buf [fwd + mid ] = t1;
- }
- if ( quality > 12 ) BLIP_REV( 6 )
- if ( quality > 8 ) BLIP_REV( 4 )
- BLIP_REV( 2 )
-
- blip_long t0 = i0 * delta + buf [rev ];
- blip_long t1 = *imp * delta + buf [rev + 1];
- buf [rev ] = t0;
- buf [rev + 1] = t1;
- #endif
-
-#endif
-}
-
-#undef BLIP_FWD
-#undef BLIP_REV
-
-template<int quality,int range>
-#if BLIP_BUFFER_FAST
- inline
-#endif
-void Blip_Synth<quality,range>::offset( blip_time_t t, int delta, Blip_Buffer* buf ) const
-{
- offset_resampled( t * buf->factor_ + buf->offset_, delta, buf );
-}
-
-template<int quality,int range>
-#if BLIP_BUFFER_FAST
- inline
-#endif
-void Blip_Synth<quality,range>::update( blip_time_t t, int amp )
-{
- int delta = amp - impl.last_amp;
- impl.last_amp = amp;
- offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf );
-}
-
-inline blip_eq_t::blip_eq_t( double t ) :
- treble( t ), rolloff_freq( 0 ), sample_rate( 44100 ), cutoff_freq( 0 ) { }
-inline blip_eq_t::blip_eq_t( double t, long rf, long sr, long cf ) :
- treble( t ), rolloff_freq( rf ), sample_rate( sr ), cutoff_freq( cf ) { }
-
-inline int Blip_Buffer::length() const { return length_; }
-inline long Blip_Buffer::samples_avail() const { return (long) (offset_ >> BLIP_BUFFER_ACCURACY); }
-inline long Blip_Buffer::sample_rate() const { return sample_rate_; }
-inline int Blip_Buffer::output_latency() const { return blip_widest_impulse_ / 2; }
-inline long Blip_Buffer::clock_rate() const { return clock_rate_; }
-inline void Blip_Buffer::clock_rate( long cps ) { factor_ = clock_rate_factor( clock_rate_ = cps ); }
-
-inline int Blip_Reader::begin( Blip_Buffer& blip_buf )
-{
- buf = blip_buf.buffer_;
- accum = blip_buf.reader_accum_;
- return blip_buf.bass_shift_;
-}
-
-int const blip_max_length = 0;
-int const blip_default_length = 250;
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.rej b/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.rej
deleted file mode 100644
index 27e9d6c5..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h.rej
+++ /dev/null
@@ -1,23 +0,0 @@
---- /home/waker/Downloads/Game_Music_Emu-0.5.2//gme/Blip_Buffer.h 2006-12-07 21:16:54.000000000 +0100
-+++ .//gme/Blip_Buffer.h 2010-05-09 20:40:36.000000000 +0200
-@@ -4,15 +4,11 @@
- #ifndef BLIP_BUFFER_H
- #define BLIP_BUFFER_H
-
-- // internal
-- #include <limits.h>
-- #if INT_MAX >= 0x7FFFFFFF
-- typedef int blip_long;
-- typedef unsigned blip_ulong;
-- #else
-- typedef long blip_long;
-- typedef unsigned long blip_ulong;
-- #endif
-+// internal
-+#include <limits.h>
-+#include <stdint.h>
-+typedef int32_t blip_long;
-+typedef uint32_t blip_ulong;
-
- // Time unit at source clock rate
- typedef blip_long blip_time_t;
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.cpp
deleted file mode 100644
index 91b48472..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-#include "Dual_Resampler.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-unsigned const resampler_extra = 256;
-
-Dual_Resampler::Dual_Resampler() {
- sample_buf_size = 0;
-}
-
-Dual_Resampler::~Dual_Resampler() { }
-
-blargg_err_t Dual_Resampler::reset( int pairs )
-{
- // expand allocations a bit
- RETURN_ERR( sample_buf.resize( (pairs + (pairs >> 2)) * 2 ) );
- resize( pairs );
- resampler_size = oversamples_per_frame + (oversamples_per_frame >> 2);
- return resampler.buffer_size( resampler_size );
-}
-
-void Dual_Resampler::resize( int pairs )
-{
- int new_sample_buf_size = pairs * 2;
- if ( sample_buf_size != new_sample_buf_size )
- {
- if ( (unsigned) new_sample_buf_size > sample_buf.size() )
- {
- check( false );
- return;
- }
- sample_buf_size = new_sample_buf_size;
- oversamples_per_frame = int (pairs * resampler.ratio()) * 2 + 2;
- clear();
- }
-}
-
-void Dual_Resampler::play_frame_( Blip_Buffer& blip_buf, dsample_t* out )
-{
- long pair_count = sample_buf_size >> 1;
- blip_time_t blip_time = blip_buf.count_clocks( pair_count );
- int sample_count = oversamples_per_frame - resampler.written();
-
- int new_count = play_frame( blip_time, sample_count, resampler.buffer() );
- assert( new_count < resampler_size );
-
- blip_buf.end_frame( blip_time );
- assert( blip_buf.samples_avail() == pair_count );
-
- resampler.write( new_count );
-
- long count = resampler.read( sample_buf.begin(), sample_buf_size );
- assert( count == (long) sample_buf_size );
-
- mix_samples( blip_buf, out );
- blip_buf.remove_samples( pair_count );
-}
-
-void Dual_Resampler::dual_play( long count, dsample_t* out, Blip_Buffer& blip_buf )
-{
- // empty extra buffer
- long remain = sample_buf_size - buf_pos;
- if ( remain )
- {
- if ( remain > count )
- remain = count;
- count -= remain;
- memcpy( out, &sample_buf [buf_pos], remain * sizeof *out );
- out += remain;
- buf_pos += remain;
- }
-
- // entire frames
- while ( count >= (long) sample_buf_size )
- {
- play_frame_( blip_buf, out );
- out += sample_buf_size;
- count -= sample_buf_size;
- }
-
- // extra
- if ( count )
- {
- play_frame_( blip_buf, sample_buf.begin() );
- buf_pos = count;
- memcpy( out, sample_buf.begin(), count * sizeof *out );
- out += count;
- }
-}
-
-void Dual_Resampler::mix_samples( Blip_Buffer& blip_buf, dsample_t* out )
-{
- Blip_Reader sn;
- int bass = sn.begin( blip_buf );
- const dsample_t* in = sample_buf.begin();
-
- for ( int n = sample_buf_size >> 1; n--; )
- {
- int s = sn.read();
- blargg_long l = (blargg_long) in [0] * 2 + s;
- if ( (BOOST::int16_t) l != l )
- l = 0x7FFF - (l >> 24);
-
- sn.next( bass );
- blargg_long r = (blargg_long) in [1] * 2 + s;
- if ( (BOOST::int16_t) r != r )
- r = 0x7FFF - (r >> 24);
-
- in += 2;
- out [0] = l;
- out [1] = r;
- out += 2;
- }
-
- sn.end( blip_buf );
-}
-
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.h b/plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.h
deleted file mode 100644
index e74ebc55..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Nintendo Game Boy PAPU sound chip emulator
-
-// Gb_Snd_Emu 0.1.5
-#ifndef GB_APU_H
-#define GB_APU_H
-
-#include "Gb_Oscs.h"
-
-class Gb_Apu {
-public:
-
- // Set overall volume of all oscillators, where 1.0 is full volume
- void volume( double );
-
- // Set treble equalization
- void treble_eq( const blip_eq_t& );
-
- // Outputs can be assigned to a single buffer for mono output, or to three
- // buffers for stereo output (using Stereo_Buffer to do the mixing).
-
- // Assign all oscillator outputs to specified buffer(s). If buffer
- // is NULL, silences all oscillators.
- void output( Blip_Buffer* mono );
- void output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right );
-
- // Assign single oscillator output to buffer(s). Valid indicies are 0 to 3,
- // which refer to Square 1, Square 2, Wave, and Noise. If buffer is NULL,
- // silences oscillator.
- enum { osc_count = 4 };
- void osc_output( int index, Blip_Buffer* mono );
- void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right );
-
- // Reset oscillators and internal state
- void reset();
-
- // Reads and writes at addr must satisfy start_addr <= addr <= end_addr
- enum { start_addr = 0xFF10 };
- enum { end_addr = 0xFF3F };
- enum { register_count = end_addr - start_addr + 1 };
-
- // Write 'data' to address at specified time
- void write_register( blip_time_t, unsigned addr, int data );
-
- // Read from address at specified time
- int read_register( blip_time_t, unsigned addr );
-
- // Run all oscillators up to specified time, end current time frame, then
- // start a new frame at time 0.
- void end_frame( blip_time_t );
-
- void set_tempo( double );
-
-public:
- Gb_Apu();
-private:
- // noncopyable
- Gb_Apu( const Gb_Apu& );
- Gb_Apu& operator = ( const Gb_Apu& );
-
- Gb_Osc* oscs [osc_count];
- blip_time_t next_frame_time;
- blip_time_t last_time;
- blip_time_t frame_period;
- double volume_unit;
- int frame_count;
-
- Gb_Square square1;
- Gb_Square square2;
- Gb_Wave wave;
- Gb_Noise noise;
- BOOST::uint8_t regs [register_count];
- Gb_Square::Synth square_synth; // used by squares
- Gb_Wave::Synth other_synth; // used by wave and noise
-
- void update_volume();
- void run_until( blip_time_t );
- void write_osc( int index, int reg, int data );
-};
-
-inline void Gb_Apu::output( Blip_Buffer* b ) { output( b, b, b ); }
-
-inline void Gb_Apu::osc_output( int i, Blip_Buffer* b ) { osc_output( i, b, b, b ); }
-
-inline void Gb_Apu::volume( double vol )
-{
- volume_unit = 0.60 / osc_count / 15 /*steps*/ / 2 /*?*/ / 8 /*master vol range*/ * vol;
- update_volume();
-}
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.cpp
deleted file mode 100644
index 735653fa..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.cpp
+++ /dev/null
@@ -1,336 +0,0 @@
-// Gb_Snd_Emu 0.1.5. http://www.slack.net/~ant/
-
-#include "Gb_Apu.h"
-
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// Gb_Osc
-
-void Gb_Osc::reset()
-{
- delay = 0;
- last_amp = 0;
- length = 0;
- output_select = 3;
- output = outputs [output_select];
-}
-
-void Gb_Osc::clock_length()
-{
- if ( (regs [4] & len_enabled_mask) && length )
- length--;
-}
-
-// Gb_Env
-
-void Gb_Env::clock_envelope()
-{
- if ( env_delay && !--env_delay )
- {
- env_delay = regs [2] & 7;
- int v = volume - 1 + (regs [2] >> 2 & 2);
- if ( (unsigned) v < 15 )
- volume = v;
- }
-}
-
-bool Gb_Env::write_register( int reg, int data )
-{
- switch ( reg )
- {
- case 1:
- length = 64 - (regs [1] & 0x3F);
- break;
-
- case 2:
- if ( !(data >> 4) )
- enabled = false;
- break;
-
- case 4:
- if ( data & trigger )
- {
- env_delay = regs [2] & 7;
- volume = regs [2] >> 4;
- enabled = true;
- if ( length == 0 )
- length = 64;
- return true;
- }
- }
- return false;
-}
-
-// Gb_Square
-
-void Gb_Square::reset()
-{
- phase = 0;
- sweep_freq = 0;
- sweep_delay = 0;
- Gb_Env::reset();
-}
-
-void Gb_Square::clock_sweep()
-{
- int sweep_period = (regs [0] & period_mask) >> 4;
- if ( sweep_period && sweep_delay && !--sweep_delay )
- {
- sweep_delay = sweep_period;
- regs [3] = sweep_freq & 0xFF;
- regs [4] = (regs [4] & ~0x07) | (sweep_freq >> 8 & 0x07);
-
- int offset = sweep_freq >> (regs [0] & shift_mask);
- if ( regs [0] & 0x08 )
- offset = -offset;
- sweep_freq += offset;
-
- if ( sweep_freq < 0 )
- {
- sweep_freq = 0;
- }
- else if ( sweep_freq >= 2048 )
- {
- sweep_delay = 0; // don't modify channel frequency any further
- sweep_freq = 2048; // silence sound immediately
- }
- }
-}
-
-void Gb_Square::run( blip_time_t time, blip_time_t end_time, int playing )
-{
- if ( sweep_freq == 2048 )
- playing = false;
-
- static unsigned char const table [4] = { 1, 2, 4, 6 };
- int const duty = table [regs [1] >> 6];
- int amp = volume & playing;
- if ( phase >= duty )
- amp = -amp;
-
- int frequency = this->frequency();
- if ( unsigned (frequency - 1) > 2040 ) // frequency < 1 || frequency > 2041
- {
- // really high frequency results in DC at half volume
- amp = volume >> 1;
- playing = false;
- }
-
- {
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth->offset( time, delta, output );
- }
- }
-
- time += delay;
- if ( !playing )
- time = end_time;
-
- if ( time < end_time )
- {
- int const period = (2048 - frequency) * 4;
- Blip_Buffer* const output = this->output;
- int phase = this->phase;
- int delta = amp * 2;
- do
- {
- phase = (phase + 1) & 7;
- if ( phase == 0 || phase == duty )
- {
- delta = -delta;
- synth->offset_inline( time, delta, output );
- }
- time += period;
- }
- while ( time < end_time );
-
- this->phase = phase;
- last_amp = delta >> 1;
- }
- delay = time - end_time;
-}
-
-// Gb_Noise
-
-void Gb_Noise::run( blip_time_t time, blip_time_t end_time, int playing )
-{
- int amp = volume & playing;
- int tap = 13 - (regs [3] & 8);
- if ( bits >> tap & 2 )
- amp = -amp;
-
- {
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth->offset( time, delta, output );
- }
- }
-
- time += delay;
- if ( !playing )
- time = end_time;
-
- if ( time < end_time )
- {
- static unsigned char const table [8] = { 8, 16, 32, 48, 64, 80, 96, 112 };
- int period = table [regs [3] & 7] << (regs [3] >> 4);
-
- // keep parallel resampled time to eliminate time conversion in the loop
- Blip_Buffer* const output = this->output;
- const blip_resampled_time_t resampled_period =
- output->resampled_duration( period );
- blip_resampled_time_t resampled_time = output->resampled_time( time );
- unsigned bits = this->bits;
- int delta = amp * 2;
-
- do
- {
- unsigned changed = (bits >> tap) + 1;
- time += period;
- bits <<= 1;
- if ( changed & 2 )
- {
- delta = -delta;
- bits |= 1;
- synth->offset_resampled( resampled_time, delta, output );
- }
- resampled_time += resampled_period;
- }
- while ( time < end_time );
-
- this->bits = bits;
- last_amp = delta >> 1;
- }
- delay = time - end_time;
-}
-
-// Gb_Wave
-
-inline void Gb_Wave::write_register( int reg, int data )
-{
- switch ( reg )
- {
- case 0:
- if ( !(data & 0x80) )
- enabled = false;
- break;
-
- case 1:
- length = 256 - regs [1];
- break;
-
- case 2:
- volume = data >> 5 & 3;
- break;
-
- case 4:
- if ( data & trigger & regs [0] )
- {
- wave_pos = 0;
- enabled = true;
- if ( length == 0 )
- length = 256;
- }
- }
-}
-
-void Gb_Wave::run( blip_time_t time, blip_time_t end_time, int playing )
-{
- int volume_shift = (volume - 1) & 7; // volume = 0 causes shift = 7
- int frequency;
- {
- int amp = (wave [wave_pos] >> volume_shift & playing) * 2;
-
- frequency = this->frequency();
- if ( unsigned (frequency - 1) > 2044 ) // frequency < 1 || frequency > 2045
- {
- amp = 30 >> volume_shift & playing;
- playing = false;
- }
-
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth->offset( time, delta, output );
- }
- }
-
- time += delay;
- if ( !playing )
- time = end_time;
-
- if ( time < end_time )
- {
- Blip_Buffer* const output = this->output;
- int const period = (2048 - frequency) * 2;
- int wave_pos = (this->wave_pos + 1) & (wave_size - 1);
-
- do
- {
- int amp = (wave [wave_pos] >> volume_shift) * 2;
- wave_pos = (wave_pos + 1) & (wave_size - 1);
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth->offset_inline( time, delta, output );
- }
- time += period;
- }
- while ( time < end_time );
-
- this->wave_pos = (wave_pos - 1) & (wave_size - 1);
- }
- delay = time - end_time;
-}
-
-// Gb_Apu::write_osc
-
-void Gb_Apu::write_osc( int index, int reg, int data )
-{
- reg -= index * 5;
- Gb_Square* sq = &square2;
- switch ( index )
- {
- case 0:
- sq = &square1;
- case 1:
- if ( sq->write_register( reg, data ) && index == 0 )
- {
- square1.sweep_freq = square1.frequency();
- if ( (regs [0] & sq->period_mask) && (regs [0] & sq->shift_mask) )
- {
- square1.sweep_delay = 1; // cause sweep to recalculate now
- square1.clock_sweep();
- }
- }
- break;
-
- case 2:
- wave.write_register( reg, data );
- break;
-
- case 3:
- if ( noise.write_register( reg, data ) )
- noise.bits = 0x7FFF;
- }
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.h b/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.h
deleted file mode 100644
index d7f88ea1..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Oscs.h
+++ /dev/null
@@ -1,83 +0,0 @@
-// Private oscillators used by Gb_Apu
-
-// Gb_Snd_Emu 0.1.5
-#ifndef GB_OSCS_H
-#define GB_OSCS_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-struct Gb_Osc
-{
- enum { trigger = 0x80 };
- enum { len_enabled_mask = 0x40 };
-
- Blip_Buffer* outputs [4]; // NULL, right, left, center
- Blip_Buffer* output;
- int output_select;
- BOOST::uint8_t* regs; // osc's 5 registers
-
- int delay;
- int last_amp;
- int volume;
- int length;
- int enabled;
-
- void reset();
- void clock_length();
- int frequency() const { return (regs [4] & 7) * 0x100 + regs [3]; }
-};
-
-struct Gb_Env : Gb_Osc
-{
- int env_delay;
-
- void reset();
- void clock_envelope();
- bool write_register( int, int );
-};
-
-struct Gb_Square : Gb_Env
-{
- enum { period_mask = 0x70 };
- enum { shift_mask = 0x07 };
-
- typedef Blip_Synth<blip_good_quality,1> Synth;
- Synth const* synth;
- int sweep_delay;
- int sweep_freq;
- int phase;
-
- void reset();
- void clock_sweep();
- void run( blip_time_t, blip_time_t, int playing );
-};
-
-struct Gb_Noise : Gb_Env
-{
- typedef Blip_Synth<blip_med_quality,1> Synth;
- Synth const* synth;
- unsigned bits;
-
- void run( blip_time_t, blip_time_t, int playing );
-};
-
-struct Gb_Wave : Gb_Osc
-{
- typedef Blip_Synth<blip_med_quality,1> Synth;
- Synth const* synth;
- int wave_pos;
- enum { wave_size = 32 };
- BOOST::uint8_t wave [wave_size];
-
- void write_register( int, int );
- void run( blip_time_t, blip_time_t, int playing );
-};
-
-inline void Gb_Env::reset()
-{
- env_delay = 0;
- Gb_Osc::reset();
-}
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.cpp
deleted file mode 100644
index b41fdec4..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.cpp
+++ /dev/null
@@ -1,330 +0,0 @@
-// Sms_Snd_Emu 0.1.4. http://www.slack.net/~ant/
-
-#include "Sms_Apu.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// Sms_Osc
-
-Sms_Osc::Sms_Osc()
-{
- output = 0;
- outputs [0] = 0; // always stays NULL
- outputs [1] = 0;
- outputs [2] = 0;
- outputs [3] = 0;
-}
-
-void Sms_Osc::reset()
-{
- delay = 0;
- last_amp = 0;
- volume = 0;
- output_select = 3;
- output = outputs [3];
-}
-
-// Sms_Square
-
-inline void Sms_Square::reset()
-{
- period = 0;
- phase = 0;
- Sms_Osc::reset();
-}
-
-void Sms_Square::run( blip_time_t time, blip_time_t end_time )
-{
- if ( !volume || period <= 128 )
- {
- // ignore 16kHz and higher
- if ( last_amp )
- {
- synth->offset( time, -last_amp, output );
- last_amp = 0;
- }
- time += delay;
- if ( !period )
- {
- time = end_time;
- }
- else if ( time < end_time )
- {
- // keep calculating phase
- int count = (end_time - time + period - 1) / period;
- phase = (phase + count) & 1;
- time += count * period;
- }
- }
- else
- {
- int amp = phase ? volume : -volume;
- {
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth->offset( time, delta, output );
- }
- }
-
- time += delay;
- if ( time < end_time )
- {
- Blip_Buffer* const output = this->output;
- int delta = amp * 2;
- do
- {
- delta = -delta;
- synth->offset_inline( time, delta, output );
- time += period;
- phase ^= 1;
- }
- while ( time < end_time );
- this->last_amp = phase ? volume : -volume;
- }
- }
- delay = time - end_time;
-}
-
-// Sms_Noise
-
-static int const noise_periods [3] = { 0x100, 0x200, 0x400 };
-
-inline void Sms_Noise::reset()
-{
- period = &noise_periods [0];
- shifter = 0x8000;
- feedback = 0x9000;
- Sms_Osc::reset();
-}
-
-void Sms_Noise::run( blip_time_t time, blip_time_t end_time )
-{
- int amp = volume;
- if ( shifter & 1 )
- amp = -amp;
-
- {
- int delta = amp - last_amp;
- if ( delta )
- {
- last_amp = amp;
- synth.offset( time, delta, output );
- }
- }
-
- time += delay;
- if ( !volume )
- time = end_time;
-
- if ( time < end_time )
- {
- Blip_Buffer* const output = this->output;
- unsigned shifter = this->shifter;
- int delta = amp * 2;
- int period = *this->period * 2;
- if ( !period )
- period = 16;
-
- do
- {
- int changed = shifter + 1;
- shifter = (feedback & -(shifter & 1)) ^ (shifter >> 1);
- if ( changed & 2 ) // true if bits 0 and 1 differ
- {
- delta = -delta;
- synth.offset_inline( time, delta, output );
- }
- time += period;
- }
- while ( time < end_time );
-
- this->shifter = shifter;
- this->last_amp = delta >> 1;
- }
- delay = time - end_time;
-}
-
-// Sms_Apu
-
-Sms_Apu::Sms_Apu()
-{
- for ( int i = 0; i < 3; i++ )
- {
- squares [i].synth = &square_synth;
- oscs [i] = &squares [i];
- }
- oscs [3] = &noise;
-
- volume( 1.0 );
- reset();
-}
-
-Sms_Apu::~Sms_Apu()
-{
-}
-
-void Sms_Apu::volume( double vol )
-{
- vol *= 0.85 / (osc_count * 64 * 2);
- square_synth.volume( vol );
- noise.synth.volume( vol );
-}
-
-void Sms_Apu::treble_eq( const blip_eq_t& eq )
-{
- square_synth.treble_eq( eq );
- noise.synth.treble_eq( eq );
-}
-
-void Sms_Apu::osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- require( (unsigned) index < osc_count );
- require( (center && left && right) || (!center && !left && !right) );
- Sms_Osc& osc = *oscs [index];
- osc.outputs [1] = right;
- osc.outputs [2] = left;
- osc.outputs [3] = center;
- osc.output = osc.outputs [osc.output_select];
-}
-
-void Sms_Apu::output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, center, left, right );
-}
-
-void Sms_Apu::reset( unsigned feedback, int noise_width )
-{
- last_time = 0;
- latch = 0;
-
- if ( !feedback || !noise_width )
- {
- feedback = 0x0009;
- noise_width = 16;
- }
- // convert to "Galios configuration"
- looped_feedback = 1 << (noise_width - 1);
- noise_feedback = 0;
- while ( noise_width-- )
- {
- noise_feedback = (noise_feedback << 1) | (feedback & 1);
- feedback >>= 1;
- }
-
- squares [0].reset();
- squares [1].reset();
- squares [2].reset();
- noise.reset();
-}
-
-void Sms_Apu::run_until( blip_time_t end_time )
-{
- require( end_time >= last_time ); // end_time must not be before previous time
-
- if ( end_time > last_time )
- {
- // run oscillators
- for ( int i = 0; i < osc_count; ++i )
- {
- Sms_Osc& osc = *oscs [i];
- if ( osc.output )
- {
- osc.output->set_modified();
- if ( i < 3 )
- squares [i].run( last_time, end_time );
- else
- noise.run( last_time, end_time );
- }
- }
-
- last_time = end_time;
- }
-}
-
-void Sms_Apu::end_frame( blip_time_t end_time )
-{
- if ( end_time > last_time )
- run_until( end_time );
-
- assert( last_time >= end_time );
- last_time -= end_time;
-}
-
-void Sms_Apu::write_ggstereo( blip_time_t time, int data )
-{
- require( (unsigned) data <= 0xFF );
-
- run_until( time );
-
- for ( int i = 0; i < osc_count; i++ )
- {
- Sms_Osc& osc = *oscs [i];
- int flags = data >> i;
- Blip_Buffer* old_output = osc.output;
- osc.output_select = (flags >> 3 & 2) | (flags & 1);
- osc.output = osc.outputs [osc.output_select];
- if ( osc.output != old_output && osc.last_amp )
- {
- if ( old_output )
- {
- old_output->set_modified();
- square_synth.offset( time, -osc.last_amp, old_output );
- }
- osc.last_amp = 0;
- }
- }
-}
-
-// volumes [i] = 64 * pow( 1.26, 15 - i ) / pow( 1.26, 15 )
-static unsigned char const volumes [16] = {
- 64, 50, 39, 31, 24, 19, 15, 12, 9, 7, 5, 4, 3, 2, 1, 0
-};
-
-void Sms_Apu::write_data( blip_time_t time, int data )
-{
- require( (unsigned) data <= 0xFF );
-
- run_until( time );
-
- if ( data & 0x80 )
- latch = data;
-
- int index = (latch >> 5) & 3;
- if ( latch & 0x10 )
- {
- oscs [index]->volume = volumes [data & 15];
- }
- else if ( index < 3 )
- {
- Sms_Square& sq = squares [index];
- if ( data & 0x80 )
- sq.period = (sq.period & 0xFF00) | (data << 4 & 0x00FF);
- else
- sq.period = (sq.period & 0x00FF) | (data << 8 & 0x3F00);
- }
- else
- {
- int select = data & 3;
- if ( select < 3 )
- noise.period = &noise_periods [select];
- else
- noise.period = &squares [2].period;
-
- noise.feedback = (data & 0x04) ? noise_feedback : looped_feedback;
- noise.shifter = 0x8000;
- }
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.h b/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.h
deleted file mode 100644
index 3c11a9c3..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Apu.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Sega Master System SN76489 PSG sound chip emulator
-
-// Sms_Snd_Emu 0.1.4
-#ifndef SMS_APU_H
-#define SMS_APU_H
-
-#include "Sms_Oscs.h"
-
-class Sms_Apu {
-public:
- // Set overall volume of all oscillators, where 1.0 is full volume
- void volume( double );
-
- // Set treble equalization
- void treble_eq( const blip_eq_t& );
-
- // Outputs can be assigned to a single buffer for mono output, or to three
- // buffers for stereo output (using Stereo_Buffer to do the mixing).
-
- // Assign all oscillator outputs to specified buffer(s). If buffer
- // is NULL, silences all oscillators.
- void output( Blip_Buffer* mono );
- void output( Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right );
-
- // Assign single oscillator output to buffer(s). Valid indicies are 0 to 3,
- // which refer to Square 1, Square 2, Square 3, and Noise. If buffer is NULL,
- // silences oscillator.
- enum { osc_count = 4 };
- void osc_output( int index, Blip_Buffer* mono );
- void osc_output( int index, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right );
-
- // Reset oscillators and internal state
- void reset( unsigned noise_feedback = 0, int noise_width = 0 );
-
- // Write GameGear left/right assignment byte
- void write_ggstereo( blip_time_t, int );
-
- // Write to data port
- void write_data( blip_time_t, int );
-
- // Run all oscillators up to specified time, end current frame, then
- // start a new frame at time 0.
- void end_frame( blip_time_t );
-
-public:
- Sms_Apu();
- ~Sms_Apu();
-private:
- // noncopyable
- Sms_Apu( const Sms_Apu& );
- Sms_Apu& operator = ( const Sms_Apu& );
-
- Sms_Osc* oscs [osc_count];
- Sms_Square squares [3];
- Sms_Square::Synth square_synth; // used by squares
- blip_time_t last_time;
- int latch;
- Sms_Noise noise;
- unsigned noise_feedback;
- unsigned looped_feedback;
-
- void run_until( blip_time_t );
-};
-
-struct sms_apu_state_t
-{
- unsigned char regs [8] [2];
- unsigned char latch;
-};
-
-inline void Sms_Apu::output( Blip_Buffer* b ) { output( b, b, b ); }
-
-inline void Sms_Apu::osc_output( int i, Blip_Buffer* b ) { osc_output( i, b, b, b ); }
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Oscs.h b/plugins/gme/game-music-emu-0.5.5/gme/Sms_Oscs.h
deleted file mode 100644
index 2a896fef..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sms_Oscs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Private oscillators used by Sms_Apu
-
-// Sms_Snd_Emu 0.1.4
-#ifndef SMS_OSCS_H
-#define SMS_OSCS_H
-
-#include "blargg_common.h"
-#include "Blip_Buffer.h"
-
-struct Sms_Osc
-{
- Blip_Buffer* outputs [4]; // NULL, right, left, center
- Blip_Buffer* output;
- int output_select;
-
- int delay;
- int last_amp;
- int volume;
-
- Sms_Osc();
- void reset();
-};
-
-struct Sms_Square : Sms_Osc
-{
- int period;
- int phase;
-
- typedef Blip_Synth<blip_good_quality,1> Synth;
- const Synth* synth;
-
- void reset();
- void run( blip_time_t, blip_time_t );
-};
-
-struct Sms_Noise : Sms_Osc
-{
- const int* period;
- unsigned shifter;
- unsigned feedback;
-
- typedef Blip_Synth<blip_med_quality,1> Synth;
- Synth synth;
-
- void reset();
- void run( blip_time_t, blip_time_t );
-};
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.cpp
deleted file mode 100644
index d169b388..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.cpp
+++ /dev/null
@@ -1,489 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-#include "Snes_Spc.h"
-
-#include <string.h>
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// always in the future (CPU time can go over 0, but not by this much)
-int const timer_disabled_time = 127;
-
-Snes_Spc::Snes_Spc() : dsp( mem.ram ), cpu( this, mem.ram )
-{
- set_tempo( 1.0 );
-
- // Put STOP instruction around memory to catch PC underflow/overflow.
- memset( mem.padding1, 0xFF, sizeof mem.padding1 );
- memset( mem.padding2, 0xFF, sizeof mem.padding2 );
-
- // A few tracks read from the last four bytes of IPL ROM
- boot_rom [sizeof boot_rom - 2] = 0xC0;
- boot_rom [sizeof boot_rom - 1] = 0xFF;
- memset( boot_rom, 0, sizeof boot_rom - 2 );
-}
-
-void Snes_Spc::set_tempo( double t )
-{
- int unit = (int) (16.0 / t + 0.5);
-
- timer [0].divisor = unit * 8; // 8 kHz
- timer [1].divisor = unit * 8; // 8 kHz
- timer [2].divisor = unit; // 64 kHz
-}
-
-// Load
-
-void Snes_Spc::set_ipl_rom( void const* in )
-{
- memcpy( boot_rom, in, sizeof boot_rom );
-}
-
-blargg_err_t Snes_Spc::load_spc( const void* data, long size )
-{
- struct spc_file_t {
- char signature [27];
- char unused [10];
- uint8_t pc [2];
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t status;
- uint8_t sp;
- char unused2 [212];
- uint8_t ram [0x10000];
- uint8_t dsp [128];
- uint8_t ipl_rom [128];
- };
- assert( offsetof (spc_file_t,ipl_rom) == spc_file_size );
-
- const spc_file_t* spc = (spc_file_t const*) data;
-
- if ( size < spc_file_size )
- return "Not an SPC file";
-
- if ( strncmp( spc->signature, "SNES-SPC700 Sound File Data", 27 ) != 0 )
- return "Not an SPC file";
-
- registers_t regs;
- regs.pc = spc->pc [1] * 0x100 + spc->pc [0];
- regs.a = spc->a;
- regs.x = spc->x;
- regs.y = spc->y;
- regs.status = spc->status;
- regs.sp = spc->sp;
-
- if ( (unsigned long) size >= sizeof *spc )
- set_ipl_rom( spc->ipl_rom );
-
- const char* error = load_state( regs, spc->ram, spc->dsp );
-
- echo_accessed = false;
-
- return error;
-}
-
-void Snes_Spc::clear_echo()
-{
- if ( !(dsp.read( 0x6C ) & 0x20) )
- {
- unsigned addr = 0x100 * dsp.read( 0x6D );
- size_t size = 0x800 * dsp.read( 0x7D );
- memset( mem.ram + addr, 0xFF, min( size, sizeof mem.ram - addr ) );
- }
-}
-
-// Handle other file formats (emulator save states) in user code, not here.
-
-blargg_err_t Snes_Spc::load_state( const registers_t& cpu_state, const void* new_ram,
- const void* dsp_state )
-{
- // cpu
- cpu.r = cpu_state;
-
- // Allow DSP to generate one sample before code starts
- // (Tengai Makyo Zero, Tenjin's Table Toss first notes are lost since it
- // clears KON 31 cycles from starting execution. It works on the SNES
- // since the SPC player adds a few extra cycles delay after restoring
- // KON from the DSP registers at the end of an SPC file).
- extra_cycles = 32;
-
- // ram
- memcpy( mem.ram, new_ram, sizeof mem.ram );
- memcpy( extra_ram, mem.ram + rom_addr, sizeof extra_ram );
-
- // boot rom (have to force enable_rom() to update it)
- rom_enabled = !(mem.ram [0xF1] & 0x80);
- enable_rom( !rom_enabled );
-
- // dsp
- dsp.reset();
- int i;
- for ( i = 0; i < Spc_Dsp::register_count; i++ )
- dsp.write( i, ((uint8_t const*) dsp_state) [i] );
-
- // timers
- for ( i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
-
- t.next_tick = 0;
- t.enabled = (mem.ram [0xF1] >> i) & 1;
- if ( !t.enabled )
- t.next_tick = timer_disabled_time;
- t.count = 0;
- t.counter = mem.ram [0xFD + i] & 15;
-
- int p = mem.ram [0xFA + i];
- t.period = p ? p : 0x100;
- }
-
- // Handle registers which already give 0 when read by setting RAM and not changing it.
- // Put STOP instruction in registers which can be read, to catch attempted CPU execution.
- mem.ram [0xF0] = 0;
- mem.ram [0xF1] = 0;
- mem.ram [0xF3] = 0xFF;
- mem.ram [0xFA] = 0;
- mem.ram [0xFB] = 0;
- mem.ram [0xFC] = 0;
- mem.ram [0xFD] = 0xFF;
- mem.ram [0xFE] = 0xFF;
- mem.ram [0xFF] = 0xFF;
-
- return 0; // success
-}
-
-// Hardware
-
-// Current time starts negative and ends at 0
-inline spc_time_t Snes_Spc::time() const
-{
- return -cpu.remain();
-}
-
-// Keep track of next time to run and avoid a function call if it hasn't been reached.
-
-// Timers
-
-void Snes_Spc::Timer::run_until_( spc_time_t time )
-{
- if ( !enabled )
- debug_printf( "next_tick: %ld, time: %ld", (long) next_tick, (long) time );
- assert( enabled ); // when disabled, next_tick should always be in the future
-
- int elapsed = ((time - next_tick) / divisor) + 1;
- next_tick += elapsed * divisor;
-
- elapsed += count;
- if ( elapsed >= period ) // avoid unnecessary division
- {
- int n = elapsed / period;
- elapsed -= n * period;
- counter = (counter + n) & 15;
- }
- count = elapsed;
-}
-
-// DSP
-
-const int clocks_per_sample = 32; // 1.024 MHz CPU clock / 32000 samples per second
-
-void Snes_Spc::run_dsp_( spc_time_t time )
-{
- int count = ((time - next_dsp) >> 5) + 1; // divide by clocks_per_sample
- sample_t* buf = sample_buf;
- if ( buf ) {
- sample_buf = buf + count * 2; // stereo
- assert( sample_buf <= buf_end );
- }
- next_dsp += count * clocks_per_sample;
- dsp.run( count, buf );
-}
-
-inline void Snes_Spc::run_dsp( spc_time_t time )
-{
- if ( time >= next_dsp )
- run_dsp_( time );
-}
-
-// Debug-only check for read/write within echo buffer, since this might result in
-// inaccurate emulation due to the DSP not being caught up to the present.
-inline void Snes_Spc::check_for_echo_access( spc_addr_t addr )
-{
- if ( !echo_accessed && !(dsp.read( 0x6C ) & 0x20) )
- {
- // ** If echo accesses are found that require running the DSP, cache
- // the start and end address on DSP writes to speed up checking.
-
- unsigned start = 0x100 * dsp.read( 0x6D );
- unsigned end = start + 0x800 * dsp.read( 0x7D );
- if ( start <= addr && addr < end ) {
- echo_accessed = true;
- debug_printf( "Read/write at $%04X within echo buffer\n", (unsigned) addr );
- }
- }
-}
-
-// Read
-
-int Snes_Spc::read( spc_addr_t addr )
-{
- int result = mem.ram [addr];
-
- if ( (rom_addr <= addr && addr < 0xFFFC || addr >= 0xFFFE) && rom_enabled )
- debug_printf( "Read from ROM: %04X -> %02X\n", addr, result );
-
- if ( unsigned (addr - 0xF0) < 0x10 )
- {
- assert( 0xF0 <= addr && addr <= 0xFF );
-
- // counters
- int i = addr - 0xFD;
- if ( i >= 0 )
- {
- Timer& t = timer [i];
- t.run_until( time() );
- int old = t.counter;
- t.counter = 0;
- return old;
- }
-
- // dsp
- if ( addr == 0xF3 )
- {
- run_dsp( time() );
- if ( mem.ram [0xF2] >= Spc_Dsp::register_count )
- debug_printf( "DSP read from $%02X\n", (int) mem.ram [0xF2] );
- return dsp.read( mem.ram [0xF2] & 0x7F );
- }
-
- if ( addr == 0xF0 || addr == 0xF1 || addr == 0xF8 ||
- addr == 0xF9 || addr == 0xFA )
- debug_printf( "Read from register $%02X\n", (int) addr );
-
- // Registers which always read as 0 are handled by setting mem.ram [reg] to 0
- // at startup then never changing that value.
-
- check(( check_for_echo_access( addr ), true ));
- }
-
- return result;
-}
-
-
-// Write
-
-void Snes_Spc::enable_rom( bool enable )
-{
- if ( rom_enabled != enable )
- {
- rom_enabled = enable;
- memcpy( mem.ram + rom_addr, (enable ? boot_rom : extra_ram), rom_size );
- // TODO: ROM can still get overwritten when DSP writes to echo buffer
- }
-}
-
-void Snes_Spc::write( spc_addr_t addr, int data )
-{
- // first page is very common
- if ( addr < 0xF0 ) {
- mem.ram [addr] = (uint8_t) data;
- }
- else switch ( addr )
- {
- // RAM
- default:
- check(( check_for_echo_access( addr ), true ));
- if ( addr < rom_addr ) {
- mem.ram [addr] = (uint8_t) data;
- }
- else {
- extra_ram [addr - rom_addr] = (uint8_t) data;
- if ( !rom_enabled )
- mem.ram [addr] = (uint8_t) data;
- }
- break;
-
- // DSP
- //case 0xF2: // mapped to RAM
- case 0xF3: {
- run_dsp( time() );
- int reg = mem.ram [0xF2];
- if ( next_dsp > 0 ) {
- // skip mode
-
- // key press
- if ( reg == 0x4C )
- keys_pressed |= data & ~dsp.read( 0x5C );
-
- // key release
- if ( reg == 0x5C ) {
- keys_released |= data;
- keys_pressed &= ~data;
- }
- }
- if ( reg < Spc_Dsp::register_count ) {
- dsp.write( reg, data );
- }
- else {
- debug_printf( "DSP write to $%02X\n", (int) reg );
- }
- break;
- }
-
- case 0xF0: // Test register
- debug_printf( "Wrote $%02X to $F0\n", (int) data );
- break;
-
- // Config
- case 0xF1:
- {
- // timers
- for ( int i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
- if ( !(data & (1 << i)) ) {
- t.enabled = 0;
- t.next_tick = timer_disabled_time;
- }
- else if ( !t.enabled ) {
- // just enabled
- t.enabled = 1;
- t.counter = 0;
- t.count = 0;
- t.next_tick = time();
- }
- }
-
- // port clears
- if ( data & 0x10 ) {
- mem.ram [0xF4] = 0;
- mem.ram [0xF5] = 0;
- }
- if ( data & 0x20 ) {
- mem.ram [0xF6] = 0;
- mem.ram [0xF7] = 0;
- }
-
- enable_rom( (data & 0x80) != 0 );
-
- break;
- }
-
- // Ports
- case 0xF4:
- case 0xF5:
- case 0xF6:
- case 0xF7:
- // to do: handle output ports
- break;
-
- //case 0xF8: // verified on SNES that these are read/write (RAM)
- //case 0xF9:
-
- // Timers
- case 0xFA:
- case 0xFB:
- case 0xFC: {
- Timer& t = timer [addr - 0xFA];
- if ( (t.period & 0xFF) != data ) {
- t.run_until( time() );
- t.period = data ? data : 0x100;
- }
- break;
- }
-
- // Counters (cleared on write)
- case 0xFD:
- case 0xFE:
- case 0xFF:
- debug_printf( "Wrote to counter $%02X\n", (int) addr );
- timer [addr - 0xFD].counter = 0;
- break;
- }
-}
-
-// Play
-
-blargg_err_t Snes_Spc::skip( long count )
-{
- if ( count > 4 * 32000L )
- {
- // don't run DSP for long durations (2-3 times faster)
-
- const long sync_count = 32000L * 2;
-
- // keep track of any keys pressed/released (and not subsequently released)
- keys_pressed = 0;
- keys_released = 0;
- // sentinel tells play to ignore DSP
- RETURN_ERR( play( count - sync_count, skip_sentinel ) );
-
- // press/release keys now
- dsp.write( 0x5C, keys_released & ~keys_pressed );
- dsp.write( 0x4C, keys_pressed );
-
- clear_echo();
-
- // play the last few seconds normally to help synchronize DSP
- count = sync_count;
- }
-
- return play( count );
-}
-
-blargg_err_t Snes_Spc::play( long count, sample_t* out )
-{
- require( count % 2 == 0 ); // output is always in pairs of samples
-
- // CPU time() runs from -duration to 0
- spc_time_t duration = (count / 2) * clocks_per_sample;
-
- // DSP output is made on-the-fly when the CPU reads/writes DSP registers
- sample_buf = out;
- buf_end = out + (out && out != skip_sentinel ? count : 0);
- next_dsp = (out == skip_sentinel) ? clocks_per_sample : -duration + clocks_per_sample;
-
- // Localize timer next_tick times and run them to the present to prevent a running
- // but ignored timer's next_tick from getting too far behind and overflowing.
- for ( int i = 0; i < timer_count; i++ )
- {
- Timer& t = timer [i];
- if ( t.enabled )
- {
- t.next_tick -= duration;
- t.run_until( -duration );
- }
- }
-
- // Run CPU for duration, reduced by any extra cycles from previous run
- int elapsed = cpu.run( duration - extra_cycles );
- if ( elapsed > 0 )
- {
- debug_printf( "Unhandled instruction $%02X, pc = $%04X\n",
- (int) cpu.read( cpu.r.pc ), (unsigned) cpu.r.pc );
- return "Emulation error (illegal/unsupported instruction)";
- }
- extra_cycles = -elapsed;
-
- // Catch DSP up to present.
- run_dsp( 0 );
- if ( out ) {
- assert( next_dsp == clocks_per_sample );
- assert( out == skip_sentinel || sample_buf - out == count );
- }
- buf_end = 0;
-
- return 0;
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.h b/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.h
deleted file mode 100644
index 1df51613..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Snes_Spc.h
+++ /dev/null
@@ -1,121 +0,0 @@
-// Super Nintendo (SNES) SPC-700 APU Emulator
-
-// Game_Music_Emu 0.5.5
-#ifndef SNES_SPC_H
-#define SNES_SPC_H
-
-#include "blargg_common.h"
-#include "Spc_Cpu.h"
-#include "Spc_Dsp.h"
-
-class Snes_Spc {
-public:
-
- // Load copy of SPC data into emulator. Clear echo buffer if 'clear_echo' is true.
- enum { spc_file_size = 0x10180 };
- blargg_err_t load_spc( const void* spc, long spc_size );
-
- // Generate 'count' samples and optionally write to 'buf'. Count must be even.
- // Sample output is 16-bit 32kHz, signed stereo pairs with the left channel first.
- typedef short sample_t;
- blargg_err_t play( long count, sample_t* buf = NULL );
-
-// Optional functionality
-
- // Load copy of state into emulator.
- typedef Spc_Cpu::registers_t registers_t;
- blargg_err_t load_state( const registers_t& cpu_state, const void* ram_64k,
- const void* dsp_regs_128 );
-
- // Clear echo buffer, useful because many tracks have junk in the buffer.
- void clear_echo();
-
- // Mute voice n if bit n (1 << n) of mask is set
- enum { voice_count = Spc_Dsp::voice_count };
- void mute_voices( int mask );
-
- // Skip forward by the specified number of samples (64000 samples = 1 second)
- blargg_err_t skip( long count );
-
- // Set gain, where 1.0 is normal. When greater than 1.0, output is clamped the
- // 16-bit sample range.
- void set_gain( double );
-
- // If true, prevent channels and global volumes from being phase-negated
- void disable_surround( bool disable = true );
-
- // Set 128 bytes to use for IPL boot ROM. Makes copy. Default is zero filled,
- // to avoid including copyrighted code from the SPC-700.
- void set_ipl_rom( const void* );
-
- void set_tempo( double );
-
-public:
- Snes_Spc();
- typedef BOOST::uint8_t uint8_t;
-private:
- // timers
- struct Timer
- {
- spc_time_t next_tick;
- int period;
- int count;
- int divisor;
- int enabled;
- int counter;
-
- void run_until_( spc_time_t );
- void run_until( spc_time_t time )
- {
- if ( time >= next_tick )
- run_until_( time );
- }
- };
- enum { timer_count = 3 };
- Timer timer [timer_count];
-
- // hardware
- int extra_cycles;
- spc_time_t time() const;
- int read( spc_addr_t );
- void write( spc_addr_t, int );
- friend class Spc_Cpu;
-
- // dsp
- sample_t* sample_buf;
- sample_t* buf_end; // to do: remove this once possible bug resolved
- spc_time_t next_dsp;
- Spc_Dsp dsp;
- int keys_pressed;
- int keys_released;
- sample_t skip_sentinel [1]; // special value for play() passed by skip()
- void run_dsp( spc_time_t );
- void run_dsp_( spc_time_t );
- bool echo_accessed;
- void check_for_echo_access( spc_addr_t );
-
- // boot rom
- enum { rom_size = 64 };
- enum { rom_addr = 0xFFC0 };
- bool rom_enabled;
- void enable_rom( bool );
-
- // CPU and RAM (at end because it's large)
- Spc_Cpu cpu;
- uint8_t extra_ram [rom_size];
- struct {
- // padding to catch jumps before beginning or past end
- uint8_t padding1 [0x100];
- uint8_t ram [0x10000];
- uint8_t padding2 [0x100];
- } mem;
- uint8_t boot_rom [rom_size];
-};
-
-inline void Snes_Spc::disable_surround( bool disable ) { dsp.disable_surround( disable ); }
-
-inline void Snes_Spc::mute_voices( int mask ) { dsp.mute_voices( mask ); }
-
-inline void Snes_Spc::set_gain( double v ) { dsp.set_gain( v ); }
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.cpp
deleted file mode 100644
index 8b61a455..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.cpp
+++ /dev/null
@@ -1,1062 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-#include "Spc_Cpu.h"
-
-#include "blargg_endian.h"
-#include "Snes_Spc.h"
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// Several instructions are commented out (or not even implemented). These aren't
-// used by the SPC files tested.
-
-// Optimize performance for the most common instructions, and size for the rest:
-//
-// 15% 0xF0 BEQ rel
-// 8% 0xE4 MOV A,dp
-// 4% 0xF5 MOV A,abs+X
-// 4% 0xD0 BNE rel
-// 4% 0x6F RET
-// 4% 0x3F CALL addr
-// 4% 0xF4 MOV A,dp+X
-// 3% 0xC4 MOV dp,A
-// 2% 0xEB MOV Y,dp
-// 2% 0x3D INC X
-// 2% 0xF6 MOV A,abs+Y
-// (1% and below not shown)
-
-Spc_Cpu::Spc_Cpu( Snes_Spc* e, uint8_t* ram_in ) : ram( ram_in ), emu( *e )
-{
- remain_ = 0;
- assert( INT_MAX >= 0x7FFFFFFF ); // requires 32-bit int
- blargg_verify_byte_order();
-}
-
-#define READ( addr ) (emu.read( addr ))
-#define WRITE( addr, value ) (emu.write( addr, value ))
-
-#define READ_DP( addr ) READ( (addr) + dp )
-#define WRITE_DP( addr, value ) WRITE( (addr) + dp, value )
-
-#define READ_PROG( addr ) (ram [addr])
-#define READ_PROG16( addr ) GET_LE16( &READ_PROG( addr ) )
-
-int Spc_Cpu::read( spc_addr_t addr )
-{
- return READ( addr );
-}
-
-void Spc_Cpu::write( spc_addr_t addr, int data )
-{
- WRITE( addr, data );
-}
-
-// Cycle table derived from text copy of SPC-700 manual (using regular expressions)
-static unsigned char const cycle_table [0x100] = {
-// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 2,8,4,5,3,4,3,6,2,6,5,4,5,4,6,8, // 0
- 2,8,4,5,4,5,5,6,5,5,6,5,2,2,4,6, // 1
- 2,8,4,5,3,4,3,6,2,6,5,4,5,4,5,4, // 2
- 2,8,4,5,4,5,5,6,5,5,6,5,2,2,3,8, // 3
- 2,8,4,5,3,4,3,6,2,6,4,4,5,4,6,6, // 4
- 2,8,4,5,4,5,5,6,5,5,4,5,2,2,4,3, // 5
- 2,8,4,5,3,4,3,6,2,6,4,4,5,4,5,5, // 6
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,6, // 7
- 2,8,4,5,3,4,3,6,2,6,5,4,5,2,4,5, // 8
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,12,5,// 9
- 3,8,4,5,3,4,3,6,2,6,4,4,5,2,4,4, // A
- 2,8,4,5,4,5,5,6,5,5,5,5,2,2,3,4, // B
- 3,8,4,5,4,5,4,7,2,5,6,4,5,2,4,9, // C
- 2,8,4,5,5,6,6,7,4,5,4,5,2,2,6,3, // D
- 2,8,4,5,3,4,3,6,2,4,5,3,4,3,4,3, // E
- 2,8,4,5,4,5,5,6,3,4,5,4,2,2,4,3 // F
-};
-
-// The C,mem instructions are hardly used, so a non-inline function is used for
-// the common access code.
-unsigned Spc_Cpu::mem_bit( spc_addr_t pc )
-{
- unsigned addr = READ_PROG16( pc );
- unsigned t = READ( addr & 0x1FFF ) >> (addr >> 13);
- return (t << 8) & 0x100;
-}
-
-spc_time_t Spc_Cpu::run( spc_time_t cycle_count )
-{
- remain_ = cycle_count;
-
- uint8_t* const ram = this->ram; // cache
-
- // Stack pointer is kept one greater than usual SPC stack pointer to allow
- // common pre-decrement and post-increment memory instructions that some
- // processors have. Address wrap-around isn't supported.
- #define PUSH( v ) (*--sp = uint8_t (v))
- #define PUSH16( v ) (sp -= 2, SET_LE16( sp, v ))
- #define POP() (*sp++)
- #define SET_SP( v ) (sp = ram + 0x101 + (v))
- #define GET_SP() (sp - 0x101 - ram)
-
- uint8_t* sp;
- SET_SP( r.sp );
-
- // registers
- unsigned pc = (unsigned) r.pc;
- int a = r.a;
- int x = r.x;
- int y = r.y;
-
- // status flags
-
- const int st_n = 0x80;
- const int st_v = 0x40;
- const int st_p = 0x20;
- const int st_b = 0x10;
- const int st_h = 0x08;
- const int st_i = 0x04;
- const int st_z = 0x02;
- const int st_c = 0x01;
-
- #define IS_NEG (nz & 0x880)
-
- #define CALC_STATUS( out ) do {\
- out = status & ~(st_n | st_z | st_c);\
- out |= (c >> 8) & st_c;\
- out |= (dp >> 3) & st_p;\
- if ( IS_NEG ) out |= st_n;\
- if ( !(nz & 0xFF) ) out |= st_z;\
- } while ( 0 )
-
- #define SET_STATUS( in ) do {\
- status = in & ~(st_n | st_z | st_c | st_p);\
- c = in << 8;\
- nz = (in << 4) & 0x800;\
- nz |= ~in & st_z;\
- dp = (in << 3) & 0x100;\
- } while ( 0 )
-
- int status;
- int c; // store C as 'c' & 0x100.
- int nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x880) != 0
- unsigned dp; // direct page base
- {
- int temp = r.status;
- SET_STATUS( temp );
- }
-
- goto loop;
-
- unsigned data; // first operand of instruction and temporary across function calls
-
- // Common endings for instructions
-cbranch_taken_loop: // compare and branch
- pc += (BOOST::int8_t) READ_PROG( pc );
- remain_ -= 2;
-inc_pc_loop: // end of instruction with an operand
- pc++;
-loop:
-
- check( (unsigned) pc < 0x10000 );
- check( (unsigned) GET_SP() < 0x100 );
-
- check( (unsigned) a < 0x100 );
- check( (unsigned) x < 0x100 );
- check( (unsigned) y < 0x100 );
-
- unsigned opcode = READ_PROG( pc );
- pc++;
- // to do: if pc is at end of memory, this will get wrong byte
- data = READ_PROG( pc );
-
- if ( remain_ <= 0 )
- goto stop;
-
- remain_ -= cycle_table [opcode];
-
- // Use 'data' for temporaries whose lifetime crosses read/write calls, otherwise
- // use a local temporary.
- switch ( opcode )
- {
-
- #define BRANCH( cond ) {\
- pc++;\
- int offset = (BOOST::int8_t) data;\
- if ( cond ) {\
- pc += offset;\
- remain_ -= 2;\
- }\
- goto loop;\
- }
-
-// Most-Common
-
- case 0xF0: // BEQ (most common)
- BRANCH( !(uint8_t) nz )
-
- case 0xD0: // BNE
- BRANCH( (uint8_t) nz )
-
- case 0x3F: // CALL
- PUSH16( pc + 2 );
- pc = READ_PROG16( pc );
- goto loop;
-
- case 0x6F: // RET
- pc = POP();
- pc += POP() * 0x100;
- goto loop;
-
-#define CASE( n ) case n:
-
-// Define common address modes based on opcode for immediate mode. Execution
-// ends with data set to the address of the operand.
-#define ADDR_MODES( op )\
- CASE( op - 0x02 ) /* (X) */\
- data = x + dp;\
- pc--;\
- goto end_##op;\
- CASE( op + 0x0F ) /* (dp)+Y */\
- data = READ_PROG16( data + dp ) + y;\
- goto end_##op;\
- CASE( op - 0x01 ) /* (dp+X) */\
- data = READ_PROG16( uint8_t (data + x) + dp );\
- goto end_##op;\
- CASE( op + 0x0E ) /* abs+Y */\
- data += y;\
- goto abs_##op;\
- CASE( op + 0x0D ) /* abs+X */\
- data += x;\
- CASE( op - 0x03 ) /* abs */\
- abs_##op:\
- pc++;\
- data += 0x100 * READ_PROG( pc );\
- goto end_##op;\
- CASE( op + 0x0C ) /* dp+X */\
- data = uint8_t (data + x);\
- CASE( op - 0x04 ) /* dp */\
- data += dp;\
- end_##op:
-
-// 1. 8-bit Data Transmission Commands. Group I
-
- ADDR_MODES( 0xE8 ) // MOV A,addr
- // case 0xE4: // MOV a,dp (most common)
- mov_a_addr:
- a = nz = READ( data );
- goto inc_pc_loop;
- case 0xBF: // MOV A,(X)+
- data = x + dp;
- x = uint8_t (x + 1);
- pc--;
- goto mov_a_addr;
-
- case 0xE8: // MOV A,imm
- a = data;
- nz = data;
- goto inc_pc_loop;
-
- case 0xF9: // MOV X,dp+Y
- data = uint8_t (data + y);
- case 0xF8: // MOV X,dp
- data += dp;
- goto mov_x_addr;
- case 0xE9: // MOV X,abs
- data = READ_PROG16( pc );
- pc++;
- mov_x_addr:
- data = READ( data );
- case 0xCD: // MOV X,imm
- x = data;
- nz = data;
- goto inc_pc_loop;
-
- case 0xFB: // MOV Y,dp+X
- data = uint8_t (data + x);
- case 0xEB: // MOV Y,dp
- data += dp;
- goto mov_y_addr;
- case 0xEC: // MOV Y,abs
- data = READ_PROG16( pc );
- pc++;
- mov_y_addr:
- data = READ( data );
- case 0x8D: // MOV Y,imm
- y = data;
- nz = data;
- goto inc_pc_loop;
-
-// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2
-
- ADDR_MODES( 0xC8 ) // MOV addr,A
- WRITE( data, a );
- goto inc_pc_loop;
-
- {
- int temp;
- case 0xCC: // MOV abs,Y
- temp = y;
- goto mov_abs_temp;
- case 0xC9: // MOV abs,X
- temp = x;
- mov_abs_temp:
- WRITE( READ_PROG16( pc ), temp );
- pc += 2;
- goto loop;
- }
-
- case 0xD9: // MOV dp+Y,X
- data = uint8_t (data + y);
- case 0xD8: // MOV dp,X
- WRITE( data + dp, x );
- goto inc_pc_loop;
-
- case 0xDB: // MOV dp+X,Y
- data = uint8_t (data + x);
- case 0xCB: // MOV dp,Y
- WRITE( data + dp, y );
- goto inc_pc_loop;
-
- case 0xFA: // MOV dp,dp
- data = READ( data + dp );
- case 0x8F: // MOV dp,#imm
- pc++;
- WRITE_DP( READ_PROG( pc ), data );
- goto inc_pc_loop;
-
-// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3.
-
- case 0x7D: // MOV A,X
- a = x;
- nz = x;
- goto loop;
-
- case 0xDD: // MOV A,Y
- a = y;
- nz = y;
- goto loop;
-
- case 0x5D: // MOV X,A
- x = a;
- nz = a;
- goto loop;
-
- case 0xFD: // MOV Y,A
- y = a;
- nz = a;
- goto loop;
-
- case 0x9D: // MOV X,SP
- x = nz = GET_SP();
- goto loop;
-
- case 0xBD: // MOV SP,X
- SET_SP( x );
- goto loop;
-
- //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2)
-
- case 0xAF: // MOV (X)+,A
- WRITE_DP( x, a );
- x++;
- goto loop;
-
-// 5. 8-BIT LOGIC OPERATION COMMANDS
-
-#define LOGICAL_OP( op, func )\
- ADDR_MODES( op ) /* addr */\
- data = READ( data );\
- case op: /* imm */\
- nz = a func##= data;\
- goto inc_pc_loop;\
- { unsigned addr;\
- case op + 0x11: /* X,Y */\
- data = READ_DP( y );\
- addr = x + dp;\
- pc--;\
- goto addr_##op;\
- case op + 0x01: /* dp,dp */\
- data = READ_DP( data );\
- case op + 0x10: /*dp,imm*/\
- pc++;\
- addr = READ_PROG( pc ) + dp;\
- addr_##op:\
- nz = data func READ( addr );\
- WRITE( addr, nz );\
- goto inc_pc_loop;\
- }
-
- LOGICAL_OP( 0x28, & ); // AND
-
- LOGICAL_OP( 0x08, | ); // OR
-
- LOGICAL_OP( 0x48, ^ ); // EOR
-
-// 4. 8-BIT ARITHMETIC OPERATION COMMANDS
-
- ADDR_MODES( 0x68 ) // CMP addr
- data = READ( data );
- case 0x68: // CMP imm
- nz = a - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x79: // CMP (X),(Y)
- data = READ_DP( x );
- nz = data - READ_DP( y );
- c = ~nz;
- nz &= 0xFF;
- goto loop;
-
- case 0x69: // CMP (dp),(dp)
- data = READ_DP( data );
- case 0x78: // CMP dp,imm
- pc++;
- nz = READ_DP( READ_PROG( pc ) ) - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x3E: // CMP X,dp
- data += dp;
- goto cmp_x_addr;
- case 0x1E: // CMP X,abs
- data = READ_PROG16( pc );
- pc++;
- cmp_x_addr:
- data = READ( data );
- case 0xC8: // CMP X,imm
- nz = x - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- case 0x7E: // CMP Y,dp
- data += dp;
- goto cmp_y_addr;
- case 0x5E: // CMP Y,abs
- data = READ_PROG16( pc );
- pc++;
- cmp_y_addr:
- data = READ( data );
- case 0xAD: // CMP Y,imm
- nz = y - data;
- c = ~nz;
- nz &= 0xFF;
- goto inc_pc_loop;
-
- {
- int addr;
- case 0xB9: // SBC (x),(y)
- case 0x99: // ADC (x),(y)
- pc--; // compensate for inc later
- data = READ_DP( x );
- addr = y + dp;
- goto adc_addr;
- case 0xA9: // SBC dp,dp
- case 0x89: // ADC dp,dp
- data = READ_DP( data );
- case 0xB8: // SBC dp,imm
- case 0x98: // ADC dp,imm
- pc++;
- addr = READ_PROG( pc ) + dp;
- adc_addr:
- nz = READ( addr );
- goto adc_data;
-
-// catch ADC and SBC together, then decode later based on operand
-#undef CASE
-#define CASE( n ) case n: case (n) + 0x20:
- ADDR_MODES( 0x88 ) // ADC/SBC addr
- data = READ( data );
- case 0xA8: // SBC imm
- case 0x88: // ADC imm
- addr = -1; // A
- nz = a;
- adc_data: {
- if ( opcode & 0x20 )
- data ^= 0xFF; // SBC
- int carry = (c >> 8) & 1;
- int ov = (nz ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
- int hc = (nz & 15) + carry;
- c = nz += data + carry;
- hc = (nz & 15) - hc;
- status = (status & ~(st_v | st_h)) | ((ov >> 2) & st_v) | ((hc >> 1) & st_h);
- if ( addr < 0 ) {
- a = (uint8_t) nz;
- goto inc_pc_loop;
- }
- WRITE( addr, (uint8_t) nz );
- goto inc_pc_loop;
- }
-
- }
-
-// 6. ADDITION & SUBTRACTION COMMANDS
-
-#define INC_DEC_REG( reg, n )\
- nz = reg + n;\
- reg = (uint8_t) nz;\
- goto loop;
-
- case 0xBC: INC_DEC_REG( a, 1 ) // INC A
- case 0x3D: INC_DEC_REG( x, 1 ) // INC X
- case 0xFC: INC_DEC_REG( y, 1 ) // INC Y
-
- case 0x9C: INC_DEC_REG( a, -1 ) // DEC A
- case 0x1D: INC_DEC_REG( x, -1 ) // DEC X
- case 0xDC: INC_DEC_REG( y, -1 ) // DEC Y
-
- case 0x9B: // DEC dp+X
- case 0xBB: // INC dp+X
- data = uint8_t (data + x);
- case 0x8B: // DEC dp
- case 0xAB: // INC dp
- data += dp;
- goto inc_abs;
- case 0x8C: // DEC abs
- case 0xAC: // INC abs
- data = READ_PROG16( pc );
- pc++;
- inc_abs:
- nz = ((opcode >> 4) & 2) - 1;
- nz += READ( data );
- WRITE( data, (uint8_t) nz );
- goto inc_pc_loop;
-
-// 7. SHIFT, ROTATION COMMANDS
-
- case 0x5C: // LSR A
- c = 0;
- case 0x7C:{// ROR A
- nz = ((c >> 1) & 0x80) | (a >> 1);
- c = a << 8;
- a = nz;
- goto loop;
- }
-
- case 0x1C: // ASL A
- c = 0;
- case 0x3C:{// ROL A
- int temp = (c >> 8) & 1;
- c = a << 1;
- nz = c | temp;
- a = (uint8_t) nz;
- goto loop;
- }
-
- case 0x0B: // ASL dp
- c = 0;
- data += dp;
- goto rol_mem;
- case 0x1B: // ASL dp+X
- c = 0;
- case 0x3B: // ROL dp+X
- data = uint8_t (data + x);
- case 0x2B: // ROL dp
- data += dp;
- goto rol_mem;
- case 0x0C: // ASL abs
- c = 0;
- case 0x2C: // ROL abs
- data = READ_PROG16( pc );
- pc++;
- rol_mem:
- nz = (c >> 8) & 1;
- nz |= (c = READ( data ) << 1);
- WRITE( data, (uint8_t) nz );
- goto inc_pc_loop;
-
- case 0x4B: // LSR dp
- c = 0;
- data += dp;
- goto ror_mem;
- case 0x5B: // LSR dp+X
- c = 0;
- case 0x7B: // ROR dp+X
- data = uint8_t (data + x);
- case 0x6B: // ROR dp
- data += dp;
- goto ror_mem;
- case 0x4C: // LSR abs
- c = 0;
- case 0x6C: // ROR abs
- data = READ_PROG16( pc );
- pc++;
- ror_mem: {
- int temp = READ( data );
- nz = ((c >> 1) & 0x80) | (temp >> 1);
- c = temp << 8;
- WRITE( data, nz );
- goto inc_pc_loop;
- }
-
- case 0x9F: // XCN
- nz = a = (a >> 4) | uint8_t (a << 4);
- goto loop;
-
-// 8. 16-BIT TRANSMISION COMMANDS
-
- case 0xBA: // MOVW YA,dp
- a = READ_DP( data );
- nz = (a & 0x7F) | (a >> 1);
- y = READ_DP( uint8_t (data + 1) );
- nz |= y;
- goto inc_pc_loop;
-
- case 0xDA: // MOVW dp,YA
- WRITE_DP( data, a );
- WRITE_DP( uint8_t (data + 1), y );
- goto inc_pc_loop;
-
-// 9. 16-BIT OPERATION COMMANDS
-
- case 0x3A: // INCW dp
- case 0x1A:{// DECW dp
- data += dp;
-
- // low byte
- int temp = READ( data );
- temp += ((opcode >> 4) & 2) - 1; // +1 for INCW, -1 for DECW
- nz = ((temp >> 1) | temp) & 0x7F;
- WRITE( data, (uint8_t) temp );
-
- // high byte
- data = uint8_t (data + 1) + dp;
- temp >>= 8;
- temp = uint8_t (temp + READ( data ));
- nz |= temp;
- WRITE( data, temp );
-
- goto inc_pc_loop;
- }
-
- case 0x9A: // SUBW YA,dp
- case 0x7A: // ADDW YA,dp
- {
- // read 16-bit addend
- int temp = READ_DP( data );
- int sign = READ_DP( uint8_t (data + 1) );
- temp += 0x100 * sign;
- status &= ~(st_v | st_h);
-
- // to do: fix half-carry for SUBW (it's probably wrong)
-
- // for SUBW, negate and truncate to 16 bits
- if ( opcode & 0x80 ) {
- temp = (temp ^ 0xFFFF) + 1;
- sign = temp >> 8;
- }
-
- // add low byte (A)
- temp += a;
- a = (uint8_t) temp;
- nz = (temp | (temp >> 1)) & 0x7F;
-
- // add high byte (Y)
- temp >>= 8;
- c = y + temp;
- nz = (nz | c) & 0xFF;
-
- // half-carry (temporary avoids CodeWarrior optimizer bug)
- unsigned hc = (c & 15) - (y & 15);
- status |= (hc >> 4) & st_h;
-
- // overflow if sign of YA changed when previous sign and addend sign were same
- status |= (((c ^ y) & ~(y ^ sign)) >> 1) & st_v;
-
- y = (uint8_t) c;
-
- goto inc_pc_loop;
- }
-
- case 0x5A: { // CMPW YA,dp
- int temp = a - READ_DP( data );
- nz = ((temp >> 1) | temp) & 0x7F;
- temp = y + (temp >> 8);
- temp -= READ_DP( uint8_t (data + 1) );
- nz |= temp;
- c = ~temp;
- nz &= 0xFF;
- goto inc_pc_loop;
- }
-
-// 10. MULTIPLICATION & DIVISON COMMANDS
-
- case 0xCF: { // MUL YA
- unsigned temp = y * a;
- a = (uint8_t) temp;
- nz = ((temp >> 1) | temp) & 0x7F;
- y = temp >> 8;
- nz |= y;
- goto loop;
- }
-
- case 0x9E: // DIV YA,X
- {
- // behavior based on SPC CPU tests
-
- status &= ~(st_h | st_v);
-
- if ( (y & 15) >= (x & 15) )
- status |= st_h;
-
- if ( y >= x )
- status |= st_v;
-
- unsigned ya = y * 0x100 + a;
- if ( y < x * 2 )
- {
- a = ya / x;
- y = ya - a * x;
- }
- else
- {
- a = 255 - (ya - x * 0x200) / (256 - x);
- y = x + (ya - x * 0x200) % (256 - x);
- }
-
- nz = (uint8_t) a;
- a = (uint8_t) a;
-
- goto loop;
- }
-
-// 11. DECIMAL COMPENSATION COMMANDS
-
- // seem unused
- // case 0xDF: // DAA
- // case 0xBE: // DAS
-
-// 12. BRANCHING COMMANDS
-
- case 0x2F: // BRA rel
- pc += (BOOST::int8_t) data;
- goto inc_pc_loop;
-
- case 0x30: // BMI
- BRANCH( IS_NEG )
-
- case 0x10: // BPL
- BRANCH( !IS_NEG )
-
- case 0xB0: // BCS
- BRANCH( c & 0x100 )
-
- case 0x90: // BCC
- BRANCH( !(c & 0x100) )
-
- case 0x70: // BVS
- BRANCH( status & st_v )
-
- case 0x50: // BVC
- BRANCH( !(status & st_v) )
-
- case 0x03: // BBS dp.bit,rel
- case 0x23:
- case 0x43:
- case 0x63:
- case 0x83:
- case 0xA3:
- case 0xC3:
- case 0xE3:
- pc++;
- if ( (READ_DP( data ) >> (opcode >> 5)) & 1 )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0x13: // BBC dp.bit,rel
- case 0x33:
- case 0x53:
- case 0x73:
- case 0x93:
- case 0xB3:
- case 0xD3:
- case 0xF3:
- pc++;
- if ( !((READ_DP( data ) >> (opcode >> 5)) & 1) )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0xDE: // CBNE dp+X,rel
- data = uint8_t (data + x);
- // fall through
- case 0x2E: // CBNE dp,rel
- pc++;
- if ( READ_DP( data ) != a )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
-
- case 0xFE: // DBNZ Y,rel
- y = uint8_t (y - 1);
- BRANCH( y )
-
- case 0x6E: { // DBNZ dp,rel
- pc++;
- unsigned temp = READ_DP( data ) - 1;
- WRITE_DP( (uint8_t) data, (uint8_t) temp );
- if ( temp )
- goto cbranch_taken_loop;
- goto inc_pc_loop;
- }
-
- case 0x1F: // JMP (abs+X)
- pc = READ_PROG16( pc ) + x;
- // fall through
- case 0x5F: // JMP abs
- pc = READ_PROG16( pc );
- goto loop;
-
-// 13. SUB-ROUTINE CALL RETURN COMMANDS
-
- case 0x0F:{// BRK
- check( false ); // untested
- PUSH16( pc + 1 );
- pc = READ_PROG16( 0xFFDE ); // vector address verified
- int temp;
- CALC_STATUS( temp );
- PUSH( temp );
- status = (status | st_b) & ~st_i;
- goto loop;
- }
-
- case 0x4F: // PCALL offset
- pc++;
- PUSH16( pc );
- pc = 0xFF00 + data;
- goto loop;
-
- case 0x01: // TCALL n
- case 0x11:
- case 0x21:
- case 0x31:
- case 0x41:
- case 0x51:
- case 0x61:
- case 0x71:
- case 0x81:
- case 0x91:
- case 0xA1:
- case 0xB1:
- case 0xC1:
- case 0xD1:
- case 0xE1:
- case 0xF1:
- PUSH16( pc );
- pc = READ_PROG16( 0xFFDE - (opcode >> 3) );
- goto loop;
-
-// 14. STACK OPERATION COMMANDS
-
- {
- int temp;
- case 0x7F: // RET1
- temp = POP();
- pc = POP();
- pc |= POP() << 8;
- goto set_status;
- case 0x8E: // POP PSW
- temp = POP();
- set_status:
- SET_STATUS( temp );
- goto loop;
- }
-
- case 0x0D: { // PUSH PSW
- int temp;
- CALC_STATUS( temp );
- PUSH( temp );
- goto loop;
- }
-
- case 0x2D: // PUSH A
- PUSH( a );
- goto loop;
-
- case 0x4D: // PUSH X
- PUSH( x );
- goto loop;
-
- case 0x6D: // PUSH Y
- PUSH( y );
- goto loop;
-
- case 0xAE: // POP A
- a = POP();
- goto loop;
-
- case 0xCE: // POP X
- x = POP();
- goto loop;
-
- case 0xEE: // POP Y
- y = POP();
- goto loop;
-
-// 15. BIT OPERATION COMMANDS
-
- case 0x02: // SET1
- case 0x22:
- case 0x42:
- case 0x62:
- case 0x82:
- case 0xA2:
- case 0xC2:
- case 0xE2:
- case 0x12: // CLR1
- case 0x32:
- case 0x52:
- case 0x72:
- case 0x92:
- case 0xB2:
- case 0xD2:
- case 0xF2: {
- data += dp;
- int bit = 1 << (opcode >> 5);
- int mask = ~bit;
- if ( opcode & 0x10 )
- bit = 0;
- WRITE( data, (READ( data ) & mask) | bit );
- goto inc_pc_loop;
- }
-
- case 0x0E: // TSET1 abs
- case 0x4E:{// TCLR1 abs
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data );
- nz = temp & a;
- temp &= ~a;
- if ( !(opcode & 0x40) )
- temp |= a;
- WRITE( data, temp );
- goto loop;
- }
-
- case 0x4A: // AND1 C,mem.bit
- c &= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x6A: // AND1 C,/mem.bit
- check( false ); // untested
- c &= ~mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x0A: // OR1 C,mem.bit
- check( false ); // untested
- c |= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x2A: // OR1 C,/mem.bit
- check( false ); // untested
- c |= ~mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0x8A: // EOR1 C,mem.bit
- c ^= mem_bit( pc );
- pc += 2;
- goto loop;
-
- case 0xEA: { // NOT1 mem.bit
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data & 0x1FFF );
- temp ^= 1 << (data >> 13);
- WRITE( data & 0x1FFF, temp );
- goto loop;
- }
-
- case 0xCA: { // MOV1 mem.bit,C
- data = READ_PROG16( pc );
- pc += 2;
- unsigned temp = READ( data & 0x1FFF );
- unsigned bit = data >> 13;
- temp = (temp & ~(1 << bit)) | (((c >> 8) & 1) << bit);
- WRITE( data & 0x1FFF, temp );
- goto loop;
- }
-
- case 0xAA: // MOV1 C,mem.bit
- c = mem_bit( pc );
- pc += 2;
- goto loop;
-
-// 16. PROGRAM STATUS FLAG OPERATION COMMANDS
-
- case 0x60: // CLRC
- c = 0;
- goto loop;
-
- case 0x80: // SETC
- c = ~0;
- goto loop;
-
- case 0xED: // NOTC
- c ^= 0x100;
- goto loop;
-
- case 0xE0: // CLRV
- status &= ~(st_v | st_h);
- goto loop;
-
- case 0x20: // CLRP
- dp = 0;
- goto loop;
-
- case 0x40: // SETP
- dp = 0x100;
- goto loop;
-
- case 0xA0: // EI
- check( false ); // untested
- status |= st_i;
- goto loop;
-
- case 0xC0: // DI
- check( false ); // untested
- status &= ~st_i;
- goto loop;
-
-// 17. OTHER COMMANDS
-
- case 0x00: // NOP
- goto loop;
-
- //case 0xEF: // SLEEP
- //case 0xFF: // STOP
-
- } // switch
-
- // unhandled instructions fall out of switch so emulator can catch them
-
-stop:
- pc--;
-
- {
- int temp;
- CALC_STATUS( temp );
- r.status = (uint8_t) temp;
- }
-
- r.pc = pc;
- r.sp = (uint8_t) GET_SP();
- r.a = (uint8_t) a;
- r.x = (uint8_t) x;
- r.y = (uint8_t) y;
-
- return remain_;
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.h b/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.h
deleted file mode 100644
index 40f55aea..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Cpu.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Super Nintendo (SNES) SPC-700 CPU emulator
-
-// Game_Music_Emu 0.5.5
-#ifndef SPC_CPU_H
-#define SPC_CPU_H
-
-#include "blargg_common.h"
-
-typedef unsigned spc_addr_t;
-typedef blargg_long spc_time_t;
-
-class Snes_Spc;
-
-class Spc_Cpu {
- typedef BOOST::uint8_t uint8_t;
- uint8_t* const ram;
-public:
- // Keeps pointer to 64K RAM
- Spc_Cpu( Snes_Spc* spc, uint8_t* ram );
-
- // SPC-700 registers. *Not* kept updated during a call to run().
- struct registers_t {
- long pc; // more than 16 bits to allow overflow detection
- uint8_t a;
- uint8_t x;
- uint8_t y;
- uint8_t status;
- uint8_t sp;
- } r;
-
- // Run CPU for at least 'count' cycles. Return the number of cycles remaining
- // when emulation stopped (negative if extra cycles were emulated). Emulation
- // stops when there are no more remaining cycles or an unhandled instruction
- // is encountered (STOP, SLEEP, and any others not yet implemented). In the
- // latter case, the return value is greater than zero.
- spc_time_t run( spc_time_t count );
-
- // Number of clock cycles remaining for current run() call
- spc_time_t remain() const;
-
- // Access memory as the emulated CPU does
- int read ( spc_addr_t );
- void write( spc_addr_t, int );
-
-private:
- // noncopyable
- Spc_Cpu( const Spc_Cpu& );
- Spc_Cpu& operator = ( const Spc_Cpu& );
- unsigned mem_bit( spc_addr_t );
-
- spc_time_t remain_;
- Snes_Spc& emu;
-};
-
-inline spc_time_t Spc_Cpu::remain() const { return remain_; }
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.cpp b/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.cpp
deleted file mode 100644
index 814ff2bd..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.cpp
+++ /dev/null
@@ -1,666 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-// Based on Brad Martin's OpenSPC DSP emulator
-
-#include "Spc_Dsp.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2002 Brad Martin */
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-#ifdef BLARGG_ENABLE_OPTIMIZER
- #include BLARGG_ENABLE_OPTIMIZER
-#endif
-
-Spc_Dsp::Spc_Dsp( uint8_t* ram_ ) : ram( ram_ )
-{
- set_gain( 1.0 );
- mute_voices( 0 );
- disable_surround( false );
-
- assert( offsetof (globals_t,unused9 [2]) == register_count );
- assert( sizeof (voice) == register_count );
- blargg_verify_byte_order();
-}
-
-void Spc_Dsp::mute_voices( int mask )
-{
- for ( int i = 0; i < voice_count; i++ )
- voice_state [i].enabled = (mask >> i & 1) ? 31 : 7;
-}
-
-void Spc_Dsp::reset()
-{
- keys = 0;
- echo_ptr = 0;
- noise_count = 0;
- noise = 1;
- fir_offset = 0;
-
- g.flags = 0xE0; // reset, mute, echo off
- g.key_ons = 0;
-
- for ( int i = 0; i < voice_count; i++ )
- {
- voice_t& v = voice_state [i];
- v.on_cnt = 0;
- v.volume [0] = 0;
- v.volume [1] = 0;
- v.envstate = state_release;
- }
-
- memset( fir_buf, 0, sizeof fir_buf );
-}
-
-void Spc_Dsp::write( int i, int data )
-{
- require( (unsigned) i < register_count );
-
- reg [i] = data;
- int high = i >> 4;
- switch ( i & 0x0F )
- {
- // voice volume
- case 0:
- case 1: {
- short* volume = voice_state [high].volume;
- int left = (int8_t) reg [i & ~1];
- int right = (int8_t) reg [i | 1];
- volume [0] = left;
- volume [1] = right;
- // kill surround only if enabled and signs of volumes differ
- if ( left * right < surround_threshold )
- {
- if ( left < 0 )
- volume [0] = -left;
- else
- volume [1] = -right;
- }
- break;
- }
-
- // fir coefficients
- case 0x0F:
- fir_coeff [high] = (int8_t) data; // sign-extend
- break;
- }
-}
-
-// This table is for envelope timing. It represents the number of counts
-// that should be subtracted from the counter each sample period (32kHz).
-// The counter starts at 30720 (0x7800). Each count divides exactly into
-// 0x7800 without remainder.
-const int env_rate_init = 0x7800;
-static short const env_rates [0x20] =
-{
- 0x0000, 0x000F, 0x0014, 0x0018, 0x001E, 0x0028, 0x0030, 0x003C,
- 0x0050, 0x0060, 0x0078, 0x00A0, 0x00C0, 0x00F0, 0x0140, 0x0180,
- 0x01E0, 0x0280, 0x0300, 0x03C0, 0x0500, 0x0600, 0x0780, 0x0A00,
- 0x0C00, 0x0F00, 0x1400, 0x1800, 0x1E00, 0x2800, 0x3C00, 0x7800
-};
-
-const int env_range = 0x800;
-
-inline int Spc_Dsp::clock_envelope( int v )
-{ /* Return value is current
- * ENVX */
- raw_voice_t& raw_voice = this->voice [v];
- voice_t& voice = voice_state [v];
-
- int envx = voice.envx;
- if ( voice.envstate == state_release )
- {
- /*
- * Docs: "When in the state of "key off". the "click" sound is
- * prevented by the addition of the fixed value 1/256" WTF???
- * Alright, I'm going to choose to interpret that this way:
- * When a note is keyed off, start the RELEASE state, which
- * subtracts 1/256th each sample period (32kHz). Note there's
- * no need for a count because it always happens every update.
- */
- envx -= env_range / 256;
- if ( envx <= 0 )
- {
- envx = 0;
- keys &= ~(1 << v);
- return -1;
- }
- voice.envx = envx;
- raw_voice.envx = envx >> 8;
- return envx;
- }
-
- int cnt = voice.envcnt;
- int adsr1 = raw_voice.adsr [0];
- if ( adsr1 & 0x80 )
- {
- switch ( voice.envstate )
- {
- case state_attack: {
- // increase envelope by 1/64 each step
- int t = adsr1 & 15;
- if ( t == 15 )
- {
- envx += env_range / 2;
- }
- else
- {
- cnt -= env_rates [t * 2 + 1];
- if ( cnt > 0 )
- break;
- envx += env_range / 64;
- cnt = env_rate_init;
- }
- if ( envx >= env_range )
- {
- envx = env_range - 1;
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- }
-
- case state_decay: {
- // Docs: "DR... [is multiplied] by the fixed value
- // 1-1/256." Well, at least that makes some sense.
- // Multiplying ENVX by 255/256 every time DECAY is
- // updated.
- cnt -= env_rates [((adsr1 >> 3) & 0xE) + 0x10];
- if ( cnt <= 0 )
- {
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- voice.envx = envx;
- }
- int sustain_level = raw_voice.adsr [1] >> 5;
-
- if ( envx <= (sustain_level + 1) * 0x100 )
- voice.envstate = state_sustain;
- break;
- }
-
- case state_sustain:
- // Docs: "SR [is multiplied] by the fixed value 1-1/256."
- // Multiplying ENVX by 255/256 every time SUSTAIN is
- // updated.
- cnt -= env_rates [raw_voice.adsr [1] & 0x1F];
- if ( cnt <= 0 )
- {
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- voice.envx = envx;
- }
- break;
-
- case state_release:
- // handled above
- break;
- }
- }
- else
- { /* GAIN mode is set */
- /*
- * Note: if the game switches between ADSR and GAIN modes
- * partway through, should the count be reset, or should it
- * continue from where it was? Does the DSP actually watch for
- * that bit to change, or does it just go along with whatever
- * it sees when it performs the update? I'm going to assume
- * the latter and not update the count, unless I see a game
- * that obviously wants the other behavior. The effect would
- * be pretty subtle, in any case.
- */
- int t = raw_voice.gain;
- if (t < 0x80)
- {
- envx = voice.envx = t << 4;
- }
- else switch (t >> 5)
- {
- case 4: /* Docs: "Decrease (linear): Subtraction
- * of the fixed value 1/64." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx -= env_range / 64;
- if ( envx < 0 )
- {
- envx = 0;
- if ( voice.envstate == state_attack )
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- case 5: /* Docs: "Drecrease <sic> (exponential):
- * Multiplication by the fixed value
- * 1-1/256." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx -= ((envx - 1) >> 8) + 1;
- if ( envx < 0 )
- {
- envx = 0;
- if ( voice.envstate == state_attack )
- voice.envstate = state_decay;
- }
- voice.envx = envx;
- break;
- case 6: /* Docs: "Increase (linear): Addition of
- * the fixed value 1/64." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- envx += env_range / 64;
- if ( envx >= env_range )
- envx = env_range - 1;
- voice.envx = envx;
- break;
- case 7: /* Docs: "Increase (bent line): Addition
- * of the constant 1/64 up to .75 of the
- * constaint <sic> 1/256 from .75 to 1." */
- cnt -= env_rates [t & 0x1F];
- if (cnt > 0)
- break;
- cnt = env_rate_init;
- if ( envx < env_range * 3 / 4 )
- envx += env_range / 64;
- else
- envx += env_range / 256;
- if ( envx >= env_range )
- envx = env_range - 1;
- voice.envx = envx;
- break;
- }
- }
- voice.envcnt = cnt;
- raw_voice.envx = envx >> 4;
- return envx;
-}
-
-// Clamp n into range -32768 <= n <= 32767
-inline int clamp_16( int n )
-{
- if ( (BOOST::int16_t) n != n )
- n = BOOST::int16_t (0x7FFF - (n >> 31));
- return n;
-}
-
-void Spc_Dsp::run( long count, short* out_buf )
-{
- // to do: make clock_envelope() inline so that this becomes a leaf function?
-
- // Should we just fill the buffer with silence? Flags won't be cleared
- // during this run so it seems it should keep resetting every sample.
- if ( g.flags & 0x80 )
- reset();
-
- struct src_dir {
- char start [2];
- char loop [2];
- };
-
- const src_dir* const sd = (src_dir*) &ram [g.wave_page * 0x100];
-
- int left_volume = g.left_volume;
- int right_volume = g.right_volume;
- if ( left_volume * right_volume < surround_threshold )
- right_volume = -right_volume; // kill global surround
- left_volume *= emu_gain;
- right_volume *= emu_gain;
-
- while ( --count >= 0 )
- {
- // Here we check for keys on/off. Docs say that successive writes
- // to KON/KOF must be separated by at least 2 Ts periods or risk
- // being neglected. Therefore DSP only looks at these during an
- // update, and not at the time of the write. Only need to do this
- // once however, since the regs haven't changed over the whole
- // period we need to catch up with.
-
- g.wave_ended &= ~g.key_ons; // Keying on a voice resets that bit in ENDX.
-
- if ( g.noise_enables )
- {
- noise_count -= env_rates [g.flags & 0x1F];
- if ( noise_count <= 0 )
- {
- noise_count = env_rate_init;
-
- noise_amp = BOOST::int16_t (noise * 2);
-
- // TODO: switch to Galios style
- int feedback = (noise << 13) ^ (noise << 14);
- noise = (feedback & 0x4000) | (noise >> 1);
- }
- }
-
- // What is the expected behavior when pitch modulation is enabled on
- // voice 0? Jurassic Park 2 does this. Assume 0 for now.
- blargg_long prev_outx = 0;
-
- int echol = 0;
- int echor = 0;
- int left = 0;
- int right = 0;
- for ( int vidx = 0; vidx < voice_count; vidx++ )
- {
- const int vbit = 1 << vidx;
- raw_voice_t& raw_voice = voice [vidx];
- voice_t& voice = voice_state [vidx];
-
- if ( voice.on_cnt && !--voice.on_cnt )
- {
- // key on
- keys |= vbit;
- voice.addr = GET_LE16( sd [raw_voice.waveform].start );
- voice.block_remain = 1;
- voice.envx = 0;
- voice.block_header = 0;
- voice.fraction = 0x3FFF; // decode three samples immediately
- voice.interp0 = 0; // BRR decoder filter uses previous two samples
- voice.interp1 = 0;
-
- // NOTE: Real SNES does *not* appear to initialize the
- // envelope counter to anything in particular. The first
- // cycle always seems to come at a random time sooner than
- // expected; as yet, I have been unable to find any
- // pattern. I doubt it will matter though, so we'll go
- // ahead and do the full time for now.
- voice.envcnt = env_rate_init;
- voice.envstate = state_attack;
- }
-
- if ( g.key_ons & vbit & ~g.key_offs )
- {
- // voice doesn't come on if key off is set
- g.key_ons &= ~vbit;
- voice.on_cnt = 8;
- }
-
- if ( keys & g.key_offs & vbit )
- {
- // key off
- voice.envstate = state_release;
- voice.on_cnt = 0;
- }
-
- int envx;
- if ( !(keys & vbit) || (envx = clock_envelope( vidx )) < 0 )
- {
- raw_voice.envx = 0;
- raw_voice.outx = 0;
- prev_outx = 0;
- continue;
- }
-
- // Decode samples when fraction >= 1.0 (0x1000)
- for ( int n = voice.fraction >> 12; --n >= 0; )
- {
- if ( !--voice.block_remain )
- {
- if ( voice.block_header & 1 )
- {
- g.wave_ended |= vbit;
-
- if ( voice.block_header & 2 )
- {
- // verified (played endless looping sample and ENDX was set)
- voice.addr = GET_LE16( sd [raw_voice.waveform].loop );
- }
- else
- {
- // first block was end block; don't play anything (verified)
- goto sample_ended; // to do: find alternative to goto
- }
- }
-
- voice.block_header = ram [voice.addr++];
- voice.block_remain = 16; // nybbles
- }
-
- // if next block has end flag set, *this* block ends *early* (verified)
- if ( voice.block_remain == 9 && (ram [voice.addr + 5] & 3) == 1 &&
- (voice.block_header & 3) != 3 )
- {
- sample_ended:
- g.wave_ended |= vbit;
- keys &= ~vbit;
- raw_voice.envx = 0;
- voice.envx = 0;
- // add silence samples to interpolation buffer
- do
- {
- voice.interp3 = voice.interp2;
- voice.interp2 = voice.interp1;
- voice.interp1 = voice.interp0;
- voice.interp0 = 0;
- }
- while ( --n >= 0 );
- break;
- }
-
- int delta = ram [voice.addr];
- if ( voice.block_remain & 1 )
- {
- delta <<= 4; // use lower nybble
- voice.addr++;
- }
-
- // Use sign-extended upper nybble
- delta = int8_t (delta) >> 4;
-
- // For invalid ranges (D,E,F): if the nybble is negative,
- // the result is F000. If positive, 0000. Nothing else
- // like previous range, etc seems to have any effect. If
- // range is valid, do the shift normally. Note these are
- // both shifted right once to do the filters properly, but
- // the output will be shifted back again at the end.
- int shift = voice.block_header >> 4;
- delta = (delta << shift) >> 1;
- if ( shift > 0x0C )
- delta = (delta >> 14) & ~0x7FF;
-
- // One, two and three point IIR filters
- int smp1 = voice.interp0;
- int smp2 = voice.interp1;
- if ( voice.block_header & 8 )
- {
- delta += smp1;
- delta -= smp2 >> 1;
- if ( !(voice.block_header & 4) )
- {
- delta += (-smp1 - (smp1 >> 1)) >> 5;
- delta += smp2 >> 5;
- }
- else
- {
- delta += (-smp1 * 13) >> 7;
- delta += (smp2 + (smp2 >> 1)) >> 4;
- }
- }
- else if ( voice.block_header & 4 )
- {
- delta += smp1 >> 1;
- delta += (-smp1) >> 5;
- }
-
- voice.interp3 = voice.interp2;
- voice.interp2 = smp2;
- voice.interp1 = smp1;
- voice.interp0 = BOOST::int16_t (clamp_16( delta ) * 2); // sign-extend
- }
-
- // rate (with possible modulation)
- int rate = GET_LE16( raw_voice.rate ) & 0x3FFF;
- if ( g.pitch_mods & vbit )
- rate = (rate * (prev_outx + 32768)) >> 15;
-
- // Gaussian interpolation using most recent 4 samples
- int index = voice.fraction >> 2 & 0x3FC;
- voice.fraction = (voice.fraction & 0x0FFF) + rate;
- const BOOST::int16_t* table = (BOOST::int16_t const*) ((char const*) gauss + index);
- const BOOST::int16_t* table2 = (BOOST::int16_t const*) ((char const*) gauss + (255*4 - index));
- int s = ((table [0] * voice.interp3) >> 12) +
- ((table [1] * voice.interp2) >> 12) +
- ((table2 [1] * voice.interp1) >> 12);
- s = (BOOST::int16_t) (s * 2);
- s += (table2 [0] * voice.interp0) >> 11 & ~1;
- int output = clamp_16( s );
- if ( g.noise_enables & vbit )
- output = noise_amp;
-
- // scale output and set outx values
- output = (output * envx) >> 11 & ~1;
-
- // output and apply muting (by setting voice.enabled to 31)
- // if voice is externally disabled (not a SNES feature)
- int l = (voice.volume [0] * output) >> voice.enabled;
- int r = (voice.volume [1] * output) >> voice.enabled;
- prev_outx = output;
- raw_voice.outx = int8_t (output >> 8);
- if ( g.echo_ons & vbit )
- {
- echol += l;
- echor += r;
- }
- left += l;
- right += r;
- }
- // end of channel loop
-
- // main volume control
- left = (left * left_volume ) >> (7 + emu_gain_bits);
- right = (right * right_volume) >> (7 + emu_gain_bits);
-
- // Echo FIR filter
-
- // read feedback from echo buffer
- int echo_ptr = this->echo_ptr;
- uint8_t* echo_buf = &ram [(g.echo_page * 0x100 + echo_ptr) & 0xFFFF];
- echo_ptr += 4;
- if ( echo_ptr >= (g.echo_delay & 15) * 0x800 )
- echo_ptr = 0;
- int fb_left = (BOOST::int16_t) GET_LE16( echo_buf ); // sign-extend
- int fb_right = (BOOST::int16_t) GET_LE16( echo_buf + 2 ); // sign-extend
- this->echo_ptr = echo_ptr;
-
- // put samples in history ring buffer
- const int fir_offset = this->fir_offset;
- short (*fir_pos) [2] = &fir_buf [fir_offset];
- this->fir_offset = (fir_offset + 7) & 7; // move backwards one step
- fir_pos [0] [0] = (short) fb_left;
- fir_pos [0] [1] = (short) fb_right;
- fir_pos [8] [0] = (short) fb_left; // duplicate at +8 eliminates wrap checking below
- fir_pos [8] [1] = (short) fb_right;
-
- // FIR
- fb_left = fb_left * fir_coeff [7] +
- fir_pos [1] [0] * fir_coeff [6] +
- fir_pos [2] [0] * fir_coeff [5] +
- fir_pos [3] [0] * fir_coeff [4] +
- fir_pos [4] [0] * fir_coeff [3] +
- fir_pos [5] [0] * fir_coeff [2] +
- fir_pos [6] [0] * fir_coeff [1] +
- fir_pos [7] [0] * fir_coeff [0];
-
- fb_right = fb_right * fir_coeff [7] +
- fir_pos [1] [1] * fir_coeff [6] +
- fir_pos [2] [1] * fir_coeff [5] +
- fir_pos [3] [1] * fir_coeff [4] +
- fir_pos [4] [1] * fir_coeff [3] +
- fir_pos [5] [1] * fir_coeff [2] +
- fir_pos [6] [1] * fir_coeff [1] +
- fir_pos [7] [1] * fir_coeff [0];
-
- left += (fb_left * g.left_echo_volume ) >> 14;
- right += (fb_right * g.right_echo_volume) >> 14;
-
- // echo buffer feedback
- if ( !(g.flags & 0x20) )
- {
- echol += (fb_left * g.echo_feedback) >> 14;
- echor += (fb_right * g.echo_feedback) >> 14;
- SET_LE16( echo_buf , clamp_16( echol ) );
- SET_LE16( echo_buf + 2, clamp_16( echor ) );
- }
-
- if ( out_buf )
- {
- // write final samples
-
- left = clamp_16( left );
- right = clamp_16( right );
-
- int mute = g.flags & 0x40;
-
- out_buf [0] = (short) left;
- out_buf [1] = (short) right;
- out_buf += 2;
-
- // muting
- if ( mute )
- {
- out_buf [-2] = 0;
- out_buf [-1] = 0;
- }
- }
- }
-}
-
-// Base normal_gauss table is almost exactly (with an error of 0 or -1 for each entry):
-// int normal_gauss [512];
-// normal_gauss [i] = exp((i-511)*(i-511)*-9.975e-6)*pow(sin(0.00307096*i),1.7358)*1304.45
-
-// Interleved gauss table (to improve cache coherency).
-// gauss [i * 2 + j] = normal_gauss [(1 - j) * 256 + i]
-const BOOST::int16_t Spc_Dsp::gauss [512] =
-{
- 370,1305, 366,1305, 362,1304, 358,1304, 354,1304, 351,1304, 347,1304, 343,1303,
- 339,1303, 336,1303, 332,1302, 328,1302, 325,1301, 321,1300, 318,1300, 314,1299,
- 311,1298, 307,1297, 304,1297, 300,1296, 297,1295, 293,1294, 290,1293, 286,1292,
- 283,1291, 280,1290, 276,1288, 273,1287, 270,1286, 267,1284, 263,1283, 260,1282,
- 257,1280, 254,1279, 251,1277, 248,1275, 245,1274, 242,1272, 239,1270, 236,1269,
- 233,1267, 230,1265, 227,1263, 224,1261, 221,1259, 218,1257, 215,1255, 212,1253,
- 210,1251, 207,1248, 204,1246, 201,1244, 199,1241, 196,1239, 193,1237, 191,1234,
- 188,1232, 186,1229, 183,1227, 180,1224, 178,1221, 175,1219, 173,1216, 171,1213,
- 168,1210, 166,1207, 163,1205, 161,1202, 159,1199, 156,1196, 154,1193, 152,1190,
- 150,1186, 147,1183, 145,1180, 143,1177, 141,1174, 139,1170, 137,1167, 134,1164,
- 132,1160, 130,1157, 128,1153, 126,1150, 124,1146, 122,1143, 120,1139, 118,1136,
- 117,1132, 115,1128, 113,1125, 111,1121, 109,1117, 107,1113, 106,1109, 104,1106,
- 102,1102, 100,1098, 99,1094, 97,1090, 95,1086, 94,1082, 92,1078, 90,1074,
- 89,1070, 87,1066, 86,1061, 84,1057, 83,1053, 81,1049, 80,1045, 78,1040,
- 77,1036, 76,1032, 74,1027, 73,1023, 71,1019, 70,1014, 69,1010, 67,1005,
- 66,1001, 65, 997, 64, 992, 62, 988, 61, 983, 60, 978, 59, 974, 58, 969,
- 56, 965, 55, 960, 54, 955, 53, 951, 52, 946, 51, 941, 50, 937, 49, 932,
- 48, 927, 47, 923, 46, 918, 45, 913, 44, 908, 43, 904, 42, 899, 41, 894,
- 40, 889, 39, 884, 38, 880, 37, 875, 36, 870, 36, 865, 35, 860, 34, 855,
- 33, 851, 32, 846, 32, 841, 31, 836, 30, 831, 29, 826, 29, 821, 28, 816,
- 27, 811, 27, 806, 26, 802, 25, 797, 24, 792, 24, 787, 23, 782, 23, 777,
- 22, 772, 21, 767, 21, 762, 20, 757, 20, 752, 19, 747, 19, 742, 18, 737,
- 17, 732, 17, 728, 16, 723, 16, 718, 15, 713, 15, 708, 15, 703, 14, 698,
- 14, 693, 13, 688, 13, 683, 12, 678, 12, 674, 11, 669, 11, 664, 11, 659,
- 10, 654, 10, 649, 10, 644, 9, 640, 9, 635, 9, 630, 8, 625, 8, 620,
- 8, 615, 7, 611, 7, 606, 7, 601, 6, 596, 6, 592, 6, 587, 6, 582,
- 5, 577, 5, 573, 5, 568, 5, 563, 4, 559, 4, 554, 4, 550, 4, 545,
- 4, 540, 3, 536, 3, 531, 3, 527, 3, 522, 3, 517, 2, 513, 2, 508,
- 2, 504, 2, 499, 2, 495, 2, 491, 2, 486, 1, 482, 1, 477, 1, 473,
- 1, 469, 1, 464, 1, 460, 1, 456, 1, 451, 1, 447, 1, 443, 1, 439,
- 0, 434, 0, 430, 0, 426, 0, 422, 0, 418, 0, 414, 0, 410, 0, 405,
- 0, 401, 0, 397, 0, 393, 0, 389, 0, 385, 0, 381, 0, 378, 0, 374,
-};
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.h b/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.h
deleted file mode 100644
index 1e79870a..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Dsp.h
+++ /dev/null
@@ -1,152 +0,0 @@
-// Super Nintendo (SNES) SPC DSP emulator
-
-// Game_Music_Emu 0.5.5
-#ifndef SPC_DSP_H
-#define SPC_DSP_H
-
-#include "blargg_common.h"
-
-class Spc_Dsp {
- typedef BOOST::int8_t int8_t;
- typedef BOOST::uint8_t uint8_t;
-public:
-
- // Keeps pointer to 64K ram
- Spc_Dsp( uint8_t* ram );
-
- // Mute voice n if bit n (1 << n) of mask is clear.
- enum { voice_count = 8 };
- void mute_voices( int mask );
-
- // Clear state and silence everything.
- void reset();
-
- // Set gain, where 1.0 is normal. When greater than 1.0, output is clamped to
- // the 16-bit sample range.
- void set_gain( double );
-
- // If true, prevent channels and global volumes from being phase-negated
- void disable_surround( bool disable );
-
- // Read/write register 'n', where n ranges from 0 to register_count - 1.
- enum { register_count = 128 };
- int read ( int n );
- void write( int n, int );
-
- // Run DSP for 'count' samples. Write resulting samples to 'buf' if not NULL.
- void run( long count, short* buf = NULL );
-
-
-// End of public interface
-private:
-
- struct raw_voice_t {
- int8_t left_vol;
- int8_t right_vol;
- uint8_t rate [2];
- uint8_t waveform;
- uint8_t adsr [2]; // envelope rates for attack, decay, and sustain
- uint8_t gain; // envelope gain (if not using ADSR)
- int8_t envx; // current envelope level
- int8_t outx; // current sample
- int8_t unused [6];
- };
-
- struct globals_t {
- int8_t unused1 [12];
- int8_t left_volume; // 0C Main Volume Left (-.7)
- int8_t echo_feedback; // 0D Echo Feedback (-.7)
- int8_t unused2 [14];
- int8_t right_volume; // 1C Main Volume Right (-.7)
- int8_t unused3 [15];
- int8_t left_echo_volume; // 2C Echo Volume Left (-.7)
- uint8_t pitch_mods; // 2D Pitch Modulation on/off for each voice
- int8_t unused4 [14];
- int8_t right_echo_volume; // 3C Echo Volume Right (-.7)
- uint8_t noise_enables; // 3D Noise output on/off for each voice
- int8_t unused5 [14];
- uint8_t key_ons; // 4C Key On for each voice
- uint8_t echo_ons; // 4D Echo on/off for each voice
- int8_t unused6 [14];
- uint8_t key_offs; // 5C key off for each voice (instantiates release mode)
- uint8_t wave_page; // 5D source directory (wave table offsets)
- int8_t unused7 [14];
- uint8_t flags; // 6C flags and noise freq
- uint8_t echo_page; // 6D
- int8_t unused8 [14];
- uint8_t wave_ended; // 7C
- uint8_t echo_delay; // 7D ms >> 4
- char unused9 [2];
- };
-
- union {
- raw_voice_t voice [voice_count];
- uint8_t reg [register_count];
- globals_t g;
- };
-
- uint8_t* const ram;
-
- // Cache of echo FIR values for faster access
- short fir_coeff [voice_count];
-
- // fir_buf [i + 8] == fir_buf [i], to avoid wrap checking in FIR code
- short fir_buf [16] [2];
- int fir_offset; // (0 to 7)
-
- enum { emu_gain_bits = 8 };
- int emu_gain;
-
- int keyed_on; // 8-bits for 8 voices
- int keys;
-
- int echo_ptr;
- int noise_amp;
- int noise;
- int noise_count;
-
- int surround_threshold;
-
- static BOOST::int16_t const gauss [];
-
- enum state_t {
- state_attack,
- state_decay,
- state_sustain,
- state_release
- };
-
- struct voice_t {
- short volume [2];
- short fraction;// 12-bit fractional position
- short interp3; // most recent four decoded samples
- short interp2;
- short interp1;
- short interp0;
- short block_remain; // number of nybbles remaining in current block
- unsigned short addr;
- short block_header; // header byte from current block
- short envcnt;
- short envx;
- short on_cnt;
- short enabled; // 7 if enabled, 31 if disabled
- short envstate;
- short unused; // pad to power of 2
- };
-
- voice_t voice_state [voice_count];
-
- int clock_envelope( int );
-};
-
-inline void Spc_Dsp::disable_surround( bool disable ) { surround_threshold = disable ? 0 : -0x7FFF; }
-
-inline void Spc_Dsp::set_gain( double v ) { emu_gain = (int) (v * (1 << emu_gain_bits)); }
-
-inline int Spc_Dsp::read( int i )
-{
- assert( (unsigned) i < register_count );
- return reg [i];
-}
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/blargg_common.h b/plugins/gme/game-music-emu-0.5.5/gme/blargg_common.h
deleted file mode 100644
index e48d6469..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/blargg_common.h
+++ /dev/null
@@ -1,175 +0,0 @@
-// Sets up common environment for Shay Green's libraries.
-// To change configuration options, modify blargg_config.h, not this file.
-
-#ifndef BLARGG_COMMON_H
-#define BLARGG_COMMON_H
-
-#include <stddef.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <limits.h>
-
-#undef BLARGG_COMMON_H
-// allow blargg_config.h to #include blargg_common.h
-#include "blargg_config.h"
-#ifndef BLARGG_COMMON_H
-#define BLARGG_COMMON_H
-
-// STATIC_CAST(T,expr): Used in place of static_cast<T> (expr)
-#ifndef STATIC_CAST
- #define STATIC_CAST(T,expr) ((T) (expr))
-#endif
-
-// blargg_err_t (0 on success, otherwise error string)
-#ifndef blargg_err_t
- typedef const char* blargg_err_t;
-#endif
-
-// blargg_vector - very lightweight vector of POD types (no constructor/destructor)
-template<class T>
-class blargg_vector {
- T* begin_;
- size_t size_;
-public:
- blargg_vector() : begin_( 0 ), size_( 0 ) { }
- ~blargg_vector() { free( begin_ ); }
- size_t size() const { return size_; }
- T* begin() const { return begin_; }
- T* end() const { return begin_ + size_; }
- blargg_err_t resize( size_t n )
- {
- void* p = realloc( begin_, n * sizeof (T) );
- if ( !p && n )
- return "Out of memory";
- begin_ = (T*) p;
- size_ = n;
- return 0;
- }
- void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); }
- T& operator [] ( size_t n ) const
- {
- assert( n <= size_ ); // <= to allow past-the-end value
- return begin_ [n];
- }
-};
-
-#ifndef BLARGG_DISABLE_NOTHROW
- #if __cplusplus < 199711
- #define BLARGG_THROWS( spec )
- #else
- #define BLARGG_THROWS( spec ) throw spec
- #endif
- #define BLARGG_DISABLE_NOTHROW \
- void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\
- void operator delete ( void* p ) { free( p ); }
- #define BLARGG_NEW new
-#else
- #include <new>
- #define BLARGG_NEW new (std::nothrow)
-#endif
-
-#define BLARGG_4CHAR( a, b, c, d ) \
- ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF))
-
-// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0.
-#ifndef BOOST_STATIC_ASSERT
- #ifdef _MSC_VER
- // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified
- #define BOOST_STATIC_ASSERT( expr ) \
- void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] )
- #else
- // Some other compilers fail when declaring same function multiple times in class,
- // so differentiate them by line
- #define BOOST_STATIC_ASSERT( expr ) \
- void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] )
- #endif
-#endif
-
-// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1,
-// compiler is assumed to support bool. If undefined, availability is determined.
-#ifndef BLARGG_COMPILER_HAS_BOOL
- #if defined (__MWERKS__)
- #if !__option(bool)
- #define BLARGG_COMPILER_HAS_BOOL 0
- #endif
- #elif defined (_MSC_VER)
- #if _MSC_VER < 1100
- #define BLARGG_COMPILER_HAS_BOOL 0
- #endif
- #elif defined (__GNUC__)
- // supports bool
- #elif __cplusplus < 199711
- #define BLARGG_COMPILER_HAS_BOOL 0
- #endif
-#endif
-#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL
- // If you get errors here, modify your blargg_config.h file
- typedef int bool;
- const bool true = 1;
- const bool false = 0;
-#endif
-
-// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough
-#include <limits.h>
-
-#if INT_MAX >= 0x7FFFFFFF
- typedef int blargg_long;
-#else
- typedef long blargg_long;
-#endif
-
-#if UINT_MAX >= 0xFFFFFFFF
- typedef unsigned blargg_ulong;
-#else
- typedef unsigned long blargg_ulong;
-#endif
-
-// BOOST::int8_t etc.
-
-// HAVE_STDINT_H: If defined, use <stdint.h> for int8_t etc.
-#if defined (HAVE_STDINT_H)
- #include <stdint.h>
- #define BOOST
-
-// HAVE_INTTYPES_H: If defined, use <stdint.h> for int8_t etc.
-#elif defined (HAVE_INTTYPES_H)
- #include <inttypes.h>
- #define BOOST
-
-#else
- struct BOOST
- {
- #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F
- typedef signed char int8_t;
- typedef unsigned char uint8_t;
- #else
- // No suitable 8-bit type available
- typedef struct see_blargg_common_h int8_t;
- typedef struct see_blargg_common_h uint8_t;
- #endif
-
- #if USHRT_MAX == 0xFFFF
- typedef short int16_t;
- typedef unsigned short uint16_t;
- #else
- // No suitable 16-bit type available
- typedef struct see_blargg_common_h int16_t;
- typedef struct see_blargg_common_h uint16_t;
- #endif
-
- #if ULONG_MAX == 0xFFFFFFFF
- typedef long int32_t;
- typedef unsigned long uint32_t;
- #elif UINT_MAX == 0xFFFFFFFF
- typedef int int32_t;
- typedef unsigned int uint32_t;
- #else
- // No suitable 32-bit type available
- typedef struct see_blargg_common_h int32_t;
- typedef struct see_blargg_common_h uint32_t;
- #endif
- };
-#endif
-
-#endif
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/blargg_config.h b/plugins/gme/game-music-emu-0.5.5/gme/blargg_config.h
deleted file mode 100644
index 9bdbeb57..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/blargg_config.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Library configuration. Modify this file as necessary.
-
-#ifndef BLARGG_CONFIG_H
-#define BLARGG_CONFIG_H
-
-// Uncomment to use zlib for transparent decompression of gzipped files
-//#define HAVE_ZLIB_H
-
-// Uncomment to enable platform-specific optimizations
-#define BLARGG_NONPORTABLE 1
-
-// Uncomment to use faster, lower quality sound synthesis
-//#define BLIP_BUFFER_FAST 1
-
-// Uncomment if automatic byte-order determination doesn't work
-//#define BLARGG_BIG_ENDIAN 1
-
-// Uncomment if you get errors in the bool section of blargg_common.h
-//#define BLARGG_COMPILER_HAS_BOOL 1
-
-// Use standard config.h if present
-#ifdef HAVE_CONFIG_H
- #include "config.h"
-#endif
-
-// Add supported emulator types
-#include "gme_types.h"
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/blargg_endian.h b/plugins/gme/game-music-emu-0.5.5/gme/blargg_endian.h
deleted file mode 100644
index 4d160d2f..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/blargg_endian.h
+++ /dev/null
@@ -1,158 +0,0 @@
-// CPU Byte Order Utilities
-
-// Game_Music_Emu 0.5.5
-#ifndef BLARGG_ENDIAN
-#define BLARGG_ENDIAN
-
-#include "blargg_common.h"
-
-// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16)
-#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \
- defined (__x86_64__) || defined (__ia64__) || defined (__i386__)
- #define BLARGG_CPU_X86 1
- #define BLARGG_CPU_CISC 1
-#endif
-
-#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc)
- #define BLARGG_CPU_POWERPC 1
-#endif
-
-// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only
-// one may be #defined to 1. Only needed if something actually depends on byte order.
-#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN)
-#ifdef __GLIBC__
- // GCC handles this for us
- #include <endian.h>
- #if __BYTE_ORDER == __LITTLE_ENDIAN
- #define BLARGG_LITTLE_ENDIAN 1
- #elif __BYTE_ORDER == __BIG_ENDIAN
- #define BLARGG_BIG_ENDIAN 1
- #endif
-#else
-
-#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \
- (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234)
- #define BLARGG_LITTLE_ENDIAN 1
-#endif
-
-#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \
- defined (__mips__) || defined (__sparc__) || BLARGG_CPU_POWERPC || \
- (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321)
- #define BLARGG_BIG_ENDIAN 1
-#else
- // No endian specified; assume little-endian, since it's most common
- #define BLARGG_LITTLE_ENDIAN 1
-#endif
-#endif
-#endif
-
-#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN
- #undef BLARGG_LITTLE_ENDIAN
- #undef BLARGG_BIG_ENDIAN
-#endif
-
-inline void blargg_verify_byte_order()
-{
- #ifndef NDEBUG
- #if BLARGG_BIG_ENDIAN
- volatile int i = 1;
- assert( *(volatile char*) &i == 0 );
- #elif BLARGG_LITTLE_ENDIAN
- volatile int i = 1;
- assert( *(volatile char*) &i != 0 );
- #endif
- #endif
-}
-
-inline unsigned get_le16( void const* p ) {
- return ((unsigned char const*) p) [1] * 0x100u +
- ((unsigned char const*) p) [0];
-}
-inline unsigned get_be16( void const* p ) {
- return ((unsigned char const*) p) [0] * 0x100u +
- ((unsigned char const*) p) [1];
-}
-inline blargg_ulong get_le32( void const* p ) {
- return ((unsigned char const*) p) [3] * 0x01000000u +
- ((unsigned char const*) p) [2] * 0x00010000u +
- ((unsigned char const*) p) [1] * 0x00000100u +
- ((unsigned char const*) p) [0];
-}
-inline blargg_ulong get_be32( void const* p ) {
- return ((unsigned char const*) p) [0] * 0x01000000u +
- ((unsigned char const*) p) [1] * 0x00010000u +
- ((unsigned char const*) p) [2] * 0x00000100u +
- ((unsigned char const*) p) [3];
-}
-inline void set_le16( void* p, unsigned n ) {
- ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
- ((unsigned char*) p) [0] = (unsigned char) n;
-}
-inline void set_be16( void* p, unsigned n ) {
- ((unsigned char*) p) [0] = (unsigned char) (n >> 8);
- ((unsigned char*) p) [1] = (unsigned char) n;
-}
-inline void set_le32( void* p, blargg_ulong n ) {
- ((unsigned char*) p) [3] = (unsigned char) (n >> 24);
- ((unsigned char*) p) [2] = (unsigned char) (n >> 16);
- ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
- ((unsigned char*) p) [0] = (unsigned char) n;
-}
-inline void set_be32( void* p, blargg_ulong n ) {
- ((unsigned char*) p) [0] = (unsigned char) (n >> 24);
- ((unsigned char*) p) [1] = (unsigned char) (n >> 16);
- ((unsigned char*) p) [2] = (unsigned char) (n >> 8);
- ((unsigned char*) p) [3] = (unsigned char) n;
-}
-
-#if BLARGG_NONPORTABLE
- // Optimized implementation if byte order is known
- #if BLARGG_LITTLE_ENDIAN
- #define GET_LE16( addr ) (*(BOOST::uint16_t*) (addr))
- #define GET_LE32( addr ) (*(BOOST::uint32_t*) (addr))
- #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data))
- #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data))
- #elif BLARGG_BIG_ENDIAN
- #define GET_BE16( addr ) (*(BOOST::uint16_t*) (addr))
- #define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr))
- #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data))
- #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data))
- #endif
-
- #if BLARGG_CPU_POWERPC && defined (__MWERKS__)
- // PowerPC has special byte-reversed instructions
- // to do: assumes that PowerPC is running in big-endian mode
- // to do: implement for other compilers which don't support these macros
- #define GET_LE16( addr ) (__lhbrx( (addr), 0 ))
- #define GET_LE32( addr ) (__lwbrx( (addr), 0 ))
- #define SET_LE16( addr, data ) (__sthbrx( (data), (addr), 0 ))
- #define SET_LE32( addr, data ) (__stwbrx( (data), (addr), 0 ))
- #endif
-#endif
-
-#ifndef GET_LE16
- #define GET_LE16( addr ) get_le16( addr )
- #define GET_LE32( addr ) get_le32( addr )
- #define SET_LE16( addr, data ) set_le16( addr, data )
- #define SET_LE32( addr, data ) set_le32( addr, data )
-#endif
-
-#ifndef GET_BE16
- #define GET_BE16( addr ) get_be16( addr )
- #define GET_BE32( addr ) get_be32( addr )
- #define SET_BE16( addr, data ) set_be16( addr, data )
- #define SET_BE32( addr, data ) set_be32( addr, data )
-#endif
-
-// auto-selecting versions
-
-inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); }
-inline void set_le( BOOST::uint32_t* p, blargg_ulong n ) { SET_LE32( p, n ); }
-inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); }
-inline void set_be( BOOST::uint32_t* p, blargg_ulong n ) { SET_BE32( p, n ); }
-inline unsigned get_le( BOOST::uint16_t* p ) { return GET_LE16( p ); }
-inline blargg_ulong get_le( BOOST::uint32_t* p ) { return GET_LE32( p ); }
-inline unsigned get_be( BOOST::uint16_t* p ) { return GET_BE16( p ); }
-inline blargg_ulong get_be( BOOST::uint32_t* p ) { return GET_BE32( p ); }
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/gme_types.h b/plugins/gme/game-music-emu-0.5.5/gme/gme_types.h
deleted file mode 100644
index 915b87a0..00000000
--- a/plugins/gme/game-music-emu-0.5.5/gme/gme_types.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef GME_TYPES_H
-#define GME_TYPES_H
-
-#define USE_GME_AY 1
-#define USE_GME_GBS 1
-#define USE_GME_GYM 1
-#define USE_GME_HES 1
-#define USE_GME_KSS 1
-#define USE_GME_NSF 1
-#define USE_GME_NSFE 1
-#define USE_GME_SAP 1
-#define USE_GME_SPC 1
-#define USE_GME_VGM 1
-
-#endif /* GME_TYPES_H */
diff --git a/plugins/gme/game-music-emu-0.5.5/license.txt b/plugins/gme/game-music-emu-0.5.5/license.txt
deleted file mode 100644
index 5faba9d4..00000000
--- a/plugins/gme/game-music-emu-0.5.5/license.txt
+++ /dev/null
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library 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
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
diff --git a/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.cpp b/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.cpp
deleted file mode 100644
index 464392d5..00000000
--- a/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.cpp
+++ /dev/null
@@ -1,198 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-#include "Audio_Scope.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-/* Copyright (C) 2005-2006 by Shay Green. Permission is hereby granted, free of
-charge, to any person obtaining a copy of this software module and associated
-documentation files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-to permit persons to whom the Software is furnished to do so, subject to the
-following conditions: The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software. THE
-SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-int const step_bits = 8;
-int const step_unit = 1 << step_bits;
-int const erase_color = 1;
-int const draw_color = 2;
-
-Audio_Scope::Audio_Scope()
-{
- surface = 0;
- buf = 0;
-}
-
-Audio_Scope::~Audio_Scope()
-{
- free( buf );
-
- if ( surface )
- SDL_FreeSurface( surface );
-}
-
-const char* Audio_Scope::init( int width, int height )
-{
- assert( height <= 256 );
- assert( !buf ); // can only call init() once
-
- buf = (byte*) calloc( width * sizeof *buf, 1 );
- if ( !buf )
- return "Out of memory";
-
- low_y = 0;
- high_y = height;
- buf_size = width;
-
- for ( sample_shift = 6; sample_shift < 14; )
- if ( ((0x7FFFL * 2) >> sample_shift++) < height )
- break;
-
- v_offset = height / 2 - (0x10000 >> sample_shift);
-
- screen = SDL_SetVideoMode( width, height, 0, 0 );
- if ( !screen )
- return "Couldn't set video mode";
-
- surface = SDL_CreateRGBSurface( SDL_SWSURFACE, width, height, 8, 0, 0, 0, 0 );
- if ( !screen )
- return "Couldn't create surface";
-
- static SDL_Color palette [2] = { {0, 0, 0}, {0, 255, 0} };
- SDL_SetColors( surface, palette, 1, 2 );
-
- return 0; // success
-}
-
-const char* Audio_Scope::draw( const short* in, long count, double step )
-{
- int low = low_y;
- int high = high_y;
-
- if ( count >= buf_size )
- {
- count = buf_size;
- low_y = 0x7FFF;
- high_y = 0;
- }
-
- if ( SDL_LockSurface( surface ) < 0 )
- return "Couldn't lock surface";
- render( in, count, (long) (step * step_unit) );
- SDL_UnlockSurface( surface );
-
- if ( low > low_y )
- low = low_y;
-
- if ( high < high_y )
- high = high_y;
-
- SDL_Rect r;
- r.x = 0;
- r.w = buf_size;
- r.y = low + v_offset;
- r.h = high - low + 1;
-
- if ( SDL_BlitSurface( surface, &r, screen, &r ) < 0 )
- return "Blit to screen failed";
-
- if ( SDL_Flip( screen ) < 0 )
- return "Couldn't flip screen";
-
- return 0; // success
-}
-
-void Audio_Scope::render( short const* in, long count, long step )
-{
- byte* old_pos = buf;
- long surface_pitch = surface->pitch;
- byte* out = (byte*) surface->pixels + v_offset * surface_pitch;
- int old_erase = *old_pos;
- int old_draw = 0;
- long in_pos = 0;
-
- int low_y = this->low_y;
- int high_y = this->high_y;
- int half_step = (step + step_unit / 2) >> (step_bits + 1);
-
- while ( count-- )
- {
- // Line drawing/erasing starts at previous sample and ends one short of
- // current sample, except when previous and current are the same.
-
- // Extra read on the last iteration of line loops will always be at the
- // height of the next sample, and thus within the gworld bounds.
-
- // Erase old line
- {
- int delta = *old_pos - old_erase;
- int offset = old_erase * surface_pitch;
- old_erase += delta;
-
- int next_line = surface_pitch;
- if ( delta < 0 )
- {
- delta = -delta;
- next_line = -surface_pitch;
- }
-
- do
- {
- out [offset] = erase_color;
- offset += next_line;
- }
- while ( delta-- > 1 );
- }
-
- // Draw new line and put in old_buf
- {
-
- int in_whole = in_pos >> step_bits;
- int sample = (0x7FFF * 2 - in [in_whole] - in [in_whole + half_step]) >> sample_shift;
- if ( !in_pos )
- old_draw = sample;
- in_pos += step;
-
- int delta = sample - old_draw;
- int offset = old_draw * surface_pitch;
- old_draw += delta;
-
- int next_line = surface_pitch;
- if ( delta < 0 )
- {
- delta = -delta;
- next_line = -surface_pitch;
- }
-
- *old_pos++ = sample;
-
- // min/max updating can be interleved anywhere
-
- if ( low_y > sample )
- low_y = sample;
-
- do
- {
- out [offset] = draw_color;
- offset += next_line;
- }
- while ( delta-- > 1 );
-
- if ( high_y < sample )
- high_y = sample;
- }
-
- out++;
- }
-
- this->low_y = low_y;
- this->high_y = high_y;
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.h b/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.h
deleted file mode 100644
index 75334676..00000000
--- a/plugins/gme/game-music-emu-0.5.5/player/Audio_Scope.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Simple audio waveform scope in a window, using SDL multimedia library
-
-#ifndef AUDIO_SCOPE_H
-#define AUDIO_SCOPE_H
-
-#include "SDL.h"
-
-class Audio_Scope {
-public:
- typedef const char* error_t;
-
- // Initialize scope window of specified size. Height must be 256 or less.
- error_t init( int width, int height );
-
- // Draw at most 'count' samples from 'in', skipping 'step' samples after
- // each sample drawn. Step can be less than 1.0.
- error_t draw( const short* in, long count, double step = 1.0 );
-
- Audio_Scope();
- ~Audio_Scope();
-
-private:
- typedef unsigned char byte;
- SDL_Surface* screen;
- SDL_Surface* surface;
- byte* buf;
- int buf_size;
- int sample_shift;
- int low_y;
- int high_y;
- int v_offset;
-
- void render( short const* in, long count, long step );
-};
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/player/Music_Player.cpp b/plugins/gme/game-music-emu-0.5.5/player/Music_Player.cpp
deleted file mode 100644
index e73261fb..00000000
--- a/plugins/gme/game-music-emu-0.5.5/player/Music_Player.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
-
-#include "Music_Player.h"
-
-#include "gme/Music_Emu.h"
-
-#include <string.h>
-#include <ctype.h>
-
-/* Copyright (C) 2005-2006 by Shay Green. Permission is hereby granted, free of
-charge, to any person obtaining a copy of this software module and associated
-documentation files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-to permit persons to whom the Software is furnished to do so, subject to the
-following conditions: The above copyright notice and this permission notice
-shall be included in all copies or substantial portions of the Software. THE
-SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-#include "blargg_source.h"
-
-// Number of audio buffers per second. Adjust if you encounter audio skipping.
-const int fill_rate = 45;
-
-// Simple sound driver using SDL
-typedef void (*sound_callback_t)( void* data, short* out, int count );
-static const char* sound_init( long sample_rate, int buf_size, sound_callback_t, void* data );
-static void sound_start();
-static void sound_stop();
-static void sound_cleanup();
-
-Music_Player::Music_Player()
-{
- emu_ = 0;
- scope_buf = 0;
- paused = false;
-}
-
-blargg_err_t Music_Player::init( long rate )
-{
- sample_rate = rate;
-
- int min_size = sample_rate * 2 / fill_rate;
- int buf_size = 512;
- while ( buf_size < min_size )
- buf_size *= 2;
-
- return sound_init( sample_rate, buf_size, fill_buffer, this );
-}
-
-void Music_Player::stop()
-{
- sound_stop();
- delete emu_;
- emu_ = 0;
-}
-
-Music_Player::~Music_Player()
-{
- stop();
- sound_cleanup();
-}
-
-blargg_err_t Music_Player::load_file( const char* path )
-{
- stop();
-
- RETURN_ERR( gme_open_file( path, &emu_, sample_rate ) );
-
- char m3u_path [256 + 5];
- strncpy( m3u_path, path, 256 );
- m3u_path [256] = 0;
- char* p = strrchr( m3u_path, '.' );
- if ( !p )
- p = m3u_path + strlen( m3u_path );
- strcpy( p, ".m3u" );
- if ( emu_->load_m3u( m3u_path ) ) { } // ignore error
-
- return 0;
-}
-
-int Music_Player::track_count() const
-{
- return emu_ ? emu_->track_count() : false;
-}
-
-blargg_err_t Music_Player::start_track( int track )
-{
- if ( emu_ )
- {
- // Sound must not be running when operating on emulator
- sound_stop();
- RETURN_ERR( emu_->start_track( track ) );
-
- // Calculate track length
- if ( !emu_->track_info( &track_info_ ) )
- {
- if ( track_info_.length <= 0 )
- track_info_.length = track_info_.intro_length +
- track_info_.loop_length * 2;
- }
- if ( track_info_.length <= 0 )
- track_info_.length = (long) (2.5 * 60 * 1000);
- emu_->set_fade( track_info_.length );
-
- paused = false;
- sound_start();
- }
- return 0;
-}
-
-void Music_Player::pause( int b )
-{
- paused = b;
- if ( b )
- sound_stop();
- else
- sound_start();
-}
-
-void Music_Player::suspend()
-{
- if ( !paused )
- sound_stop();
-}
-
-void Music_Player::resume()
-{
- if ( !paused )
- sound_start();
-}
-
-bool Music_Player::track_ended() const
-{
- return emu_ ? emu_->track_ended() : false;
-}
-
-void Music_Player::set_stereo_depth( double tempo )
-{
- suspend();
- gme_set_stereo_depth( emu_, tempo );
- resume();
-}
-
-void Music_Player::set_tempo( double tempo )
-{
- suspend();
- emu_->set_tempo( tempo );
- resume();
-}
-
-void Music_Player::mute_voices( int mask )
-{
- suspend();
- emu_->mute_voices( mask );
- emu_->ignore_silence( mask != 0 );
- resume();
-}
-
-void Music_Player::fill_buffer( void* data, sample_t* out, int count )
-{
- Music_Player* self = (Music_Player*) data;
- if ( self->emu_ )
- {
- if ( self->emu_->play( count, out ) ) { } // ignore error
-
- if ( self->scope_buf )
- memcpy( self->scope_buf, out, self->scope_buf_size * sizeof *self->scope_buf );
- }
-}
-
-// Sound output driver using SDL
-
-#include "SDL.h"
-
-static sound_callback_t sound_callback;
-static void* sound_callback_data;
-
-static void sdl_callback( void* data, Uint8* out, int count )
-{
- if ( sound_callback )
- sound_callback( sound_callback_data, (short*) out, count / 2 );
-}
-
-static const char* sound_init( long sample_rate, int buf_size,
- sound_callback_t cb, void* data )
-{
- sound_callback = cb;
- sound_callback_data = data;
-
- static SDL_AudioSpec as; // making static clears all fields to 0
- as.freq = sample_rate;
- as.format = AUDIO_S16SYS;
- as.channels = 2;
- as.callback = sdl_callback;
- as.samples = buf_size;
- if ( SDL_OpenAudio( &as, 0 ) < 0 )
- {
- const char* err = SDL_GetError();
- if ( !err )
- err = "Couldn't open SDL audio";
- return err;
- }
-
- return 0;
-}
-
-static void sound_start()
-{
- SDL_PauseAudio( false );
-}
-
-static void sound_stop()
-{
- SDL_PauseAudio( true );
-
- // be sure audio thread is not active
- SDL_LockAudio();
- SDL_UnlockAudio();
-}
-
-static void sound_cleanup()
-{
- sound_stop();
- SDL_CloseAudio();
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/player/Music_Player.h b/plugins/gme/game-music-emu-0.5.5/player/Music_Player.h
deleted file mode 100644
index 82115fc6..00000000
--- a/plugins/gme/game-music-emu-0.5.5/player/Music_Player.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Simple game music file player
-
-// Game_Music_Emu 0.5.5
-#ifndef MUSIC_PLAYER_H
-#define MUSIC_PLAYER_H
-
-#include "gme/Music_Emu.h"
-
-class Music_Player {
-public:
- // Initialize player and set sample rate
- blargg_err_t init( long sample_rate = 44100 );
-
- // Load game music file. NULL on success, otherwise error string.
- blargg_err_t load_file( const char* path );
-
- // (Re)start playing track. Tracks are numbered from 0 to track_count() - 1.
- blargg_err_t start_track( int track );
-
- // Stop playing current file
- void stop();
-
-// Optional functions
-
- // Number of tracks in current file, or 0 if no file loaded.
- int track_count() const;
-
- // Info for current track
- track_info_t const& track_info() const { return track_info_; }
-
- // Pause/resume playing current track.
- void pause( int );
-
- // True if track ended
- bool track_ended() const;
-
- // Pointer to emulator
- Music_Emu* emu() const { return emu_; }
-
- // Set stereo depth, where 0.0 = none and 1.0 = maximum
- void set_stereo_depth( double );
-
- // Set tempo, where 0.5 = half speed, 1.0 = normal, 2.0 = double speed
- void set_tempo( double );
-
- // Set voice muting bitmask
- void mute_voices( int );
-
- // Set buffer to copy samples from each buffer into, or NULL to disable
- typedef short sample_t;
- void set_scope_buffer( sample_t* buf, int size ) { scope_buf = buf; scope_buf_size = size; }
-
-public:
- Music_Player();
- ~Music_Player();
-private:
- Music_Emu* emu_;
- sample_t* scope_buf;
- long sample_rate;
- int scope_buf_size;
- bool paused;
- track_info_t track_info_;
-
- void suspend();
- void resume();
- static void fill_buffer( void*, sample_t*, int );
-};
-
-#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/player/player.cpp b/plugins/gme/game-music-emu-0.5.5/player/player.cpp
deleted file mode 100644
index 59d66729..00000000
--- a/plugins/gme/game-music-emu-0.5.5/player/player.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/* How to play game music files with Music_Player (requires SDL library)
-
-Run program with path to a game music file.
-
-Left/Right Change track
-Space Pause/unpause
-E Normal/slight stereo echo/more stereo echo
--/= Adjust tempo
-1-9 Toggle channel on/off
-0 Reset tempo and turn channels back on */
-
-int const scope_width = 512;
-
-#include "Music_Player.h"
-#include "Audio_Scope.h"
-
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include "SDL.h"
-
-void handle_error( const char* );
-
-static bool paused;
-static Audio_Scope* scope;
-static Music_Player* player;
-static short scope_buf [scope_width * 2];
-
-static void init()
-{
- // Start SDL
- if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 )
- exit( EXIT_FAILURE );
- atexit( SDL_Quit );
- SDL_EnableKeyRepeat( 500, 80 );
-
- // Init scope
- scope = new Audio_Scope;
- if ( !scope )
- handle_error( "Out of memory" );
- if ( scope->init( scope_width, 256 ) )
- handle_error( "Couldn't initialize scope" );
- memset( scope_buf, 0, sizeof scope_buf );
-
- // Create player
- player = new Music_Player;
- if ( !player )
- handle_error( "Out of memory" );
- handle_error( player->init() );
- player->set_scope_buffer( scope_buf, scope_width * 2 );
-}
-
-static void start_track( int track, const char* path )
-{
- paused = false;
- handle_error( player->start_track( track - 1 ) );
-
- // update window title with track info
-
- long seconds = player->track_info().length / 1000;
- const char* game = player->track_info().game;
- if ( !*game )
- {
- // extract filename
- game = strrchr( path, '\\' ); // DOS
- if ( !game )
- game = strrchr( path, '/' ); // UNIX
- if ( !game )
- game = path;
- else
- game++; // skip path separator
- }
-
- char title [512];
- sprintf( title, "%s: %d/%d %s (%ld:%02ld)",
- game, track, player->track_count(), player->track_info().song,
- seconds / 60, seconds % 60 );
- SDL_WM_SetCaption( title, title );
-}
-
-int main( int argc, char** argv )
-{
- init();
-
- // Load file
- const char* path = (argc > 1 ? argv [argc - 1] : "test.nsf");
- handle_error( player->load_file( path ) );
- start_track( 1, path );
-
- // Main loop
- int track = 1;
- double tempo = 1.0;
- bool running = true;
- double stereo_depth = 0.0;
- int muting_mask = 0;
- while ( running )
- {
- SDL_Delay( 1000 / 100 );
-
- // Update scope
- scope->draw( scope_buf, scope_width, 2 );
-
- // Automatically go to next track when current one ends
- if ( player->track_ended() )
- {
- if ( track < player->track_count() )
- start_track( ++track, path );
- else
- player->pause( paused = true );
- }
-
- // Handle keyboard input
- SDL_Event e;
- while ( SDL_PollEvent( &e ) )
- {
- switch ( e.type )
- {
- case SDL_QUIT:
- running = false;
- break;
-
- case SDL_KEYDOWN:
- int key = e.key.keysym.sym;
- switch ( key )
- {
- case SDLK_q:
- case SDLK_ESCAPE: // quit
- running = false;
- break;
-
- case SDLK_LEFT: // prev track
- if ( !paused && !--track )
- track = 1;
- start_track( track, path );
- break;
-
- case SDLK_RIGHT: // next track
- if ( track < player->track_count() )
- start_track( ++track, path );
- break;
-
- case SDLK_MINUS: // reduce tempo
- tempo -= 0.1;
- if ( tempo < 0.1 )
- tempo = 0.1;
- player->set_tempo( tempo );
- break;
-
- case SDLK_EQUALS: // increase tempo
- tempo += 0.1;
- if ( tempo > 2.0 )
- tempo = 2.0;
- player->set_tempo( tempo );
- break;
-
- case SDLK_SPACE: // toggle pause
- paused = !paused;
- player->pause( paused );
- break;
-
- case SDLK_e: // toggle echo
- stereo_depth += 0.2;
- if ( stereo_depth > 0.5 )
- stereo_depth = 0;
- player->set_stereo_depth( stereo_depth );
- break;
-
- case SDLK_0: // reset tempo and muting
- tempo = 1.0;
- muting_mask = 0;
- player->set_tempo( tempo );
- player->mute_voices( muting_mask );
- break;
-
- default:
- if ( SDLK_1 <= key && key <= SDLK_9 ) // toggle muting
- {
- muting_mask ^= 1 << (key - SDLK_1);
- player->mute_voices( muting_mask );
- }
- }
- }
- }
- }
-
- // Cleanup
- delete player;
- delete scope;
-
- return 0;
-}
-
-void handle_error( const char* error )
-{
- if ( error )
- {
- // put error in window title
- char str [256];
- sprintf( str, "Error: %s", error );
- fprintf( stderr, "%s\n", str );
- SDL_WM_SetCaption( str, str );
-
- // wait for keyboard or mouse activity
- SDL_Event e;
- do
- {
- while ( !SDL_PollEvent( &e ) ) { }
- }
- while ( e.type != SDL_QUIT && e.type != SDL_KEYDOWN && e.type != SDL_MOUSEBUTTONDOWN );
-
- exit( EXIT_FAILURE );
- }
-}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.cpp
index 8204abf2..8204abf2 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.h
index 42395e37..42395e37 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.cpp
index 0f67db1b..0f67db1b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.h
index 2f4d351e..2f4d351e 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Cpu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.cpp
index 7f2c0613..0ee592e3 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.cpp
@@ -17,7 +17,6 @@ License along with this module; if not, write to the Free Software Foundation,
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
#include "blargg_source.h"
-#include <stdio.h>
long const spectrum_clock = 3546900;
long const cpc_clock = 2000000;
@@ -213,10 +212,6 @@ blargg_err_t Ay_Emu::start_track_( int track )
//debug_printf( "addr: $%04X, len: $%04X\n", addr, len );
if ( addr < ram_start && addr >= 0x400 ) // several tracks use low data
debug_printf( "Block addr in ROM\n" );
-
- if (!in) {
- return "NULL in pointer\n";
- }
memcpy( mem.ram + addr, in, len );
if ( file.end - blocks < 8 )
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.h
index 8cd2231d..8cd2231d 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ay_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ay_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.cpp
index 9dc89ea8..2b88cd4f 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.cpp
@@ -233,18 +233,32 @@ static void gen_sinc( float* out, int count, double oversample, double treble, d
double const to_angle = PI / 2 / maxh / oversample;
for ( int i = 0; i < count; i++ )
{
- double angle = ((i - count) * 2 + 1) * to_angle;
- double c = rolloff * cos( (maxh - 1.0) * angle ) - cos( maxh * angle );
- double cos_nc_angle = cos( maxh * cutoff * angle );
- double cos_nc1_angle = cos( (maxh * cutoff - 1.0) * angle );
- double cos_angle = cos( angle );
+ double angle = ((i - count) * 2 + 1) * to_angle;
+ double angle_maxh = angle * maxh;
+ double angle_maxh_mid = angle_maxh * cutoff;
- c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle;
- double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle);
- double b = 2.0 - cos_angle - cos_angle;
- double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle;
+ double y = maxh;
- out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d
+ // 0 to Fs/2*cutoff, flat
+ if ( angle_maxh_mid ) // unstable at t=0
+ y *= sin( angle_maxh_mid ) / angle_maxh_mid;
+
+ // Fs/2*cutoff to Fs/2, logarithmic rolloff
+ double cosa = cos( angle );
+ double den = 1 + rolloff * (rolloff - cosa - cosa);
+
+ // Becomes unstable when rolloff is near 1.0 and t is near 0,
+ // which is the only time den becomes small
+ if ( den > 1e-13 )
+ {
+ double num =
+ (cos( angle_maxh - angle ) * rolloff - cos( angle_maxh )) * pow_a_n -
+ cos( angle_maxh_mid - angle ) * rolloff + cos( angle_maxh_mid );
+
+ y = y * cutoff + num / den;
+ }
+
+ out [i] = (float) y;
}
}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h b/plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.h
index 4cc526d2..4cc526d2 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Blip_Buffer.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Blip_Buffer.h
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/CMakeLists.txt b/plugins/gme/game-music-emu-0.6.0/gme/CMakeLists.txt
new file mode 100644
index 00000000..f7e87a13
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/CMakeLists.txt
@@ -0,0 +1,163 @@
+# List of source files required by libgme and any emulators
+# This is not 100% accurate (Fir_Resampler for instance) but
+# you'll be OK.
+set(libgme_SRCS Blip_Buffer.cpp
+ Classic_Emu.cpp
+ Data_Reader.cpp
+ Dual_Resampler.cpp
+ Effects_Buffer.cpp
+ Fir_Resampler.cpp
+ gme.cpp
+ Gme_File.cpp
+ M3u_Playlist.cpp
+ Multi_Buffer.cpp
+ Music_Emu.cpp
+ )
+
+# Ay_Apu is very popular around here
+if (USE_GME_AY OR USE_GME_KSS)
+ set(libgme_SRCS ${libgme_SRCS}
+ Ay_Apu.cpp
+ )
+endif()
+
+# so is Ym2612_Emu
+if (USE_GME_VGM OR USE_GME_GYM)
+ set(libgme_SRCS ${libgme_SRCS}
+ Ym2612_Emu.cpp
+ )
+endif()
+
+# But none are as popular as Sms_Apu
+if (USE_GME_VGM OR USE_GME_GYM OR USE_GME_KSS)
+ set(libgme_SRCS ${libgme_SRCS}
+ Sms_Apu.cpp
+ )
+endif()
+
+if (USE_GME_AY)
+ set(libgme_SRCS ${libgme_SRCS}
+ # Ay_Apu.cpp included earlier
+ Ay_Cpu.cpp
+ Ay_Emu.cpp
+ )
+endif()
+
+if (USE_GME_GBS)
+ set(libgme_SRCS ${libgme_SRCS}
+ Gb_Apu.cpp
+ Gb_Cpu.cpp
+ Gb_Oscs.cpp
+ Gbs_Emu.cpp
+ )
+endif()
+
+if (USE_GME_GYM)
+ set(libgme_SRCS ${libgme_SRCS}
+ # Sms_Apu.cpp included earlier
+ # Ym2612_Emu.cpp included earlier
+ Gym_Emu.cpp
+ )
+endif()
+
+if (USE_GME_HES)
+ set(libgme_SRCS ${libgme_SRCS}
+ Hes_Apu.cpp
+ Hes_Cpu.cpp
+ Hes_Emu.cpp
+ )
+endif()
+
+if (USE_GME_KSS)
+ set(libgme_SRCS ${libgme_SRCS}
+ # Ay_Apu.cpp included earlier
+ # Sms_Apu.cpp included earlier
+ Kss_Cpu.cpp
+ Kss_Emu.cpp
+ Kss_Scc_Apu.cpp
+ )
+endif()
+
+if (USE_GME_NSF OR USE_GME_NSFE)
+ set(libgme_SRCS ${libgme_SRCS}
+ Nes_Apu.cpp
+ Nes_Cpu.cpp
+ Nes_Fme7_Apu.cpp
+ Nes_Namco_Apu.cpp
+ Nes_Oscs.cpp
+ Nes_Vrc6_Apu.cpp
+ Nsf_Emu.cpp
+ )
+endif()
+
+if (USE_GME_NSFE)
+ set(libgme_SRCS ${libgme_SRCS}
+ Nsfe_Emu.cpp
+ )
+endif()
+
+if (USE_GME_SAP)
+ set(libgme_SRCS ${libgme_SRCS}
+ Sap_Apu.cpp
+ Sap_Cpu.cpp
+ Sap_Emu.cpp
+ )
+endif()
+
+if (USE_GME_SPC)
+ set(libgme_SRCS ${libgme_SRCS}
+ Snes_Spc.cpp
+ Spc_Cpu.cpp
+ Spc_Dsp.cpp
+ Spc_Emu.cpp
+ Spc_Filter.cpp
+ )
+endif()
+
+if (USE_GME_VGM)
+ set(libgme_SRCS ${libgme_SRCS}
+ # Sms_Apu.cpp included earlier
+ # Ym2612_Emu.cpp included earlier
+ Vgm_Emu.cpp
+ Vgm_Emu_Impl.cpp
+ Ym2413_Emu.cpp
+ )
+endif()
+
+# These headers are part of the generic gme interface.
+set (EXPORTED_HEADERS gme.h)
+
+# Run during cmake phase, so this is available during make
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gme_types.h.in
+ ${CMAKE_CURRENT_BINARY_DIR}/gme_types.h)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libgme.pc.in
+ ${CMAKE_CURRENT_BINARY_DIR}/libgme.pc @ONLY)
+
+# On some platforms we may need to change headers or whatnot based on whether
+# we're building the library or merely using the library. The following is
+# only defined when building the library to allow us to tell which is which.
+add_definitions(-DBLARGG_BUILD_DLL)
+
+# For the gme_types.h
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+# Add library to be compiled.
+add_library(gme SHARED ${libgme_SRCS})
+
+# The version is the release. The "soversion" is the API version. As long
+# as only build fixes are performed (i.e. no backwards-incompatible changes
+# to the API), the SOVERSION should be the same even when bumping up VERSION.
+# The way gme.h is designed, SOVERSION should very rarely be bumped, if ever.
+# Hopefully the API can stay compatible with old versions.
+set_target_properties(gme
+ PROPERTIES VERSION ${GME_VERSION}
+ SOVERSION 0)
+
+# TODO: Libsuffix for 64-bit?
+install(TARGETS gme LIBRARY DESTINATION lib
+ RUNTIME DESTINATION bin # DLL platforms
+ ARCHIVE DESTINATION lib) # DLL platforms
+
+install(FILES ${EXPORTED_HEADERS} DESTINATION include/gme)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libgme.pc DESTINATION lib/pkgconfig)
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.cpp
index 9b68a445..9b68a445 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.h
index d0cfda25..d0cfda25 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Classic_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Classic_Emu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.cpp
index 5bbfbf55..5bbfbf55 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.h b/plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.h
index acf571f6..acf571f6 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Data_Reader.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.cpp
index 8644517c..090b0acf 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Dual_Resampler.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.cpp
@@ -1,4 +1,4 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
#include "Dual_Resampler.h"
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.h b/plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.h
index e3194fe7..e3194fe7 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Dual_Resampler.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Dual_Resampler.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.cpp
index 181b11e9..181b11e9 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.h b/plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.h
index 061f74ab..061f74ab 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Effects_Buffer.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Effects_Buffer.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.cpp
index f2c905a9..f2c905a9 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.h b/plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.h
index aed87492..aed87492 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Fir_Resampler.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Fir_Resampler.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.cpp
index 866594dd..866594dd 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.h
index e74ebc55..e74ebc55 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.cpp
index 6980aafe..6980aafe 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.h
index 9d623e04..9d623e04 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gb_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Cpu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.cpp
index 735653fa..735653fa 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.h b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.h
index d7f88ea1..d7f88ea1 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gb_Oscs.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gb_Oscs.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.cpp
index ceb526e5..c3a0153b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.cpp
@@ -212,11 +212,11 @@ blargg_err_t Gbs_Emu::start_track_( int track )
for ( int i = 0; i < (int) sizeof sound_data; i++ )
apu.write_register( 0, i + apu.start_addr, sound_data [i] );
- cpu::reset( rom.unmapped() );
-
unsigned load_addr = get_le16( header_.load_addr );
- cpu::rst_base = load_addr;
rom.set_addr( load_addr );
+ cpu::rst_base = load_addr;
+
+ cpu::reset( rom.unmapped() );
cpu::map_code( ram_addr, 0x10000 - ram_addr, ram );
cpu::map_code( 0, bank_size, rom.at_addr( 0 ) );
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.h
index f3318dc8..f3318dc8 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gbs_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gbs_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gme_File.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gme_File.cpp
index 17edc9f8..17edc9f8 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gme_File.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gme_File.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gme_File.h b/plugins/gme/game-music-emu-0.6.0/gme/Gme_File.h
index f50dceae..a327ceb6 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gme_File.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gme_File.h
@@ -24,6 +24,24 @@ struct gme_type_t_
int flags_;
};
+struct track_info_t
+{
+ long track_count;
+
+ /* times in milliseconds; -1 if unknown */
+ long length;
+ long intro_length;
+ long loop_length;
+
+ /* empty string if not available */
+ char system [256];
+ char game [256];
+ char song [256];
+ char author [256];
+ char copyright [256];
+ char comment [256];
+ char dumper [256];
+};
enum { gme_max_field = 255 };
struct Gme_File {
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.cpp
index c286dea9..c286dea9 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.h
index f2e13238..f2e13238 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Gym_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Gym_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.cpp
index 63c2b707..63c2b707 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.h
index 1e546053..1e546053 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.cpp
index 8acdd94f..8acdd94f 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.h
index cf3af87d..cf3af87d 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Cpu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.cpp
index 9a32b688..9a32b688 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.h
index d17983c5..d17983c5 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Hes_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Hes_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.cpp
index dac483c1..dac483c1 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.h
index 28a2fc0f..28a2fc0f 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Cpu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.cpp
index 3b84509c..3b84509c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.h
index 1d6ae475..1d6ae475 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.cpp
index cfccce64..cfccce64 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.h
index 5c65461c..5c65461c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Kss_Scc_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Kss_Scc_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.cpp b/plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.cpp
index 75d0fcb2..6be6190e 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.cpp
@@ -52,9 +52,9 @@ blargg_err_t Gme_File::load_m3u( const char* path ) { return load_m3u_( playlist
blargg_err_t Gme_File::load_m3u( Data_Reader& in ) { return load_m3u_( playlist.load( in ) ); }
-gme_err_t gme_load_m3u( Music_Emu* me, const char* path ) { return me->load_m3u( path ); }
+BLARGG_EXPORT gme_err_t gme_load_m3u( Music_Emu* me, const char* path ) { return me->load_m3u( path ); }
-gme_err_t gme_load_m3u_data( Music_Emu* me, const void* data, long size )
+BLARGG_EXPORT gme_err_t gme_load_m3u_data( Music_Emu* me, const void* data, long size )
{
Mem_File_Reader in( data, size );
return me->load_m3u( in );
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.h b/plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.h
index 266a0653..266a0653 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/M3u_Playlist.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/M3u_Playlist.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.cpp
index 57f93b31..57f93b31 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.h b/plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.h
index 82c8b3ab..82c8b3ab 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Multi_Buffer.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Multi_Buffer.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.cpp
index 5db66fb9..e2373181 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.cpp
@@ -404,6 +404,7 @@ blargg_err_t Gme_Info_::set_sample_rate_( long ) { return 0; }
void Gme_Info_::pre_load() { Gme_File::pre_load(); } // skip Music_Emu
void Gme_Info_::post_load_() { Gme_File::post_load_(); } // skip Music_Emu
void Gme_Info_::set_equalizer_( equalizer_t const& ){ check( false ); }
+void Gme_Info_::enable_accuracy_( bool ) { check( false ); }
void Gme_Info_::mute_voices_( int ) { check( false ); }
void Gme_Info_::set_tempo_( double ) { }
blargg_err_t Gme_Info_::start_track_( int ) { return "Use full emulator for playback"; }
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.h
index c5f1d029..fe679d74 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Music_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Music_Emu.h
@@ -58,7 +58,7 @@ public:
void ignore_silence( bool disable = true );
// Info for current track
- Gme_File::track_info;
+ using Gme_File::track_info;
blargg_err_t track_info( track_info_t* out ) const;
// Sound customization
@@ -82,6 +82,10 @@ public:
// on others this has no effect. Should be called only once *before* set_sample_rate().
virtual void set_buffer( Multi_Buffer* ) { }
+ // Enables/disables accurate emulation options, if any are supported. Might change
+ // equalizer settings.
+ void enable_accuracy( bool enable = true );
+
// Sound equalization (treble/bass)
// Frequency equalizer parameters (see gme.txt)
@@ -111,7 +115,8 @@ protected:
void remute_voices();
virtual blargg_err_t set_sample_rate_( long sample_rate ) = 0;
- virtual void set_equalizer_( equalizer_t const& ) { };
+ virtual void set_equalizer_( equalizer_t const& ) { }
+ virtual void enable_accuracy_( bool enable ) { }
virtual void mute_voices_( int mask ) = 0;
virtual void set_tempo_( double ) = 0;
virtual blargg_err_t start_track_( int ) = 0; // tempo is set before this
@@ -169,6 +174,7 @@ struct Gme_Info_ : Music_Emu
{
virtual blargg_err_t set_sample_rate_( long sample_rate );
virtual void set_equalizer_( equalizer_t const& );
+ virtual void enable_accuracy_( bool );
virtual void mute_voices_( int mask );
virtual void set_tempo_( double );
virtual blargg_err_t start_track_( int );
@@ -189,6 +195,7 @@ inline int Music_Emu::current_track() const { return current_track_; }
inline bool Music_Emu::track_ended() const { return track_ended_; }
inline const Music_Emu::equalizer_t& Music_Emu::equalizer() const { return equalizer_; }
+inline void Music_Emu::enable_accuracy( bool b ) { enable_accuracy_( b ); }
inline void Music_Emu::set_tempo_( double t ) { tempo_ = t; }
inline void Music_Emu::remute_voices() { mute_voices( mute_mask_ ); }
inline void Music_Emu::ignore_silence( bool b ) { ignore_silence_ = b; }
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.cpp
index 68edb446..68edb446 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.h
index 5e722248..5e722248 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.cpp
index 864e0dde..864e0dde 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h
index 694296f7..694296f7 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Cpu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.cpp
index 62594fc2..62594fc2 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.h
index 97094897..97094897 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Fme7_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Fme7_Apu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.cpp
index f3235b38..f3235b38 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.h
index db5fea4b..db5fea4b 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Namco_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Namco_Apu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.cpp
index 1ad3f59c..1ad3f59c 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.h
index b675bfb4..b675bfb4 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Oscs.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Oscs.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.cpp
index d178407c..d178407c 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.h
index 18722233..18722233 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Vrc6_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nes_Vrc6_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.cpp
index 6e58164c..6e58164c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.h
index 6b213529..6b213529 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nsf_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nsf_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.cpp
index eb8cdadf..eb8cdadf 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.h
index 7971e47b..7971e47b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nsfe_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Nsfe_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.cpp
index fb56f5dc..fa9bc4b1 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.cpp
@@ -90,7 +90,7 @@ void Sap_Apu::reset( Sap_Apu_Impl* new_impl )
memset( &oscs [i], 0, offsetof (osc_t,output) );
}
-void Sap_Apu::calc_periods()
+inline void Sap_Apu::calc_periods()
{
// 15/64 kHz clock
int divider = 28;
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.h
index a573499c..a573499c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Apu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.cpp
index 35e1b511..35e1b511 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.h
index bde219f6..bde219f6 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Cpu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Cpu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.cpp
index aa4ce948..aa4ce948 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.h
index 21879447..21879447 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Sap_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sap_Emu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.cpp
index b41fdec4..b41fdec4 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.h b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.h
index 3c11a9c3..3c11a9c3 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Apu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Apu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Oscs.h b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Oscs.h
index 2a896fef..2a896fef 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sms_Oscs.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Sms_Oscs.h
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.cpp
new file mode 100644
index 00000000..186a30f0
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.cpp
@@ -0,0 +1,380 @@
+// SPC emulation support: init, sample buffering, reset, SPC loading
+
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+#include "Snes_Spc.h"
+
+#include <string.h>
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define RAM (m.ram.ram)
+#define REGS (m.smp_regs [0])
+#define REGS_IN (m.smp_regs [1])
+
+// (n ? n : 256)
+#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1)
+
+
+//// Init
+
+blargg_err_t Snes_Spc::init()
+{
+ memset( &m, 0, sizeof m );
+ dsp.init( RAM );
+
+ m.tempo = tempo_unit;
+
+ // Most SPC music doesn't need ROM, and almost all the rest only rely
+ // on these two bytes
+ m.rom [0x3E] = 0xFF;
+ m.rom [0x3F] = 0xC0;
+
+ static unsigned char const cycle_table [128] =
+ {// 01 23 45 67 89 AB CD EF
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x68, // 0
+ 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x46, // 1
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x74, // 2
+ 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x38, // 3
+ 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x66, // 4
+ 0x48,0x47,0x45,0x56,0x55,0x45,0x22,0x43, // 5
+ 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x75, // 6
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x36, // 7
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x52,0x45, // 8
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0xC5, // 9
+ 0x38,0x47,0x34,0x36,0x26,0x44,0x52,0x44, // A
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x34, // B
+ 0x38,0x47,0x45,0x47,0x25,0x64,0x52,0x49, // C
+ 0x48,0x47,0x56,0x67,0x45,0x55,0x22,0x83, // D
+ 0x28,0x47,0x34,0x36,0x24,0x53,0x43,0x40, // E
+ 0x48,0x47,0x45,0x56,0x34,0x54,0x22,0x60, // F
+ };
+
+ // unpack cycle table
+ for ( int i = 0; i < 128; i++ )
+ {
+ int n = cycle_table [i];
+ m.cycle_table [i * 2 + 0] = n >> 4;
+ m.cycle_table [i * 2 + 1] = n & 0x0F;
+ }
+
+ #if SPC_LESS_ACCURATE
+ memcpy( reg_times, reg_times_, sizeof reg_times );
+ #endif
+
+ reset();
+ return 0;
+}
+
+void Snes_Spc::init_rom( uint8_t const in [rom_size] )
+{
+ memcpy( m.rom, in, sizeof m.rom );
+}
+
+void Snes_Spc::set_tempo( int t )
+{
+ m.tempo = t;
+ int const timer2_shift = 4; // 64 kHz
+ int const other_shift = 3; // 8 kHz
+
+ #if SPC_DISABLE_TEMPO
+ m.timers [2].prescaler = timer2_shift;
+ m.timers [1].prescaler = timer2_shift + other_shift;
+ m.timers [0].prescaler = timer2_shift + other_shift;
+ #else
+ if ( !t )
+ t = 1;
+ int const timer2_rate = 1 << timer2_shift;
+ int rate = (timer2_rate * tempo_unit + (t >> 1)) / t;
+ if ( rate < timer2_rate / 4 )
+ rate = timer2_rate / 4; // max 4x tempo
+ m.timers [2].prescaler = rate;
+ m.timers [1].prescaler = rate << other_shift;
+ m.timers [0].prescaler = rate << other_shift;
+ #endif
+}
+
+// Timer registers have been loaded. Applies these to the timers. Does not
+// reset timer prescalers or dividers.
+void Snes_Spc::timers_loaded()
+{
+ int i;
+ for ( i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ t->period = IF_0_THEN_256( REGS [r_t0target + i] );
+ t->enabled = REGS [r_control] >> i & 1;
+ t->counter = REGS_IN [r_t0out + i] & 0x0F;
+ }
+
+ set_tempo( m.tempo );
+}
+
+// Loads registers from unified 16-byte format
+void Snes_Spc::load_regs( uint8_t const in [reg_count] )
+{
+ memcpy( REGS, in, reg_count );
+ memcpy( REGS_IN, REGS, reg_count );
+
+ // These always read back as 0
+ REGS_IN [r_test ] = 0;
+ REGS_IN [r_control ] = 0;
+ REGS_IN [r_t0target] = 0;
+ REGS_IN [r_t1target] = 0;
+ REGS_IN [r_t2target] = 0;
+}
+
+// RAM was just loaded from SPC, with $F0-$FF containing SMP registers
+// and timer counts. Copies these to proper registers.
+void Snes_Spc::ram_loaded()
+{
+ m.rom_enabled = 0;
+ load_regs( &RAM [0xF0] );
+
+ // Put STOP instruction around memory to catch PC underflow/overflow
+ memset( m.ram.padding1, cpu_pad_fill, sizeof m.ram.padding1 );
+ memset( m.ram.padding2, cpu_pad_fill, sizeof m.ram.padding2 );
+}
+
+// Registers were just loaded. Applies these new values.
+void Snes_Spc::regs_loaded()
+{
+ enable_rom( REGS [r_control] & 0x80 );
+ timers_loaded();
+}
+
+void Snes_Spc::reset_time_regs()
+{
+ m.cpu_error = 0;
+ m.echo_accessed = 0;
+ m.spc_time = 0;
+ m.dsp_time = 0;
+ #if SPC_LESS_ACCURATE
+ m.dsp_time = clocks_per_sample + 1;
+ #endif
+
+ for ( int i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ t->next_time = 1;
+ t->divider = 0;
+ }
+
+ regs_loaded();
+
+ m.extra_clocks = 0;
+ reset_buf();
+}
+
+void Snes_Spc::reset_common( int timer_counter_init )
+{
+ int i;
+ for ( i = 0; i < timer_count; i++ )
+ REGS_IN [r_t0out + i] = timer_counter_init;
+
+ // Run IPL ROM
+ memset( &m.cpu_regs, 0, sizeof m.cpu_regs );
+ m.cpu_regs.pc = rom_addr;
+
+ REGS [r_test ] = 0x0A;
+ REGS [r_control] = 0xB0; // ROM enabled, clear ports
+ for ( i = 0; i < port_count; i++ )
+ REGS_IN [r_cpuio0 + i] = 0;
+
+ reset_time_regs();
+}
+
+void Snes_Spc::soft_reset()
+{
+ reset_common( 0 );
+ dsp.soft_reset();
+}
+
+void Snes_Spc::reset()
+{
+ memset( RAM, 0xFF, 0x10000 );
+ ram_loaded();
+ reset_common( 0x0F );
+ dsp.reset();
+}
+
+char const Snes_Spc::signature [signature_size + 1] =
+ "SNES-SPC700 Sound File Data v0.30\x1A\x1A";
+
+blargg_err_t Snes_Spc::load_spc( void const* data, long size )
+{
+ spc_file_t const* const spc = (spc_file_t const*) data;
+
+ // be sure compiler didn't insert any padding into fle_t
+ assert( sizeof (spc_file_t) == spc_min_file_size + 0x80 );
+
+ // Check signature and file size
+ if ( size < signature_size || memcmp( spc, signature, 27 ) )
+ return "Not an SPC file";
+
+ if ( size < spc_min_file_size )
+ return "Corrupt SPC file";
+
+ // CPU registers
+ m.cpu_regs.pc = spc->pch * 0x100 + spc->pcl;
+ m.cpu_regs.a = spc->a;
+ m.cpu_regs.x = spc->x;
+ m.cpu_regs.y = spc->y;
+ m.cpu_regs.psw = spc->psw;
+ m.cpu_regs.sp = spc->sp;
+
+ // RAM and registers
+ memcpy( RAM, spc->ram, 0x10000 );
+ ram_loaded();
+
+ // DSP registers
+ dsp.load( spc->dsp );
+
+ reset_time_regs();
+
+ return 0;
+}
+
+void Snes_Spc::clear_echo()
+{
+ if ( !(dsp.read( Spc_Dsp::r_flg ) & 0x20) )
+ {
+ int addr = 0x100 * dsp.read( Spc_Dsp::r_esa );
+ int end = addr + 0x800 * (dsp.read( Spc_Dsp::r_edl ) & 0x0F);
+ if ( end > 0x10000 )
+ end = 0x10000;
+ memset( &RAM [addr], 0xFF, end - addr );
+ }
+}
+
+
+//// Sample output
+
+void Snes_Spc::reset_buf()
+{
+ // Start with half extra buffer of silence
+ sample_t* out = m.extra_buf;
+ while ( out < &m.extra_buf [extra_size / 2] )
+ *out++ = 0;
+
+ m.extra_pos = out;
+ m.buf_begin = 0;
+
+ dsp.set_output( 0, 0 );
+}
+
+void Snes_Spc::set_output( sample_t* out, int size )
+{
+ require( (size & 1) == 0 ); // size must be even
+
+ m.extra_clocks &= clocks_per_sample - 1;
+ if ( out )
+ {
+ sample_t const* out_end = out + size;
+ m.buf_begin = out;
+ m.buf_end = out_end;
+
+ // Copy extra to output
+ sample_t const* in = m.extra_buf;
+ while ( in < m.extra_pos && out < out_end )
+ *out++ = *in++;
+
+ // Handle output being full already
+ if ( out >= out_end )
+ {
+ // Have DSP write to remaining extra space
+ out = dsp.extra();
+ out_end = &dsp.extra() [extra_size];
+
+ // Copy any remaining extra samples as if DSP wrote them
+ while ( in < m.extra_pos )
+ *out++ = *in++;
+ assert( out <= out_end );
+ }
+
+ dsp.set_output( out, out_end - out );
+ }
+ else
+ {
+ reset_buf();
+ }
+}
+
+void Snes_Spc::save_extra()
+{
+ // Get end pointers
+ sample_t const* main_end = m.buf_end; // end of data written to buf
+ sample_t const* dsp_end = dsp.out_pos(); // end of data written to dsp.extra()
+ if ( m.buf_begin <= dsp_end && dsp_end <= main_end )
+ {
+ main_end = dsp_end;
+ dsp_end = dsp.extra(); // nothing in DSP's extra
+ }
+
+ // Copy any extra samples at these ends into extra_buf
+ sample_t* out = m.extra_buf;
+ sample_t const* in;
+ for ( in = m.buf_begin + sample_count(); in < main_end; in++ )
+ *out++ = *in;
+ for ( in = dsp.extra(); in < dsp_end ; in++ )
+ *out++ = *in;
+
+ m.extra_pos = out;
+ assert( out <= &m.extra_buf [extra_size] );
+}
+
+blargg_err_t Snes_Spc::play( int count, sample_t* out )
+{
+ require( (count & 1) == 0 ); // must be even
+ if ( count )
+ {
+ set_output( out, count );
+ end_frame( count * (clocks_per_sample / 2) );
+ }
+
+ const char* err = m.cpu_error;
+ m.cpu_error = 0;
+ return err;
+}
+
+blargg_err_t Snes_Spc::skip( int count )
+{
+ #if SPC_LESS_ACCURATE
+ if ( count > 2 * sample_rate * 2 )
+ {
+ set_output( 0, 0 );
+
+ // Skip a multiple of 4 samples
+ time_t end = count;
+ count = (count & 3) + 1 * sample_rate * 2;
+ end = (end - count) * (clocks_per_sample / 2);
+
+ m.skipped_kon = 0;
+ m.skipped_koff = 0;
+
+ // Preserve DSP and timer synchronization
+ // TODO: verify that this really preserves it
+ int old_dsp_time = m.dsp_time + m.spc_time;
+ m.dsp_time = end - m.spc_time + skipping_time;
+ end_frame( end );
+ m.dsp_time = m.dsp_time - skipping_time + old_dsp_time;
+
+ dsp.write( Spc_Dsp::r_koff, m.skipped_koff & ~m.skipped_kon );
+ dsp.write( Spc_Dsp::r_kon , m.skipped_kon );
+ clear_echo();
+ }
+ #endif
+
+ return play( count, 0 );
+}
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.h b/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.h
new file mode 100644
index 00000000..188a2c21
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Snes_Spc.h
@@ -0,0 +1,287 @@
+// SNES SPC-700 APU emulator
+
+// Game_Music_Emu 0.5.5
+#ifndef SNES_SPC_H
+#define SNES_SPC_H
+
+#include "Spc_Dsp.h"
+#include "blargg_endian.h"
+
+struct Snes_Spc {
+public:
+ typedef BOOST::uint8_t uint8_t;
+
+ // Must be called once before using
+ blargg_err_t init();
+
+ // Sample pairs generated per second
+ enum { sample_rate = 32000 };
+
+// Emulator use
+
+ // Sets IPL ROM data. Library does not include ROM data. Most SPC music files
+ // don't need ROM, but a full emulator must provide this.
+ enum { rom_size = 0x40 };
+ void init_rom( uint8_t const rom [rom_size] );
+
+ // Sets destination for output samples
+ typedef short sample_t;
+ void set_output( sample_t* out, int out_size );
+
+ // Number of samples written to output since last set
+ int sample_count() const;
+
+ // Resets SPC to power-on state. This resets your output buffer, so you must
+ // call set_output() after this.
+ void reset();
+
+ // Emulates pressing reset switch on SNES. This resets your output buffer, so
+ // you must call set_output() after this.
+ void soft_reset();
+
+ // 1024000 SPC clocks per second, sample pair every 32 clocks
+ typedef int time_t;
+ enum { clock_rate = 1024000 };
+ enum { clocks_per_sample = 32 };
+
+ // Emulated port read/write at specified time
+ enum { port_count = 4 };
+ int read_port ( time_t, int port );
+ void write_port( time_t, int port, int data );
+
+ // Runs SPC to end_time and starts a new time frame at 0
+ void end_frame( time_t end_time );
+
+// Sound control
+
+ // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events).
+ // Reduces emulation accuracy.
+ enum { voice_count = 8 };
+ void mute_voices( int mask );
+
+ // If true, prevents channels and global volumes from being phase-negated.
+ // Only supported by fast DSP.
+ void disable_surround( bool disable = true );
+
+ // Sets tempo, where tempo_unit = normal, tempo_unit / 2 = half speed, etc.
+ enum { tempo_unit = 0x100 };
+ void set_tempo( int );
+
+// SPC music files
+
+ // Loads SPC data into emulator
+ enum { spc_min_file_size = 0x10180 };
+ enum { spc_file_size = 0x10200 };
+ blargg_err_t load_spc( void const* in, long size );
+
+ // Clears echo region. Useful after loading an SPC as many have garbage in echo.
+ void clear_echo();
+
+ // Plays for count samples and write samples to out. Discards samples if out
+ // is NULL. Count must be a multiple of 2 since output is stereo.
+ blargg_err_t play( int count, sample_t* out );
+
+ // Skips count samples. Several times faster than play() when using fast DSP.
+ blargg_err_t skip( int count );
+
+// State save/load (only available with accurate DSP)
+
+#if !SPC_NO_COPY_STATE_FUNCS
+ // Saves/loads state
+ enum { state_size = 67 * 1024L }; // maximum space needed when saving
+ typedef Spc_Dsp::copy_func_t copy_func_t;
+ void copy_state( unsigned char** io, copy_func_t );
+
+ // Writes minimal header to spc_out
+ static void init_header( void* spc_out );
+
+ // Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out.
+ // Does not set up SPC header; use init_header() for that.
+ void save_spc( void* spc_out );
+
+ // Returns true if new key-on events occurred since last check. Useful for
+ // trimming silence while saving an SPC.
+ bool check_kon();
+#endif
+
+public:
+ // TODO: document
+ struct regs_t
+ {
+ int pc;
+ int a;
+ int x;
+ int y;
+ int psw;
+ int sp;
+ };
+ regs_t& smp_regs() { return m.cpu_regs; }
+
+ uint8_t* smp_ram() { return m.ram.ram; }
+
+ void run_until( time_t t ) { run_until_( t ); }
+public:
+ BLARGG_DISABLE_NOTHROW
+
+ typedef BOOST::uint16_t uint16_t;
+
+ // Time relative to m_spc_time. Speeds up code a bit by eliminating need to
+ // constantly add m_spc_time to time from CPU. CPU uses time that ends at
+ // 0 to eliminate reloading end time every instruction. It pays off.
+ typedef int rel_time_t;
+
+ struct Timer
+ {
+ rel_time_t next_time; // time of next event
+ int prescaler;
+ int period;
+ int divider;
+ int enabled;
+ int counter;
+ };
+ enum { reg_count = 0x10 };
+ enum { timer_count = 3 };
+ enum { extra_size = Spc_Dsp::extra_size };
+
+ enum { signature_size = 35 };
+
+private:
+ Spc_Dsp dsp;
+
+ #if SPC_LESS_ACCURATE
+ static signed char const reg_times_ [256];
+ signed char reg_times [256];
+ #endif
+
+ struct state_t
+ {
+ Timer timers [timer_count];
+
+ uint8_t smp_regs [2] [reg_count];
+
+ regs_t cpu_regs;
+
+ rel_time_t dsp_time;
+ time_t spc_time;
+ bool echo_accessed;
+
+ int tempo;
+ int skipped_kon;
+ int skipped_koff;
+ const char* cpu_error;
+
+ int extra_clocks;
+ sample_t* buf_begin;
+ sample_t const* buf_end;
+ sample_t* extra_pos;
+ sample_t extra_buf [extra_size];
+
+ int rom_enabled;
+ uint8_t rom [rom_size];
+ uint8_t hi_ram [rom_size];
+
+ unsigned char cycle_table [256];
+
+ struct
+ {
+ // padding to neutralize address overflow
+ union {
+ uint8_t padding1 [0x100];
+ uint16_t align; // makes compiler align data for 16-bit access
+ } padding1 [1];
+ uint8_t ram [0x10000];
+ uint8_t padding2 [0x100];
+ } ram;
+ };
+ state_t m;
+
+ enum { rom_addr = 0xFFC0 };
+
+ enum { skipping_time = 127 };
+
+ // Value that padding should be filled with
+ enum { cpu_pad_fill = 0xFF };
+
+ enum {
+ r_test = 0x0, r_control = 0x1,
+ r_dspaddr = 0x2, r_dspdata = 0x3,
+ r_cpuio0 = 0x4, r_cpuio1 = 0x5,
+ r_cpuio2 = 0x6, r_cpuio3 = 0x7,
+ r_f8 = 0x8, r_f9 = 0x9,
+ r_t0target = 0xA, r_t1target = 0xB, r_t2target = 0xC,
+ r_t0out = 0xD, r_t1out = 0xE, r_t2out = 0xF
+ };
+
+ void timers_loaded();
+ void enable_rom( int enable );
+ void reset_buf();
+ void save_extra();
+ void load_regs( uint8_t const in [reg_count] );
+ void ram_loaded();
+ void regs_loaded();
+ void reset_time_regs();
+ void reset_common( int timer_counter_init );
+
+ Timer* run_timer_ ( Timer* t, rel_time_t );
+ Timer* run_timer ( Timer* t, rel_time_t );
+ int dsp_read ( rel_time_t );
+ void dsp_write ( int data, rel_time_t );
+ void cpu_write_smp_reg_( int data, rel_time_t, int addr );
+ void cpu_write_smp_reg ( int data, rel_time_t, int addr );
+ void cpu_write_high ( int data, int i, rel_time_t );
+ void cpu_write ( int data, int addr, rel_time_t );
+ int cpu_read_smp_reg ( int i, rel_time_t );
+ int cpu_read ( int addr, rel_time_t );
+ unsigned CPU_mem_bit ( uint8_t const* pc, rel_time_t );
+
+ bool check_echo_access ( int addr );
+ uint8_t* run_until_( time_t end_time );
+
+ struct spc_file_t
+ {
+ char signature [signature_size];
+ uint8_t has_id666;
+ uint8_t version;
+ uint8_t pcl, pch;
+ uint8_t a;
+ uint8_t x;
+ uint8_t y;
+ uint8_t psw;
+ uint8_t sp;
+ char text [212];
+ uint8_t ram [0x10000];
+ uint8_t dsp [128];
+ uint8_t unused [0x40];
+ uint8_t ipl_rom [0x40];
+ };
+
+ static char const signature [signature_size + 1];
+
+ void save_regs( uint8_t out [reg_count] );
+};
+
+#include <assert.h>
+
+inline int Snes_Spc::sample_count() const { return (m.extra_clocks >> 5) * 2; }
+
+inline int Snes_Spc::read_port( time_t t, int port )
+{
+ assert( (unsigned) port < port_count );
+ return run_until_( t ) [port];
+}
+
+inline void Snes_Spc::write_port( time_t t, int port, int data )
+{
+ assert( (unsigned) port < port_count );
+ run_until_( t ) [0x10 + port] = data;
+}
+
+inline void Snes_Spc::mute_voices( int mask ) { dsp.mute_voices( mask ); }
+
+inline void Snes_Spc::disable_surround( bool disable ) { dsp.disable_surround( disable ); }
+
+#if !SPC_NO_COPY_STATE_FUNCS
+inline bool Snes_Spc::check_kon() { return dsp.check_kon(); }
+#endif
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.cpp
new file mode 100644
index 00000000..52cb25c5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.cpp
@@ -0,0 +1,565 @@
+// Core SPC emulation: CPU, timers, SMP registers, memory
+
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+#include "Snes_Spc.h"
+
+#include <string.h>
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define RAM (m.ram.ram)
+#define REGS (m.smp_regs [0])
+#define REGS_IN (m.smp_regs [1])
+
+// (n ? n : 256)
+#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1)
+
+// Note: SPC_MORE_ACCURACY exists mainly so I can run my validation tests, which
+// do crazy echo buffer accesses.
+#ifndef SPC_MORE_ACCURACY
+ #define SPC_MORE_ACCURACY 0
+#endif
+
+#ifdef BLARGG_ENABLE_OPTIMIZER
+ #include BLARGG_ENABLE_OPTIMIZER
+#endif
+
+
+//// Timers
+
+#if SPC_DISABLE_TEMPO
+ #define TIMER_DIV( t, n ) ((n) >> t->prescaler)
+ #define TIMER_MUL( t, n ) ((n) << t->prescaler)
+#else
+ #define TIMER_DIV( t, n ) ((n) / t->prescaler)
+ #define TIMER_MUL( t, n ) ((n) * t->prescaler)
+#endif
+
+Snes_Spc::Timer* Snes_Spc::run_timer_( Timer* t, rel_time_t time )
+{
+ int elapsed = TIMER_DIV( t, time - t->next_time ) + 1;
+ t->next_time += TIMER_MUL( t, elapsed );
+
+ if ( t->enabled )
+ {
+ int remain = IF_0_THEN_256( t->period - t->divider );
+ int divider = t->divider + elapsed;
+ int over = elapsed - remain;
+ if ( over >= 0 )
+ {
+ int n = over / t->period;
+ t->counter = (t->counter + 1 + n) & 0x0F;
+ divider = over - n * t->period;
+ }
+ t->divider = (uint8_t) divider;
+ }
+ return t;
+}
+
+inline Snes_Spc::Timer* Snes_Spc::run_timer( Timer* t, rel_time_t time )
+{
+ if ( time >= t->next_time )
+ t = run_timer_( t, time );
+ return t;
+}
+
+
+//// ROM
+
+void Snes_Spc::enable_rom( int enable )
+{
+ if ( m.rom_enabled != enable )
+ {
+ m.rom_enabled = enable;
+ if ( enable )
+ memcpy( m.hi_ram, &RAM [rom_addr], sizeof m.hi_ram );
+ memcpy( &RAM [rom_addr], (enable ? m.rom : m.hi_ram), rom_size );
+ // TODO: ROM can still get overwritten when DSP writes to echo buffer
+ }
+}
+
+
+//// DSP
+
+#if SPC_LESS_ACCURATE
+ int const max_reg_time = 29;
+
+ signed char const Snes_Spc::reg_times_ [256] =
+ {
+ -1, 0,-11,-10,-15,-11, -2, -2, 4, 3, 14, 14, 26, 26, 14, 22,
+ 2, 3, 0, 1,-12, 0, 1, 1, 7, 6, 14, 14, 27, 14, 14, 23,
+ 5, 6, 3, 4, -1, 3, 4, 4, 10, 9, 14, 14, 26, -5, 14, 23,
+ 8, 9, 6, 7, 2, 6, 7, 7, 13, 12, 14, 14, 27, -4, 14, 24,
+ 11, 12, 9, 10, 5, 9, 10, 10, 16, 15, 14, 14, -2, -4, 14, 24,
+ 14, 15, 12, 13, 8, 12, 13, 13, 19, 18, 14, 14, -2,-36, 14, 24,
+ 17, 18, 15, 16, 11, 15, 16, 16, 22, 21, 14, 14, 28, -3, 14, 25,
+ 20, 21, 18, 19, 14, 18, 19, 19, 25, 24, 14, 14, 14, 29, 14, 25,
+
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ };
+
+ #define RUN_DSP( time, offset ) \
+ int count = (time) - (offset) - m.dsp_time;\
+ if ( count >= 0 )\
+ {\
+ int clock_count = (count & ~(clocks_per_sample - 1)) + clocks_per_sample;\
+ m.dsp_time += clock_count;\
+ dsp.run( clock_count );\
+ }
+#else
+ #define RUN_DSP( time, offset ) \
+ {\
+ int count = (time) - m.dsp_time;\
+ if ( !SPC_MORE_ACCURACY || count )\
+ {\
+ assert( count > 0 );\
+ m.dsp_time = (time);\
+ dsp.run( count );\
+ }\
+ }
+#endif
+
+int Snes_Spc::dsp_read( rel_time_t time )
+{
+ RUN_DSP( time, reg_times [REGS [r_dspaddr] & 0x7F] );
+
+ int result = dsp.read( REGS [r_dspaddr] & 0x7F );
+
+ #ifdef SPC_DSP_READ_HOOK
+ SPC_DSP_READ_HOOK( spc_time + time, (REGS [r_dspaddr] & 0x7F), result );
+ #endif
+
+ return result;
+}
+
+inline void Snes_Spc::dsp_write( int data, rel_time_t time )
+{
+ RUN_DSP( time, reg_times [REGS [r_dspaddr]] )
+ #if SPC_LESS_ACCURATE
+ else if ( m.dsp_time == skipping_time )
+ {
+ int r = REGS [r_dspaddr];
+ if ( r == Spc_Dsp::r_kon )
+ m.skipped_kon |= data & ~dsp.read( Spc_Dsp::r_koff );
+
+ if ( r == Spc_Dsp::r_koff )
+ {
+ m.skipped_koff |= data;
+ m.skipped_kon &= ~data;
+ }
+ }
+ #endif
+
+ #ifdef SPC_DSP_WRITE_HOOK
+ SPC_DSP_WRITE_HOOK( m.spc_time + time, REGS [r_dspaddr], (uint8_t) data );
+ #endif
+
+ if ( REGS [r_dspaddr] <= 0x7F )
+ dsp.write( REGS [r_dspaddr], data );
+ else if ( !SPC_MORE_ACCURACY )
+ debug_printf( "SPC wrote to DSP register > $7F\n" );
+}
+
+
+//// Memory access extras
+
+#if SPC_MORE_ACCURACY
+ #define MEM_ACCESS( time, addr ) \
+ {\
+ if ( time >= m.dsp_time )\
+ {\
+ RUN_DSP( time, max_reg_time );\
+ }\
+ }
+#elif !defined (NDEBUG)
+ // Debug-only check for read/write within echo buffer, since this might result in
+ // inaccurate emulation due to the DSP not being caught up to the present.
+
+ bool Snes_Spc::check_echo_access( int addr )
+ {
+ if ( !(dsp.read( Spc_Dsp::r_flg ) & 0x20) )
+ {
+ int start = 0x100 * dsp.read( Spc_Dsp::r_esa );
+ int size = 0x800 * (dsp.read( Spc_Dsp::r_edl ) & 0x0F);
+ int end = start + (size ? size : 4);
+ if ( start <= addr && addr < end )
+ {
+ if ( !m.echo_accessed )
+ {
+ m.echo_accessed = 1;
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ #define MEM_ACCESS( time, addr ) check( !check_echo_access( (uint16_t) addr ) );
+#else
+ #define MEM_ACCESS( time, addr )
+#endif
+
+
+//// CPU write
+
+#if SPC_MORE_ACCURACY
+static unsigned char const glitch_probs [3] [256] =
+{
+ 0xC3,0x92,0x5B,0x1C,0xD1,0x92,0x5B,0x1C,0xDB,0x9C,0x72,0x18,0xCD,0x5C,0x38,0x0B,
+ 0xE1,0x9C,0x74,0x17,0xCF,0x75,0x45,0x0C,0xCF,0x6E,0x4A,0x0D,0xA3,0x3A,0x1D,0x08,
+ 0xDB,0xA0,0x82,0x19,0xD9,0x73,0x3C,0x0E,0xCB,0x76,0x52,0x0B,0xA5,0x46,0x1D,0x09,
+ 0xDA,0x74,0x55,0x0F,0xA2,0x3F,0x21,0x05,0x9A,0x40,0x20,0x07,0x63,0x1E,0x10,0x01,
+ 0xDF,0xA9,0x85,0x1D,0xD3,0x84,0x4B,0x0E,0xCF,0x6F,0x49,0x0F,0xB3,0x48,0x1E,0x05,
+ 0xD8,0x77,0x52,0x12,0xB7,0x49,0x23,0x06,0xAA,0x45,0x28,0x07,0x7D,0x28,0x0F,0x07,
+ 0xCC,0x7B,0x4A,0x0E,0xB2,0x4F,0x24,0x07,0xAD,0x43,0x2C,0x06,0x86,0x29,0x11,0x07,
+ 0xAE,0x48,0x1F,0x0A,0x76,0x21,0x19,0x05,0x76,0x21,0x14,0x05,0x44,0x11,0x0B,0x01,
+ 0xE7,0xAD,0x96,0x23,0xDC,0x86,0x59,0x0E,0xDC,0x7C,0x5F,0x15,0xBB,0x53,0x2E,0x09,
+ 0xD6,0x7C,0x4A,0x16,0xBB,0x4A,0x25,0x08,0xB3,0x4F,0x28,0x0B,0x8E,0x23,0x15,0x08,
+ 0xCF,0x7F,0x57,0x11,0xB5,0x4A,0x23,0x0A,0xAA,0x42,0x28,0x05,0x7D,0x22,0x12,0x03,
+ 0xA6,0x49,0x28,0x09,0x82,0x2B,0x0D,0x04,0x7A,0x20,0x0F,0x04,0x3D,0x0F,0x09,0x03,
+ 0xD1,0x7C,0x4C,0x0F,0xAF,0x4E,0x21,0x09,0xA8,0x46,0x2A,0x07,0x85,0x1F,0x0E,0x07,
+ 0xA6,0x3F,0x26,0x07,0x7C,0x24,0x14,0x07,0x78,0x22,0x16,0x04,0x46,0x12,0x0A,0x02,
+ 0xA6,0x41,0x2C,0x0A,0x7E,0x28,0x11,0x05,0x73,0x1B,0x14,0x05,0x3D,0x11,0x0A,0x02,
+ 0x70,0x22,0x17,0x05,0x48,0x13,0x08,0x03,0x3C,0x07,0x0D,0x07,0x26,0x07,0x06,0x01,
+
+ 0xE0,0x9F,0xDA,0x7C,0x4F,0x18,0x28,0x0D,0xE9,0x9F,0xDA,0x7C,0x4F,0x18,0x1F,0x07,
+ 0xE6,0x97,0xD8,0x72,0x64,0x13,0x26,0x09,0xDC,0x67,0xA9,0x38,0x21,0x07,0x15,0x06,
+ 0xE9,0x91,0xD2,0x6B,0x63,0x14,0x2B,0x0E,0xD6,0x61,0xB7,0x41,0x2B,0x0E,0x10,0x09,
+ 0xCF,0x59,0xB0,0x2F,0x35,0x08,0x0F,0x07,0xB6,0x30,0x7A,0x21,0x17,0x07,0x09,0x03,
+ 0xE7,0xA3,0xE5,0x6B,0x65,0x1F,0x34,0x09,0xD8,0x6B,0xBE,0x45,0x27,0x07,0x10,0x07,
+ 0xDA,0x54,0xB1,0x39,0x2E,0x0E,0x17,0x08,0xA9,0x3C,0x86,0x22,0x16,0x06,0x07,0x03,
+ 0xD4,0x51,0xBC,0x3D,0x38,0x0A,0x13,0x06,0xB2,0x37,0x79,0x1C,0x17,0x05,0x0E,0x06,
+ 0xA7,0x31,0x74,0x1C,0x11,0x06,0x0C,0x02,0x6D,0x1A,0x38,0x10,0x0B,0x05,0x06,0x03,
+ 0xEB,0x9A,0xE1,0x7A,0x6F,0x13,0x34,0x0E,0xE6,0x75,0xC5,0x45,0x3E,0x0B,0x1A,0x05,
+ 0xD8,0x63,0xC1,0x40,0x3C,0x1B,0x19,0x06,0xB3,0x42,0x83,0x29,0x18,0x0A,0x08,0x04,
+ 0xD4,0x58,0xBA,0x43,0x3F,0x0A,0x1F,0x09,0xB1,0x33,0x8A,0x1F,0x1F,0x06,0x0D,0x05,
+ 0xAF,0x3C,0x7A,0x1F,0x16,0x08,0x0A,0x01,0x72,0x1B,0x52,0x0D,0x0B,0x09,0x06,0x01,
+ 0xCF,0x63,0xB7,0x47,0x40,0x10,0x14,0x06,0xC0,0x41,0x96,0x20,0x1C,0x09,0x10,0x05,
+ 0xA6,0x35,0x82,0x1A,0x20,0x0C,0x0E,0x04,0x80,0x1F,0x53,0x0F,0x0B,0x02,0x06,0x01,
+ 0xA6,0x31,0x81,0x1B,0x1D,0x01,0x08,0x08,0x7B,0x20,0x4D,0x19,0x0E,0x05,0x07,0x03,
+ 0x6B,0x17,0x49,0x07,0x0E,0x03,0x0A,0x05,0x37,0x0B,0x1F,0x06,0x04,0x02,0x07,0x01,
+
+ 0xF0,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x47,0x1E,0x6E,0x1B,0x32,0x0A,
+ 0xF0,0xD6,0xEA,0xA4,0xED,0xC4,0xDE,0x82,0x98,0x1F,0x50,0x13,0x52,0x15,0x2A,0x0A,
+ 0xF1,0xD1,0xEB,0xA2,0xEB,0xB7,0xD8,0x69,0xA2,0x1F,0x5B,0x18,0x55,0x18,0x2C,0x0A,
+ 0xED,0xB5,0xDE,0x7E,0xE6,0x85,0xD3,0x59,0x59,0x0F,0x2C,0x09,0x24,0x07,0x15,0x09,
+ 0xF1,0xD6,0xEA,0xA0,0xEC,0xBB,0xDA,0x77,0xA9,0x23,0x58,0x14,0x5D,0x12,0x2F,0x09,
+ 0xF1,0xC1,0xE3,0x86,0xE4,0x87,0xD2,0x4E,0x68,0x15,0x26,0x0B,0x27,0x09,0x15,0x02,
+ 0xEE,0xA6,0xE0,0x5C,0xE0,0x77,0xC3,0x41,0x67,0x1B,0x3C,0x07,0x2A,0x06,0x19,0x07,
+ 0xE4,0x75,0xC6,0x43,0xCC,0x50,0x95,0x23,0x35,0x09,0x14,0x04,0x15,0x05,0x0B,0x04,
+ 0xEE,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x56,0x14,0x5A,0x12,0x26,0x0A,
+ 0xEE,0xBB,0xE7,0x7E,0xE9,0x8D,0xCB,0x49,0x67,0x11,0x34,0x07,0x2B,0x0B,0x14,0x07,
+ 0xED,0xA7,0xE5,0x76,0xE3,0x7E,0xC4,0x4B,0x77,0x14,0x34,0x08,0x27,0x07,0x14,0x04,
+ 0xE7,0x8B,0xD2,0x4C,0xCA,0x56,0x9E,0x31,0x36,0x0C,0x11,0x07,0x14,0x04,0x0A,0x02,
+ 0xF0,0x9B,0xEA,0x6F,0xE5,0x81,0xC4,0x43,0x74,0x10,0x30,0x0B,0x2D,0x08,0x1B,0x06,
+ 0xE6,0x83,0xCA,0x48,0xD9,0x56,0xA7,0x23,0x3B,0x09,0x12,0x09,0x15,0x07,0x0A,0x03,
+ 0xE5,0x5F,0xCB,0x3C,0xCF,0x48,0x91,0x22,0x31,0x0A,0x17,0x08,0x15,0x04,0x0D,0x02,
+ 0xD1,0x43,0x91,0x20,0xA9,0x2D,0x54,0x12,0x17,0x07,0x09,0x02,0x0C,0x04,0x05,0x03,
+};
+#endif
+
+// Read/write handlers are divided into multiple functions to keep rarely-used
+// functionality separate so often-used functionality can be optimized better
+// by compiler.
+
+// If write isn't preceded by read, data has this added to it
+int const no_read_before_write = 0x2000;
+
+void Snes_Spc::cpu_write_smp_reg_( int data, rel_time_t time, int addr )
+{
+ switch ( addr )
+ {
+ case r_t0target:
+ case r_t1target:
+ case r_t2target: {
+ Timer* t = &m.timers [addr - r_t0target];
+ int period = IF_0_THEN_256( data );
+ if ( t->period != period )
+ {
+ t = run_timer( t, time );
+ #if SPC_MORE_ACCURACY
+ // Insane behavior when target is written just after counter is
+ // clocked and counter matches new period and new period isn't 1, 2, 4, or 8
+ if ( t->divider == (period & 0xFF) &&
+ t->next_time == time + TIMER_MUL( t, 1 ) &&
+ ((period - 1) | ~0x0F) & period )
+ {
+ //debug_printf( "SPC pathological timer target write\n" );
+
+ // If the period is 3, 5, or 9, there's a probability this behavior won't occur,
+ // based on the previous period
+ int prob = 0xFF;
+ int old_period = t->period & 0xFF;
+ if ( period == 3 ) prob = glitch_probs [0] [old_period];
+ if ( period == 5 ) prob = glitch_probs [1] [old_period];
+ if ( period == 9 ) prob = glitch_probs [2] [old_period];
+
+ // The glitch suppresses incrementing of one of the counter bits, based on
+ // the lowest set bit in the new period
+ int b = 1;
+ while ( !(period & b) )
+ b <<= 1;
+
+ if ( (rand() >> 4 & 0xFF) <= prob )
+ t->divider = (t->divider - b) & 0xFF;
+ }
+ #endif
+ t->period = period;
+ }
+ break;
+ }
+
+ case r_t0out:
+ case r_t1out:
+ case r_t2out:
+ if ( !SPC_MORE_ACCURACY )
+ debug_printf( "SPC wrote to counter %d\n", (int) addr - r_t0out );
+
+ if ( data < no_read_before_write / 2 )
+ run_timer( &m.timers [addr - r_t0out], time - 1 )->counter = 0;
+ break;
+
+ // Registers that act like RAM
+ case 0x8:
+ case 0x9:
+ REGS_IN [addr] = (uint8_t) data;
+ break;
+
+ case r_test:
+ if ( (uint8_t) data != 0x0A )
+ debug_printf( "SPC wrote to test register\n" );
+ break;
+
+ case r_control:
+ // port clears
+ if ( data & 0x10 )
+ {
+ REGS_IN [r_cpuio0] = 0;
+ REGS_IN [r_cpuio1] = 0;
+ }
+ if ( data & 0x20 )
+ {
+ REGS_IN [r_cpuio2] = 0;
+ REGS_IN [r_cpuio3] = 0;
+ }
+
+ // timers
+ {
+ for ( int i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ int enabled = data >> i & 1;
+ if ( t->enabled != enabled )
+ {
+ t = run_timer( t, time );
+ t->enabled = enabled;
+ if ( enabled )
+ {
+ t->divider = 0;
+ t->counter = 0;
+ }
+ }
+ }
+ }
+ enable_rom( data & 0x80 );
+ break;
+ }
+}
+
+void Snes_Spc::cpu_write_smp_reg( int data, rel_time_t time, int addr )
+{
+ if ( addr == r_dspdata ) // 99%
+ dsp_write( data, time );
+ else
+ cpu_write_smp_reg_( data, time, addr );
+}
+
+void Snes_Spc::cpu_write_high( int data, int i, rel_time_t time )
+{
+ if ( i < rom_size )
+ {
+ m.hi_ram [i] = (uint8_t) data;
+ if ( m.rom_enabled )
+ RAM [i + rom_addr] = m.rom [i]; // restore overwritten ROM
+ }
+ else
+ {
+ assert( RAM [i + rom_addr] == (uint8_t) data );
+ RAM [i + rom_addr] = cpu_pad_fill; // restore overwritten padding
+ cpu_write( data, i + rom_addr - 0x10000, time );
+ }
+}
+
+int const bits_in_int = CHAR_BIT * sizeof (int);
+
+void Snes_Spc::cpu_write( int data, int addr, rel_time_t time )
+{
+ MEM_ACCESS( time, addr )
+
+ // RAM
+ RAM [addr] = (uint8_t) data;
+ int reg = addr - 0xF0;
+ if ( reg >= 0 ) // 64%
+ {
+ // $F0-$FF
+ if ( reg < reg_count ) // 87%
+ {
+ REGS [reg] = (uint8_t) data;
+
+ // Ports
+ #ifdef SPC_PORT_WRITE_HOOK
+ if ( (unsigned) (reg - r_cpuio0) < port_count )
+ SPC_PORT_WRITE_HOOK( m.spc_time + time, (reg - r_cpuio0),
+ (uint8_t) data, &REGS [r_cpuio0] );
+ #endif
+
+ // Registers other than $F2 and $F4-$F7
+ //if ( reg != 2 && reg != 4 && reg != 5 && reg != 6 && reg != 7 )
+ // TODO: this is a bit on the fragile side
+ if ( ((~0x2F00 << (bits_in_int - 16)) << reg) < 0 ) // 36%
+ cpu_write_smp_reg( data, time, reg );
+ }
+ // High mem/address wrap-around
+ else
+ {
+ reg -= rom_addr - 0xF0;
+ if ( reg >= 0 ) // 1% in IPL ROM area or address wrapped around
+ cpu_write_high( data, reg, time );
+ }
+ }
+}
+
+
+//// CPU read
+
+inline int Snes_Spc::cpu_read_smp_reg( int reg, rel_time_t time )
+{
+ int result = REGS_IN [reg];
+ reg -= r_dspaddr;
+ // DSP addr and data
+ if ( (unsigned) reg <= 1 ) // 4% 0xF2 and 0xF3
+ {
+ result = REGS [r_dspaddr];
+ if ( (unsigned) reg == 1 )
+ result = dsp_read( time ); // 0xF3
+ }
+ return result;
+}
+
+int Snes_Spc::cpu_read( int addr, rel_time_t time )
+{
+ MEM_ACCESS( time, addr )
+
+ // RAM
+ int result = RAM [addr];
+ int reg = addr - 0xF0;
+ if ( reg >= 0 ) // 40%
+ {
+ reg -= 0x10;
+ if ( (unsigned) reg >= 0xFF00 ) // 21%
+ {
+ reg += 0x10 - r_t0out;
+
+ // Timers
+ if ( (unsigned) reg < timer_count ) // 90%
+ {
+ Timer* t = &m.timers [reg];
+ if ( time >= t->next_time )
+ t = run_timer_( t, time );
+ result = t->counter;
+ t->counter = 0;
+ }
+ // Other registers
+ else if ( reg < 0 ) // 10%
+ {
+ result = cpu_read_smp_reg( reg + r_t0out, time );
+ }
+ else // 1%
+ {
+ assert( reg + (r_t0out + 0xF0 - 0x10000) < 0x100 );
+ result = cpu_read( reg + (r_t0out + 0xF0 - 0x10000), time );
+ }
+ }
+ }
+
+ return result;
+}
+
+
+//// Run
+
+// Prefix and suffix for CPU emulator function
+#define SPC_CPU_RUN_FUNC \
+BOOST::uint8_t* Snes_Spc::run_until_( time_t end_time )\
+{\
+ rel_time_t rel_time = m.spc_time - end_time;\
+ assert( rel_time <= 0 );\
+ m.spc_time = end_time;\
+ m.dsp_time += rel_time;\
+ m.timers [0].next_time += rel_time;\
+ m.timers [1].next_time += rel_time;\
+ m.timers [2].next_time += rel_time;
+
+#define SPC_CPU_RUN_FUNC_END \
+ m.spc_time += rel_time;\
+ m.dsp_time -= rel_time;\
+ m.timers [0].next_time -= rel_time;\
+ m.timers [1].next_time -= rel_time;\
+ m.timers [2].next_time -= rel_time;\
+ assert( m.spc_time <= end_time );\
+ return &REGS [r_cpuio0];\
+}
+
+int const cpu_lag_max = 12 - 1; // DIV YA,X takes 12 clocks
+
+void Snes_Spc::end_frame( time_t end_time )
+{
+ // Catch CPU up to as close to end as possible. If final instruction
+ // would exceed end, does NOT execute it and leaves m.spc_time < end.
+ if ( end_time > m.spc_time )
+ run_until_( end_time );
+
+ m.spc_time -= end_time;
+ m.extra_clocks += end_time;
+
+ // Greatest number of clocks early that emulation can stop early due to
+ // not being able to execute current instruction without going over
+ // allowed time.
+ assert( -cpu_lag_max <= m.spc_time && m.spc_time <= 0 );
+
+ // Catch timers up to CPU
+ for ( int i = 0; i < timer_count; i++ )
+ run_timer( &m.timers [i], 0 );
+
+ // Catch DSP up to CPU
+ if ( m.dsp_time < 0 )
+ {
+ RUN_DSP( 0, max_reg_time );
+ }
+
+ // Save any extra samples beyond what should be generated
+ if ( m.buf_begin )
+ save_extra();
+}
+
+// Inclusion here allows static memory access functions and better optimization
+#include "Spc_Cpu.h"
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.h b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.h
new file mode 100644
index 00000000..7394475c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Cpu.h
@@ -0,0 +1,1220 @@
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+//// Memory access
+
+#if SPC_MORE_ACCURACY
+ #define SUSPICIOUS_OPCODE( name ) ((void) 0)
+#else
+ #define SUSPICIOUS_OPCODE( name ) debug_printf( "SPC: suspicious opcode: " name "\n" )
+#endif
+
+#define CPU_READ( time, offset, addr )\
+ cpu_read( addr, time + offset )
+
+#define CPU_WRITE( time, offset, addr, data )\
+ cpu_write( data, addr, time + offset )
+
+#if SPC_MORE_ACCURACY
+ #define CPU_READ_TIMER( time, offset, addr, out )\
+ { out = CPU_READ( time, offset, addr ); }
+
+#else
+ // timers are by far the most common thing read from dp
+ #define CPU_READ_TIMER( time, offset, addr_, out )\
+ {\
+ rel_time_t adj_time = time + offset;\
+ int dp_addr = addr_;\
+ int ti = dp_addr - (r_t0out + 0xF0);\
+ if ( (unsigned) ti < timer_count )\
+ {\
+ Timer* t = &m.timers [ti];\
+ if ( adj_time >= t->next_time )\
+ t = run_timer_( t, adj_time );\
+ out = t->counter;\
+ t->counter = 0;\
+ }\
+ else\
+ {\
+ out = ram [dp_addr];\
+ int i = dp_addr - 0xF0;\
+ if ( (unsigned) i < 0x10 )\
+ out = cpu_read_smp_reg( i, adj_time );\
+ }\
+ }
+#endif
+
+#define TIME_ADJ( n ) (n)
+
+#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out )
+#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) )
+#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) )
+
+#define DP_ADDR( addr ) (dp + (addr))
+
+#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out )
+#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) )
+#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data )
+
+#define READ_PROG16( addr ) GET_LE16( ram + (addr) )
+
+#define SET_PC( n ) (pc = ram + (n))
+#define GET_PC() (pc - ram)
+#define READ_PC( pc ) (*(pc))
+#define READ_PC16( pc ) GET_LE16( pc )
+
+// TODO: remove non-wrapping versions?
+#define SPC_NO_SP_WRAPAROUND 0
+
+#define SET_SP( v ) (sp = ram + 0x101 + (v))
+#define GET_SP() (sp - 0x101 - ram)
+
+#if SPC_NO_SP_WRAPAROUND
+#define PUSH16( v ) (sp -= 2, SET_LE16( sp, v ))
+#define PUSH( v ) (void) (*--sp = (uint8_t) (v))
+#define POP( out ) (void) ((out) = *sp++)
+
+#else
+#define PUSH16( data )\
+{\
+ int addr = (sp -= 2) - ram;\
+ if ( addr > 0x100 )\
+ {\
+ SET_LE16( sp, data );\
+ }\
+ else\
+ {\
+ ram [(uint8_t) addr + 0x100] = (uint8_t) data;\
+ sp [1] = (uint8_t) (data >> 8);\
+ sp += 0x100;\
+ }\
+}
+
+#define PUSH( data )\
+{\
+ *--sp = (uint8_t) (data);\
+ if ( sp - ram == 0x100 )\
+ sp += 0x100;\
+}
+
+#define POP( out )\
+{\
+ out = *sp++;\
+ if ( sp - ram == 0x201 )\
+ {\
+ out = sp [-0x101];\
+ sp -= 0x100;\
+ }\
+}
+
+#endif
+
+#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel )
+
+unsigned Snes_Spc::CPU_mem_bit( uint8_t const* pc, rel_time_t rel_time )
+{
+ unsigned addr = READ_PC16( pc );
+ unsigned t = READ( 0, addr & 0x1FFF ) >> (addr >> 13);
+ return t << 8 & 0x100;
+}
+
+//// Status flag handling
+
+// Hex value in name to clarify code and bit shifting.
+// Flag stored in indicated variable during emulation
+int const n80 = 0x80; // nz
+int const v40 = 0x40; // psw
+int const p20 = 0x20; // dp
+int const b10 = 0x10; // psw
+int const h08 = 0x08; // psw
+int const i04 = 0x04; // psw
+int const z02 = 0x02; // nz
+int const c01 = 0x01; // c
+
+int const nz_neg_mask = 0x880; // either bit set indicates N flag set
+
+#define GET_PSW( out )\
+{\
+ out = psw & ~(n80 | p20 | z02 | c01);\
+ out |= c >> 8 & c01;\
+ out |= dp >> 3 & p20;\
+ out |= ((nz >> 4) | nz) & n80;\
+ if ( !(uint8_t) nz ) out |= z02;\
+}
+
+#define SET_PSW( in )\
+{\
+ psw = in;\
+ c = in << 8;\
+ dp = in << 3 & 0x100;\
+ nz = (in << 4 & 0x800) | (~in & z02);\
+}
+
+SPC_CPU_RUN_FUNC
+{
+ uint8_t* const ram = RAM;
+ int a = m.cpu_regs.a;
+ int x = m.cpu_regs.x;
+ int y = m.cpu_regs.y;
+ uint8_t const* pc;
+ uint8_t* sp;
+ int psw;
+ int c;
+ int nz;
+ int dp;
+
+ SET_PC( m.cpu_regs.pc );
+ SET_SP( m.cpu_regs.sp );
+ SET_PSW( m.cpu_regs.psw );
+
+ goto loop;
+
+
+ // Main loop
+
+cbranch_taken_loop:
+ pc += *(BOOST::int8_t const*) pc;
+inc_pc_loop:
+ pc++;
+loop:
+{
+ unsigned opcode;
+ unsigned data;
+
+ check( (unsigned) a < 0x100 );
+ check( (unsigned) x < 0x100 );
+ check( (unsigned) y < 0x100 );
+
+ opcode = *pc;
+ if ( (rel_time += m.cycle_table [opcode]) > 0 )
+ goto out_of_time;
+
+ #ifdef SPC_CPU_OPCODE_HOOK
+ SPC_CPU_OPCODE_HOOK( GET_PC(), opcode );
+ #endif
+ /*
+ //SUB_CASE_COUNTER( 1 );
+ #define PROFILE_TIMER_LOOP( op, addr, len )\
+ if ( opcode == op )\
+ {\
+ int cond = (unsigned) ((addr) - 0xFD) < 3 &&\
+ pc [len] == 0xF0 && pc [len+1] == 0xFE - len;\
+ SUB_CASE_COUNTER( op && cond );\
+ }
+
+ PROFILE_TIMER_LOOP( 0xEC, GET_LE16( pc + 1 ), 3 );
+ PROFILE_TIMER_LOOP( 0xEB, pc [1], 2 );
+ PROFILE_TIMER_LOOP( 0xE4, pc [1], 2 );
+ */
+
+ // TODO: if PC is at end of memory, this will get wrong operand (very obscure)
+ data = *++pc;
+ switch ( opcode )
+ {
+
+// Common instructions
+
+#define BRANCH( cond )\
+{\
+ pc++;\
+ pc += (BOOST::int8_t) data;\
+ if ( cond )\
+ goto loop;\
+ pc -= (BOOST::int8_t) data;\
+ rel_time -= 2;\
+ goto loop;\
+}
+
+ case 0xF0: // BEQ
+ BRANCH( !(uint8_t) nz ) // 89% taken
+
+ case 0xD0: // BNE
+ BRANCH( (uint8_t) nz )
+
+ case 0x3F:{// CALL
+ int old_addr = GET_PC() + 2;
+ SET_PC( READ_PC16( pc ) );
+ PUSH16( old_addr );
+ goto loop;
+ }
+
+ case 0x6F:// RET
+ #if SPC_NO_SP_WRAPAROUND
+ {
+ SET_PC( GET_LE16( sp ) );
+ sp += 2;
+ }
+ #else
+ {
+ int addr = sp - ram;
+ SET_PC( GET_LE16( sp ) );
+ sp += 2;
+ if ( addr < 0x1FF )
+ goto loop;
+
+ SET_PC( sp [-0x101] * 0x100 + ram [(uint8_t) addr + 0x100] );
+ sp -= 0x100;
+ }
+ #endif
+ goto loop;
+
+ case 0xE4: // MOV a,dp
+ ++pc;
+ // 80% from timer
+ READ_DP_TIMER( 0, data, a = nz );
+ goto loop;
+
+ case 0xFA:{// MOV dp,dp
+ int temp;
+ READ_DP_TIMER( -2, data, temp );
+ data = temp + no_read_before_write ;
+ }
+ // fall through
+ case 0x8F:{// MOV dp,#imm
+ int temp = READ_PC( pc + 1 );
+ pc += 2;
+
+ #if !SPC_MORE_ACCURACY
+ {
+ int i = dp + temp;
+ ram [i] = (uint8_t) data;
+ i -= 0xF0;
+ if ( (unsigned) i < 0x10 ) // 76%
+ {
+ REGS [i] = (uint8_t) data;
+
+ // Registers other than $F2 and $F4-$F7
+ //if ( i != 2 && i != 4 && i != 5 && i != 6 && i != 7 )
+ if ( ((~0x2F00 << (bits_in_int - 16)) << i) < 0 ) // 12%
+ cpu_write_smp_reg( data, rel_time, i );
+ }
+ }
+ #else
+ WRITE_DP( 0, temp, data );
+ #endif
+ goto loop;
+ }
+
+ case 0xC4: // MOV dp,a
+ ++pc;
+ #if !SPC_MORE_ACCURACY
+ {
+ int i = dp + data;
+ ram [i] = (uint8_t) a;
+ i -= 0xF0;
+ if ( (unsigned) i < 0x10 ) // 39%
+ {
+ unsigned sel = i - 2;
+ REGS [i] = (uint8_t) a;
+
+ if ( sel == 1 ) // 51% $F3
+ dsp_write( a, rel_time );
+ else if ( sel > 1 ) // 1% not $F2 or $F3
+ cpu_write_smp_reg_( a, rel_time, i );
+ }
+ }
+ #else
+ WRITE_DP( 0, data, a );
+ #endif
+ goto loop;
+
+#define CASE( n ) case n:
+
+// Define common address modes based on opcode for immediate mode. Execution
+// ends with data set to the address of the operand.
+#define ADDR_MODES_( op )\
+ CASE( op - 0x02 ) /* (X) */\
+ data = x + dp;\
+ pc--;\
+ goto end_##op;\
+ CASE( op + 0x0F ) /* (dp)+Y */\
+ data = READ_PROG16( data + dp ) + y;\
+ goto end_##op;\
+ CASE( op - 0x01 ) /* (dp+X) */\
+ data = READ_PROG16( ((uint8_t) (data + x)) + dp );\
+ goto end_##op;\
+ CASE( op + 0x0E ) /* abs+Y */\
+ data += y;\
+ goto abs_##op;\
+ CASE( op + 0x0D ) /* abs+X */\
+ data += x;\
+ CASE( op - 0x03 ) /* abs */\
+ abs_##op:\
+ data += 0x100 * READ_PC( ++pc );\
+ goto end_##op;\
+ CASE( op + 0x0C ) /* dp+X */\
+ data = (uint8_t) (data + x);
+
+#define ADDR_MODES_NO_DP( op )\
+ ADDR_MODES_( op )\
+ data += dp;\
+ end_##op:
+
+#define ADDR_MODES( op )\
+ ADDR_MODES_( op )\
+ CASE( op - 0x04 ) /* dp */\
+ data += dp;\
+ end_##op:
+
+// 1. 8-bit Data Transmission Commands. Group I
+
+ ADDR_MODES_NO_DP( 0xE8 ) // MOV A,addr
+ a = nz = READ( 0, data );
+ goto inc_pc_loop;
+
+ case 0xBF:{// MOV A,(X)+
+ int temp = x + dp;
+ x = (uint8_t) (x + 1);
+ a = nz = READ( -1, temp );
+ goto loop;
+ }
+
+ case 0xE8: // MOV A,imm
+ a = data;
+ nz = data;
+ goto inc_pc_loop;
+
+ case 0xF9: // MOV X,dp+Y
+ data = (uint8_t) (data + y);
+ case 0xF8: // MOV X,dp
+ READ_DP_TIMER( 0, data, x = nz );
+ goto inc_pc_loop;
+
+ case 0xE9: // MOV X,abs
+ data = READ_PC16( pc );
+ ++pc;
+ data = READ( 0, data );
+ case 0xCD: // MOV X,imm
+ x = data;
+ nz = data;
+ goto inc_pc_loop;
+
+ case 0xFB: // MOV Y,dp+X
+ data = (uint8_t) (data + x);
+ case 0xEB: // MOV Y,dp
+ // 70% from timer
+ pc++;
+ READ_DP_TIMER( 0, data, y = nz );
+ goto loop;
+
+ case 0xEC:{// MOV Y,abs
+ int temp = READ_PC16( pc );
+ pc += 2;
+ READ_TIMER( 0, temp, y = nz );
+ //y = nz = READ( 0, temp );
+ goto loop;
+ }
+
+ case 0x8D: // MOV Y,imm
+ y = data;
+ nz = data;
+ goto inc_pc_loop;
+
+// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2
+
+ ADDR_MODES_NO_DP( 0xC8 ) // MOV addr,A
+ WRITE( 0, data, a );
+ goto inc_pc_loop;
+
+ {
+ int temp;
+ case 0xCC: // MOV abs,Y
+ temp = y;
+ goto mov_abs_temp;
+ case 0xC9: // MOV abs,X
+ temp = x;
+ mov_abs_temp:
+ WRITE( 0, READ_PC16( pc ), temp );
+ pc += 2;
+ goto loop;
+ }
+
+ case 0xD9: // MOV dp+Y,X
+ data = (uint8_t) (data + y);
+ case 0xD8: // MOV dp,X
+ WRITE( 0, data + dp, x );
+ goto inc_pc_loop;
+
+ case 0xDB: // MOV dp+X,Y
+ data = (uint8_t) (data + x);
+ case 0xCB: // MOV dp,Y
+ WRITE( 0, data + dp, y );
+ goto inc_pc_loop;
+
+// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3.
+
+ case 0x7D: // MOV A,X
+ a = x;
+ nz = x;
+ goto loop;
+
+ case 0xDD: // MOV A,Y
+ a = y;
+ nz = y;
+ goto loop;
+
+ case 0x5D: // MOV X,A
+ x = a;
+ nz = a;
+ goto loop;
+
+ case 0xFD: // MOV Y,A
+ y = a;
+ nz = a;
+ goto loop;
+
+ case 0x9D: // MOV X,SP
+ x = nz = GET_SP();
+ goto loop;
+
+ case 0xBD: // MOV SP,X
+ SET_SP( x );
+ goto loop;
+
+ //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2)
+
+ case 0xAF: // MOV (X)+,A
+ WRITE_DP( 0, x, a + no_read_before_write );
+ x++;
+ goto loop;
+
+// 5. 8-BIT LOGIC OPERATION COMMANDS
+
+#define LOGICAL_OP( op, func )\
+ ADDR_MODES( op ) /* addr */\
+ data = READ( 0, data );\
+ case op: /* imm */\
+ nz = a func##= data;\
+ goto inc_pc_loop;\
+ { unsigned addr;\
+ case op + 0x11: /* X,Y */\
+ data = READ_DP( -2, y );\
+ addr = x + dp;\
+ goto addr_##op;\
+ case op + 0x01: /* dp,dp */\
+ data = READ_DP( -3, data );\
+ case op + 0x10:{/*dp,imm*/\
+ uint8_t const* addr2 = pc + 1;\
+ pc += 2;\
+ addr = READ_PC( addr2 ) + dp;\
+ }\
+ addr_##op:\
+ nz = data func READ( -1, addr );\
+ WRITE( 0, addr, nz );\
+ goto loop;\
+ }
+
+ LOGICAL_OP( 0x28, & ); // AND
+
+ LOGICAL_OP( 0x08, | ); // OR
+
+ LOGICAL_OP( 0x48, ^ ); // EOR
+
+// 4. 8-BIT ARITHMETIC OPERATION COMMANDS
+
+ ADDR_MODES( 0x68 ) // CMP addr
+ data = READ( 0, data );
+ case 0x68: // CMP imm
+ nz = a - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x79: // CMP (X),(Y)
+ data = READ_DP( -2, y );
+ nz = READ_DP( -1, x ) - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto loop;
+
+ case 0x69: // CMP dp,dp
+ data = READ_DP( -3, data );
+ case 0x78: // CMP dp,imm
+ nz = READ_DP( -1, READ_PC( ++pc ) ) - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x3E: // CMP X,dp
+ data += dp;
+ goto cmp_x_addr;
+ case 0x1E: // CMP X,abs
+ data = READ_PC16( pc );
+ pc++;
+ cmp_x_addr:
+ data = READ( 0, data );
+ case 0xC8: // CMP X,imm
+ nz = x - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x7E: // CMP Y,dp
+ data += dp;
+ goto cmp_y_addr;
+ case 0x5E: // CMP Y,abs
+ data = READ_PC16( pc );
+ pc++;
+ cmp_y_addr:
+ data = READ( 0, data );
+ case 0xAD: // CMP Y,imm
+ nz = y - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ {
+ int addr;
+ case 0xB9: // SBC (x),(y)
+ case 0x99: // ADC (x),(y)
+ pc--; // compensate for inc later
+ data = READ_DP( -2, y );
+ addr = x + dp;
+ goto adc_addr;
+ case 0xA9: // SBC dp,dp
+ case 0x89: // ADC dp,dp
+ data = READ_DP( -3, data );
+ case 0xB8: // SBC dp,imm
+ case 0x98: // ADC dp,imm
+ addr = READ_PC( ++pc ) + dp;
+ adc_addr:
+ nz = READ( -1, addr );
+ goto adc_data;
+
+// catch ADC and SBC together, then decode later based on operand
+#undef CASE
+#define CASE( n ) case n: case (n) + 0x20:
+ ADDR_MODES( 0x88 ) // ADC/SBC addr
+ data = READ( 0, data );
+ case 0xA8: // SBC imm
+ case 0x88: // ADC imm
+ addr = -1; // A
+ nz = a;
+ adc_data: {
+ int flags;
+ if ( opcode >= 0xA0 ) // SBC
+ data ^= 0xFF;
+
+ flags = data ^ nz;
+ nz += data + (c >> 8 & 1);
+ flags ^= nz;
+
+ psw = (psw & ~(v40 | h08)) |
+ (flags >> 1 & h08) |
+ ((flags + 0x80) >> 2 & v40);
+ c = nz;
+ if ( addr < 0 )
+ {
+ a = (uint8_t) nz;
+ goto inc_pc_loop;
+ }
+ WRITE( 0, addr, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+ }
+
+ }
+
+// 6. ADDITION & SUBTRACTION COMMANDS
+
+#define INC_DEC_REG( reg, op )\
+ nz = reg op;\
+ reg = (uint8_t) nz;\
+ goto loop;
+
+ case 0xBC: INC_DEC_REG( a, + 1 ) // INC A
+ case 0x3D: INC_DEC_REG( x, + 1 ) // INC X
+ case 0xFC: INC_DEC_REG( y, + 1 ) // INC Y
+
+ case 0x9C: INC_DEC_REG( a, - 1 ) // DEC A
+ case 0x1D: INC_DEC_REG( x, - 1 ) // DEC X
+ case 0xDC: INC_DEC_REG( y, - 1 ) // DEC Y
+
+ case 0x9B: // DEC dp+X
+ case 0xBB: // INC dp+X
+ data = (uint8_t) (data + x);
+ case 0x8B: // DEC dp
+ case 0xAB: // INC dp
+ data += dp;
+ goto inc_abs;
+ case 0x8C: // DEC abs
+ case 0xAC: // INC abs
+ data = READ_PC16( pc );
+ pc++;
+ inc_abs:
+ nz = (opcode >> 4 & 2) - 1;
+ nz += READ( -1, data );
+ WRITE( 0, data, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+
+// 7. SHIFT, ROTATION COMMANDS
+
+ case 0x5C: // LSR A
+ c = 0;
+ case 0x7C:{// ROR A
+ nz = (c >> 1 & 0x80) | (a >> 1);
+ c = a << 8;
+ a = nz;
+ goto loop;
+ }
+
+ case 0x1C: // ASL A
+ c = 0;
+ case 0x3C:{// ROL A
+ int temp = c >> 8 & 1;
+ c = a << 1;
+ nz = c | temp;
+ a = (uint8_t) nz;
+ goto loop;
+ }
+
+ case 0x0B: // ASL dp
+ c = 0;
+ data += dp;
+ goto rol_mem;
+ case 0x1B: // ASL dp+X
+ c = 0;
+ case 0x3B: // ROL dp+X
+ data = (uint8_t) (data + x);
+ case 0x2B: // ROL dp
+ data += dp;
+ goto rol_mem;
+ case 0x0C: // ASL abs
+ c = 0;
+ case 0x2C: // ROL abs
+ data = READ_PC16( pc );
+ pc++;
+ rol_mem:
+ nz = c >> 8 & 1;
+ nz |= (c = READ( -1, data ) << 1);
+ WRITE( 0, data, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+
+ case 0x4B: // LSR dp
+ c = 0;
+ data += dp;
+ goto ror_mem;
+ case 0x5B: // LSR dp+X
+ c = 0;
+ case 0x7B: // ROR dp+X
+ data = (uint8_t) (data + x);
+ case 0x6B: // ROR dp
+ data += dp;
+ goto ror_mem;
+ case 0x4C: // LSR abs
+ c = 0;
+ case 0x6C: // ROR abs
+ data = READ_PC16( pc );
+ pc++;
+ ror_mem: {
+ int temp = READ( -1, data );
+ nz = (c >> 1 & 0x80) | (temp >> 1);
+ c = temp << 8;
+ WRITE( 0, data, nz );
+ goto inc_pc_loop;
+ }
+
+ case 0x9F: // XCN
+ nz = a = (a >> 4) | (uint8_t) (a << 4);
+ goto loop;
+
+// 8. 16-BIT TRANSMISION COMMANDS
+
+ case 0xBA: // MOVW YA,dp
+ a = READ_DP( -2, data );
+ nz = (a & 0x7F) | (a >> 1);
+ y = READ_DP( 0, (uint8_t) (data + 1) );
+ nz |= y;
+ goto inc_pc_loop;
+
+ case 0xDA: // MOVW dp,YA
+ WRITE_DP( -1, data, a );
+ WRITE_DP( 0, (uint8_t) (data + 1), y + no_read_before_write );
+ goto inc_pc_loop;
+
+// 9. 16-BIT OPERATION COMMANDS
+
+ case 0x3A: // INCW dp
+ case 0x1A:{// DECW dp
+ int temp;
+ // low byte
+ data += dp;
+ temp = READ( -3, data );
+ temp += (opcode >> 4 & 2) - 1; // +1 for INCW, -1 for DECW
+ nz = ((temp >> 1) | temp) & 0x7F;
+ WRITE( -2, data, /*(uint8_t)*/ temp );
+
+ // high byte
+ data = (uint8_t) (data + 1) + dp;
+ temp = (uint8_t) ((temp >> 8) + READ( -1, data ));
+ nz |= temp;
+ WRITE( 0, data, temp );
+
+ goto inc_pc_loop;
+ }
+
+ case 0x7A: // ADDW YA,dp
+ case 0x9A:{// SUBW YA,dp
+ int lo = READ_DP( -2, data );
+ int hi = READ_DP( 0, (uint8_t) (data + 1) );
+ int result;
+ int flags;
+
+ if ( opcode == 0x9A ) // SUBW
+ {
+ lo = (lo ^ 0xFF) + 1;
+ hi ^= 0xFF;
+ }
+
+ lo += a;
+ result = y + hi + (lo >> 8);
+ flags = hi ^ y ^ result;
+
+ psw = (psw & ~(v40 | h08)) |
+ (flags >> 1 & h08) |
+ ((flags + 0x80) >> 2 & v40);
+ c = result;
+ a = (uint8_t) lo;
+ result = (uint8_t) result;
+ y = result;
+ nz = (((lo >> 1) | lo) & 0x7F) | result;
+
+ goto inc_pc_loop;
+ }
+
+ case 0x5A: { // CMPW YA,dp
+ int temp = a - READ_DP( -1, data );
+ nz = ((temp >> 1) | temp) & 0x7F;
+ temp = y + (temp >> 8);
+ temp -= READ_DP( 0, (uint8_t) (data + 1) );
+ nz |= temp;
+ c = ~temp;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+ }
+
+// 10. MULTIPLICATION & DIVISON COMMANDS
+
+ case 0xCF: { // MUL YA
+ unsigned temp = y * a;
+ a = (uint8_t) temp;
+ nz = ((temp >> 1) | temp) & 0x7F;
+ y = temp >> 8;
+ nz |= y;
+ goto loop;
+ }
+
+ case 0x9E: // DIV YA,X
+ {
+ unsigned ya = y * 0x100 + a;
+
+ psw &= ~(h08 | v40);
+
+ if ( y >= x )
+ psw |= v40;
+
+ if ( (y & 15) >= (x & 15) )
+ psw |= h08;
+
+ if ( y < x * 2 )
+ {
+ a = ya / x;
+ y = ya - a * x;
+ }
+ else
+ {
+ a = 255 - (ya - x * 0x200) / (256 - x);
+ y = x + (ya - x * 0x200) % (256 - x);
+ }
+
+ nz = (uint8_t) a;
+ a = (uint8_t) a;
+
+ goto loop;
+ }
+
+// 11. DECIMAL COMPENSATION COMMANDS
+
+ case 0xDF: // DAA
+ SUSPICIOUS_OPCODE( "DAA" );
+ if ( a > 0x99 || c & 0x100 )
+ {
+ a += 0x60;
+ c = 0x100;
+ }
+
+ if ( (a & 0x0F) > 9 || psw & h08 )
+ a += 0x06;
+
+ nz = a;
+ a = (uint8_t) a;
+ goto loop;
+
+ case 0xBE: // DAS
+ SUSPICIOUS_OPCODE( "DAS" );
+ if ( a > 0x99 || !(c & 0x100) )
+ {
+ a -= 0x60;
+ c = 0;
+ }
+
+ if ( (a & 0x0F) > 9 || !(psw & h08) )
+ a -= 0x06;
+
+ nz = a;
+ a = (uint8_t) a;
+ goto loop;
+
+// 12. BRANCHING COMMANDS
+
+ case 0x2F: // BRA rel
+ pc += (BOOST::int8_t) data;
+ goto inc_pc_loop;
+
+ case 0x30: // BMI
+ BRANCH( (nz & nz_neg_mask) )
+
+ case 0x10: // BPL
+ BRANCH( !(nz & nz_neg_mask) )
+
+ case 0xB0: // BCS
+ BRANCH( c & 0x100 )
+
+ case 0x90: // BCC
+ BRANCH( !(c & 0x100) )
+
+ case 0x70: // BVS
+ BRANCH( psw & v40 )
+
+ case 0x50: // BVC
+ BRANCH( !(psw & v40) )
+
+ #define CBRANCH( cond )\
+ {\
+ pc++;\
+ if ( cond )\
+ goto cbranch_taken_loop;\
+ rel_time -= 2;\
+ goto inc_pc_loop;\
+ }
+
+ case 0x03: // BBS dp.bit,rel
+ case 0x23:
+ case 0x43:
+ case 0x63:
+ case 0x83:
+ case 0xA3:
+ case 0xC3:
+ case 0xE3:
+ CBRANCH( READ_DP( -4, data ) >> (opcode >> 5) & 1 )
+
+ case 0x13: // BBC dp.bit,rel
+ case 0x33:
+ case 0x53:
+ case 0x73:
+ case 0x93:
+ case 0xB3:
+ case 0xD3:
+ case 0xF3:
+ CBRANCH( !(READ_DP( -4, data ) >> (opcode >> 5) & 1) )
+
+ case 0xDE: // CBNE dp+X,rel
+ data = (uint8_t) (data + x);
+ // fall through
+ case 0x2E:{// CBNE dp,rel
+ int temp;
+ // 61% from timer
+ READ_DP_TIMER( -4, data, temp );
+ CBRANCH( temp != a )
+ }
+
+ case 0x6E: { // DBNZ dp,rel
+ unsigned temp = READ_DP( -4, data ) - 1;
+ WRITE_DP( -3, (uint8_t) data, /*(uint8_t)*/ temp + no_read_before_write );
+ CBRANCH( temp )
+ }
+
+ case 0xFE: // DBNZ Y,rel
+ y = (uint8_t) (y - 1);
+ BRANCH( y )
+
+ case 0x1F: // JMP [abs+X]
+ SET_PC( READ_PC16( pc ) + x );
+ // fall through
+ case 0x5F: // JMP abs
+ SET_PC( READ_PC16( pc ) );
+ goto loop;
+
+// 13. SUB-ROUTINE CALL RETURN COMMANDS
+
+ case 0x0F:{// BRK
+ int temp;
+ int ret_addr = GET_PC();
+ SUSPICIOUS_OPCODE( "BRK" );
+ SET_PC( READ_PROG16( 0xFFDE ) ); // vector address verified
+ PUSH16( ret_addr );
+ GET_PSW( temp );
+ psw = (psw | b10) & ~i04;
+ PUSH( temp );
+ goto loop;
+ }
+
+ case 0x4F:{// PCALL offset
+ int ret_addr = GET_PC() + 1;
+ SET_PC( 0xFF00 | data );
+ PUSH16( ret_addr );
+ goto loop;
+ }
+
+ case 0x01: // TCALL n
+ case 0x11:
+ case 0x21:
+ case 0x31:
+ case 0x41:
+ case 0x51:
+ case 0x61:
+ case 0x71:
+ case 0x81:
+ case 0x91:
+ case 0xA1:
+ case 0xB1:
+ case 0xC1:
+ case 0xD1:
+ case 0xE1:
+ case 0xF1: {
+ int ret_addr = GET_PC();
+ SET_PC( READ_PROG16( 0xFFDE - (opcode >> 3) ) );
+ PUSH16( ret_addr );
+ goto loop;
+ }
+
+// 14. STACK OPERATION COMMANDS
+
+ {
+ int temp;
+ case 0x7F: // RET1
+ temp = *sp;
+ SET_PC( GET_LE16( sp + 1 ) );
+ sp += 3;
+ goto set_psw;
+ case 0x8E: // POP PSW
+ POP( temp );
+ set_psw:
+ SET_PSW( temp );
+ goto loop;
+ }
+
+ case 0x0D: { // PUSH PSW
+ int temp;
+ GET_PSW( temp );
+ PUSH( temp );
+ goto loop;
+ }
+
+ case 0x2D: // PUSH A
+ PUSH( a );
+ goto loop;
+
+ case 0x4D: // PUSH X
+ PUSH( x );
+ goto loop;
+
+ case 0x6D: // PUSH Y
+ PUSH( y );
+ goto loop;
+
+ case 0xAE: // POP A
+ POP( a );
+ goto loop;
+
+ case 0xCE: // POP X
+ POP( x );
+ goto loop;
+
+ case 0xEE: // POP Y
+ POP( y );
+ goto loop;
+
+// 15. BIT OPERATION COMMANDS
+
+ case 0x02: // SET1
+ case 0x22:
+ case 0x42:
+ case 0x62:
+ case 0x82:
+ case 0xA2:
+ case 0xC2:
+ case 0xE2:
+ case 0x12: // CLR1
+ case 0x32:
+ case 0x52:
+ case 0x72:
+ case 0x92:
+ case 0xB2:
+ case 0xD2:
+ case 0xF2: {
+ int bit = 1 << (opcode >> 5);
+ int mask = ~bit;
+ if ( opcode & 0x10 )
+ bit = 0;
+ data += dp;
+ WRITE( 0, data, (READ( -1, data ) & mask) | bit );
+ goto inc_pc_loop;
+ }
+
+ case 0x0E: // TSET1 abs
+ case 0x4E: // TCLR1 abs
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -2, data );
+ nz = (uint8_t) (a - temp);
+ temp &= ~a;
+ if ( opcode == 0x0E )
+ temp |= a;
+ WRITE( 0, data, temp );
+ }
+ goto loop;
+
+ case 0x4A: // AND1 C,mem.bit
+ c &= MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+ case 0x6A: // AND1 C,/mem.bit
+ c &= ~MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+ case 0x0A: // OR1 C,mem.bit
+ c |= MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0x2A: // OR1 C,/mem.bit
+ c |= ~MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0x8A: // EOR1 C,mem.bit
+ c ^= MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0xEA: // NOT1 mem.bit
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -1, data & 0x1FFF );
+ temp ^= 1 << (data >> 13);
+ WRITE( 0, data & 0x1FFF, temp );
+ }
+ goto loop;
+
+ case 0xCA: // MOV1 mem.bit,C
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -2, data & 0x1FFF );
+ unsigned bit = data >> 13;
+ temp = (temp & ~(1 << bit)) | ((c >> 8 & 1) << bit);
+ WRITE( 0, data & 0x1FFF, temp + no_read_before_write );
+ }
+ goto loop;
+
+ case 0xAA: // MOV1 C,mem.bit
+ c = MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+// 16. PROGRAM PSW FLAG OPERATION COMMANDS
+
+ case 0x60: // CLRC
+ c = 0;
+ goto loop;
+
+ case 0x80: // SETC
+ c = ~0;
+ goto loop;
+
+ case 0xED: // NOTC
+ c ^= 0x100;
+ goto loop;
+
+ case 0xE0: // CLRV
+ psw &= ~(v40 | h08);
+ goto loop;
+
+ case 0x20: // CLRP
+ dp = 0;
+ goto loop;
+
+ case 0x40: // SETP
+ dp = 0x100;
+ goto loop;
+
+ case 0xA0: // EI
+ SUSPICIOUS_OPCODE( "EI" );
+ psw |= i04;
+ goto loop;
+
+ case 0xC0: // DI
+ SUSPICIOUS_OPCODE( "DI" );
+ psw &= ~i04;
+ goto loop;
+
+// 17. OTHER COMMANDS
+
+ case 0x00: // NOP
+ goto loop;
+
+ case 0xFF:{// STOP
+ // handle PC wrap-around
+ unsigned addr = GET_PC() - 1;
+ if ( addr >= 0x10000 )
+ {
+ addr &= 0xFFFF;
+ SET_PC( addr );
+ debug_printf( "SPC: PC wrapped around\n" );
+ goto loop;
+ }
+ }
+ // fall through
+ case 0xEF: // SLEEP
+ SUSPICIOUS_OPCODE( "STOP/SLEEP" );
+ --pc;
+ rel_time = 0;
+ m.cpu_error = "SPC emulation error";
+ goto stop;
+ } // switch
+
+ assert( 0 ); // catch any unhandled instructions
+}
+out_of_time:
+ rel_time -= m.cycle_table [*pc]; // undo partial execution of opcode
+stop:
+
+ // Uncache registers
+ if ( GET_PC() >= 0x10000 )
+ debug_printf( "SPC: PC wrapped around\n" );
+ m.cpu_regs.pc = (uint16_t) GET_PC();
+ m.cpu_regs.sp = ( uint8_t) GET_SP();
+ m.cpu_regs.a = ( uint8_t) a;
+ m.cpu_regs.x = ( uint8_t) x;
+ m.cpu_regs.y = ( uint8_t) y;
+ {
+ int temp;
+ GET_PSW( temp );
+ m.cpu_regs.psw = (uint8_t) temp;
+ }
+}
+SPC_CPU_RUN_FUNC_END
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.cpp
new file mode 100644
index 00000000..65f83fe5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.cpp
@@ -0,0 +1,703 @@
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+#include "Spc_Dsp.h"
+
+#include "blargg_endian.h"
+#include <string.h>
+
+/* Copyright (C) 2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifdef BLARGG_ENABLE_OPTIMIZER
+ #include BLARGG_ENABLE_OPTIMIZER
+#endif
+
+#if INT_MAX < 0x7FFFFFFF
+ #error "Requires that int type have at least 32 bits"
+#endif
+
+
+// TODO: add to blargg_endian.h
+#define GET_LE16SA( addr ) ((BOOST::int16_t) GET_LE16( addr ))
+#define GET_LE16A( addr ) GET_LE16( addr )
+#define SET_LE16A( addr, data ) SET_LE16( addr, data )
+
+static BOOST::uint8_t const initial_regs [Spc_Dsp::register_count] =
+{
+ 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80,
+ 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF,
+ 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A,
+ 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF,
+ 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67,
+ 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x9C,0x4E,0x7B,0xFF,
+ 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F,
+ 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF
+};
+
+// if ( io < -32768 ) io = -32768;
+// if ( io > 32767 ) io = 32767;
+#define CLAMP16( io )\
+{\
+ if ( (int16_t) io != io )\
+ io = (io >> 31) ^ 0x7FFF;\
+}
+
+// Access global DSP register
+#define REG(n) m.regs [r_##n]
+
+// Access voice DSP register
+#define VREG(r,n) r [v_##n]
+
+#define WRITE_SAMPLES( l, r, out ) \
+{\
+ out [0] = l;\
+ out [1] = r;\
+ out += 2;\
+ if ( out >= m.out_end )\
+ {\
+ check( out == m.out_end );\
+ check( m.out_end != &m.extra [extra_size] || \
+ (m.extra <= m.out_begin && m.extra < &m.extra [extra_size]) );\
+ out = m.extra;\
+ m.out_end = &m.extra [extra_size];\
+ }\
+}\
+
+void Spc_Dsp::set_output( sample_t* out, int size )
+{
+ require( (size & 1) == 0 ); // must be even
+ if ( !out )
+ {
+ out = m.extra;
+ size = extra_size;
+ }
+ m.out_begin = out;
+ m.out = out;
+ m.out_end = out + size;
+}
+
+// Volume registers and efb are signed! Easy to forget int8_t cast.
+// Prefixes are to avoid accidental use of locals with same names.
+
+// Interleved gauss table (to improve cache coherency)
+// interleved_gauss [i] = gauss [(i & 1) * 256 + 255 - (i >> 1 & 0xFF)]
+static short const interleved_gauss [512] =
+{
+ 370,1305, 366,1305, 362,1304, 358,1304, 354,1304, 351,1304, 347,1304, 343,1303,
+ 339,1303, 336,1303, 332,1302, 328,1302, 325,1301, 321,1300, 318,1300, 314,1299,
+ 311,1298, 307,1297, 304,1297, 300,1296, 297,1295, 293,1294, 290,1293, 286,1292,
+ 283,1291, 280,1290, 276,1288, 273,1287, 270,1286, 267,1284, 263,1283, 260,1282,
+ 257,1280, 254,1279, 251,1277, 248,1275, 245,1274, 242,1272, 239,1270, 236,1269,
+ 233,1267, 230,1265, 227,1263, 224,1261, 221,1259, 218,1257, 215,1255, 212,1253,
+ 210,1251, 207,1248, 204,1246, 201,1244, 199,1241, 196,1239, 193,1237, 191,1234,
+ 188,1232, 186,1229, 183,1227, 180,1224, 178,1221, 175,1219, 173,1216, 171,1213,
+ 168,1210, 166,1207, 163,1205, 161,1202, 159,1199, 156,1196, 154,1193, 152,1190,
+ 150,1186, 147,1183, 145,1180, 143,1177, 141,1174, 139,1170, 137,1167, 134,1164,
+ 132,1160, 130,1157, 128,1153, 126,1150, 124,1146, 122,1143, 120,1139, 118,1136,
+ 117,1132, 115,1128, 113,1125, 111,1121, 109,1117, 107,1113, 106,1109, 104,1106,
+ 102,1102, 100,1098, 99,1094, 97,1090, 95,1086, 94,1082, 92,1078, 90,1074,
+ 89,1070, 87,1066, 86,1061, 84,1057, 83,1053, 81,1049, 80,1045, 78,1040,
+ 77,1036, 76,1032, 74,1027, 73,1023, 71,1019, 70,1014, 69,1010, 67,1005,
+ 66,1001, 65, 997, 64, 992, 62, 988, 61, 983, 60, 978, 59, 974, 58, 969,
+ 56, 965, 55, 960, 54, 955, 53, 951, 52, 946, 51, 941, 50, 937, 49, 932,
+ 48, 927, 47, 923, 46, 918, 45, 913, 44, 908, 43, 904, 42, 899, 41, 894,
+ 40, 889, 39, 884, 38, 880, 37, 875, 36, 870, 36, 865, 35, 860, 34, 855,
+ 33, 851, 32, 846, 32, 841, 31, 836, 30, 831, 29, 826, 29, 821, 28, 816,
+ 27, 811, 27, 806, 26, 802, 25, 797, 24, 792, 24, 787, 23, 782, 23, 777,
+ 22, 772, 21, 767, 21, 762, 20, 757, 20, 752, 19, 747, 19, 742, 18, 737,
+ 17, 732, 17, 728, 16, 723, 16, 718, 15, 713, 15, 708, 15, 703, 14, 698,
+ 14, 693, 13, 688, 13, 683, 12, 678, 12, 674, 11, 669, 11, 664, 11, 659,
+ 10, 654, 10, 649, 10, 644, 9, 640, 9, 635, 9, 630, 8, 625, 8, 620,
+ 8, 615, 7, 611, 7, 606, 7, 601, 6, 596, 6, 592, 6, 587, 6, 582,
+ 5, 577, 5, 573, 5, 568, 5, 563, 4, 559, 4, 554, 4, 550, 4, 545,
+ 4, 540, 3, 536, 3, 531, 3, 527, 3, 522, 3, 517, 2, 513, 2, 508,
+ 2, 504, 2, 499, 2, 495, 2, 491, 2, 486, 1, 482, 1, 477, 1, 473,
+ 1, 469, 1, 464, 1, 460, 1, 456, 1, 451, 1, 447, 1, 443, 1, 439,
+ 0, 434, 0, 430, 0, 426, 0, 422, 0, 418, 0, 414, 0, 410, 0, 405,
+ 0, 401, 0, 397, 0, 393, 0, 389, 0, 385, 0, 381, 0, 378, 0, 374,
+};
+
+
+//// Counters
+
+#define RATE( rate, div )\
+ (rate >= div ? rate / div * 8 - 1 : rate - 1)
+
+static unsigned const counter_mask [32] =
+{
+ RATE( 2,2), RATE(2048,4), RATE(1536,3),
+ RATE(1280,5), RATE(1024,4), RATE( 768,3),
+ RATE( 640,5), RATE( 512,4), RATE( 384,3),
+ RATE( 320,5), RATE( 256,4), RATE( 192,3),
+ RATE( 160,5), RATE( 128,4), RATE( 96,3),
+ RATE( 80,5), RATE( 64,4), RATE( 48,3),
+ RATE( 40,5), RATE( 32,4), RATE( 24,3),
+ RATE( 20,5), RATE( 16,4), RATE( 12,3),
+ RATE( 10,5), RATE( 8,4), RATE( 6,3),
+ RATE( 5,5), RATE( 4,4), RATE( 3,3),
+ RATE( 2,4),
+ RATE( 1,4)
+};
+#undef RATE
+
+inline void Spc_Dsp::init_counter()
+{
+ // counters start out with this synchronization
+ m.counters [0] = 1;
+ m.counters [1] = 0;
+ m.counters [2] = -0x20u;
+ m.counters [3] = 0x0B;
+
+ int n = 2;
+ for ( int i = 1; i < 32; i++ )
+ {
+ m.counter_select [i] = &m.counters [n];
+ if ( !--n )
+ n = 3;
+ }
+ m.counter_select [ 0] = &m.counters [0];
+ m.counter_select [30] = &m.counters [2];
+}
+
+inline void Spc_Dsp::run_counter( int i )
+{
+ int n = m.counters [i];
+ if ( !(n-- & 7) )
+ n -= 6 - i;
+ m.counters [i] = n;
+}
+
+#define READ_COUNTER( rate )\
+ (*m.counter_select [rate] & counter_mask [rate])
+
+
+//// Emulation
+
+void Spc_Dsp::run( int clock_count )
+{
+ int new_phase = m.phase + clock_count;
+ int count = new_phase >> 5;
+ m.phase = new_phase & 31;
+ if ( !count )
+ return;
+
+ uint8_t* const ram = m.ram;
+ uint8_t const* const dir = &ram [REG(dir) * 0x100];
+ int const slow_gaussian = (REG(pmon) >> 1) | REG(non);
+ int const noise_rate = REG(flg) & 0x1F;
+
+ // Global volume
+ int mvoll = (int8_t) REG(mvoll);
+ int mvolr = (int8_t) REG(mvolr);
+ if ( mvoll * mvolr < m.surround_threshold )
+ mvoll = -mvoll; // eliminate surround
+
+ do
+ {
+ // KON/KOFF reading
+ if ( (m.every_other_sample ^= 1) != 0 )
+ {
+ m.new_kon &= ~m.kon;
+ m.kon = m.new_kon;
+ m.t_koff = REG(koff);
+ }
+
+ run_counter( 1 );
+ run_counter( 2 );
+ run_counter( 3 );
+
+ // Noise
+ if ( !READ_COUNTER( noise_rate ) )
+ {
+ int feedback = (m.noise << 13) ^ (m.noise << 14);
+ m.noise = (feedback & 0x4000) ^ (m.noise >> 1);
+ }
+
+ // Voices
+ int pmon_input = 0;
+ int main_out_l = 0;
+ int main_out_r = 0;
+ int echo_out_l = 0;
+ int echo_out_r = 0;
+ voice_t* v = m.voices;
+ uint8_t* v_regs = m.regs;
+ int vbit = 1;
+ do
+ {
+ #define SAMPLE_PTR(i) GET_LE16A( &dir [VREG(v_regs,srcn) * 4 + i * 2] )
+
+ int brr_header = ram [v->brr_addr];
+ int kon_delay = v->kon_delay;
+
+ // Pitch
+ int pitch = GET_LE16A( &VREG(v_regs,pitchl) ) & 0x3FFF;
+ if ( REG(pmon) & vbit )
+ pitch += ((pmon_input >> 5) * pitch) >> 10;
+
+ // KON phases
+ if ( --kon_delay >= 0 )
+ {
+ v->kon_delay = kon_delay;
+
+ // Get ready to start BRR decoding on next sample
+ if ( kon_delay == 4 )
+ {
+ v->brr_addr = SAMPLE_PTR( 0 );
+ v->brr_offset = 1;
+ v->buf_pos = v->buf;
+ brr_header = 0; // header is ignored on this sample
+ }
+
+ // Envelope is never run during KON
+ v->env = 0;
+ v->hidden_env = 0;
+
+ // Disable BRR decoding until last three samples
+ v->interp_pos = (kon_delay & 3 ? 0x4000 : 0);
+
+ // Pitch is never added during KON
+ pitch = 0;
+ }
+
+ int env = v->env;
+
+ // Gaussian interpolation
+ {
+ int output = 0;
+ VREG(v_regs,envx) = (uint8_t) (env >> 4);
+ if ( env )
+ {
+ // Make pointers into gaussian based on fractional position between samples
+ int offset = (unsigned) v->interp_pos >> 3 & 0x1FE;
+ short const* fwd = interleved_gauss + offset;
+ short const* rev = interleved_gauss + 510 - offset; // mirror left half of gaussian
+
+ int const* in = &v->buf_pos [(unsigned) v->interp_pos >> 12];
+
+ if ( !(slow_gaussian & vbit) ) // 99%
+ {
+ // Faster approximation when exact sample value isn't necessary for pitch mod
+ output = (fwd [0] * in [0] +
+ fwd [1] * in [1] +
+ rev [1] * in [2] +
+ rev [0] * in [3]) >> 11;
+ output = (output * env) >> 11;
+ }
+ else
+ {
+ output = (int16_t) (m.noise * 2);
+ if ( !(REG(non) & vbit) )
+ {
+ output = (fwd [0] * in [0]) >> 11;
+ output += (fwd [1] * in [1]) >> 11;
+ output += (rev [1] * in [2]) >> 11;
+ output = (int16_t) output;
+ output += (rev [0] * in [3]) >> 11;
+
+ CLAMP16( output );
+ output &= ~1;
+ }
+ output = (output * env) >> 11 & ~1;
+ }
+
+ // Output
+ int l = output * v->volume [0];
+ int r = output * v->volume [1];
+
+ main_out_l += l;
+ main_out_r += r;
+
+ if ( REG(eon) & vbit )
+ {
+ echo_out_l += l;
+ echo_out_r += r;
+ }
+ }
+
+ pmon_input = output;
+ VREG(v_regs,outx) = (uint8_t) (output >> 8);
+ }
+
+ // Soft reset or end of sample
+ if ( REG(flg) & 0x80 || (brr_header & 3) == 1 )
+ {
+ v->env_mode = env_release;
+ env = 0;
+ }
+
+ if ( m.every_other_sample )
+ {
+ // KOFF
+ if ( m.t_koff & vbit )
+ v->env_mode = env_release;
+
+ // KON
+ if ( m.kon & vbit )
+ {
+ v->kon_delay = 5;
+ v->env_mode = env_attack;
+ REG(endx) &= ~vbit;
+ }
+ }
+
+ // Envelope
+ if ( !v->kon_delay )
+ {
+ if ( v->env_mode == env_release ) // 97%
+ {
+ env -= 0x8;
+ v->env = env;
+ if ( env <= 0 )
+ {
+ v->env = 0;
+ goto skip_brr; // no BRR decoding for you!
+ }
+ }
+ else // 3%
+ {
+ int rate;
+ int const adsr0 = VREG(v_regs,adsr0);
+ int env_data = VREG(v_regs,adsr1);
+ if ( adsr0 >= 0x80 ) // 97% ADSR
+ {
+ if ( v->env_mode > env_decay ) // 89%
+ {
+ env--;
+ env -= env >> 8;
+ rate = env_data & 0x1F;
+
+ // optimized handling
+ v->hidden_env = env;
+ if ( READ_COUNTER( rate ) )
+ goto exit_env;
+ v->env = env;
+ goto exit_env;
+ }
+ else if ( v->env_mode == env_decay )
+ {
+ env--;
+ env -= env >> 8;
+ rate = (adsr0 >> 3 & 0x0E) + 0x10;
+ }
+ else // env_attack
+ {
+ rate = (adsr0 & 0x0F) * 2 + 1;
+ env += rate < 31 ? 0x20 : 0x400;
+ }
+ }
+ else // GAIN
+ {
+ int mode;
+ env_data = VREG(v_regs,gain);
+ mode = env_data >> 5;
+ if ( mode < 4 ) // direct
+ {
+ env = env_data * 0x10;
+ rate = 31;
+ }
+ else
+ {
+ rate = env_data & 0x1F;
+ if ( mode == 4 ) // 4: linear decrease
+ {
+ env -= 0x20;
+ }
+ else if ( mode < 6 ) // 5: exponential decrease
+ {
+ env--;
+ env -= env >> 8;
+ }
+ else // 6,7: linear increase
+ {
+ env += 0x20;
+ if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 )
+ env += 0x8 - 0x20; // 7: two-slope linear increase
+ }
+ }
+ }
+
+ // Sustain level
+ if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay )
+ v->env_mode = env_sustain;
+
+ v->hidden_env = env;
+
+ // unsigned cast because linear decrease going negative also triggers this
+ if ( (unsigned) env > 0x7FF )
+ {
+ env = (env < 0 ? 0 : 0x7FF);
+ if ( v->env_mode == env_attack )
+ v->env_mode = env_decay;
+ }
+
+ if ( !READ_COUNTER( rate ) )
+ v->env = env; // nothing else is controlled by the counter
+ }
+ }
+ exit_env:
+
+ {
+ // Apply pitch
+ int old_pos = v->interp_pos;
+ int interp_pos = (old_pos & 0x3FFF) + pitch;
+ if ( interp_pos > 0x7FFF )
+ interp_pos = 0x7FFF;
+ v->interp_pos = interp_pos;
+
+ // BRR decode if necessary
+ if ( old_pos >= 0x4000 )
+ {
+ // Arrange the four input nybbles in 0xABCD order for easy decoding
+ int nybbles = ram [(v->brr_addr + v->brr_offset) & 0xFFFF] * 0x100 +
+ ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF];
+
+ // Advance read position
+ int const brr_block_size = 9;
+ int brr_offset = v->brr_offset;
+ if ( (brr_offset += 2) >= brr_block_size )
+ {
+ // Next BRR block
+ int brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF;
+ assert( brr_offset == brr_block_size );
+ if ( brr_header & 1 )
+ {
+ brr_addr = SAMPLE_PTR( 1 );
+ if ( !v->kon_delay )
+ REG(endx) |= vbit;
+ }
+ v->brr_addr = brr_addr;
+ brr_offset = 1;
+ }
+ v->brr_offset = brr_offset;
+
+ // Decode
+
+ // 0: >>1 1: <<0 2: <<1 ... 12: <<11 13-15: >>4 <<11
+ static unsigned char const shifts [16 * 2] = {
+ 13,12,12,12,12,12,12,12,12,12,12, 12, 12, 16, 16, 16,
+ 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 11, 11
+ };
+ int const scale = brr_header >> 4;
+ int const right_shift = shifts [scale];
+ int const left_shift = shifts [scale + 16];
+
+ // Write to next four samples in circular buffer
+ int* pos = v->buf_pos;
+ int* end;
+
+ // Decode four samples
+ for ( end = pos + 4; pos < end; pos++, nybbles <<= 4 )
+ {
+ // Extract upper nybble and scale appropriately
+ int s = ((int16_t) nybbles >> right_shift) << left_shift;
+
+ // Apply IIR filter (8 is the most commonly used)
+ int const filter = brr_header & 0x0C;
+ int const p1 = pos [brr_buf_size - 1];
+ int const p2 = pos [brr_buf_size - 2] >> 1;
+ if ( filter >= 8 )
+ {
+ s += p1;
+ s -= p2;
+ if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875
+ {
+ s += p2 >> 4;
+ s += (p1 * -3) >> 6;
+ }
+ else // s += p1 * 0.8984375 - p2 * 0.40625
+ {
+ s += (p1 * -13) >> 7;
+ s += (p2 * 3) >> 4;
+ }
+ }
+ else if ( filter ) // s += p1 * 0.46875
+ {
+ s += p1 >> 1;
+ s += (-p1) >> 5;
+ }
+
+ // Adjust and write sample
+ CLAMP16( s );
+ s = (int16_t) (s * 2);
+ pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around
+ }
+
+ if ( pos >= &v->buf [brr_buf_size] )
+ pos = v->buf;
+ v->buf_pos = pos;
+ }
+ }
+skip_brr:
+ // Next voice
+ vbit <<= 1;
+ v_regs += 0x10;
+ v++;
+ }
+ while ( vbit < 0x100 );
+
+ // Echo position
+ int echo_offset = m.echo_offset;
+ uint8_t* const echo_ptr = &ram [(REG(esa) * 0x100 + echo_offset) & 0xFFFF];
+ if ( !echo_offset )
+ m.echo_length = (REG(edl) & 0x0F) * 0x800;
+ echo_offset += 4;
+ if ( echo_offset >= m.echo_length )
+ echo_offset = 0;
+ m.echo_offset = echo_offset;
+
+ // FIR
+ int echo_in_l = GET_LE16SA( echo_ptr + 0 );
+ int echo_in_r = GET_LE16SA( echo_ptr + 2 );
+
+ int (*echo_hist_pos) [2] = m.echo_hist_pos;
+ if ( ++echo_hist_pos >= &m.echo_hist [echo_hist_size] )
+ echo_hist_pos = m.echo_hist;
+ m.echo_hist_pos = echo_hist_pos;
+
+ echo_hist_pos [0] [0] = echo_hist_pos [8] [0] = echo_in_l;
+ echo_hist_pos [0] [1] = echo_hist_pos [8] [1] = echo_in_r;
+
+ #define CALC_FIR_( i, in ) ((in) * (int8_t) REG(fir + i * 0x10))
+ echo_in_l = CALC_FIR_( 7, echo_in_l );
+ echo_in_r = CALC_FIR_( 7, echo_in_r );
+
+ #define CALC_FIR( i, ch ) CALC_FIR_( i, echo_hist_pos [i + 1] [ch] )
+ #define DO_FIR( i )\
+ echo_in_l += CALC_FIR( i, 0 );\
+ echo_in_r += CALC_FIR( i, 1 );
+ DO_FIR( 0 );
+ DO_FIR( 1 );
+ DO_FIR( 2 );
+ #if defined (__MWERKS__) && __MWERKS__ < 0x3200
+ __eieio(); // keeps compiler from stupidly "caching" things in memory
+ #endif
+ DO_FIR( 3 );
+ DO_FIR( 4 );
+ DO_FIR( 5 );
+ DO_FIR( 6 );
+
+ // Echo out
+ if ( !(REG(flg) & 0x20) )
+ {
+ int l = (echo_out_l >> 7) + ((echo_in_l * (int8_t) REG(efb)) >> 14);
+ int r = (echo_out_r >> 7) + ((echo_in_r * (int8_t) REG(efb)) >> 14);
+
+ // just to help pass more validation tests
+ #if SPC_MORE_ACCURACY
+ l &= ~1;
+ r &= ~1;
+ #endif
+
+ CLAMP16( l );
+ CLAMP16( r );
+
+ SET_LE16A( echo_ptr + 0, l );
+ SET_LE16A( echo_ptr + 2, r );
+ }
+
+ // Sound out
+ int l = (main_out_l * mvoll + echo_in_l * (int8_t) REG(evoll)) >> 14;
+ int r = (main_out_r * mvolr + echo_in_r * (int8_t) REG(evolr)) >> 14;
+
+ CLAMP16( l );
+ CLAMP16( r );
+
+ if ( (REG(flg) & 0x40) )
+ {
+ l = 0;
+ r = 0;
+ }
+
+ sample_t* out = m.out;
+ WRITE_SAMPLES( l, r, out );
+ m.out = out;
+ }
+ while ( --count );
+}
+
+
+//// Setup
+
+void Spc_Dsp::mute_voices( int mask )
+{
+ m.mute_mask = mask;
+ for ( int i = 0; i < voice_count; i++ )
+ {
+ m.voices [i].enabled = (mask >> i & 1) - 1;
+ update_voice_vol( i * 0x10 );
+ }
+}
+
+void Spc_Dsp::init( void* ram_64k )
+{
+ m.ram = (uint8_t*) ram_64k;
+ mute_voices( 0 );
+ disable_surround( false );
+ set_output( 0, 0 );
+ reset();
+
+ #ifndef NDEBUG
+ // be sure this sign-extends
+ assert( (int16_t) 0x8000 == -0x8000 );
+
+ // be sure right shift preserves sign
+ assert( (-1 >> 1) == -1 );
+
+ // check clamp macro
+ int i;
+ i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF );
+ i = -0x8001; CLAMP16( i ); assert( i == -0x8000 );
+
+ blargg_verify_byte_order();
+ #endif
+}
+
+void Spc_Dsp::soft_reset_common()
+{
+ require( m.ram ); // init() must have been called already
+
+ m.noise = 0x4000;
+ m.echo_hist_pos = m.echo_hist;
+ m.every_other_sample = 1;
+ m.echo_offset = 0;
+ m.phase = 0;
+
+ init_counter();
+}
+
+void Spc_Dsp::soft_reset()
+{
+ REG(flg) = 0xE0;
+ soft_reset_common();
+}
+
+void Spc_Dsp::load( uint8_t const regs [register_count] )
+{
+ memcpy( m.regs, regs, sizeof m.regs );
+ memset( &m.regs [register_count], 0, offsetof (state_t,ram) - register_count );
+
+ // Internal state
+ int i;
+ for ( i = voice_count; --i >= 0; )
+ {
+ voice_t& v = m.voices [i];
+ v.brr_offset = 1;
+ v.buf_pos = v.buf;
+ }
+ m.new_kon = REG(kon);
+
+ mute_voices( m.mute_mask );
+ soft_reset_common();
+}
+
+void Spc_Dsp::reset() { load( initial_regs ); }
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.h b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.h
new file mode 100644
index 00000000..bc0efe5f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Dsp.h
@@ -0,0 +1,212 @@
+// Fast SNES SPC-700 DSP emulator (about 3x speed of accurate one)
+
+// Game_Music_Emu 0.5.5
+#ifndef SPC_DSP_H
+#define SPC_DSP_H
+
+#include "blargg_common.h"
+
+struct Spc_Dsp {
+public:
+ typedef BOOST::uint8_t uint8_t;
+
+// Setup
+
+ // Initializes DSP and has it use the 64K RAM provided
+ void init( void* ram_64k );
+
+ // Sets destination for output samples. If out is NULL or out_size is 0,
+ // doesn't generate any.
+ typedef short sample_t;
+ void set_output( sample_t* out, int out_size );
+
+ // Number of samples written to output since it was last set, always
+ // a multiple of 2. Undefined if more samples were generated than
+ // output buffer could hold.
+ int sample_count() const;
+
+// Emulation
+
+ // Resets DSP to power-on state
+ void reset();
+
+ // Emulates pressing reset switch on SNES
+ void soft_reset();
+
+ // Reads/writes DSP registers. For accuracy, you must first call spc_run_dsp()
+ // to catch the DSP up to present.
+ int read ( int addr ) const;
+ void write( int addr, int data );
+
+ // Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks
+ // a pair of samples is be generated.
+ void run( int clock_count );
+
+// Sound control
+
+ // Mutes voices corresponding to non-zero bits in mask (overrides VxVOL with 0).
+ // Reduces emulation accuracy.
+ enum { voice_count = 8 };
+ void mute_voices( int mask );
+
+ // If true, prevents channels and global volumes from being phase-negated
+ void disable_surround( bool disable = true );
+
+// State
+
+ // Resets DSP and uses supplied values to initialize registers
+ enum { register_count = 128 };
+ void load( uint8_t const regs [register_count] );
+
+// DSP register addresses
+
+ // Global registers
+ enum {
+ r_mvoll = 0x0C, r_mvolr = 0x1C,
+ r_evoll = 0x2C, r_evolr = 0x3C,
+ r_kon = 0x4C, r_koff = 0x5C,
+ r_flg = 0x6C, r_endx = 0x7C,
+ r_efb = 0x0D, r_pmon = 0x2D,
+ r_non = 0x3D, r_eon = 0x4D,
+ r_dir = 0x5D, r_esa = 0x6D,
+ r_edl = 0x7D,
+ r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F
+ };
+
+ // Voice registers
+ enum {
+ v_voll = 0x00, v_volr = 0x01,
+ v_pitchl = 0x02, v_pitchh = 0x03,
+ v_srcn = 0x04, v_adsr0 = 0x05,
+ v_adsr1 = 0x06, v_gain = 0x07,
+ v_envx = 0x08, v_outx = 0x09
+ };
+
+public:
+ enum { extra_size = 16 };
+ sample_t* extra() { return m.extra; }
+ sample_t const* out_pos() const { return m.out; }
+public:
+ BLARGG_DISABLE_NOTHROW
+
+ typedef BOOST::int8_t int8_t;
+ typedef BOOST::int16_t int16_t;
+
+ enum { echo_hist_size = 8 };
+
+ enum env_mode_t { env_release, env_attack, env_decay, env_sustain };
+ enum { brr_buf_size = 12 };
+ struct voice_t
+ {
+ int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling)
+ int* buf_pos; // place in buffer where next samples will be decoded
+ int interp_pos; // relative fractional position in sample (0x1000 = 1.0)
+ int brr_addr; // address of current BRR block
+ int brr_offset; // current decoding offset in BRR block
+ int kon_delay; // KON delay/current setup phase
+ env_mode_t env_mode;
+ int env; // current envelope level
+ int hidden_env; // used by GAIN mode 7, very obscure quirk
+ int volume [2]; // copy of volume from DSP registers, with surround disabled
+ int enabled; // -1 if enabled, 0 if muted
+ };
+private:
+ struct state_t
+ {
+ uint8_t regs [register_count];
+
+ // Echo history keeps most recent 8 samples (twice the size to simplify wrap handling)
+ int echo_hist [echo_hist_size * 2] [2];
+ int (*echo_hist_pos) [2]; // &echo_hist [0 to 7]
+
+ int every_other_sample; // toggles every sample
+ int kon; // KON value when last checked
+ int noise;
+ int echo_offset; // offset from ESA in echo buffer
+ int echo_length; // number of bytes that echo_offset will stop at
+ int phase; // next clock cycle to run (0-31)
+ unsigned counters [4];
+
+ int new_kon;
+ int t_koff;
+
+ voice_t voices [voice_count];
+
+ unsigned* counter_select [32];
+
+ // non-emulation state
+ uint8_t* ram; // 64K shared RAM between DSP and SMP
+ int mute_mask;
+ int surround_threshold;
+ sample_t* out;
+ sample_t* out_end;
+ sample_t* out_begin;
+ sample_t extra [extra_size];
+ };
+ state_t m;
+
+ void init_counter();
+ void run_counter( int );
+ void soft_reset_common();
+ void write_outline( int addr, int data );
+ void update_voice_vol( int addr );
+};
+
+#include <assert.h>
+
+inline int Spc_Dsp::sample_count() const { return m.out - m.out_begin; }
+
+inline int Spc_Dsp::read( int addr ) const
+{
+ assert( (unsigned) addr < register_count );
+ return m.regs [addr];
+}
+
+inline void Spc_Dsp::update_voice_vol( int addr )
+{
+ int l = (int8_t) m.regs [addr + v_voll];
+ int r = (int8_t) m.regs [addr + v_volr];
+
+ if ( l * r < m.surround_threshold )
+ {
+ // signs differ, so negate those that are negative
+ l ^= l >> 7;
+ r ^= r >> 7;
+ }
+
+ voice_t& v = m.voices [addr >> 4];
+ int enabled = v.enabled;
+ v.volume [0] = l & enabled;
+ v.volume [1] = r & enabled;
+}
+
+inline void Spc_Dsp::write( int addr, int data )
+{
+ assert( (unsigned) addr < register_count );
+
+ m.regs [addr] = (uint8_t) data;
+ int low = addr & 0x0F;
+ if ( low < 0x2 ) // voice volumes
+ {
+ update_voice_vol( low ^ addr );
+ }
+ else if ( low == 0xC )
+ {
+ if ( addr == r_kon )
+ m.new_kon = (uint8_t) data;
+
+ if ( addr == r_endx ) // always cleared, regardless of data written
+ m.regs [r_endx] = 0;
+ }
+}
+
+inline void Spc_Dsp::disable_surround( bool disable )
+{
+ m.surround_threshold = disable ? 0 : -0x4000;
+}
+
+#define SPC_NO_COPY_STATE_FUNCS 1
+
+#define SPC_LESS_ACCURATE 1
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.cpp
index a5002bf7..e652e7ee 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.cpp
@@ -19,6 +19,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
#include "blargg_source.h"
+// TODO: support Spc_Filter's bass
+
Spc_Emu::Spc_Emu()
{
set_type( gme_spc_type );
@@ -216,7 +218,7 @@ struct Spc_File : Gme_Info_
blargg_err_t load_( Data_Reader& in )
{
long file_size = in.remain();
- if ( file_size < Snes_Spc::spc_file_size )
+ if ( file_size < Snes_Spc::spc_min_file_size )
return gme_wrong_file_type;
RETURN_ERR( in.read( &header, Spc_Emu::header_size ) );
RETURN_ERR( check_spc_header( header.tag ) );
@@ -249,7 +251,8 @@ gme_type_t const gme_spc_type = &gme_spc_type_;
blargg_err_t Spc_Emu::set_sample_rate_( long sample_rate )
{
- apu.set_gain( gain() );
+ RETURN_ERR( apu.init() );
+ enable_accuracy( false );
if ( sample_rate != native_sample_rate )
{
RETURN_ERR( resampler.buffer_size( native_sample_rate / 20 * 2 ) );
@@ -258,6 +261,12 @@ blargg_err_t Spc_Emu::set_sample_rate_( long sample_rate )
return 0;
}
+void Spc_Emu::enable_accuracy_( bool b )
+{
+ Music_Emu::enable_accuracy_( b );
+ filter.enable( b );
+}
+
void Spc_Emu::mute_voices_( int m )
{
Music_Emu::mute_voices_( m );
@@ -270,24 +279,36 @@ blargg_err_t Spc_Emu::load_mem_( byte const* in, long size )
file_data = in;
file_size = size;
set_voice_count( Snes_Spc::voice_count );
- if ( size < Snes_Spc::spc_file_size )
+ if ( size < Snes_Spc::spc_min_file_size )
return gme_wrong_file_type;
return check_spc_header( in );
}
// Emulation
-void Spc_Emu::set_tempo_( double t ) { apu.set_tempo( t ); }
+void Spc_Emu::set_tempo_( double t )
+{
+ apu.set_tempo( (int) (t * apu.tempo_unit) );
+}
blargg_err_t Spc_Emu::start_track_( int track )
{
RETURN_ERR( Music_Emu::start_track_( track ) );
resampler.clear();
+ filter.clear();
RETURN_ERR( apu.load_spc( file_data, file_size ) );
+ filter.set_gain( (int) (gain() * SPC_Filter::gain_unit) );
apu.clear_echo();
return 0;
}
+blargg_err_t Spc_Emu::play_and_filter( long count, sample_t out [] )
+{
+ RETURN_ERR( apu.play( count, out ) );
+ filter.run( out, count );
+ return 0;
+}
+
blargg_err_t Spc_Emu::skip_( long count )
{
if ( sample_rate() != native_sample_rate )
@@ -299,7 +320,10 @@ blargg_err_t Spc_Emu::skip_( long count )
// TODO: shouldn't skip be adjusted for the 64 samples read afterwards?
if ( count > 0 )
+ {
RETURN_ERR( apu.skip( count ) );
+ filter.clear();
+ }
// eliminate pop due to resampler
const int resampler_latency = 64;
@@ -310,7 +334,7 @@ blargg_err_t Spc_Emu::skip_( long count )
blargg_err_t Spc_Emu::play_( long count, sample_t* out )
{
if ( sample_rate() == native_sample_rate )
- return apu.play( count, out );
+ return play_and_filter( count, out );
long remain = count;
while ( remain > 0 )
@@ -319,7 +343,7 @@ blargg_err_t Spc_Emu::play_( long count, sample_t* out )
if ( remain > 0 )
{
long n = resampler.max_write();
- RETURN_ERR( apu.play( n, resampler.buffer() ) );
+ RETURN_ERR( play_and_filter( n, resampler.buffer() ) );
resampler.write( n );
}
}
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.h
index ab35649c..ab034ad3 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Spc_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Emu.h
@@ -7,6 +7,7 @@
#include "Fir_Resampler.h"
#include "Music_Emu.h"
#include "Snes_Spc.h"
+#include "Spc_Filter.h"
class Spc_Emu : public Music_Emu {
public:
@@ -65,11 +66,15 @@ protected:
blargg_err_t skip_( long );
void mute_voices_( int );
void set_tempo_( double );
+ void enable_accuracy_( bool );
private:
byte const* file_data;
long file_size;
Fir_Resampler<24> resampler;
+ SPC_Filter filter;
Snes_Spc apu;
+
+ blargg_err_t play_and_filter( long count, sample_t out [] );
};
inline void Spc_Emu::disable_surround( bool b ) { apu.disable_surround( b ); }
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.cpp
new file mode 100644
index 00000000..9b7ace98
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.cpp
@@ -0,0 +1,83 @@
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+#include "Spc_Filter.h"
+
+#include <string.h>
+
+/* Copyright (C) 2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); }
+
+SPC_Filter::SPC_Filter()
+{
+ enabled = true;
+ gain = gain_unit;
+ bass = bass_norm;
+ clear();
+}
+
+void SPC_Filter::run( short* io, int count )
+{
+ require( (count & 1) == 0 ); // must be even
+
+ int const gain = this->gain;
+ if ( enabled )
+ {
+ int const bass = this->bass;
+ chan_t* c = &ch [2];
+ do
+ {
+ // cache in registers
+ int sum = (--c)->sum;
+ int pp1 = c->pp1;
+ int p1 = c->p1;
+
+ for ( int i = 0; i < count; i += 2 )
+ {
+ // Low-pass filter (two point FIR with coeffs 0.25, 0.75)
+ int f = io [i] + p1;
+ p1 = io [i] * 3;
+
+ // High-pass filter ("leaky integrator")
+ int delta = f - pp1;
+ pp1 = f;
+ int s = sum >> (gain_bits + 2);
+ sum += (delta * gain) - (sum >> bass);
+
+ // Clamp to 16 bits
+ if ( (short) s != s )
+ s = (s >> 31) ^ 0x7FFF;
+
+ io [i] = (short) s;
+ }
+
+ c->p1 = p1;
+ c->pp1 = pp1;
+ c->sum = sum;
+ ++io;
+ }
+ while ( c != ch );
+ }
+ else if ( gain != gain_unit )
+ {
+ short* const end = io + count;
+ while ( io < end )
+ {
+ int s = (*io * gain) >> gain_bits;
+ if ( (short) s != s )
+ s = (s >> 31) ^ 0x7FFF;
+ *io++ = (short) s;
+ }
+ }
+}
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.h b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.h
new file mode 100644
index 00000000..9de56b18
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Spc_Filter.h
@@ -0,0 +1,53 @@
+// Simple low-pass and high-pass filter to better match sound output of a SNES
+
+// Game_Music_Emu 0.5.5
+#ifndef SPC_FILTER_H
+#define SPC_FILTER_H
+
+#include "blargg_common.h"
+
+struct SPC_Filter {
+public:
+
+ // Filters count samples of stereo sound in place. Count must be a multiple of 2.
+ typedef short sample_t;
+ void run( sample_t* io, int count );
+
+// Optional features
+
+ // Clears filter to silence
+ void clear();
+
+ // Sets gain (volume), where gain_unit is normal. Gains greater than gain_unit
+ // are fine, since output is clamped to 16-bit sample range.
+ enum { gain_unit = 0x100 };
+ void set_gain( int gain );
+
+ // Enables/disables filtering (when disabled, gain is still applied)
+ void enable( bool b );
+
+ // Sets amount of bass (logarithmic scale)
+ enum { bass_none = 0 };
+ enum { bass_norm = 8 }; // normal amount
+ enum { bass_max = 31 };
+ void set_bass( int bass );
+
+public:
+ SPC_Filter();
+ BLARGG_DISABLE_NOTHROW
+private:
+ enum { gain_bits = 8 };
+ int gain;
+ int bass;
+ bool enabled;
+ struct chan_t { int p1, pp1, sum; };
+ chan_t ch [2];
+};
+
+inline void SPC_Filter::enable( bool b ) { enabled = b; }
+
+inline void SPC_Filter::set_gain( int g ) { gain = g; }
+
+inline void SPC_Filter::set_bass( int b ) { bass = b; }
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.cpp
index 6a7cb98a..6a7cb98a 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.h
index bcfa506b..bcfa506b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.cpp
index 5a9b724a..5a9b724a 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.h b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.h
index 8a73c328..8a73c328 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Vgm_Emu_Impl.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Vgm_Emu_Impl.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.cpp
index be5b2d8c..be5b2d8c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.h
index 42314435..42314435 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ym2413_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ym2413_Emu.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.cpp b/plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.cpp
index 390fdfce..390fdfce 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.cpp
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.h b/plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.h
index 314b3399..314b3399 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Ym2612_Emu.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/Ym2612_Emu.h
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_common.h b/plugins/gme/game-music-emu-0.6.0/gme/blargg_common.h
index 9ab0bd7d..ed218a8d 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_common.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/blargg_common.h
@@ -8,7 +8,6 @@
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
-#include <stdint.h>
#undef BLARGG_COMMON_H
// allow blargg_config.h to #include blargg_common.h
@@ -16,6 +15,13 @@
#ifndef BLARGG_COMMON_H
#define BLARGG_COMMON_H
+// BLARGG_RESTRICT: equivalent to restrict, where supported
+#if __GNUC__ >= 3 || _MSC_VER >= 1100
+ #define BLARGG_RESTRICT __restrict
+#else
+ #define BLARGG_RESTRICT
+#endif
+
// STATIC_CAST(T,expr): Used in place of static_cast<T> (expr)
#ifndef STATIC_CAST
#define STATIC_CAST(T,expr) ((T) (expr))
@@ -55,10 +61,11 @@ public:
};
#ifndef BLARGG_DISABLE_NOTHROW
- #if __cplusplus < 199711
- #define BLARGG_THROWS( spec )
- #else
+ // throw spec mandatory in ISO C++ if operator new can return NULL
+ #if __cplusplus >= 199711 || __GNUC__ >= 3
#define BLARGG_THROWS( spec ) throw spec
+ #else
+ #define BLARGG_THROWS( spec )
#endif
#define BLARGG_DISABLE_NOTHROW \
void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\
@@ -69,6 +76,7 @@ public:
#define BLARGG_NEW new (std::nothrow)
#endif
+// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant)
#define BLARGG_4CHAR( a, b, c, d ) \
((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF))
@@ -111,21 +119,17 @@ public:
#endif
// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough
-#include <limits.h>
-#if 0
-#if INT_MAX >= 0x7FFFFFFF
- typedef int blargg_long;
-#else
+#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF
typedef long blargg_long;
+#else
+ typedef int blargg_long;
#endif
-#endif
-typedef int64_t blargg_long;
-#if UINT_MAX >= 0xFFFFFFFF
- typedef unsigned blargg_ulong;
-#else
+#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF
typedef unsigned long blargg_ulong;
+#else
+ typedef unsigned blargg_ulong;
#endif
// BOOST::int8_t etc.
@@ -175,5 +179,18 @@ typedef int64_t blargg_long;
};
#endif
+#if __GNUC__ >= 3
+ #define BLARGG_DEPRECATED __attribute__ ((deprecated))
+#else
+ #define BLARGG_DEPRECATED
+#endif
+
+// Use in place of "= 0;" for a pure virtual, since these cause calls to std C++ lib.
+// During development, BLARGG_PURE( x ) expands to = 0;
+// virtual int func() BLARGG_PURE( { return 0; } )
+#ifndef BLARGG_PURE
+ #define BLARGG_PURE( def ) def
+#endif
+
#endif
#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_config.h b/plugins/gme/game-music-emu-0.6.0/gme/blargg_config.h
index 9e9c751d..377dd2d8 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_config.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/blargg_config.h
@@ -6,9 +6,22 @@
// Uncomment to use zlib for transparent decompression of gzipped files
//#define HAVE_ZLIB_H
-// Uncomment to support only the listed game music types. See gme_type_list.cpp
-// for a list of all types.
-//#define GME_TYPE_LIST gme_nsf_type, gme_gbs_type
+// Uncomment and edit list to support only the listed game music types,
+// so that the others don't get linked in at all.
+/*
+#define GME_TYPE_LIST \
+ gme_ay_type,\
+ gme_gbs_type,\
+ gme_gym_type,\
+ gme_hes_type,\
+ gme_kss_type,\
+ gme_nsf_type,\
+ gme_nsfe_type,\
+ gme_sap_type,\
+ gme_spc_type,\
+ gme_vgm_type,\
+ gme_vgz_type
+*/
// Uncomment to enable platform-specific optimizations
//#define BLARGG_NONPORTABLE 1
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_endian.h b/plugins/gme/game-music-emu-0.6.0/gme/blargg_endian.h
index 67165565..ba09e067 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/blargg_endian.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/blargg_endian.h
@@ -1,20 +1,20 @@
// CPU Byte Order Utilities
-// Game_Music_Emu 0.5.2
#ifndef BLARGG_ENDIAN
#define BLARGG_ENDIAN
#include "blargg_common.h"
// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16)
-#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \
- defined (__x86_64__) || defined (__ia64__) || defined (__i386__)
+#if defined (__i386__) || defined (__x86_64__) || defined (_M_IX86) || defined (_M_X64)
#define BLARGG_CPU_X86 1
#define BLARGG_CPU_CISC 1
#endif
-#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc)
+#if defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__) || \
+ defined (__POWERPC__) || defined (__powerc)
#define BLARGG_CPU_POWERPC 1
+ #define BLARGG_CPU_RISC 1
#endif
// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only
@@ -36,10 +36,10 @@
#endif
#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \
- defined (__mips__) || defined (__sparc__) || BLARGG_CPU_POWERPC || \
+ defined (__sparc__) || BLARGG_CPU_POWERPC || \
(defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321)
#define BLARGG_BIG_ENDIAN 1
-#else
+#elif !defined (__mips__)
// No endian specified; assume little-endian, since it's most common
#define BLARGG_LITTLE_ENDIAN 1
#endif
@@ -64,45 +64,60 @@ inline void blargg_verify_byte_order()
#endif
}
-inline unsigned get_le16( void const* p ) {
- return ((unsigned char const*) p) [1] * 0x100u +
- ((unsigned char const*) p) [0];
+inline unsigned get_le16( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [1] << 8 |
+ (unsigned) ((unsigned char const*) p) [0];
}
-inline unsigned get_be16( void const* p ) {
- return ((unsigned char const*) p) [0] * 0x100u +
- ((unsigned char const*) p) [1];
+
+inline unsigned get_be16( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [0] << 8 |
+ (unsigned) ((unsigned char const*) p) [1];
}
-inline blargg_ulong get_le32( void const* p ) {
- return ((unsigned char const*) p) [3] * 0x01000000u +
- ((unsigned char const*) p) [2] * 0x00010000u +
- ((unsigned char const*) p) [1] * 0x00000100u +
- ((unsigned char const*) p) [0];
+
+inline blargg_ulong get_le32( void const* p )
+{
+ return (blargg_ulong) ((unsigned char const*) p) [3] << 24 |
+ (blargg_ulong) ((unsigned char const*) p) [2] << 16 |
+ (blargg_ulong) ((unsigned char const*) p) [1] << 8 |
+ (blargg_ulong) ((unsigned char const*) p) [0];
}
-inline blargg_ulong get_be32( void const* p ) {
- return ((unsigned char const*) p) [0] * 0x01000000u +
- ((unsigned char const*) p) [1] * 0x00010000u +
- ((unsigned char const*) p) [2] * 0x00000100u +
- ((unsigned char const*) p) [3];
+
+inline blargg_ulong get_be32( void const* p )
+{
+ return (blargg_ulong) ((unsigned char const*) p) [0] << 24 |
+ (blargg_ulong) ((unsigned char const*) p) [1] << 16 |
+ (blargg_ulong) ((unsigned char const*) p) [2] << 8 |
+ (blargg_ulong) ((unsigned char const*) p) [3];
}
-inline void set_le16( void* p, unsigned n ) {
+
+inline void set_le16( void* p, unsigned n )
+{
((unsigned char*) p) [1] = (unsigned char) (n >> 8);
((unsigned char*) p) [0] = (unsigned char) n;
}
-inline void set_be16( void* p, unsigned n ) {
+
+inline void set_be16( void* p, unsigned n )
+{
((unsigned char*) p) [0] = (unsigned char) (n >> 8);
((unsigned char*) p) [1] = (unsigned char) n;
}
-inline void set_le32( void* p, blargg_ulong n ) {
- ((unsigned char*) p) [3] = (unsigned char) (n >> 24);
- ((unsigned char*) p) [2] = (unsigned char) (n >> 16);
- ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
+
+inline void set_le32( void* p, blargg_ulong n )
+{
((unsigned char*) p) [0] = (unsigned char) n;
+ ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [2] = (unsigned char) (n >> 16);
+ ((unsigned char*) p) [3] = (unsigned char) (n >> 24);
}
-inline void set_be32( void* p, blargg_ulong n ) {
- ((unsigned char*) p) [0] = (unsigned char) (n >> 24);
- ((unsigned char*) p) [1] = (unsigned char) (n >> 16);
- ((unsigned char*) p) [2] = (unsigned char) (n >> 8);
+
+inline void set_be32( void* p, blargg_ulong n )
+{
((unsigned char*) p) [3] = (unsigned char) n;
+ ((unsigned char*) p) [2] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [1] = (unsigned char) (n >> 16);
+ ((unsigned char*) p) [0] = (unsigned char) (n >> 24);
}
#if BLARGG_NONPORTABLE
@@ -117,30 +132,41 @@ inline void set_be32( void* p, blargg_ulong n ) {
#define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr))
#define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data))
#define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data))
- #endif
-
- #if BLARGG_CPU_POWERPC && defined (__MWERKS__)
- // PowerPC has special byte-reversed instructions
- // to do: assumes that PowerPC is running in big-endian mode
- // to do: implement for other compilers which don't support these macros
- #define GET_LE16( addr ) (__lhbrx( (addr), 0 ))
- #define GET_LE32( addr ) (__lwbrx( (addr), 0 ))
- #define SET_LE16( addr, data ) (__sthbrx( (data), (addr), 0 ))
- #define SET_LE32( addr, data ) (__stwbrx( (data), (addr), 0 ))
+
+ #if BLARGG_CPU_POWERPC
+ // PowerPC has special byte-reversed instructions
+ #if defined (__MWERKS__)
+ #define GET_LE16( addr ) (__lhbrx( addr, 0 ))
+ #define GET_LE32( addr ) (__lwbrx( addr, 0 ))
+ #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 ))
+ #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 ))
+ #elif defined (__GNUC__)
+ #define GET_LE16( addr ) ({unsigned short ppc_lhbrx_; __asm__ volatile( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr) : "memory" ); ppc_lhbrx_;})
+ #define GET_LE32( addr ) ({unsigned short ppc_lwbrx_; __asm__ volatile( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr) : "memory" ); ppc_lwbrx_;})
+ #define SET_LE16( addr, in ) ({__asm__ volatile( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) : "memory" );})
+ #define SET_LE32( addr, in ) ({__asm__ volatile( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) : "memory" );})
+ #endif
+ #endif
#endif
#endif
#ifndef GET_LE16
#define GET_LE16( addr ) get_le16( addr )
- #define GET_LE32( addr ) get_le32( addr )
#define SET_LE16( addr, data ) set_le16( addr, data )
+#endif
+
+#ifndef GET_LE32
+ #define GET_LE32( addr ) get_le32( addr )
#define SET_LE32( addr, data ) set_le32( addr, data )
#endif
#ifndef GET_BE16
#define GET_BE16( addr ) get_be16( addr )
- #define GET_BE32( addr ) get_be32( addr )
#define SET_BE16( addr, data ) set_be16( addr, data )
+#endif
+
+#ifndef GET_BE32
+ #define GET_BE32( addr ) get_be32( addr )
#define SET_BE32( addr, data ) set_be32( addr, data )
#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/blargg_source.h b/plugins/gme/game-music-emu-0.6.0/gme/blargg_source.h
index 2b568d19..b011777a 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/blargg_source.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/blargg_source.h
@@ -1,4 +1,8 @@
-// Included at the beginning of library source files, after all other #include lines
+/* Included at the beginning of library source files, after all other #include lines.
+Sets up helpful macros and services used in my source code. They don't need
+module an annoying module prefix on their names since they are defined after
+all other #include lines. */
+
#ifndef BLARGG_SOURCE_H
#define BLARGG_SOURCE_H
@@ -17,7 +21,7 @@
// Like printf() except output goes to debug log file. Might be defined to do
// nothing (not even evaluate its arguments).
// void debug_printf( const char* format, ... );
-inline void blargg_dprintf_( const char*, ... ) { }
+static inline void blargg_dprintf_( const char*, ... ) { }
#undef debug_printf
#define debug_printf (1) ? (void) 0 : blargg_dprintf_
@@ -42,9 +46,25 @@ inline void blargg_dprintf_( const char*, ... ) { }
#undef min
#undef max
+#define DEF_MIN_MAX( type ) \
+ static inline type min( type x, type y ) { if ( x < y ) return x; return y; }\
+ static inline type max( type x, type y ) { if ( y < x ) return x; return y; }
+
+DEF_MIN_MAX( int )
+DEF_MIN_MAX( unsigned )
+DEF_MIN_MAX( long )
+DEF_MIN_MAX( unsigned long )
+DEF_MIN_MAX( float )
+DEF_MIN_MAX( double )
+
+#undef DEF_MIN_MAX
+
+/*
// using const references generates crappy code, and I am currenly only using these
// for built-in types, so they take arguments by value
+// TODO: remove
+inline int min( int x, int y )
template<class T>
inline T min( T x, T y )
{
@@ -60,12 +80,24 @@ inline T max( T x, T y )
return y;
return x;
}
+*/
// TODO: good idea? bad idea?
#undef byte
#define byte byte_
typedef unsigned char byte;
+// Setup compiler defines useful for exporting required public API symbols in gme.cpp
+#ifndef BLARGG_EXPORT
+ #if defined (_WIN32) && defined(BLARGG_BUILD_DLL)
+ #define BLARGG_EXPORT __declspec(dllexport)
+ #elif defined (LIBGME_VISIBILITY)
+ #define BLARGG_EXPORT __attribute__((visibility ("default")))
+ #else
+ #define BLARGG_EXPORT
+ #endif
+#endif
+
// deprecated
#define BLARGG_CHECK_ALLOC CHECK_ALLOC
#define BLARGG_RETURN_ERR RETURN_ERR
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/gb_cpu_io.h b/plugins/gme/game-music-emu-0.6.0/gme/gb_cpu_io.h
index cd98ffd5..8bd69aa2 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/gb_cpu_io.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/gb_cpu_io.h
@@ -59,7 +59,7 @@ void Gbs_Emu::cpu_write( gb_addr_t addr, int data )
#define CPU_READ_FAST_( emu, addr, time, out ) \
{\
out = READ_PROG( addr );\
- if ( unsigned (addr - Gb_Apu::start_addr) <= Gb_Apu::register_count )\
+ if ( unsigned (addr - Gb_Apu::start_addr) < Gb_Apu::register_count )\
out = emu->apu.read_register( emu->cpu_time - time * clocks_per_instr, addr );\
else\
check( out == emu->cpu_read( addr ) );\
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/gme.cpp b/plugins/gme/game-music-emu-0.6.0/gme/gme.cpp
index 6b9dc0b8..255dbf4b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/gme.cpp
+++ b/plugins/gme/game-music-emu-0.6.0/gme/gme.cpp
@@ -2,6 +2,7 @@
#include "Music_Emu.h"
+#include "gme_types.h"
#if !GME_DISABLE_STEREO_DEPTH
#include "Effects_Buffer.h"
#endif
@@ -22,46 +23,51 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
#include "blargg_source.h"
-gme_type_t const* gme_type_list()
+BLARGG_EXPORT gme_type_t const* gme_type_list()
{
static gme_type_t const gme_type_list_ [] = {
-#ifdef USE_GME_AY
- gme_ay_type,
+#ifdef GME_TYPE_LIST
+ GME_TYPE_LIST,
+#else
+ #ifdef USE_GME_AY
+ gme_ay_type,
+ #endif
+ #ifdef USE_GME_GBS
+ gme_gbs_type,
+ #endif
+ #ifdef USE_GME_GYM
+ gme_gym_type,
+ #endif
+ #ifdef USE_GME_HES
+ gme_hes_type,
+ #endif
+ #ifdef USE_GME_KSS
+ gme_kss_type,
+ #endif
+ #ifdef USE_GME_NSF
+ gme_nsf_type,
+ #endif
+ #ifdef USE_GME_NSFE
+ gme_nsfe_type,
+ #endif
+ #ifdef USE_GME_SAP
+ gme_sap_type,
+ #endif
+ #ifdef USE_GME_SPC
+ gme_spc_type,
+ #endif
+ #ifdef USE_GME_VGM
+ gme_vgm_type,
+ gme_vgz_type,
+ #endif
#endif
-#ifdef USE_GME_GBS
- gme_gbs_type,
-#endif
-#ifdef USE_GME_GYM
- gme_gym_type,
-#endif
-#ifdef USE_GME_HES
- gme_hes_type,
-#endif
-#ifdef USE_GME_KSS
- gme_kss_type,
-#endif
-#if defined(USE_GME_NSF) || defined(USE_GME_NSFE)
- gme_nsf_type,
-#endif
-#ifdef USE_GME_NSFE
- gme_nsfe_type,
-#endif
-#ifdef USE_GME_SAP
- gme_sap_type,
-#endif
-#ifdef USE_GME_SPC
- gme_spc_type,
-#endif
-#ifdef USE_GME_VGM
- gme_vgm_type,
- gme_vgz_type,
-#endif
- 0 };
+ 0
+ };
return gme_type_list_;
}
-const char* gme_identify_header( void const* header )
+BLARGG_EXPORT const char* gme_identify_header( void const* header )
{
switch ( get_be32( header ) )
{
@@ -90,7 +96,7 @@ static void to_uppercase( const char* in, int len, char* out )
*out = 0; // extension too long
}
-gme_type_t gme_identify_extension( const char* extension_ )
+BLARGG_EXPORT gme_type_t gme_identify_extension( const char* extension_ )
{
char const* end = strrchr( extension_, '.' );
if ( end )
@@ -105,7 +111,7 @@ gme_type_t gme_identify_extension( const char* extension_ )
return 0;
}
-gme_err_t gme_identify_file( const char* path, gme_type_t* type_out )
+BLARGG_EXPORT gme_err_t gme_identify_file( const char* path, gme_type_t* type_out )
{
*type_out = gme_identify_extension( path );
// TODO: don't examine header if file has extension?
@@ -120,14 +126,14 @@ gme_err_t gme_identify_file( const char* path, gme_type_t* type_out )
return 0;
}
-gme_err_t gme_open_data( void const* data, long size, Music_Emu** out, int sample_rate )
+BLARGG_EXPORT gme_err_t gme_open_data( const char *path, void const* data, long size, Music_Emu** out, int sample_rate )
{
require( (data || !size) && out );
*out = 0;
gme_type_t file_type = 0;
if ( size >= 4 )
- file_type = gme_identify_extension( gme_identify_header( data ) );
+ file_type = gme_identify_extension( path );
if ( !file_type )
return gme_wrong_file_type;
@@ -144,7 +150,7 @@ gme_err_t gme_open_data( void const* data, long size, Music_Emu** out, int sampl
return err;
}
-gme_err_t gme_open_file( const char* path, Music_Emu** out, int sample_rate )
+BLARGG_EXPORT gme_err_t gme_open_file( const char* path, Music_Emu** out, int sample_rate )
{
require( path && out );
*out = 0;
@@ -181,7 +187,7 @@ gme_err_t gme_open_file( const char* path, Music_Emu** out, int sample_rate )
return err;
}
-Music_Emu* gme_new_emu( gme_type_t type, int rate )
+BLARGG_EXPORT Music_Emu* gme_new_emu( gme_type_t type, int rate )
{
if ( type )
{
@@ -214,27 +220,27 @@ Music_Emu* gme_new_emu( gme_type_t type, int rate )
return 0;
}
-gme_err_t gme_load_file( Music_Emu* me, const char* path ) { return me->load_file( path ); }
+BLARGG_EXPORT gme_err_t gme_load_file( Music_Emu* me, const char* path ) { return me->load_file( path ); }
-gme_err_t gme_load_data( Music_Emu* me, void const* data, long size )
+BLARGG_EXPORT gme_err_t gme_load_data( Music_Emu* me, void const* data, long size )
{
Mem_File_Reader in( data, size );
return me->load( in );
}
-gme_err_t gme_load_custom( Music_Emu* me, gme_reader_t func, long size, void* data )
+BLARGG_EXPORT gme_err_t gme_load_custom( Music_Emu* me, gme_reader_t func, long size, void* data )
{
Callback_Reader in( func, size, data );
return me->load( in );
}
-void gme_delete( Music_Emu* me ) { delete me; }
+BLARGG_EXPORT void gme_delete( Music_Emu* me ) { delete me; }
-gme_type_t gme_type( Music_Emu const* me ) { return me->type(); }
+BLARGG_EXPORT gme_type_t gme_type( Music_Emu const* me ) { return me->type(); }
-const char* gme_warning( Music_Emu* me ) { return me->warning(); }
+BLARGG_EXPORT const char* gme_warning( Music_Emu* me ) { return me->warning(); }
-int gme_track_count( Music_Emu const* me ) { return me->track_count(); }
+BLARGG_EXPORT int gme_track_count( Music_Emu const* me ) { return me->track_count(); }
struct gme_info_t_ : gme_info_t
{
@@ -243,7 +249,7 @@ struct gme_info_t_ : gme_info_t
BLARGG_DISABLE_NOTHROW
};
-gme_err_t gme_track_info( Music_Emu const* me, gme_info_t** out, int track )
+BLARGG_EXPORT gme_err_t gme_track_info( Music_Emu const* me, gme_info_t** out, int track )
{
*out = NULL;
@@ -309,12 +315,12 @@ gme_err_t gme_track_info( Music_Emu const* me, gme_info_t** out, int track )
return 0;
}
-void gme_free_info( gme_info_t* info )
+BLARGG_EXPORT void gme_free_info( gme_info_t* info )
{
delete STATIC_CAST(gme_info_t_*,info);
}
-void gme_set_stereo_depth( Music_Emu* me, double depth )
+BLARGG_EXPORT void gme_set_stereo_depth( Music_Emu* me, double depth )
{
#if !GME_DISABLE_STEREO_DEPTH
if ( me->effects_buffer )
@@ -322,23 +328,26 @@ void gme_set_stereo_depth( Music_Emu* me, double depth )
#endif
}
-void* gme_user_data ( Music_Emu const* me ) { return me->user_data(); }
-void gme_set_user_data ( Music_Emu* me, void* new_user_data ) { me->set_user_data( new_user_data ); }
-void gme_set_user_cleanup(Music_Emu* me, gme_user_cleanup_t func ) { me->set_user_cleanup( func ); }
+BLARGG_EXPORT void* gme_user_data ( Music_Emu const* me ) { return me->user_data(); }
+BLARGG_EXPORT void gme_set_user_data ( Music_Emu* me, void* new_user_data ) { me->set_user_data( new_user_data ); }
+BLARGG_EXPORT void gme_set_user_cleanup(Music_Emu* me, gme_user_cleanup_t func ) { me->set_user_cleanup( func ); }
-gme_err_t gme_start_track ( Music_Emu* me, int index ) { return me->start_track( index ); }
-gme_err_t gme_play ( Music_Emu* me, int n, short* p ) { return me->play( n, p ); }
-void gme_set_fade ( Music_Emu* me, int start_msec ) { me->set_fade( start_msec ); }
-int gme_track_ended ( Music_Emu const* me ) { return me->track_ended(); }
-int gme_tell ( Music_Emu const* me ) { return me->tell(); }
-gme_err_t gme_seek ( Music_Emu* me, int msec ) { return me->seek( msec ); }
-int gme_voice_count ( Music_Emu const* me ) { return me->voice_count(); }
-void gme_ignore_silence ( Music_Emu* me, int disable ) { me->ignore_silence( disable != 0 ); }
-void gme_set_tempo ( Music_Emu* me, double t ) { me->set_tempo( t ); }
-void gme_mute_voice ( Music_Emu* me, int index, int mute ) { me->mute_voice( index, mute != 0 ); }
-void gme_mute_voices ( Music_Emu* me, int mask ) { me->mute_voices( mask ); }
+BLARGG_EXPORT gme_err_t gme_start_track ( Music_Emu* me, int index ) { return me->start_track( index ); }
+BLARGG_EXPORT gme_err_t gme_play ( Music_Emu* me, int n, short* p ) { return me->play( n, p ); }
+BLARGG_EXPORT void gme_set_fade ( Music_Emu* me, int start_msec ) { me->set_fade( start_msec ); }
+BLARGG_EXPORT int gme_track_ended ( Music_Emu const* me ) { return me->track_ended(); }
+BLARGG_EXPORT int gme_tell ( Music_Emu const* me ) { return me->tell(); }
+BLARGG_EXPORT gme_err_t gme_seek ( Music_Emu* me, int msec ) { return me->seek( msec ); }
+BLARGG_EXPORT int gme_voice_count ( Music_Emu const* me ) { return me->voice_count(); }
+BLARGG_EXPORT void gme_ignore_silence ( Music_Emu* me, int disable ) { me->ignore_silence( disable != 0 ); }
+BLARGG_EXPORT void gme_set_tempo ( Music_Emu* me, double t ) { me->set_tempo( t ); }
+BLARGG_EXPORT void gme_mute_voice ( Music_Emu* me, int index, int mute ) { me->mute_voice( index, mute != 0 ); }
+BLARGG_EXPORT void gme_mute_voices ( Music_Emu* me, int mask ) { me->mute_voices( mask ); }
+BLARGG_EXPORT void gme_enable_accuracy( Music_Emu* me, int enabled ) { me->enable_accuracy( enabled ); }
+BLARGG_EXPORT void gme_clear_playlist ( Music_Emu* me ) { me->clear_playlist(); }
+BLARGG_EXPORT int gme_type_multitrack( gme_type_t t ) { return t->track_count != 1; }
-void gme_set_equalizer ( Music_Emu* me, gme_equalizer_t const* eq )
+BLARGG_EXPORT void gme_set_equalizer ( Music_Emu* me, gme_equalizer_t const* eq )
{
Music_Emu::equalizer_t e = me->equalizer();
e.treble = eq->treble;
@@ -346,7 +355,7 @@ void gme_set_equalizer ( Music_Emu* me, gme_equalizer_t const* eq )
me->set_equalizer( e );
}
-void gme_equalizer( Music_Emu const* me, gme_equalizer_t* out )
+BLARGG_EXPORT void gme_equalizer( Music_Emu const* me, gme_equalizer_t* out )
{
gme_equalizer_t e = { };
e.treble = me->equalizer().treble;
@@ -354,13 +363,13 @@ void gme_equalizer( Music_Emu const* me, gme_equalizer_t* out )
*out = e;
}
-const char* gme_voice_name( Music_Emu const* me, int i )
+BLARGG_EXPORT const char* gme_voice_name( Music_Emu const* me, int i )
{
assert( (unsigned) i < (unsigned) me->voice_count() );
return me->voice_names() [i];
}
-const char* gme_type_system( gme_type_t type )
+BLARGG_EXPORT const char* gme_type_system( gme_type_t type )
{
assert( type );
return type->system;
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/gme.h b/plugins/gme/game-music-emu-0.6.0/gme/gme.h
index 5b9039c4..d86c8761 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/gme.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/gme.h
@@ -142,6 +142,8 @@ void gme_equalizer( Music_Emu const*, gme_equalizer_t* out );
/* Change frequency equalizer parameters */
void gme_set_equalizer( Music_Emu*, gme_equalizer_t const* eq );
+/* Enables/disables most accurate sound emulation options */
+void gme_enable_accuracy( Music_Emu*, int enabled );
/******** Game music types ********/
@@ -183,7 +185,7 @@ int gme_type_multitrack( gme_type_t );
extern const char* const gme_wrong_file_type;
/* Same as gme_open_file(), but uses file data already in memory. Makes copy of data. */
-gme_err_t gme_open_data( void const* data, long size, Music_Emu** out, int sample_rate );
+gme_err_t gme_open_data( const char *path, void const* data, long size, Music_Emu** out, int sample_rate );
/* Determine likely game music type based on first four bytes of file. Returns
string containing proper file suffix (i.e. "NSF", "SPC", etc.) or "" if
@@ -228,24 +230,6 @@ clear it. Passes user_data to cleanup function. */
typedef void (*gme_user_cleanup_t)( void* user_data );
void gme_set_user_cleanup( Music_Emu*, gme_user_cleanup_t func );
-typedef struct
-{
- long track_count;
-
- /* times in milliseconds; -1 if unknown */
- long length;
- long intro_length;
- long loop_length;
-
- /* empty string if not available */
- char system [256];
- char game [256];
- char song [256];
- char author [256];
- char copyright [256];
- char comment [256];
- char dumper [256];
-} track_info_t;
#ifdef __cplusplus
}
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/gme_types.h b/plugins/gme/game-music-emu-0.6.0/gme/gme_types.h
new file mode 100644
index 00000000..06226f4a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/gme_types.h
@@ -0,0 +1,21 @@
+#ifndef GME_TYPES_H
+#define GME_TYPES_H
+
+/*
+ * This is a default gme_types.h for use when *not* using
+ * CMake. If CMake is in use gme_types.h.in will be
+ * processed instead.
+ */
+#define USE_GME_AY
+#define USE_GME_GBS
+#define USE_GME_GYM
+#define USE_GME_HES
+#define USE_GME_KSS
+#define USE_GME_NSF
+#define USE_GME_NSFE
+#define USE_GME_SAP
+#define USE_GME_SPC
+/* VGM and VGZ are a package deal */
+#define USE_GME_VGM
+
+#endif /* GME_TYPES_H */
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/gme_types.h.in b/plugins/gme/game-music-emu-0.6.0/gme/gme_types.h.in
index 4829b3e1..4829b3e1 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/gme_types.h.in
+++ b/plugins/gme/game-music-emu-0.6.0/gme/gme_types.h.in
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/hes_cpu_io.h b/plugins/gme/game-music-emu-0.6.0/gme/hes_cpu_io.h
index ce60ce8e..ce60ce8e 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/hes_cpu_io.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/hes_cpu_io.h
diff --git a/plugins/gme/game-music-emu-0.6.0/gme/libgme.pc.in b/plugins/gme/game-music-emu-0.6.0/gme/libgme.pc.in
new file mode 100644
index 00000000..4f420d9e
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6.0/gme/libgme.pc.in
@@ -0,0 +1,15 @@
+# entries grouped with CMake are expanded by CMake
+# ${foo} entries are left alone by CMake and much
+# later are used by pkg-config.
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=${prefix}
+lib_suffix=
+libdir=${exec_prefix}/lib${lib_suffix}
+includedir=${prefix}/include
+
+Name: Game_Music_Emu
+Description: A video game emulation library for music.
+URL: http://code.google.com/p/game-music-emu/
+Version: @GME_VERSION@
+Cflags: -I${includedir}
+Libs: -L${libdir} -lgme
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/nes_cpu_io.h b/plugins/gme/game-music-emu-0.6.0/gme/nes_cpu_io.h
index 68ce9b6f..68ce9b6f 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/nes_cpu_io.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/nes_cpu_io.h
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/sap_cpu_io.h b/plugins/gme/game-music-emu-0.6.0/gme/sap_cpu_io.h
index d009d0d9..d009d0d9 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/sap_cpu_io.h
+++ b/plugins/gme/game-music-emu-0.6.0/gme/sap_cpu_io.h
diff --git a/plugins/gme/game-music-emu-0.6pre/CMakeLists.txt b/plugins/gme/game-music-emu-0.6pre/CMakeLists.txt
new file mode 100644
index 00000000..c76bbe19
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/CMakeLists.txt
@@ -0,0 +1,91 @@
+# CMake project definition file.
+project(libgme)
+
+include (CheckCXXCompilerFlag)
+
+set(GME_VERSION 0.6.0 CACHE INTERNAL "libgme Version")
+
+# 2.6+ always assumes FATAL_ERROR, but 2.4 and below don't.
+# Of course, 2.4 might work, in which case you're welcome to drop
+# down the requirement, but I can't test that.
+cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
+
+# Default emulators to build (all of them! ;)
+if (NOT DEFINED USE_GME_AY)
+ SET(USE_GME_AY 1 CACHE BOOL "Enable support for Spectrum ZX music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_GBS)
+ SET(USE_GME_GBS 1 CACHE BOOL "Enable support for Game Boy music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_GYM)
+ SET(USE_GME_GYM 1 CACHE BOOL "Enable Sega MegaDrive/Genesis music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_HES)
+ SET(USE_GME_HES 1 CACHE BOOL "Enable PC Engine/TurboGrafx-16 music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_KSS)
+ SET(USE_GME_KSS 1 CACHE BOOL "Enable MSX or other Z80 systems music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_NSF)
+ SET(USE_GME_NSF 1 CACHE BOOL "Enable NES NSF music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_NSFE)
+ SET(USE_GME_NSFE 1 CACHE BOOL "Enable NES NSFE and NSF music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_SAP)
+ SET(USE_GME_SAP 1 CACHE BOOL "Enable Atari SAP music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_SPC)
+ SET(USE_GME_SPC 1 CACHE BOOL "Enable SNES SPC music emulation")
+endif()
+
+if (NOT DEFINED USE_GME_VGM)
+ SET(USE_GME_VGM 1 CACHE BOOL "Enable Sega VGM/VGZ music emulation")
+endif()
+
+if (USE_GME_NSFE AND NOT USE_GME_NSF)
+ MESSAGE(" -- NSFE support requires NSF, enabling NSF support. --")
+ SET(USE_GME_NSF 1 CACHE BOOL "Enable NES NSF music emulation" FORCE)
+endif()
+
+# Check for GCC "visibility" support.
+if (CMAKE_COMPILER_IS_GNUCXX)
+ check_cxx_compiler_flag (-fvisibility=hidden __LIBGME_TEST_VISIBILITY)
+ set (ENABLE_VISIBILITY OFF)
+ if (__LIBGME_TEST_VISIBILITY)
+ # get the gcc version
+ exec_program(${CMAKE_CXX_COMPILER} ARGS --version OUTPUT_VARIABLE _gcc_version_info)
+ string (REGEX MATCH "[3-9]\\.[0-9]\\.[0-9]" _gcc_version "${_gcc_version_info}")
+
+ # gcc <4.1 had poor support for symbol visibility
+ if ((${_gcc_version} VERSION_GREATER "4.1") OR (${_gcc_version} VERSION_EQUAL "4.1"))
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
+ set (ENABLE_VISIBILITY ON)
+ add_definitions (-DLIBGME_VISIBILITY)
+
+ # GCC >= 4.2 also correctly supports making inline members have hidden
+ # visibility by default.
+ if ((${_gcc_version} VERSION_GREATER "4.2") OR (${_gcc_version} VERSION_EQUAL "4.2"))
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden")
+ endif()
+ endif()
+ endif() # test visibility
+endif (CMAKE_COMPILER_IS_GNUCXX)
+
+# Cache this result
+set( LIBGME_HAVE_GCC_VISIBILITY ${ENABLE_VISIBILITY} CACHE BOOL "GCC support for hidden visibility")
+
+# Shared library defined here
+add_subdirectory(gme)
+
+# EXCLUDE_FROM_ALL adds build rules but keeps it out of default build
+add_subdirectory(player EXCLUDE_FROM_ALL)
+add_subdirectory(demo EXCLUDE_FROM_ALL)
diff --git a/plugins/gme/game-music-emu-0.5.5/changes.txt b/plugins/gme/game-music-emu-0.6pre/changes.txt
index f3038387..c0afecff 100644
--- a/plugins/gme/game-music-emu-0.5.5/changes.txt
+++ b/plugins/gme/game-music-emu-0.6pre/changes.txt
@@ -1,6 +1,19 @@
Game_Music_Emu Change Log
-------------------------
+Game_Music_Emu 0.5.6
+--------------------
+- Switched to newer snes_spc 0.9.0 for SPC emulation. Uses fast DSP.
+
+- Fixed a couple of GBS bugs, one involving access of memory after realloc.
+
+- Removed documentation of C++ interface, as the C interface in gme.h is
+the only supported one.
+
+- Added gme_enable_accuracy() for enabling more accurate sound emulation
+options (currently affects SPC only).
+
+
Game_Music_Emu 0.5.5
--------------------
- CMake build support has been added. You can build Game_Music_Emu as
@@ -8,6 +21,7 @@ a shared library and install it so that you do not have to include your
own copy if you know libgme will be present on your target system.
Requires CMake 2.6 or higher.
+
Game_Music_Emu 0.5.2
--------------------
- *TONS* of changes and improvements. You should re-read the new header
diff --git a/plugins/gme/game-music-emu-0.5.5/design.txt b/plugins/gme/game-music-emu-0.6pre/design.txt
index 8c8c65b1..33e185a3 100644
--- a/plugins/gme/game-music-emu-0.5.5/design.txt
+++ b/plugins/gme/game-music-emu-0.6pre/design.txt
@@ -1,4 +1,4 @@
-Game_Music_Emu 0.5.2 Design
+Game_Music_Emu 0.5.6 Design
---------------------------
This might be slightly out-of-date at times, but will be a big help in
understanding the library implementation.
diff --git a/plugins/gme/game-music-emu-0.5.5/gme.txt b/plugins/gme/game-music-emu-0.6pre/gme.txt
index ca3da769..2985786b 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme.txt
+++ b/plugins/gme/game-music-emu-0.6pre/gme.txt
@@ -8,8 +8,6 @@ License: GNU Lesser General Public License (LGPL)
Contents
--------
* Overview
-* C and C++ interfaces
-* Function reference
* Error handling
* Emulator types
* M3U playlist support
@@ -21,7 +19,6 @@ Contents
* Modular construction
* Obscure features
* Solving problems
-* Deprecated features
* Thanks
@@ -62,56 +59,15 @@ deleted with gme_set_user_cleanup()
Refer to gme.h for a comprehensive summary of features.
-C and C++ interfaces
---------------------
-While the library is written in C++, an extensive C interface is
-provided in gme.h. This C interface will be referred to throughout this
-documentation unless a feature is only available in the full C++
-interface. All C interface functions and other names have the gme_
-prefix, so you can recognize a C++-only feature by the lack of gme_ in
-the names used (contact me if you'd like a feature added to the C
-interface). If you're building a shared library, I highly recommend
-sticking to the C interface only, because it will be more stable between
-releases of the library than the C++ interface. Finally, the C and C++
-interfaces can be freely mixed without problems. Compare demo/basics.c
-with demo/cpp_basics.cpp to see how the C and C++ interfaces translate
-between each other.
-
-
-Function reference
-------------------
-Read the following header files for a complete reference to functions
-and features. The second group of header files can only be used in C++.
-
-blargg_config.h Library configuration
-gme.h C interface (also usable from C++)
-
-Gme_File.h File loading and track information
-Music_Emu.h Track playback and adjustments
-Data_Reader.h Custom data readers
-Effects_Buffer.h Sound buffer with adjustable stereo echo and panning
-M3u_Playlist.h M3U playlist support
-Gbs_Emu.h GBS equalizer settings
-Nsf_Emu.h NSF equalizer settings
-Spc_Emu.h SPC surround disable
-Vgm_Emu.h VGM oversampling disable and custom buffer query
-
-
Error handling
--------------
-Functions which can fail have a return type of gme_err_t (blargg_err_t
-in the C++ interfaces), which is a pointer to an error string (const
-char*). If a function is successful it returns NULL. Errors that you can
-easily avoid are checked with debug assertions; gme_err_t return values
-are only used for genuine run-time errors that can't be easily predicted
-in advance (out of memory, I/O errors, incompatible file data). Your
-code should check all error values.
-
-To improve usability for C programmers, C++ programmers unfamiliar with
-exceptions, and compatibility with older C++ compilers, the library does
-*not* throw any C++ exceptions and uses malloc() instead of the standard
-operator new. This means that you *must* check for NULL when creating a
-library object with the new operator.
+Functions which can fail have a return type of gme_err_t, which is a
+pointer to an error string (const char*). If a function is successful it
+returns NULL. Errors that you can easily avoid are checked with debug
+assertions; gme_err_t return values are only used for genuine run-time
+errors that can't be easily predicted in advance (out of memory, I/O
+errors, incompatible file data). Your code should check all error
+values.
When loading a music file in the wrong emulator or trying to load a
non-music file, gme_wrong_file_type is returned. You can check for this
@@ -154,7 +110,9 @@ If you want to remove support for some music types to reduce your
executable size, edit GME_TYPE_LIST in blargg_config.h. For example, to
support just NSF and GBS, use this:
- #define GME_TYPE_LIST gme_nsf_type, gme_gbs_type
+ #define GME_TYPE_LIST \
+ gme_nsf_type,\
+ gme_gbs_type
M3U playlist support
@@ -271,40 +229,6 @@ create an emulator, you can use the following methods of loading:
error = gme_load_custom( emu, my_read, file_size, my_data );
-* If you must load the file data into memory yourself, you can have the
-library use your data directly *without* making a copy. If you do this,
-you must not free the data until you're done playing the file.
-
- error = emu->load_mem( pointer, size );
-
-* If you've already read the first bytes of a file (perhaps to determine
-the file type) and want to avoid seeking back to the beginning for
-performance reasons, use Remaining_Reader:
-
- Std_File_Reader in;
- error = in.open( file_path );
-
- char header [4];
- error = in.read( &header, sizeof header );
- ...
-
- Remaining_Reader rem( &header, sizeof header, &in );
- error = emu->load( rem );
-
-If you merely need access to a file's header after loading, use the
-emulator-specific header() functions, after casting the Music_Emu
-pointer to the specific emulator's type. This example examines the
-chip_flags field of the header if it's an NSF file:
-
- if ( music_emu->type() == gme_nsf_type )
- {
- Nsf_Emu* nsf_emu = (Nsf_Emu*) music_emu;
- if ( nsf_emu->header().chip_flags & 0x01 )
- ...
- }
-
-Contact me if you want more information about loading files.
-
Sound parameters
----------------
@@ -437,21 +361,6 @@ separate threads.
* If all else fails, see if the demos work.
-Deprecated features
--------------------
-The following functions and other features have been deprecated and will
-be removed in a future release of the library. Alternatives to the
-deprecated features are listed to the right.
-
-Music_Emu::error_count() warning()
-load( header, reader ) see "Loading file data" above
-Spc_Emu::trailer() track_info()
-Spc_Emu::trailer_size()
-Gym_Emu::track_length() track_info()
-Vgm_Emu::gd3_data() track_info()
-Nsfe_Emu::disable_playlist() clear_playlist()
-
-
Thanks
------
Big thanks to Chris Moeller (kode54) for help with library testing and
@@ -461,4 +370,6 @@ Brad Martin's excellent OpenSPC SNES DSP emulator worked well from the
start. Also thanks to Richard Bannister, Mahendra Tallur, Shazz,
nenolod, theHobbit, Johan Samuelsson, and nes6502 for testing, using,
and giving feedback for the library in their respective game music
-players.
+players. More recently, Lucas Paul and Michael Pyne have helped nudge the
+library into a public repository and get its interface more stable for use
+in shared libraries.
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.cpp
index 9dc5bb28..81ff27c7 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ay_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.cpp
@@ -1,8 +1,8 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
#include "Ay_Apu.h"
-/* Copyright (C) 2006 Shay Green. This module is free software; you
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -22,7 +22,7 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
// Tones above this frequency are treated as disabled tone at half volume.
// Power of two is more efficient (avoids division).
-unsigned const inaudible_freq = 16384;
+int const inaudible_freq = 16384;
int const period_factor = 16;
@@ -67,12 +67,18 @@ static byte const modes [8] =
MODE( 0,1, 0,0, 0,0 ),
};
+void Ay_Apu::set_output( Blip_Buffer* b )
+{
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, b );
+}
+
Ay_Apu::Ay_Apu()
{
// build full table of the upper 8 envelope waveforms
for ( int m = 8; m--; )
{
- byte* out = env.modes [m];
+ byte* out = env_modes [m];
int flags = modes [m];
for ( int x = 3; --x >= 0; )
{
@@ -89,19 +95,19 @@ Ay_Apu::Ay_Apu()
}
}
- output( 0 );
+ set_output( NULL );
volume( 1.0 );
reset();
}
void Ay_Apu::reset()
{
+ addr_ = 0;
last_time = 0;
- noise.delay = 0;
- noise.lfsr = 1;
+ noise_delay = 0;
+ noise_lfsr = 1;
- osc_t* osc = &oscs [osc_count];
- do
+ for ( osc_t* osc = &oscs [osc_count]; osc != oscs; )
{
osc--;
osc->period = period_factor;
@@ -109,7 +115,6 @@ void Ay_Apu::reset()
osc->last_amp = 0;
osc->phase = 0;
}
- while ( osc != oscs );
for ( int i = sizeof regs; --i >= 0; )
regs [i] = 0;
@@ -117,25 +122,30 @@ void Ay_Apu::reset()
write_data_( 13, 0 );
}
+int Ay_Apu::read()
+{
+ static byte const masks [reg_count] = {
+ 0xFF, 0x0F, 0xFF, 0x0F, 0xFF, 0x0F, 0x1F, 0x3F,
+ 0x1F, 0x1F, 0x1F, 0xFF, 0xFF, 0x0F, 0x00, 0x00
+ };
+ return regs [addr_] & masks [addr_];
+}
+
void Ay_Apu::write_data_( int addr, int data )
{
assert( (unsigned) addr < reg_count );
if ( (unsigned) addr >= 14 )
- {
- #ifdef dprintf
- dprintf( "Wrote to I/O port %02X\n", (int) addr );
- #endif
- }
+ dprintf( "Wrote to I/O port %02X\n", (int) addr );
// envelope mode
if ( addr == 13 )
{
if ( !(data & 8) ) // convert modes 0-7 to proper equivalents
data = (data & 4) ? 15 : 9;
- env.wave = env.modes [data - 7];
- env.pos = -48;
- env.delay = 0; // will get set to envelope period in run_until()
+ env_wave = env_modes [data - 7];
+ env_pos = -48;
+ env_delay = 0; // will get set to envelope period in run_until()
}
regs [addr] = data;
@@ -143,7 +153,7 @@ void Ay_Apu::write_data_( int addr, int data )
int i = addr >> 1;
if ( i < osc_count )
{
- blip_time_t period = (regs [i * 2 + 1] & 0x0F) * (0x100L * period_factor) +
+ blip_time_t period = (regs [i * 2 + 1] & 0x0F) * (0x100 * period_factor) +
regs [i * 2] * period_factor;
if ( !period )
period = period_factor;
@@ -170,16 +180,16 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
blip_time_t noise_period = (regs [6] & 0x1F) * noise_period_factor;
if ( !noise_period )
noise_period = noise_period_factor;
- blip_time_t const old_noise_delay = noise.delay;
- blargg_ulong const old_noise_lfsr = noise.lfsr;
+ blip_time_t const old_noise_delay = noise_delay;
+ unsigned const old_noise_lfsr = noise_lfsr;
// envelope period
blip_time_t const env_period_factor = period_factor * 2; // verified
- blip_time_t env_period = (regs [12] * 0x100L + regs [11]) * env_period_factor;
+ blip_time_t env_period = (regs [12] * 0x100 + regs [11]) * env_period_factor;
if ( !env_period )
env_period = env_period_factor; // same as period 1 on my AY chip
- if ( !env.delay )
- env.delay = env_period;
+ if ( !env_delay )
+ env_delay = env_period;
// run each osc separately
for ( int index = 0; index < osc_count; index++ )
@@ -195,8 +205,8 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
// period
int half_vol = 0;
- blip_time_t inaudible_period = (blargg_ulong) (osc_output->clock_rate() +
- inaudible_freq) / (inaudible_freq * 2);
+ blip_time_t inaudible_period = (unsigned) (osc_output->clock_rate() +
+ inaudible_freq) / (unsigned) (inaudible_freq * 2);
if ( osc->period <= inaudible_period && !(osc_mode & tone_off) )
{
half_vol = 1; // Actually around 60%, but 50% is close enough
@@ -208,14 +218,14 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
blip_time_t end_time = final_end_time;
int const vol_mode = regs [0x08 + index];
int volume = amp_table [vol_mode & 0x0F] >> half_vol;
- int osc_env_pos = env.pos;
+ int osc_env_pos = env_pos;
if ( vol_mode & 0x10 )
{
- volume = env.wave [osc_env_pos] >> half_vol;
+ volume = env_wave [osc_env_pos] >> half_vol;
// use envelope only if it's a repeating wave or a ramp that hasn't finished
if ( !(regs [13] & 1) || osc_env_pos < -32 )
{
- end_time = start_time + env.delay;
+ end_time = start_time + env_delay;
if ( end_time >= final_end_time )
end_time = final_end_time;
@@ -237,14 +247,14 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
blip_time_t time = start_time + osc->delay;
if ( osc_mode & tone_off ) // maintain tone's phase when off
{
- blargg_long count = (final_end_time - time + period - 1) / period;
+ int count = (final_end_time - time + period - 1) / period;
time += count * period;
osc->phase ^= count & 1;
}
// noise time
blip_time_t ntime = final_end_time;
- blargg_ulong noise_lfsr = 1;
+ unsigned noise_lfsr = 1;
if ( !(osc_mode & noise_off) )
{
ntime = start_time + old_noise_delay;
@@ -311,8 +321,8 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
else
{
// 20 or more noise periods on average for some music
- blargg_long remain = end - ntime;
- blargg_long count = remain / noise_period;
+ int remain = end - ntime;
+ int count = remain / noise_period;
if ( remain >= 0 )
ntime += noise_period + count * noise_period;
}
@@ -327,11 +337,12 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
delta = -delta;
synth_.offset( time, delta, osc_output );
time += period;
+
+ // alternate (less-efficient) implementation
//phase ^= 1;
}
- //assert( phase == (delta > 0) );
phase = unsigned (-delta) >> (CHAR_BIT * sizeof (unsigned) - 1);
- // (delta > 0)
+ check( phase == (delta > 0) );
}
else
{
@@ -358,7 +369,7 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
// next envelope step
if ( ++osc_env_pos >= 0 )
osc_env_pos -= 32;
- volume = env.wave [osc_env_pos] >> half_vol;
+ volume = env_wave [osc_env_pos] >> half_vol;
start_time = end_time;
end_time += env_period;
@@ -369,27 +380,27 @@ void Ay_Apu::run_until( blip_time_t final_end_time )
if ( !(osc_mode & noise_off) )
{
- noise.delay = ntime - final_end_time;
- noise.lfsr = noise_lfsr;
+ noise_delay = ntime - final_end_time;
+ this->noise_lfsr = noise_lfsr;
}
}
// TODO: optimized saw wave envelope?
// maintain envelope phase
- blip_time_t remain = final_end_time - last_time - env.delay;
+ blip_time_t remain = final_end_time - last_time - env_delay;
if ( remain >= 0 )
{
- blargg_long count = (remain + env_period) / env_period;
- env.pos += count;
- if ( env.pos >= 0 )
- env.pos = (env.pos & 31) - 32;
+ int count = (remain + env_period) / env_period;
+ env_pos += count;
+ if ( env_pos >= 0 )
+ env_pos = (env_pos & 31) - 32;
remain -= count * env_period;
assert( -remain <= env_period );
}
- env.delay = -remain;
- assert( env.delay > 0 );
- assert( env.pos < 0 );
+ env_delay = -remain;
+ assert( env_delay > 0 );
+ assert( env_pos < 0 );
last_time = final_end_time;
}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.h
new file mode 100644
index 00000000..bafdea47
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Apu.h
@@ -0,0 +1,104 @@
+// AY-3-8910 sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef AY_APU_H
+#define AY_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Ay_Apu {
+public:
+// Basics
+
+ // Sets buffer to generate sound into, or 0 to mute.
+ void set_output( Blip_Buffer* );
+
+ // Writes to address register
+ void write_addr( int data ) { addr_ = data & 0x0F; }
+
+ // Emulates to time t, then writes to current data register
+ void write_data( blip_time_t t, int data ) { run_until( t ); write_data_( addr_, data ); }
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Reads from current data register
+ int read();
+
+ // Resets sound chip
+ void reset();
+
+ // Number of registers
+ enum { reg_count = 16 };
+
+ // Same as set_output(), but for a particular channel
+ enum { osc_count = 3 };
+ void set_output( int chan, Blip_Buffer* );
+
+ // Sets overall volume, where 1.0 is normal
+ void volume( double v ) { synth_.volume( 0.7/osc_count/amp_range * v ); }
+
+ // Sets treble equalization
+ void treble_eq( blip_eq_t const& eq ) { synth_.treble_eq( eq ); }
+
+private:
+ // noncopyable
+ Ay_Apu( const Ay_Apu& );
+ Ay_Apu& operator = ( const Ay_Apu& );
+
+// Implementation
+public:
+ Ay_Apu();
+ BLARGG_DISABLE_NOTHROW
+ typedef BOOST::uint8_t byte;
+
+private:
+ struct osc_t
+ {
+ blip_time_t period;
+ blip_time_t delay;
+ short last_amp;
+ short phase;
+ Blip_Buffer* output;
+ } oscs [osc_count];
+
+ blip_time_t last_time;
+ byte addr_;
+ byte regs [reg_count];
+
+ blip_time_t noise_delay;
+ unsigned noise_lfsr;
+
+ blip_time_t env_delay;
+ byte const* env_wave;
+ int env_pos;
+ byte env_modes [8] [48]; // values already passed through volume table
+
+ void write_data_( int addr, int data );
+ void run_until( blip_time_t );
+
+public:
+ enum { amp_range = 255 };
+ Blip_Synth_Norm synth_; // used by Ay_Core for beeper sound
+};
+
+inline void Ay_Apu::set_output( int i, Blip_Buffer* out )
+{
+ assert( (unsigned) i < osc_count );
+ oscs [i].output = out;
+}
+
+inline void Ay_Apu::end_frame( blip_time_t time )
+{
+ if ( time > last_time )
+ run_until( time );
+
+ last_time -= time;
+ assert( last_time >= 0 );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.cpp
new file mode 100644
index 00000000..4c56f56a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.cpp
@@ -0,0 +1,190 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Ay_Core.h"
+
+/* Copyright (C) 2006-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+inline void Ay_Core::disable_beeper()
+{
+ beeper_mask = 0;
+ last_beeper = 0;
+}
+
+Ay_Core::Ay_Core()
+{
+ beeper_output = NULL;
+ disable_beeper();
+}
+
+Ay_Core::~Ay_Core() { }
+
+void Ay_Core::set_beeper_output( Blip_Buffer* b )
+{
+ beeper_output = b;
+ if ( b && !cpc_mode )
+ beeper_mask = 0x10;
+ else
+ disable_beeper();
+}
+
+void Ay_Core::start_track( registers_t const& r, addr_t play )
+{
+ play_addr = play;
+
+ memset( mem_.padding1, 0xFF, sizeof mem_.padding1 );
+
+ int const mirrored = 0x80; // this much is mirrored after end of memory
+ memset( mem_.ram + mem_size + mirrored, 0xFF, sizeof mem_.ram - mem_size - mirrored );
+ memcpy( mem_.ram + mem_size, mem_.ram, mirrored ); // some code wraps around (ugh)
+
+ cpu.reset( mem_.padding1, mem_.padding1 );
+ cpu.map_mem( 0, mem_size, mem_.ram, mem_.ram );
+ cpu.r = r;
+
+ beeper_delta = (int) (apu_.amp_range * 0.8);
+ last_beeper = 0;
+ next_play = play_period;
+ spectrum_mode = false;
+ cpc_mode = false;
+ cpc_latch = 0;
+ set_beeper_output( beeper_output );
+ apu_.reset();
+
+ // a few tunes rely on channels having tone enabled at the beginning
+ apu_.write_addr( 7 );
+ apu_.write_data( 0, 0x38 );
+
+}
+
+// Emulation
+
+void Ay_Core::cpu_out_( time_t time, addr_t addr, int data )
+{
+ // Spectrum
+ if ( !cpc_mode )
+ {
+ switch ( addr & 0xFEFF )
+ {
+ case 0xFEFD:
+ spectrum_mode = true;
+ apu_.write_addr( data );
+ return;
+
+ case 0xBEFD:
+ spectrum_mode = true;
+ apu_.write_data( time, data );
+ return;
+ }
+ }
+
+ // CPC
+ if ( !spectrum_mode )
+ {
+ switch ( addr >> 8 )
+ {
+ case 0xF6:
+ switch ( data & 0xC0 )
+ {
+ case 0xC0:
+ apu_.write_addr( cpc_latch );
+ goto enable_cpc;
+
+ case 0x80:
+ apu_.write_data( time, cpc_latch );
+ goto enable_cpc;
+ }
+ break;
+
+ case 0xF4:
+ cpc_latch = data;
+ goto enable_cpc;
+ }
+ }
+
+ dprintf( "Unmapped OUT: $%04X <- $%02X\n", addr, data );
+ return;
+
+enable_cpc:
+ if ( !cpc_mode )
+ {
+ cpc_mode = true;
+ disable_beeper();
+ set_cpc_callback.f( set_cpc_callback.data );
+ }
+}
+
+int Ay_Core::cpu_in( addr_t addr )
+{
+ // keyboard read and other things
+ if ( (addr & 0xFF) == 0xFE )
+ return 0xFF; // other values break some beeper tunes
+
+ dprintf( "Unmapped IN : $%04X\n", addr );
+ return 0xFF;
+}
+
+void Ay_Core::end_frame( time_t* end )
+{
+ cpu.set_time( 0 );
+
+ // Since detection of CPC mode will halve clock rate during the frame
+ // and thus generate up to twice as much sound, we must generate half
+ // as much until mode is known.
+ if ( !(spectrum_mode | cpc_mode) )
+ *end /= 2;
+
+ while ( cpu.time() < *end )
+ {
+ run_cpu( min( *end, next_play ) );
+
+ if ( cpu.time() >= next_play )
+ {
+ // next frame
+ next_play += play_period;
+
+ if ( cpu.r.iff1 )
+ {
+ // interrupt enabled
+
+ if ( mem_.ram [cpu.r.pc] == 0x76 )
+ cpu.r.pc++; // advance past HALT instruction
+
+ cpu.r.iff1 = 0;
+ cpu.r.iff2 = 0;
+
+ mem_.ram [--cpu.r.sp] = byte (cpu.r.pc >> 8);
+ mem_.ram [--cpu.r.sp] = byte (cpu.r.pc);
+
+ // fixed interrupt
+ cpu.r.pc = 0x38;
+ cpu.adjust_time( 12 );
+
+ if ( cpu.r.im == 2 )
+ {
+ // vectored interrupt
+ addr_t addr = cpu.r.i * 0x100 + 0xFF;
+ cpu.r.pc = mem_.ram [(addr + 1) & 0xFFFF] * 0x100 + mem_.ram [addr];
+ cpu.adjust_time( 6 );
+ }
+ }
+ }
+ }
+
+ // End time frame
+ *end = cpu.time();
+ next_play -= *end;
+ check( next_play >= 0 );
+ cpu.adjust_time( -*end );
+ apu_.end_frame( *end );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.h
new file mode 100644
index 00000000..30230f66
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Core.h
@@ -0,0 +1,81 @@
+// Sinclair Spectrum AY music emulator core
+
+// Game_Music_Emu 0.6-pre
+#ifndef AY_CORE_H
+#define AY_CORE_H
+
+#include "Z80_Cpu.h"
+#include "Ay_Apu.h"
+
+class Ay_Core {
+public:
+
+ // Clock count
+ typedef int time_t;
+
+ // Sound chip access, to assign it to Blip_Buffer etc.
+ Ay_Apu& apu() { return apu_; }
+
+ // Sets beeper sound buffer, or NULL to mute it. Volume and treble EQ of
+ // beeper are set by APU.
+ void set_beeper_output( Blip_Buffer* );
+
+ // Sets time between calls to play routine. Can be changed while playing.
+ void set_play_period( time_t p ) { play_period = p; }
+
+ // 64K memory to load code and data into before starting track. Caller
+ // must parse the AY file.
+ BOOST::uint8_t* mem() { return mem_.ram; }
+ enum { mem_size = 0x10000 };
+ enum { ram_addr = 0x4000 }; // where official RAM starts
+
+ // Starts track using specified register values, and sets play routine that
+ // is called periodically
+ typedef Z80_Cpu::registers_t registers_t;
+ typedef int addr_t;
+ void start_track( registers_t const&, addr_t play );
+
+ // Ends time frame of at most *end clocks and sets *end to number of clocks
+ // emulated. Until Spectrum/CPC mode is determined, *end is HALVED.
+ void end_frame( time_t* end );
+
+ // Called when CPC hardware is first accessed. AY file format doesn't specify
+ // which sound hardware is used, so it must be determined during playback
+ // based on which sound port is first used.
+ blargg_callback<void (*)( void* )> set_cpc_callback;
+
+// Implementation
+public:
+ Ay_Core();
+ ~Ay_Core();
+
+private:
+ Blip_Buffer* beeper_output;
+ int beeper_delta;
+ int last_beeper;
+ int beeper_mask;
+
+ addr_t play_addr;
+ time_t play_period;
+ time_t next_play;
+
+ int cpc_latch;
+ bool spectrum_mode;
+ bool cpc_mode;
+
+ // large items
+ Z80_Cpu cpu;
+ struct {
+ BOOST::uint8_t padding1 [0x100];
+ BOOST::uint8_t ram [mem_size + 0x100];
+ } mem_;
+ Ay_Apu apu_;
+
+ int cpu_in( addr_t );
+ void cpu_out( time_t, addr_t, int data );
+ void cpu_out_( time_t, addr_t, int data );
+ bool run_cpu( time_t end );
+ void disable_beeper();
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Cpu.cpp
new file mode 100644
index 00000000..f0b66b62
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Cpu.cpp
@@ -0,0 +1,59 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Ay_Core.h"
+
+#include "blargg_endian.h"
+//#include "z80_cpu_log.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void Ay_Core::cpu_out( time_t time, addr_t addr, int data )
+{
+ if ( (addr & 0xFF) == 0xFE )
+ {
+ check( !cpc_mode );
+ spectrum_mode = !cpc_mode;
+
+ // beeper_mask and last_beeper are 0 if (cpc_mode || !beeper_output)
+ if ( (data &= beeper_mask) != last_beeper )
+ {
+ last_beeper = data;
+ int delta = -beeper_delta;
+ beeper_delta = delta;
+ Blip_Buffer* bb = beeper_output;
+ bb->set_modified();
+ apu_.synth_.offset( time, delta, bb );
+ }
+ }
+ else
+ {
+ cpu_out_( time, addr, data );
+ }
+}
+
+#define OUT_PORT( addr, data ) cpu_out( TIME(), addr, data )
+#define IN_PORT( addr ) cpu_in( addr )
+#define FLAT_MEM mem
+#define CPU cpu
+
+#define CPU_BEGIN \
+bool Ay_Core::run_cpu( time_t end_time ) \
+{\
+ cpu.set_end_time( end_time );\
+ byte* const mem = mem_.ram; // cache
+
+ #include "Z80_Cpu_run.h"
+
+ return warning;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.cpp
new file mode 100644
index 00000000..fafbc4ce
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.cpp
@@ -0,0 +1,306 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Ay_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// TODO: probably don't need detailed errors as to why file is corrupt
+
+int const spectrum_clock = 3546900; // 128K Spectrum
+int const spectrum_period = 70908;
+
+//int const spectrum_clock = 3500000; // 48K Spectrum
+//int const spectrum_period = 69888;
+
+int const cpc_clock = 2000000;
+
+Ay_Emu::Ay_Emu()
+{
+ core.set_cpc_callback( enable_cpc_, this );
+ set_type( gme_ay_type );
+ set_silence_lookahead( 6 );
+}
+
+Ay_Emu::~Ay_Emu() { }
+
+// Track info
+
+// Given pointer to 2-byte offset of data, returns pointer to data, or NULL if
+// offset is 0 or there is less than min_size bytes of data available.
+static byte const* get_data( Ay_Emu::file_t const& file, byte const ptr [], int min_size )
+{
+ int offset = (BOOST::int16_t) get_be16( ptr );
+ int pos = ptr - (byte const*) file.header;
+ int size = file.end - (byte const*) file.header;
+ assert( (unsigned) pos <= (unsigned) size - 2 );
+ int limit = size - min_size;
+ if ( limit < 0 || !offset || (unsigned) (pos + offset) > (unsigned) limit )
+ return NULL;
+ return ptr + offset;
+}
+
+static blargg_err_t parse_header( byte const in [], int size, Ay_Emu::file_t* out )
+{
+ typedef Ay_Emu::header_t header_t;
+ if ( size < header_t::size )
+ return blargg_err_file_type;
+
+ out->header = (header_t const*) in;
+ out->end = in + size;
+ header_t const& h = *(header_t const*) in;
+ if ( memcmp( h.tag, "ZXAYEMUL", 8 ) )
+ return blargg_err_file_type;
+
+ out->tracks = get_data( *out, h.track_info, (h.max_track + 1) * 4 );
+ if ( !out->tracks )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "missing track data" );
+
+ return blargg_ok;
+}
+
+static void copy_ay_fields( Ay_Emu::file_t const& file, track_info_t* out, int track )
+{
+ Gme_File::copy_field_( out->song, (char const*) get_data( file, file.tracks + track * 4, 1 ) );
+ byte const* track_info = get_data( file, file.tracks + track * 4 + 2, 6 );
+ if ( track_info )
+ out->length = get_be16( track_info + 4 ) * (1000 / 50); // frames to msec
+
+ Gme_File::copy_field_( out->author, (char const*) get_data( file, file.header->author, 1 ) );
+ Gme_File::copy_field_( out->comment, (char const*) get_data( file, file.header->comment, 1 ) );
+}
+
+blargg_err_t Ay_Emu::track_info_( track_info_t* out, int track ) const
+{
+ copy_ay_fields( file, out, track );
+ return blargg_ok;
+}
+
+struct Ay_File : Gme_Info_
+{
+ Ay_Emu::file_t file;
+
+ Ay_File() { set_type( gme_ay_type ); }
+
+ blargg_err_t load_mem_( byte const begin [], int size )
+ {
+ RETURN_ERR( parse_header( begin, size, &file ) );
+ set_track_count( file.header->max_track + 1 );
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int track ) const
+ {
+ copy_ay_fields( file, out, track );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_ay_emu ()
+{
+ return BLARGG_NEW Ay_Emu;
+}
+
+static Music_Emu* new_ay_file()
+{
+ return BLARGG_NEW Ay_File;
+}
+
+gme_type_t_ const gme_ay_type [1] = {{
+ "ZX Spectrum",
+ 0,
+ &new_ay_emu,
+ &new_ay_file,
+ "AY",
+ 1
+}};
+
+// Setup
+
+blargg_err_t Ay_Emu::load_mem_( byte const in [], int size )
+{
+ assert( offsetof (header_t,track_info [2]) == header_t::size );
+
+ RETURN_ERR( parse_header( in, size, &file ) );
+ set_track_count( file.header->max_track + 1 );
+
+ if ( file.header->vers > 2 )
+ set_warning( "Unknown file version" );
+
+ int const osc_count = Ay_Apu::osc_count + 1; // +1 for beeper
+
+ set_voice_count( osc_count );
+ core.apu().volume( gain() );
+
+ static const char* const names [osc_count] = {
+ "Wave 1", "Wave 2", "Wave 3", "Beeper"
+ };
+ set_voice_names( names );
+
+ static int const types [osc_count] = {
+ wave_type+0, wave_type+1, wave_type+2, mixed_type+1
+ };
+ set_voice_types( types );
+
+ return setup_buffer( spectrum_clock );
+}
+
+void Ay_Emu::update_eq( blip_eq_t const& eq )
+{
+ core.apu().treble_eq( eq );
+}
+
+void Ay_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer*, Blip_Buffer* )
+{
+ if ( i >= Ay_Apu::osc_count )
+ core.set_beeper_output( center );
+ else
+ core.apu().set_output( i, center );
+}
+
+void Ay_Emu::set_tempo_( double t )
+{
+ int p = spectrum_period;
+ if ( clock_rate() != spectrum_clock )
+ p = clock_rate() / 50;
+
+ core.set_play_period( blip_time_t (p / t) );
+}
+
+blargg_err_t Ay_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+
+ byte* const mem = core.mem();
+
+ memset( mem + 0x0000, 0xC9, 0x100 ); // fill RST vectors with RET
+ memset( mem + 0x0100, 0xFF, 0x4000 - 0x100 );
+ memset( mem + core.ram_addr, 0x00, core.mem_size - core.ram_addr );
+
+ // locate data blocks
+ byte const* const data = get_data( file, file.tracks + track * 4 + 2, 14 );
+ if ( !data )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "file data missing" );
+
+ byte const* const more_data = get_data( file, data + 10, 6 );
+ if ( !more_data )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "file data missing" );
+
+ byte const* blocks = get_data( file, data + 12, 8 );
+ if ( !blocks )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "file data missing" );
+
+ // initial addresses
+ unsigned addr = get_be16( blocks );
+ if ( !addr )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "file data missing" );
+
+ unsigned init = get_be16( more_data + 2 );
+ if ( !init )
+ init = addr;
+
+ // copy blocks into memory
+ do
+ {
+ blocks += 2;
+ unsigned len = get_be16( blocks ); blocks += 2;
+ if ( addr + len > core.mem_size )
+ {
+ set_warning( "Bad data block size" );
+ len = core.mem_size - addr;
+ }
+ check( len );
+ byte const* in = get_data( file, blocks, 0 ); blocks += 2;
+ if ( len > (unsigned) (file.end - in) )
+ {
+ set_warning( "File data missing" );
+ len = file.end - in;
+ }
+ //dprintf( "addr: $%04X, len: $%04X\n", addr, len );
+ if ( addr < core.ram_addr && addr >= 0x400 ) // several tracks use low data
+ dprintf( "Block addr in ROM\n" );
+ memcpy( mem + addr, in, len );
+
+ if ( file.end - blocks < 8 )
+ {
+ set_warning( "File data missing" );
+ break;
+ }
+ }
+ while ( (addr = get_be16( blocks )) != 0 );
+
+ // copy and configure driver
+ static byte const passive [] = {
+ 0xF3, // DI
+ 0xCD, 0, 0, // CALL init
+ 0xED, 0x5E, // LOOP: IM 2
+ 0xFB, // EI
+ 0x76, // HALT
+ 0x18, 0xFA // JR LOOP
+ };
+ static byte const active [] = {
+ 0xF3, // DI
+ 0xCD, 0, 0, // CALL init
+ 0xED, 0x56, // LOOP: IM 1
+ 0xFB, // EI
+ 0x76, // HALT
+ 0xCD, 0, 0, // CALL play
+ 0x18, 0xF7 // JR LOOP
+ };
+ memcpy( mem, passive, sizeof passive );
+ int const play_addr = get_be16( more_data + 4 );
+ if ( play_addr )
+ {
+ memcpy( mem, active, sizeof active );
+ mem [ 9] = play_addr;
+ mem [10] = play_addr >> 8;
+ }
+ mem [2] = init;
+ mem [3] = init >> 8;
+
+ mem [0x38] = 0xFB; // Put EI at interrupt vector (followed by RET)
+
+ // start at spectrum speed
+ change_clock_rate( spectrum_clock );
+ set_tempo( tempo() );
+
+ Ay_Core::registers_t r = { };
+ r.sp = get_be16( more_data );
+ r.b.a = r.b.b = r.b.d = r.b.h = data [8];
+ r.b.flags = r.b.c = r.b.e = r.b.l = data [9];
+ r.alt.w = r.w;
+ r.ix = r.iy = r.w.hl;
+
+ core.start_track( r, play_addr );
+
+ return blargg_ok;
+}
+
+blargg_err_t Ay_Emu::run_clocks( blip_time_t& duration, int )
+{
+ core.end_frame( &duration );
+ return blargg_ok;
+}
+
+inline void Ay_Emu::enable_cpc()
+{
+ change_clock_rate( cpc_clock );
+ set_tempo( tempo() );
+}
+
+void Ay_Emu::enable_cpc_( void* data )
+{
+ STATIC_CAST(Ay_Emu*,data)->enable_cpc();
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.h
new file mode 100644
index 00000000..440353b6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ay_Emu.h
@@ -0,0 +1,58 @@
+// Sinclair Spectrum AY music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef AY_EMU_H
+#define AY_EMU_H
+
+#include "Classic_Emu.h"
+#include "Ay_Core.h"
+
+class Ay_Emu : public Classic_Emu {
+public:
+ // AY file header
+ struct header_t
+ {
+ enum { size = 0x14 };
+
+ byte tag [8];
+ byte vers;
+ byte player;
+ byte unused [2];
+ byte author [2];
+ byte comment [2];
+ byte max_track;
+ byte first_track;
+ byte track_info [2];
+ };
+
+ static gme_type_t static_type() { return gme_ay_type; }
+
+// Implementation
+public:
+ Ay_Emu();
+ ~Ay_Emu();
+
+ struct file_t {
+ header_t const* header;
+ byte const* tracks;
+ byte const* end; // end of file data
+ };
+
+protected:
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_mem_( byte const [], int );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+
+private:
+ file_t file;
+ Ay_Core core;
+
+ void enable_cpc();
+ static void enable_cpc_( void* data );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.cpp
new file mode 100644
index 00000000..97166297
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.cpp
@@ -0,0 +1,509 @@
+// Blip_Buffer 0.4.0. http://www.slack.net/~ant/
+
+#include "Blip_Buffer.h"
+
+#include <math.h>
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+//// Blip_Buffer
+
+Blip_Buffer::Blip_Buffer()
+{
+ factor_ = UINT_MAX/2 + 1;
+ buffer_ = NULL;
+ buffer_center_ = NULL;
+ buffer_size_ = 0;
+ sample_rate_ = 0;
+ bass_shift_ = 0;
+ clock_rate_ = 0;
+ bass_freq_ = 16;
+ length_ = 0;
+
+ // assumptions code makes about implementation-defined features
+ #ifndef NDEBUG
+ // right shift of negative value preserves sign
+ int i = -0x7FFFFFFE;
+ assert( (i >> 1) == -0x3FFFFFFF );
+
+ // casting truncates and sign-extends
+ i = 0x18000;
+ assert( (BOOST::int16_t) i == -0x8000 );
+ #endif
+
+ clear();
+}
+
+Blip_Buffer::~Blip_Buffer()
+{
+ free( buffer_ );
+}
+
+void Blip_Buffer::clear()
+{
+ bool const entire_buffer = true;
+
+ offset_ = 0;
+ reader_accum_ = 0;
+ modified_ = false;
+
+ if ( buffer_ )
+ {
+ int count = (entire_buffer ? buffer_size_ : samples_avail());
+ memset( buffer_, 0, (count + blip_buffer_extra_) * sizeof (delta_t) );
+ }
+}
+
+blargg_err_t Blip_Buffer::set_sample_rate( int new_rate, int msec )
+{
+ // Limit to maximum size that resampled time can represent
+ int max_size = (((blip_resampled_time_t) -1) >> BLIP_BUFFER_ACCURACY) -
+ blip_buffer_extra_ - 64; // TODO: -64 isn't needed
+ int new_size = (new_rate * (msec + 1) + 999) / 1000;
+ if ( new_size > max_size )
+ new_size = max_size;
+
+ // Resize buffer
+ if ( buffer_size_ != new_size )
+ {
+ //dprintf( "%d \n", (new_size + blip_buffer_extra_) * sizeof *buffer_ );
+ void* p = realloc( buffer_, (new_size + blip_buffer_extra_) * sizeof *buffer_ );
+ CHECK_ALLOC( p );
+ buffer_ = (delta_t*) p;
+ buffer_center_ = buffer_ + BLIP_MAX_QUALITY/2;
+ buffer_size_ = new_size;
+ }
+
+ // Update sample_rate and things that depend on it
+ sample_rate_ = new_rate;
+ length_ = new_size * 1000 / new_rate - 1;
+ if ( clock_rate_ )
+ clock_rate( clock_rate_ );
+ bass_freq( bass_freq_ );
+
+ clear();
+
+ return blargg_ok;
+}
+
+blip_resampled_time_t Blip_Buffer::clock_rate_factor( int rate ) const
+{
+ double ratio = (double) sample_rate_ / rate;
+ int factor = (int) floor( ratio * (1 << BLIP_BUFFER_ACCURACY) + 0.5 );
+ assert( factor > 0 || !sample_rate_ ); // fails if clock/output ratio is too large
+ return (blip_resampled_time_t) factor;
+}
+
+void Blip_Buffer::bass_freq( int freq )
+{
+ bass_freq_ = freq;
+ int shift = 31;
+ if ( freq > 0 && sample_rate_ )
+ {
+ shift = 13;
+ int f = (freq << 16) / sample_rate_;
+ while ( (f >>= 1) != 0 && --shift ) { }
+ }
+ bass_shift_ = shift;
+}
+
+void Blip_Buffer::end_frame( blip_time_t t )
+{
+ offset_ += t * factor_;
+ assert( samples_avail() <= (int) buffer_size_ ); // fails if time is past end of buffer
+}
+
+int Blip_Buffer::count_samples( blip_time_t t ) const
+{
+ blip_resampled_time_t last_sample = resampled_time( t ) >> BLIP_BUFFER_ACCURACY;
+ blip_resampled_time_t first_sample = offset_ >> BLIP_BUFFER_ACCURACY;
+ return (int) (last_sample - first_sample);
+}
+
+blip_time_t Blip_Buffer::count_clocks( int count ) const
+{
+ if ( count > buffer_size_ )
+ count = buffer_size_;
+ blip_resampled_time_t time = (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
+ return (blip_time_t) ((time - offset_ + factor_ - 1) / factor_);
+}
+
+void Blip_Buffer::remove_samples( int count )
+{
+ if ( count )
+ {
+ remove_silence( count );
+
+ // copy remaining samples to beginning and clear old samples
+ int remain = samples_avail() + blip_buffer_extra_;
+ memmove( buffer_, buffer_ + count, remain * sizeof *buffer_ );
+ memset( buffer_ + remain, 0, count * sizeof *buffer_ );
+ }
+}
+
+int Blip_Buffer::read_samples( blip_sample_t out_ [], int max_samples, bool stereo )
+{
+ int count = samples_avail();
+ if ( count > max_samples )
+ count = max_samples;
+
+ if ( count )
+ {
+ int const bass = highpass_shift();
+ delta_t const* reader = read_pos() + count;
+ int reader_sum = integrator();
+
+ blip_sample_t* BLARGG_RESTRICT out = out_ + count;
+ if ( stereo )
+ out += count;
+ int offset = -count;
+
+ if ( !stereo )
+ {
+ do
+ {
+ int s = reader_sum >> delta_bits;
+
+ reader_sum -= reader_sum >> bass;
+ reader_sum += reader [offset];
+
+ BLIP_CLAMP( s, s );
+ out [offset] = (blip_sample_t) s;
+ }
+ while ( ++offset );
+ }
+ else
+ {
+ do
+ {
+ int s = reader_sum >> delta_bits;
+
+ reader_sum -= reader_sum >> bass;
+ reader_sum += reader [offset];
+
+ BLIP_CLAMP( s, s );
+ out [offset * 2] = (blip_sample_t) s;
+ }
+ while ( ++offset );
+ }
+
+ set_integrator( reader_sum );
+
+ remove_samples( count );
+ }
+ return count;
+}
+
+void Blip_Buffer::mix_samples( blip_sample_t const in [], int count )
+{
+ delta_t* out = buffer_center_ + (offset_ >> BLIP_BUFFER_ACCURACY);
+
+ int const sample_shift = blip_sample_bits - 16;
+ int prev = 0;
+ while ( --count >= 0 )
+ {
+ int s = *in++ << sample_shift;
+ *out += s - prev;
+ prev = s;
+ ++out;
+ }
+ *out -= prev;
+}
+
+void Blip_Buffer::save_state( blip_buffer_state_t* out )
+{
+ assert( samples_avail() == 0 );
+ out->offset_ = offset_;
+ out->reader_accum_ = reader_accum_;
+ memcpy( out->buf, &buffer_ [offset_ >> BLIP_BUFFER_ACCURACY], sizeof out->buf );
+}
+
+void Blip_Buffer::load_state( blip_buffer_state_t const& in )
+{
+ clear();
+
+ offset_ = in.offset_;
+ reader_accum_ = in.reader_accum_;
+ memcpy( buffer_, in.buf, sizeof in.buf );
+}
+
+
+//// Blip_Synth_
+
+Blip_Synth_Fast_::Blip_Synth_Fast_()
+{
+ buf = NULL;
+ last_amp = 0;
+ delta_factor = 0;
+}
+
+void Blip_Synth_Fast_::volume_unit( double new_unit )
+{
+ delta_factor = int (new_unit * (1 << blip_sample_bits) + 0.5);
+}
+
+#if BLIP_BUFFER_FAST
+
+void blip_eq_t::generate( float* out, int count ) const { }
+
+#else
+
+Blip_Synth_::Blip_Synth_( short p [], int w ) :
+ phases( p ),
+ width( w )
+{
+ volume_unit_ = 0.0;
+ kernel_unit = 0;
+ buf = NULL;
+ last_amp = 0;
+ delta_factor = 0;
+}
+
+#undef PI
+#define PI 3.1415926535897932384626433832795029
+
+// Generates right half of sinc kernel (including center point) with cutoff at
+// sample rate / 2 / oversample. Frequency response at cutoff frequency is
+// treble dB (-6=0.5,-12=0.25). Mid controls frequency that rolloff begins at,
+// cut * sample rate / 2.
+static void gen_sinc( float out [], int out_size, double oversample,
+ double treble, double mid )
+{
+ if ( mid > 0.9999 ) mid = 0.9999;
+ if ( treble < -300.0 ) treble = -300.0;
+ if ( treble > 5.0 ) treble = 5.0;
+
+ double const maxh = 4096.0;
+ double rolloff = pow( 10.0, 1.0 / (maxh * 20.0) * treble / (1.0 - mid) );
+ double const pow_a_n = pow( rolloff, maxh - maxh * mid );
+ double const to_angle = PI / maxh / oversample;
+ for ( int i = 1; i < out_size; i++ )
+ {
+ double angle = i * to_angle;
+ double c = rolloff * cos( angle * maxh - angle ) -
+ cos( angle * maxh );
+ double cos_nc_angle = cos( angle * maxh * mid );
+ double cos_nc1_angle = cos( angle * maxh * mid - angle );
+ double cos_angle = cos( angle );
+
+ c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle;
+ double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle);
+ double b = 2.0 - cos_angle - cos_angle;
+ double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle;
+
+ out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d
+ }
+
+ // Approximate center by looking at two points to right. Much simpler
+ // and more reliable than trying to calculate it properly.
+ out [0] = out [1] + 0.5 * (out [1] - out [2]);
+}
+
+// Gain is 1-2800 for beta of 0-10, instead of 1.0 as it should be, but
+// this is corrected by normalization in treble_eq().
+static void kaiser_window( float io [], int count, float beta )
+{
+ int const accuracy = 10;
+
+ float const beta2 = beta * beta;
+ float const step = (float) 0.5 / count;
+ float pos = (float) 0.5;
+ for ( float* const end = io + count; io < end; ++io )
+ {
+ float x = (pos - pos*pos) * beta2;
+ float u = x;
+ float k = 1;
+ float n = 2;
+
+ // Keep refining until adjustment becomes small
+ do
+ {
+ u *= x / (n * n);
+ n += 1;
+ k += u;
+ }
+ while ( k <= u * (1 << accuracy) );
+
+ pos += step;
+ *io *= k;
+ }
+}
+
+void blip_eq_t::generate( float out [], int count ) const
+{
+ // lower cutoff freq for narrow kernels with their wider transition band
+ // (8 points->1.49, 16 points->1.15)
+ double cutoff_adj = blip_res * 2.25 / count + 0.85;
+ if ( cutoff_adj < 1.02 )
+ cutoff_adj = 1.02;
+ double half_rate = sample_rate * 0.5;
+ if ( cutoff_freq )
+ cutoff_adj = half_rate / cutoff_freq;
+ double cutoff = rolloff_freq * cutoff_adj / half_rate;
+
+ gen_sinc( out, count, oversample * cutoff_adj, treble, cutoff );
+
+ kaiser_window( out, count, kaiser );
+}
+
+void Blip_Synth_::treble_eq( blip_eq_t const& eq )
+{
+ // Generate right half of kernel
+ int const half_size = blip_eq_t::calc_count( width );
+ float fimpulse [blip_res / 2 * (BLIP_MAX_QUALITY - 1) + 1];
+ eq.generate( fimpulse, half_size );
+
+ int i;
+
+ // Find rescale factor. Summing from small to large (right to left)
+ // reduces error.
+ double total = 0.0;
+ for ( i = half_size; --i > 0; )
+ total += fimpulse [i];
+ total = total * 2.0 + fimpulse [0];
+
+ //double const base_unit = 44800.0 - 128 * 18; // allows treble up to +0 dB
+ //double const base_unit = 37888.0; // allows treble to +5 dB
+ double const base_unit = 32768.0; // necessary for blip_unscaled to work
+ double rescale = base_unit / total;
+ kernel_unit = (int) base_unit;
+
+ // Integrate, first difference, rescale, convert to int
+ double sum = 0;
+ double next = 0;
+ int const size = impulses_size();
+ for ( i = 0; i < size; i++ )
+ {
+ int j = (half_size - 1) - i;
+
+ if ( i >= blip_res )
+ sum += fimpulse [j + blip_res];
+
+ // goes slightly past center, so it needs a little mirroring
+ next += fimpulse [j < 0 ? -j : j];
+
+ // calculate unintereleved index
+ int x = (~i & (blip_res - 1)) * (width >> 1) + (i >> BLIP_PHASE_BITS);
+ assert( (unsigned) x < (unsigned) size );
+
+ // flooring separately virtually eliminates error
+ phases [x] = (short) (int)
+ (floor( sum * rescale + 0.5 ) - floor( next * rescale + 0.5 ));
+ //phases [x] = (short) (int)
+ // floor( sum * rescale - next * rescale + 0.5 );
+ }
+
+ adjust_impulse();
+
+ // volume might require rescaling
+ double vol = volume_unit_;
+ if ( vol )
+ {
+ volume_unit_ = 0.0;
+ volume_unit( vol );
+ }
+}
+
+void Blip_Synth_::adjust_impulse()
+{
+ int const size = impulses_size();
+ int const half_width = width / 2;
+
+ // Sum each phase as would be done when synthesizing, and correct
+ // any that don't add up to exactly kernel_half.
+ for ( int phase = blip_res / 2; --phase >= 0; )
+ {
+ int const fwd = phase * half_width;
+ int const rev = size - half_width - fwd;
+
+ int error = kernel_unit;
+ for ( int i = half_width; --i >= 0; )
+ {
+ error += phases [fwd + i];
+ error += phases [rev + i];
+ }
+ phases [fwd + half_width - 1] -= (short) error;
+
+ // Error shouldn't occur now with improved calculation
+ //if ( error ) printf( "error: %ld\n", error );
+ }
+
+ #if 0
+ for ( int i = 0; i < blip_res; i++, printf( "\n" ) )
+ for ( int j = 0; j < width / 2; j++ )
+ printf( "%5d,", (int) -phases [j + width/2 * i] );
+ #endif
+}
+
+void Blip_Synth_::rescale_kernel( int shift )
+{
+ // Keep values positive to avoid round-towards-zero of sign-preserving
+ // right shift for negative values.
+ int const keep_positive = 0x8000 + (1 << (shift - 1));
+
+ int const half_width = width / 2;
+ for ( int phase = blip_res; --phase >= 0; )
+ {
+ int const fwd = phase * half_width;
+
+ // Integrate, rescale, then differentiate again.
+ // If differences are rescaled directly, more error results.
+ int sum = keep_positive;
+ for ( int i = 0; i < half_width; i++ )
+ {
+ int prev = sum;
+ sum += phases [fwd + i];
+ phases [fwd + i] = (sum >> shift) - (prev >> shift);
+ }
+ }
+
+ adjust_impulse();
+}
+
+void Blip_Synth_::volume_unit( double new_unit )
+{
+ if ( volume_unit_ != new_unit )
+ {
+ // use default eq if it hasn't been set yet
+ if ( !kernel_unit )
+ treble_eq( -8.0 );
+
+ // Factor that kernel must be multiplied by
+ volume_unit_ = new_unit;
+ double factor = new_unit * (1 << blip_sample_bits) / kernel_unit;
+
+ if ( factor > 0.0 )
+ {
+ // If factor is low, reduce amplitude of kernel itself
+ int shift = 0;
+ while ( factor < 2.0 )
+ {
+ shift++;
+ factor *= 2.0;
+ }
+
+ if ( shift )
+ {
+ kernel_unit >>= shift;
+ assert( kernel_unit > 0 ); // fails if volume unit is too low
+
+ rescale_kernel( shift );
+ }
+ }
+
+ delta_factor = -(int) floor( factor + 0.5 );
+ //printf( "delta_factor: %d, kernel_unit: %d\n", delta_factor, kernel_unit );
+ }
+}
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.h b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.h
new file mode 100644
index 00000000..5208c816
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer.h
@@ -0,0 +1,198 @@
+// Band-limited sound synthesis buffer
+
+// Blip_Buffer 0.4.0
+#ifndef BLIP_BUFFER_H
+#define BLIP_BUFFER_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer_impl.h"
+
+typedef int blip_time_t; // Source clocks in current time frame
+typedef BOOST::int16_t blip_sample_t; // 16-bit signed output sample
+int const blip_default_length = 1000 / 4; // Default Blip_Buffer length (1/4 second)
+
+
+//// Sample buffer for band-limited synthesis
+
+class Blip_Buffer : public Blip_Buffer_ {
+public:
+
+ // Sets output sample rate and resizes and clears sample buffer
+ blargg_err_t set_sample_rate( int samples_per_sec, int msec_length = blip_default_length );
+
+ // Sets number of source time units per second
+ void clock_rate( int clocks_per_sec );
+
+ // Clears buffer and removes all samples
+ void clear();
+
+ // Use Blip_Synth to add waveform to buffer
+
+ // Resamples to time t, then subtracts t from current time. Appends result of resampling
+ // to buffer for reading.
+ void end_frame( blip_time_t t );
+
+ // Number of samples available for reading with read_samples()
+ int samples_avail() const;
+
+ // Reads at most n samples to out [0 to n-1] and returns number actually read. If stereo
+ // is true, writes to out [0], out [2], out [4] etc. instead.
+ int read_samples( blip_sample_t out [], int n, bool stereo = false );
+
+// More features
+
+ // Sets flag that tells some Multi_Buffer types that sound was added to buffer,
+ // so they know that it needs to be mixed in. Only needs to be called once
+ // per time frame that sound was added. Not needed if not using Multi_Buffer.
+ void set_modified() { modified_ = true; }
+
+ // Sets high-pass filter frequency, from 0 to 20000 Hz, where higher values reduce bass more
+ void bass_freq( int frequency );
+
+ int length() const; // Length of buffer in milliseconds
+ int sample_rate() const; // Current output sample rate
+ int clock_rate() const; // Number of source time units per second
+ int output_latency() const; // Number of samples delay from offset() to read_samples()
+
+// Low-level features
+
+ // Removes the first n samples
+ void remove_samples( int n );
+
+ // Returns number of clocks needed until n samples will be available.
+ // If buffer cannot even hold n samples, returns number of clocks
+ // until buffer becomes full.
+ blip_time_t count_clocks( int n ) const;
+
+ // Number of samples that should be mixed before calling end_frame( t )
+ int count_samples( blip_time_t t ) const;
+
+ // Mixes n samples into buffer
+ void mix_samples( const blip_sample_t in [], int n );
+
+// Resampled time (sorry, poor documentation right now)
+
+ // Resampled time is fixed-point, in terms of output samples.
+
+ // Converts clock count to resampled time
+ blip_resampled_time_t resampled_duration( int t ) const { return t * factor_; }
+
+ // Converts clock time since beginning of current time frame to resampled time
+ blip_resampled_time_t resampled_time( blip_time_t t ) const { return t * factor_ + offset_; }
+
+ // Returns factor that converts clock rate to resampled time
+ blip_resampled_time_t clock_rate_factor( int clock_rate ) const;
+
+// State save/load
+
+ // Saves state, including high-pass filter and tails of last deltas.
+ // All samples must have been read from buffer before calling this
+ // (that is, samples_avail() must return 0).
+ void save_state( blip_buffer_state_t* out );
+
+ // Loads state. State must have been saved from Blip_Buffer with same
+ // settings during same run of program; states can NOT be stored on disk.
+ // Clears buffer before loading state.
+ void load_state( const blip_buffer_state_t& in );
+
+private:
+ // noncopyable
+ Blip_Buffer( const Blip_Buffer& );
+ Blip_Buffer& operator = ( const Blip_Buffer& );
+
+// Implementation
+public:
+ BLARGG_DISABLE_NOTHROW
+ Blip_Buffer();
+ ~Blip_Buffer();
+ void remove_silence( int n );
+};
+
+
+//// Adds amplitude changes to Blip_Buffer
+
+template<int quality,int range> class Blip_Synth;
+
+typedef Blip_Synth<8, 1> Blip_Synth_Fast; // faster, but less equalizer control
+typedef Blip_Synth<12,1> Blip_Synth_Norm; // good for most things
+typedef Blip_Synth<16,1> Blip_Synth_Good; // sharper filter cutoff
+
+template<int quality,int range>
+class Blip_Synth {
+public:
+
+ // Sets volume of amplitude delta unit
+ void volume( double v ) { impl.volume_unit( 1.0 / range * v ); }
+
+ // Configures low-pass filter
+ void treble_eq( const blip_eq_t& eq ) { impl.treble_eq( eq ); }
+
+ // Gets/sets default Blip_Buffer
+ Blip_Buffer* output() const { return impl.buf; }
+ void output( Blip_Buffer* b ) { impl.buf = b; impl.last_amp = 0; }
+
+ // Extends waveform to time t at current amplitude, then changes its amplitude to a
+ // Using this requires a separate Blip_Synth for each waveform.
+ void update( blip_time_t t, int a );
+
+// Low-level interface
+
+ // If no Blip_Buffer* is specified, uses one set by output() above
+
+ // Adds amplitude transition at time t. Delta can be positive or negative.
+ // The actual change in amplitude is delta * volume.
+ void offset( blip_time_t t, int delta, Blip_Buffer* ) const;
+ void offset( blip_time_t t, int delta ) const { offset( t, delta, impl.buf ); }
+
+ // Same as offset(), except code is inlined for higher performance
+ void offset_inline( blip_time_t t, int delta, Blip_Buffer* buf ) const { offset_resampled( buf->to_fixed( t ), delta, buf ); }
+ void offset_inline( blip_time_t t, int delta ) const { offset_resampled( impl.buf->to_fixed( t ), delta, impl.buf ); }
+
+ // Works directly in terms of fractional output samples. Use resampled time functions in Blip_Buffer
+ // to convert clock counts to resampled time.
+ void offset_resampled( blip_resampled_time_t, int delta, Blip_Buffer* ) const;
+
+// Implementation
+public:
+ BLARGG_DISABLE_NOTHROW
+
+private:
+#if BLIP_BUFFER_FAST
+ Blip_Synth_Fast_ impl;
+ typedef char coeff_t;
+#else
+ Blip_Synth_ impl;
+ typedef short coeff_t;
+ // Left halves of first difference of step response for each possible phase
+ coeff_t phases [quality / 2 * blip_res];
+public:
+ Blip_Synth() : impl( phases, quality ) { }
+#endif
+};
+
+
+//// Low-pass equalization parameters
+
+class blip_eq_t {
+ double treble, kaiser;
+ int rolloff_freq, sample_rate, cutoff_freq;
+public:
+ // Logarithmic rolloff to treble dB at half sampling rate. Negative values reduce
+ // treble, small positive values (0 to 5.0) increase treble.
+ blip_eq_t( double treble_db = 0 );
+
+ // See blip_buffer.txt
+ blip_eq_t( double treble, int rolloff_freq, int sample_rate, int cutoff_freq = 0,
+ double kaiser = 5.2 );
+
+ // Generate center point and right half of impulse response
+ virtual void generate( float out [], int count ) const;
+ virtual ~blip_eq_t() { }
+
+ enum { oversample = blip_res };
+ static int calc_count( int quality ) { return (quality - 1) * (oversample / 2) + 1; }
+};
+
+#include "Blip_Buffer_impl2.h"
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl.h b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl.h
new file mode 100644
index 00000000..56af3783
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl.h
@@ -0,0 +1,135 @@
+// Internal stuff here to keep public header uncluttered
+
+// Blip_Buffer 0.4.0
+#ifndef BLIP_BUFFER_IMPL_H
+#define BLIP_BUFFER_IMPL_H
+
+typedef unsigned blip_resampled_time_t;
+
+#ifndef BLIP_MAX_QUALITY
+ #define BLIP_MAX_QUALITY 32
+#endif
+
+#ifndef BLIP_BUFFER_ACCURACY
+ #define BLIP_BUFFER_ACCURACY 16
+#endif
+
+#ifndef BLIP_PHASE_BITS
+ #define BLIP_PHASE_BITS 6
+#endif
+
+class blip_eq_t;
+class Blip_Buffer;
+
+#if BLIP_BUFFER_FAST
+ // linear interpolation needs 8 bits
+ #undef BLIP_PHASE_BITS
+ #define BLIP_PHASE_BITS 8
+
+ #undef BLIP_MAX_QUALITY
+ #define BLIP_MAX_QUALITY 2
+#endif
+
+int const blip_res = 1 << BLIP_PHASE_BITS;
+int const blip_buffer_extra_ = BLIP_MAX_QUALITY + 2;
+
+class Blip_Buffer_ {
+public:
+// Writer
+
+ typedef int clocks_t;
+
+ // Properties of fixed-point sample position
+ typedef unsigned fixed_t; // unsigned for more range, optimized shifts
+ enum { fixed_bits = BLIP_BUFFER_ACCURACY }; // bits in fraction
+ enum { fixed_unit = 1 << fixed_bits }; // 1.0 samples
+
+ // Converts clock count to fixed-point sample position
+ fixed_t to_fixed( clocks_t t ) const { return t * factor_ + offset_; }
+
+ // Deltas in buffer are fixed-point with this many fraction bits.
+ // Less than 16 for extra range.
+ enum { delta_bits = 14 };
+
+ // Pointer to first committed delta sample
+ typedef int delta_t;
+
+ // Pointer to delta corresponding to fixed-point sample position
+ delta_t* delta_at( fixed_t );
+
+// Reader
+
+ delta_t* read_pos() { return buffer_; }
+
+ void clear_modified() { modified_ = false; }
+ int highpass_shift() const { return bass_shift_; }
+ int integrator() const { return reader_accum_; }
+ void set_integrator( int n ) { reader_accum_ = n; }
+
+public: //friend class Tracked_Blip_Buffer; private:
+ bool modified() const { return modified_; }
+ void remove_silence( int count );
+
+private:
+ unsigned factor_;
+ fixed_t offset_;
+ delta_t* buffer_center_;
+ int buffer_size_;
+ int reader_accum_;
+ int bass_shift_;
+ delta_t* buffer_;
+ int sample_rate_;
+ int clock_rate_;
+ int bass_freq_;
+ int length_;
+ bool modified_;
+
+ friend class Blip_Buffer;
+};
+
+class Blip_Synth_Fast_ {
+public:
+ int delta_factor;
+ int last_amp;
+ Blip_Buffer* buf;
+
+ void volume_unit( double );
+ void treble_eq( blip_eq_t const& ) { }
+ Blip_Synth_Fast_();
+};
+
+class Blip_Synth_ {
+public:
+ int delta_factor;
+ int last_amp;
+ Blip_Buffer* buf;
+
+ void volume_unit( double );
+ void treble_eq( blip_eq_t const& );
+ Blip_Synth_( short phases [], int width );
+private:
+ double volume_unit_;
+ short* const phases;
+ int const width;
+ int kernel_unit;
+
+ void adjust_impulse();
+ void rescale_kernel( int shift );
+ int impulses_size() const { return blip_res / 2 * width; }
+};
+
+class blip_buffer_state_t
+{
+ blip_resampled_time_t offset_;
+ int reader_accum_;
+ int buf [blip_buffer_extra_];
+ friend class Blip_Buffer;
+};
+
+inline Blip_Buffer_::delta_t* Blip_Buffer_::delta_at( fixed_t f )
+{
+ assert( (f >> fixed_bits) < (unsigned) buffer_size_ );
+ return buffer_center_ + (f >> fixed_bits);
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl2.h b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl2.h
new file mode 100644
index 00000000..5d2b04b0
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Blip_Buffer_impl2.h
@@ -0,0 +1,282 @@
+// Internal stuff here to keep public header uncluttered
+
+// Blip_Buffer 0.4.0
+#ifndef BLIP_BUFFER_IMPL2_H
+#define BLIP_BUFFER_IMPL2_H
+
+//// Compatibility
+
+BLARGG_DEPRECATED( int const blip_low_quality = 8; )
+BLARGG_DEPRECATED( int const blip_med_quality = 8; )
+BLARGG_DEPRECATED( int const blip_good_quality = 12; )
+BLARGG_DEPRECATED( int const blip_high_quality = 16; )
+
+BLARGG_DEPRECATED( int const blip_sample_max = 32767; )
+
+// Number of bits in raw sample that covers normal output range. Less than 32 bits to give
+// extra amplitude range. That is,
+// +1 << (blip_sample_bits-1) = +1.0
+// -1 << (blip_sample_bits-1) = -1.0
+int const blip_sample_bits = 30;
+
+//// BLIP_READER_
+
+//// Optimized reading from Blip_Buffer, for use in custom sample buffer or mixer
+
+// Begins reading from buffer. Name should be unique to the current {} block.
+#define BLIP_READER_BEGIN( name, blip_buffer ) \
+ const Blip_Buffer::delta_t* BLARGG_RESTRICT name##_reader_buf = (blip_buffer).read_pos();\
+ int name##_reader_accum = (blip_buffer).integrator()
+
+// Gets value to pass to BLIP_READER_NEXT()
+#define BLIP_READER_BASS( blip_buffer ) (blip_buffer).highpass_shift()
+
+// Constant value to use instead of BLIP_READER_BASS(), for slightly more optimal
+// code at the cost of having no bass_freq() functionality
+int const blip_reader_default_bass = 9;
+
+// Current sample as 16-bit signed value
+#define BLIP_READER_READ( name ) (name##_reader_accum >> (blip_sample_bits - 16))
+
+// Current raw sample in full internal resolution
+#define BLIP_READER_READ_RAW( name ) (name##_reader_accum)
+
+// Advances to next sample
+#define BLIP_READER_NEXT( name, bass ) \
+ (void) (name##_reader_accum += *name##_reader_buf++ - (name##_reader_accum >> (bass)))
+
+// Ends reading samples from buffer. The number of samples read must now be removed
+// using Blip_Buffer::remove_samples().
+#define BLIP_READER_END( name, blip_buffer ) \
+ (void) ((blip_buffer).set_integrator( name##_reader_accum ))
+
+#define BLIP_READER_ADJ_( name, offset ) (name##_reader_buf += offset)
+
+int const blip_reader_idx_factor = sizeof (Blip_Buffer::delta_t);
+
+#define BLIP_READER_NEXT_IDX_( name, bass, idx ) {\
+ name##_reader_accum -= name##_reader_accum >> (bass);\
+ name##_reader_accum += name##_reader_buf [(idx)];\
+}
+
+#define BLIP_READER_NEXT_RAW_IDX_( name, bass, idx ) {\
+ name##_reader_accum -= name##_reader_accum >> (bass);\
+ name##_reader_accum +=\
+ *(Blip_Buffer::delta_t const*) ((char const*) name##_reader_buf + (idx));\
+}
+
+//// BLIP_CLAMP
+
+#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \
+ defined (__x86_64__) || defined (__ia64__) || defined (__i386__)
+ #define BLIP_X86 1
+ #define BLIP_CLAMP_( in ) in < -0x8000 || 0x7FFF < in
+#else
+ #define BLIP_CLAMP_( in ) (blip_sample_t) in != in
+#endif
+
+// Clamp sample to blip_sample_t range
+#define BLIP_CLAMP( sample, out )\
+ { if ( BLIP_CLAMP_( (sample) ) ) (out) = ((sample) >> 31) ^ 0x7FFF; }
+
+
+//// Blip_Synth
+
+// (in >> sh & mask) * mul
+#define BLIP_SH_AND_MUL( in, sh, mask, mul ) \
+((int) (in) / ((1U << (sh)) / (mul)) & (unsigned) ((mask) * (mul)))
+
+// (T*) ptr + (off >> sh)
+#define BLIP_PTR_OFF_SH( T, ptr, off, sh ) \
+ ((T*) (BLIP_SH_AND_MUL( off, sh, -1, sizeof (T) ) + (char*) (ptr)))
+
+template<int quality,int range>
+inline void Blip_Synth<quality,range>::offset_resampled( blip_resampled_time_t time,
+ int delta, Blip_Buffer* blip_buf ) const
+{
+#if BLIP_BUFFER_FAST
+ int const half_width = 1;
+#else
+ int const half_width = quality / 2;
+#endif
+
+ Blip_Buffer::delta_t* BLARGG_RESTRICT buf = blip_buf->delta_at( time );
+
+ delta *= impl.delta_factor;
+
+ int const phase_shift = BLIP_BUFFER_ACCURACY - BLIP_PHASE_BITS;
+ int const phase = (half_width & (half_width - 1)) ?
+ (int) BLIP_SH_AND_MUL( time, phase_shift, blip_res - 1, sizeof (coeff_t) ) * half_width :
+ (int) BLIP_SH_AND_MUL( time, phase_shift, blip_res - 1, sizeof (coeff_t) * half_width );
+
+#if BLIP_BUFFER_FAST
+ int left = buf [0] + delta;
+
+ // Kind of crappy, but doing shift after multiply results in overflow.
+ // Alternate way of delaying multiply by delta_factor results in worse
+ // sub-sample resolution.
+ int right = (delta >> BLIP_PHASE_BITS) * phase;
+ #if BLIP_BUFFER_NOINTERP
+ // TODO: remove? (just a hack to see how it sounds)
+ right = 0;
+ #endif
+ left -= right;
+ right += buf [1];
+
+ buf [0] = left;
+ buf [1] = right;
+#else
+
+ int const fwd = -quality / 2;
+ int const rev = fwd + quality - 2;
+
+ coeff_t const* BLARGG_RESTRICT imp = (coeff_t const*) ((char const*) phases + phase);
+ int const phase2 = phase + phase - (blip_res - 1) * half_width * sizeof (coeff_t);
+
+ #define BLIP_MID_IMP imp = (coeff_t const*) ((char const*) imp - phase2);
+
+ #if BLIP_MAX_QUALITY > 16
+ // General version for any quality
+ if ( quality != 8 && quality != 12 && quality != 16 )
+ {
+ buf += fwd;
+
+ // left half
+ for ( int n = half_width / 2; --n >= 0; )
+ {
+ buf [0] += imp [0] * delta;
+ buf [1] += imp [1] * delta;
+ imp += 2;
+ buf += 2;
+ }
+
+ // mirrored right half
+ BLIP_MID_IMP
+ for ( int n = half_width / 2; --n >= 0; )
+ {
+ buf [0] += imp [-1] * delta;
+ buf [1] += *(imp -= 2) * delta;
+ buf += 2;
+ }
+
+ return;
+ }
+ #endif
+
+ // Unrolled versions for qualities 8, 12, and 16
+
+ #if BLIP_X86
+ // This gives better code for x86
+ #define BLIP_ADD( out, in ) \
+ buf [out] += imp [in] * delta
+
+ #define BLIP_FWD( i ) {\
+ BLIP_ADD( fwd + i, i );\
+ BLIP_ADD( fwd + 1 + i, i + 1 );\
+ }
+
+ #define BLIP_REV( r ) {\
+ BLIP_ADD( rev - r, r + 1 );\
+ BLIP_ADD( rev + 1 - r, r );\
+ }
+
+ BLIP_FWD( 0 )
+ BLIP_FWD( 2 )
+ if ( quality > 8 ) BLIP_FWD( 4 )
+ if ( quality > 12 ) BLIP_FWD( 6 )
+ BLIP_MID_IMP
+ if ( quality > 12 ) BLIP_REV( 6 )
+ if ( quality > 8 ) BLIP_REV( 4 )
+ BLIP_REV( 2 )
+ BLIP_REV( 0 )
+
+ #else
+ // Help RISC processors and simplistic compilers by reading ahead of writes
+ #define BLIP_FWD( i ) {\
+ int t0 = i0 * delta + buf [fwd + i];\
+ int t1 = imp [i + 1] * delta + buf [fwd + 1 + i];\
+ i0 = imp [i + 2];\
+ buf [fwd + i] = t0;\
+ buf [fwd + 1 + i] = t1;\
+ }
+
+ #define BLIP_REV( r ) {\
+ int t0 = i0 * delta + buf [rev - r];\
+ int t1 = imp [r] * delta + buf [rev + 1 - r];\
+ i0 = imp [r - 1];\
+ buf [rev - r] = t0;\
+ buf [rev + 1 - r] = t1;\
+ }
+
+ int i0 = *imp;
+ BLIP_FWD( 0 )
+ if ( quality > 8 ) BLIP_FWD( 2 )
+ if ( quality > 12 ) BLIP_FWD( 4 )
+ {
+ int const mid = half_width - 1;
+ int t0 = i0 * delta + buf [fwd + mid - 1];
+ int t1 = imp [mid] * delta + buf [fwd + mid ];
+ BLIP_MID_IMP
+ i0 = imp [mid];
+ buf [fwd + mid - 1] = t0;
+ buf [fwd + mid ] = t1;
+ }
+ if ( quality > 12 ) BLIP_REV( 6 )
+ if ( quality > 8 ) BLIP_REV( 4 )
+ BLIP_REV( 2 )
+
+ int t0 = i0 * delta + buf [rev ];
+ int t1 = *imp * delta + buf [rev + 1];
+ buf [rev ] = t0;
+ buf [rev + 1] = t1;
+ #endif
+
+#endif
+}
+
+template<int quality,int range>
+#if BLIP_BUFFER_FAST
+ inline
+#endif
+void Blip_Synth<quality,range>::offset( blip_time_t t, int delta, Blip_Buffer* buf ) const
+{
+ offset_resampled( buf->to_fixed( t ), delta, buf );
+}
+
+template<int quality,int range>
+#if BLIP_BUFFER_FAST
+ inline
+#endif
+void Blip_Synth<quality,range>::update( blip_time_t t, int amp )
+{
+ int delta = amp - impl.last_amp;
+ impl.last_amp = amp;
+ offset_resampled( impl.buf->to_fixed( t ), delta, impl.buf );
+}
+
+
+//// blip_eq_t
+
+inline blip_eq_t::blip_eq_t( double t ) :
+ treble( t ), kaiser( 5.2 ), rolloff_freq( 0 ), sample_rate( 44100 ), cutoff_freq( 0 ) { }
+inline blip_eq_t::blip_eq_t( double t, int rf, int sr, int cf, double k ) :
+ treble( t ), kaiser( k ), rolloff_freq( rf ), sample_rate( sr ), cutoff_freq( cf ) { }
+
+
+//// Blip_Buffer
+
+inline int Blip_Buffer::length() const { return length_; }
+inline int Blip_Buffer::samples_avail() const { return (int) (offset_ >> BLIP_BUFFER_ACCURACY); }
+inline int Blip_Buffer::sample_rate() const { return sample_rate_; }
+inline int Blip_Buffer::output_latency() const { return BLIP_MAX_QUALITY / 2; }
+inline int Blip_Buffer::clock_rate() const { return clock_rate_; }
+inline void Blip_Buffer::clock_rate( int cps ) { factor_ = clock_rate_factor( clock_rate_ = cps ); }
+
+inline void Blip_Buffer::remove_silence( int count )
+{
+ // fails if you try to remove more samples than available
+ assert( count <= samples_avail() );
+ offset_ -= (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY;
+}
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.cpp
index 063444fe..229bb67d 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Classic_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.cpp
@@ -1,11 +1,10 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
#include "Classic_Emu.h"
#include "Multi_Buffer.h"
-#include <string.h>
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -20,9 +19,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
Classic_Emu::Classic_Emu()
{
- buf = 0;
- stereo_buffer = 0;
- voice_types = 0;
+ buf = NULL;
+ stereo_buffer = NULL;
+ voice_types = NULL;
// avoid inconsistency in our duplicated constants
assert( (int) wave_type == (int) Multi_Buffer::wave_type );
@@ -33,6 +32,8 @@ Classic_Emu::Classic_Emu()
Classic_Emu::~Classic_Emu()
{
delete stereo_buffer;
+ delete effects_buffer_;
+ effects_buffer_ = NULL;
}
void Classic_Emu::set_equalizer_( equalizer_t const& eq )
@@ -40,10 +41,10 @@ void Classic_Emu::set_equalizer_( equalizer_t const& eq )
Music_Emu::set_equalizer_( eq );
update_eq( eq.treble );
if ( buf )
- buf->bass_freq( equalizer().bass );
+ buf->bass_freq( (int) equalizer().bass );
}
-blargg_err_t Classic_Emu::set_sample_rate_( long rate )
+blargg_err_t Classic_Emu::set_sample_rate_( int rate )
{
if ( !buf )
{
@@ -61,11 +62,11 @@ void Classic_Emu::mute_voices_( int mask )
{
if ( mask & (1 << i) )
{
- set_voice( i, 0, 0, 0 );
+ set_voice( i, NULL, NULL, NULL );
}
else
{
- Multi_Buffer::channel_t ch = buf->channel( i, (voice_types ? voice_types [i] : 0) );
+ Multi_Buffer::channel_t ch = buf->channel( i );
assert( (ch.center && ch.left && ch.right) ||
(!ch.center && !ch.left && !ch.right) ); // all or nothing
set_voice( i, ch.center, ch.left, ch.right );
@@ -73,33 +74,35 @@ void Classic_Emu::mute_voices_( int mask )
}
}
-void Classic_Emu::change_clock_rate( long rate )
+void Classic_Emu::change_clock_rate( int rate )
{
clock_rate_ = rate;
buf->clock_rate( rate );
}
-blargg_err_t Classic_Emu::setup_buffer( long rate )
+blargg_err_t Classic_Emu::setup_buffer( int rate )
{
change_clock_rate( rate );
- RETURN_ERR( buf->set_channel_count( voice_count() ) );
+ RETURN_ERR( buf->set_channel_count( voice_count(), voice_types ) );
set_equalizer( equalizer() );
buf_changed_count = buf->channels_changed_count();
- return 0;
+ return blargg_ok;
}
blargg_err_t Classic_Emu::start_track_( int track )
{
RETURN_ERR( Music_Emu::start_track_( track ) );
buf->clear();
- return 0;
+ return blargg_ok;
}
-blargg_err_t Classic_Emu::play_( long count, sample_t* out )
+blargg_err_t Classic_Emu::play_( int count, sample_t out [] )
{
- long remain = count;
+ // read from buffer, then refill buffer and repeat if necessary
+ int remain = count;
while ( remain )
{
+ buf->disable_immediate_removal();
remain -= buf->read_samples( &out [count - remain], remain );
if ( remain )
{
@@ -108,77 +111,14 @@ blargg_err_t Classic_Emu::play_( long count, sample_t* out )
buf_changed_count = buf->channels_changed_count();
remute_voices();
}
+
+ // TODO: use more accurate length calculation
int msec = buf->length();
- blip_time_t clocks_emulated = (blargg_long) msec * clock_rate_ / 1000;
+ blip_time_t clocks_emulated = msec * clock_rate_ / 1000 - 100;
RETURN_ERR( run_clocks( clocks_emulated, msec ) );
assert( clocks_emulated );
buf->end_frame( clocks_emulated );
}
}
- return 0;
-}
-
-// Rom_Data
-
-blargg_err_t Rom_Data_::load_rom_data_( Data_Reader& in,
- int header_size, void* header_out, int fill, long pad_size )
-{
- long file_offset = pad_size - header_size;
-
- rom_addr = 0;
- mask = 0;
- size_ = 0;
- rom.clear();
-
- file_size_ = in.remain();
- if ( file_size_ <= header_size ) // <= because there must be data after header
- return gme_wrong_file_type;
- blargg_err_t err = rom.resize( file_offset + file_size_ + pad_size );
- if ( !err )
- err = in.read( rom.begin() + file_offset, file_size_ );
- if ( err )
- {
- rom.clear();
- return err;
- }
-
- file_size_ -= header_size;
- memcpy( header_out, &rom [file_offset], header_size );
-
- memset( rom.begin() , fill, pad_size );
- memset( rom.end() - pad_size, fill, pad_size );
-
- return 0;
-}
-
-void Rom_Data_::set_addr_( long addr, int unit )
-{
- rom_addr = addr - unit - pad_extra;
-
- long rounded = (addr + file_size_ + unit - 1) / unit * unit;
- if ( rounded <= 0 )
- {
- rounded = 0;
- }
- else
- {
- int shift = 0;
- unsigned long max_addr = (unsigned long) (rounded - 1);
- while ( max_addr >> shift )
- shift++;
- mask = (1L << shift) - 1;
- }
-
- if ( addr < 0 )
- addr = 0;
- size_ = rounded;
- if ( rom.resize( rounded - rom_addr + pad_extra ) ) { } // OK if shrink fails
-
- if ( 0 )
- {
- dprintf( "addr: %X\n", addr );
- dprintf( "file_size: %d\n", file_size_ );
- dprintf( "rounded: %d\n", rounded );
- dprintf( "mask: $%X\n", mask );
- }
+ return blargg_ok;
}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.h
new file mode 100644
index 00000000..b5760e75
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Classic_Emu.h
@@ -0,0 +1,79 @@
+// Common aspects of emulators which use Blip_Buffer for sound output
+
+// Game_Music_Emu 0.6-pre
+#ifndef CLASSIC_EMU_H
+#define CLASSIC_EMU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+#include "Music_Emu.h"
+
+class Classic_Emu : public Music_Emu {
+protected:
+// Derived interface
+
+ // Advertises type of sound on each voice, so Effects_Buffer can better choose
+ // what effect to apply (pan, echo, surround). Constant can have value added so
+ // that voices of the same type can be spread around the stereo sound space.
+ enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
+ void set_voice_types( int const types [] ) { voice_types = types; }
+
+ // Sets up Blip_Buffers after loading file
+ blargg_err_t setup_buffer( int clock_rate );
+
+ // Clock rate of Blip_buffers
+ int clock_rate() const { return clock_rate_; }
+
+ // Changes clock rate of Blip_Buffers (experimental)
+ void change_clock_rate( int );
+
+// Overrides should do the indicated task
+
+ // Set Blip_Buffer(s) voice outputs to, or mute voice if pointer is NULL
+ virtual void set_voice( int index, Blip_Buffer* center,
+ Blip_Buffer* left, Blip_Buffer* right ) BLARGG_PURE( ; )
+
+ // Update equalization
+ virtual void update_eq( blip_eq_t const& ) BLARGG_PURE( ; )
+
+ // Start track
+ virtual blargg_err_t start_track_( int track ) BLARGG_PURE( ; )
+
+ // Run for at most msec or time_io clocks, then set time_io to number of clocks
+ // actually run for. After returning, Blip_Buffers have time frame of time_io clocks
+ // ended.
+ virtual blargg_err_t run_clocks( blip_time_t& time_io, int msec ) BLARGG_PURE( ; )
+
+// Internal
+public:
+ Classic_Emu();
+ ~Classic_Emu();
+ virtual void set_buffer( Multi_Buffer* );
+
+protected:
+ virtual blargg_err_t set_sample_rate_( int sample_rate );
+ virtual void mute_voices_( int );
+ virtual void set_equalizer_( equalizer_t const& );
+ virtual blargg_err_t play_( int, sample_t [] );
+
+private:
+ Multi_Buffer* buf;
+ Multi_Buffer* stereo_buffer; // NULL if using custom buffer
+ int clock_rate_;
+ unsigned buf_changed_count;
+ int const* voice_types;
+};
+
+inline void Classic_Emu::set_buffer( Multi_Buffer* new_buf )
+{
+ assert( !buf && new_buf );
+ buf = new_buf;
+}
+
+inline void Classic_Emu::set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* ) { }
+
+inline void Classic_Emu::update_eq( blip_eq_t const& ) { }
+
+inline blargg_err_t Classic_Emu::run_clocks( blip_time_t&, int ) { return blargg_ok; }
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.cpp
index 5bbfbf55..5bbfbf55 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Data_Reader.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.cpp
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.h b/plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.h
index 00b53b9e..acf571f6 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Data_Reader.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Data_Reader.h
@@ -116,7 +116,7 @@ private:
// Invokes callback function to read data. Size of data must be specified in advance.
class Callback_Reader : public Data_Reader {
public:
- typedef const char* (*callback_t)( void* data, void* out, long count );
+ typedef const char* (*callback_t)( void* data, void* out, int count );
Callback_Reader( callback_t, long size, void* data = 0 );
public:
long read_avail( void*, long );
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.cpp
new file mode 100644
index 00000000..aeb50fc5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.cpp
@@ -0,0 +1,74 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Downsampler.h"
+
+/* Copyright (C) 2004-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const shift = 14;
+int const unit = 1 << shift;
+
+void Downsampler::clear_()
+{
+ pos = 0;
+ Resampler::clear_();
+}
+
+Downsampler::Downsampler()
+{
+ clear();
+}
+
+blargg_err_t Downsampler::set_rate_( double new_factor )
+{
+ step = (int) (new_factor * unit + 0.5);
+ return Resampler::set_rate_( 1.0 / unit * step );
+}
+
+Resampler::sample_t const* Downsampler::resample_( sample_t** out_,
+ sample_t const* out_end, sample_t const in [], int in_size )
+{
+ in_size -= write_offset;
+ if ( in_size > 0 )
+ {
+ sample_t* BLARGG_RESTRICT out = *out_;
+ sample_t const* const in_end = in + in_size;
+
+ int const step = this->step;
+ int pos = this->pos;
+
+ // TODO: IIR filter, then linear resample
+ // TODO: detect skipped sample, allowing merging of IIR and resample?
+
+ do
+ {
+ #define INTERP( i, out )\
+ out = (in [0 + i] * (unit - pos) + ((in [2 + i] + in [4 + i] + in [6 + i]) << shift) +\
+ in [8 + i] * pos) >> (shift + 2);
+
+ int out_0;
+ INTERP( 0, out_0 )
+ INTERP( 1, out [0] = out_0; out [1] )
+ out += stereo;
+
+ pos += step;
+ in += ((unsigned) pos >> shift) * stereo;
+ pos &= unit - 1;
+ }
+ while ( in < in_end && out < out_end );
+
+ this->pos = pos;
+ *out_ = out;
+ }
+ return in;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.h
new file mode 100644
index 00000000..8ce85e27
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Downsampler.h
@@ -0,0 +1,25 @@
+// Linear downsampler with pre-low-pass
+
+// Game_Music_Emu 0.6-pre
+#ifndef DOWNSAMPLER_H
+#define DOWNSAMPLER_H
+
+#include "Resampler.h"
+
+class Downsampler : public Resampler {
+public:
+ Downsampler();
+
+protected:
+ virtual blargg_err_t set_rate_( double );
+ virtual void clear_();
+ virtual sample_t const* resample_( sample_t**, sample_t const*, sample_t const [], int );
+
+private:
+ enum { stereo = 2 };
+ enum { write_offset = 8 * stereo };
+ int pos;
+ int step;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.cpp
new file mode 100644
index 00000000..152fbbd3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.cpp
@@ -0,0 +1,200 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Dual_Resampler.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// TODO: fix this. hack since resampler holds back some output.
+int const resampler_extra = 34;
+
+int const stereo = 2;
+
+Dual_Resampler::Dual_Resampler() { }
+
+Dual_Resampler::~Dual_Resampler() { }
+
+blargg_err_t Dual_Resampler::reset( int pairs )
+{
+ // expand allocations a bit
+ RETURN_ERR( sample_buf.resize( (pairs + (pairs >> 2)) * 2 ) );
+ resize( pairs );
+ resampler_size = oversamples_per_frame + (oversamples_per_frame >> 2);
+ RETURN_ERR( resampler.resize_buffer( resampler_size ) );
+ resampler.clear();
+ return blargg_ok;
+}
+
+void Dual_Resampler::resize( int pairs )
+{
+ int new_sample_buf_size = pairs * 2;
+ //new_sample_buf_size = new_sample_buf_size / 4 * 4; // TODO: needed only for 3:2 downsampler
+ if ( sample_buf_size != new_sample_buf_size )
+ {
+ if ( (unsigned) new_sample_buf_size > sample_buf.size() )
+ {
+ check( false );
+ return;
+ }
+ sample_buf_size = new_sample_buf_size;
+ oversamples_per_frame = int (pairs * resampler.rate()) * 2 + 2;
+ clear();
+ }
+}
+
+void Dual_Resampler::clear()
+{
+ buf_pos = sample_buf_size;
+ resampler.clear();
+}
+
+
+void Dual_Resampler::play_frame_( Stereo_Buffer& stereo_buf, dsample_t out [] )
+{
+ int pair_count = sample_buf_size >> 1;
+ blip_time_t blip_time = stereo_buf.center()->count_clocks( pair_count );
+ int sample_count = oversamples_per_frame - resampler.written() + resampler_extra;
+
+ int new_count = set_callback.f( set_callback.data, blip_time, sample_count, resampler.buffer() );
+ assert( new_count < resampler_size );
+
+ stereo_buf.end_frame( blip_time );
+ assert( stereo_buf.samples_avail() == pair_count * 2 );
+
+ resampler.write( new_count );
+
+ int count = resampler.read( sample_buf.begin(), sample_buf_size );
+ assert( count == sample_buf_size );
+
+ mix_samples( stereo_buf, out );
+ stereo_buf.left()->remove_samples( pair_count );
+ stereo_buf.right()->remove_samples( pair_count );
+ stereo_buf.center()->remove_samples( pair_count );
+}
+
+void Dual_Resampler::dual_play( int count, dsample_t out [], Stereo_Buffer& stereo_buf )
+{
+ // empty extra buffer
+ int remain = sample_buf_size - buf_pos;
+ if ( remain )
+ {
+ if ( remain > count )
+ remain = count;
+ count -= remain;
+ memcpy( out, &sample_buf [buf_pos], remain * sizeof *out );
+ out += remain;
+ buf_pos += remain;
+ }
+
+ // entire frames
+ while ( count >= sample_buf_size )
+ {
+ play_frame_( stereo_buf, out );
+ out += sample_buf_size;
+ count -= sample_buf_size;
+ }
+
+ // extra
+ if ( count )
+ {
+ play_frame_( stereo_buf, sample_buf.begin() );
+ buf_pos = count;
+ memcpy( out, sample_buf.begin(), count * sizeof *out );
+ out += count;
+ }
+}
+
+void Dual_Resampler::mix_samples( Stereo_Buffer& stereo_buf, dsample_t out_ [] )
+{
+ // lol hax
+ if ( ((Tracked_Blip_Buffer*)stereo_buf.left())->non_silent() | ((Tracked_Blip_Buffer*)stereo_buf.right())->non_silent() )
+ mix_stereo( stereo_buf, out_ );
+ else
+ mix_mono( stereo_buf, out_ );
+}
+
+void Dual_Resampler::mix_mono( Stereo_Buffer& stereo_buf, dsample_t out_ [] )
+{
+ int const bass = BLIP_READER_BASS( *stereo_buf.center() );
+ BLIP_READER_BEGIN( sn, *stereo_buf.center() );
+
+ int count = sample_buf_size >> 1;
+ BLIP_READER_ADJ_( sn, count );
+
+ typedef dsample_t stereo_dsample_t [2];
+ stereo_dsample_t* BLARGG_RESTRICT out = (stereo_dsample_t*) out_ + count;
+ stereo_dsample_t const* BLARGG_RESTRICT in =
+ (stereo_dsample_t const*) sample_buf.begin() + count;
+ int offset = -count;
+ int const gain = gain_;
+ do
+ {
+ int s = BLIP_READER_READ_RAW( sn ) >> (blip_sample_bits - 16);
+ BLIP_READER_NEXT_IDX_( sn, bass, offset );
+
+ int l = (in [offset] [0] * gain >> gain_bits) + s;
+ int r = (in [offset] [1] * gain >> gain_bits) + s;
+
+ BLIP_CLAMP( l, l );
+ out [offset] [0] = (blip_sample_t) l;
+
+ BLIP_CLAMP( r, r );
+ out [offset] [1] = (blip_sample_t) r;
+ }
+ while ( ++offset );
+
+ BLIP_READER_END( sn, *stereo_buf.center() );
+}
+
+void Dual_Resampler::mix_stereo( Stereo_Buffer& stereo_buf, dsample_t out_ [] )
+{
+ int const bass = BLIP_READER_BASS( *stereo_buf.center() );
+ BLIP_READER_BEGIN( snc, *stereo_buf.center() );
+ BLIP_READER_BEGIN( snl, *stereo_buf.left() );
+ BLIP_READER_BEGIN( snr, *stereo_buf.right() );
+
+ int count = sample_buf_size >> 1;
+ BLIP_READER_ADJ_( snc, count );
+ BLIP_READER_ADJ_( snl, count );
+ BLIP_READER_ADJ_( snr, count );
+
+ typedef dsample_t stereo_dsample_t [2];
+ stereo_dsample_t* BLARGG_RESTRICT out = (stereo_dsample_t*) out_ + count;
+ stereo_dsample_t const* BLARGG_RESTRICT in =
+ (stereo_dsample_t const*) sample_buf.begin() + count;
+ int offset = -count;
+ int const gain = gain_;
+ do
+ {
+ int sc = BLIP_READER_READ_RAW( snc ) >> (blip_sample_bits - 16);
+ int sl = BLIP_READER_READ_RAW( snl ) >> (blip_sample_bits - 16);
+ int sr = BLIP_READER_READ_RAW( snr ) >> (blip_sample_bits - 16);
+ BLIP_READER_NEXT_IDX_( snc, bass, offset );
+ BLIP_READER_NEXT_IDX_( snl, bass, offset );
+ BLIP_READER_NEXT_IDX_( snr, bass, offset );
+
+ int l = (in [offset] [0] * gain >> gain_bits) + sl + sc;
+ int r = (in [offset] [1] * gain >> gain_bits) + sr + sc;
+
+ BLIP_CLAMP( l, l );
+ out [offset] [0] = (blip_sample_t) l;
+
+ BLIP_CLAMP( r, r );
+ out [offset] [1] = (blip_sample_t) r;
+ }
+ while ( ++offset );
+
+ BLIP_READER_END( snc, *stereo_buf.center() );
+ BLIP_READER_END( snl, *stereo_buf.left() );
+ BLIP_READER_END( snr, *stereo_buf.right() );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.h
new file mode 100644
index 00000000..6d77fd59
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Dual_Resampler.h
@@ -0,0 +1,58 @@
+// Combination of Fir_Resampler and Stereo_Buffer mixing. Used by Sega FM emulators.
+
+// Game_Music_Emu 0.6-pre
+#ifndef DUAL_RESAMPLER_H
+#define DUAL_RESAMPLER_H
+
+#include "Multi_Buffer.h"
+
+#if GME_VGM_FAST_RESAMPLER
+ #include "Downsampler.h"
+ typedef Downsampler Dual_Resampler_Downsampler;
+#else
+ #include "Fir_Resampler.h"
+ typedef Fir_Resampler_Norm Dual_Resampler_Downsampler;
+#endif
+
+class Dual_Resampler {
+public:
+ typedef short dsample_t;
+
+ blargg_err_t setup( double oversample, double rolloff, double gain );
+ double rate() const { return resampler.rate(); }
+ blargg_err_t reset( int max_pairs );
+ void resize( int pairs_per_frame );
+ void clear();
+
+ void dual_play( int count, dsample_t out [], Stereo_Buffer& );
+
+ blargg_callback<int (*)( void*, blip_time_t, int, dsample_t* )> set_callback;
+
+// Implementation
+public:
+ Dual_Resampler();
+ ~Dual_Resampler();
+
+private:
+ enum { gain_bits = 14 };
+ blargg_vector<dsample_t> sample_buf;
+ int sample_buf_size;
+ int oversamples_per_frame;
+ int buf_pos;
+ int resampler_size;
+ int gain_;
+
+ Dual_Resampler_Downsampler resampler;
+ void mix_samples( Stereo_Buffer&, dsample_t []);
+ void mix_mono( Stereo_Buffer&, dsample_t []);
+ void mix_stereo( Stereo_Buffer&, dsample_t []);
+ void play_frame_( Stereo_Buffer&, dsample_t []);
+};
+
+inline blargg_err_t Dual_Resampler::setup( double oversample, double rolloff, double gain )
+{
+ gain_ = (int) ((1 << gain_bits) * gain);
+ return resampler.set_rate( oversample );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.cpp
new file mode 100644
index 00000000..2a490561
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.cpp
@@ -0,0 +1,640 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Effects_Buffer.h"
+
+/* Copyright (C) 2006-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifdef BLARGG_ENABLE_OPTIMIZER
+ #include BLARGG_ENABLE_OPTIMIZER
+#endif
+
+int const fixed_shift = 12;
+#define TO_FIXED( f ) fixed_t ((f) * ((fixed_t) 1 << fixed_shift))
+#define FROM_FIXED( f ) (f >> fixed_shift)
+
+int const max_read = 2560; // determines minimum delay
+
+Effects_Buffer::Effects_Buffer( int max_bufs, int echo_size_ ) : Multi_Buffer( stereo )
+{
+ echo_size = max( max_read * (int) stereo, echo_size_ & ~1 );
+ clock_rate_ = 0;
+ bass_freq_ = 90;
+ bufs = NULL;
+ bufs_size = 0;
+ bufs_max = max( max_bufs, (int) extra_chans );
+ no_echo = true;
+ no_effects = true;
+
+ // defaults
+ config_.enabled = false;
+ config_.delay [0] = 120;
+ config_.delay [1] = 122;
+ config_.feedback = 0.2f;
+ config_.treble = 0.4f;
+
+ static float const sep = 0.8f;
+ config_.side_chans [0].pan = -sep;
+ config_.side_chans [1].pan = +sep;
+ config_.side_chans [0].vol = 1.0f;
+ config_.side_chans [1].vol = 1.0f;
+
+ memset( &s, 0, sizeof s );
+ clear();
+}
+
+Effects_Buffer::~Effects_Buffer()
+{
+ delete_bufs();
+}
+
+// avoid using new []
+blargg_err_t Effects_Buffer::new_bufs( int size )
+{
+ bufs = (buf_t*) malloc( size * sizeof *bufs );
+ CHECK_ALLOC( bufs );
+ for ( int i = 0; i < size; i++ )
+ new (bufs + i) buf_t;
+ bufs_size = size;
+ return blargg_ok;
+}
+
+void Effects_Buffer::delete_bufs()
+{
+ if ( bufs )
+ {
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].~buf_t();
+ free( bufs );
+ bufs = NULL;
+ }
+ bufs_size = 0;
+}
+
+blargg_err_t Effects_Buffer::set_sample_rate( int rate, int msec )
+{
+ // extra to allow farther past-the-end pointers
+ mixer.samples_read = 0;
+ RETURN_ERR( echo.resize( echo_size + stereo ) );
+ return Multi_Buffer::set_sample_rate( rate, msec );
+}
+
+void Effects_Buffer::clock_rate( int rate )
+{
+ clock_rate_ = rate;
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].clock_rate( clock_rate_ );
+}
+
+void Effects_Buffer::bass_freq( int freq )
+{
+ bass_freq_ = freq;
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].bass_freq( bass_freq_ );
+}
+
+blargg_err_t Effects_Buffer::set_channel_count( int count, int const types [] )
+{
+ RETURN_ERR( Multi_Buffer::set_channel_count( count, types ) );
+
+ delete_bufs();
+
+ mixer.samples_read = 0;
+
+ RETURN_ERR( chans.resize( count + extra_chans ) );
+
+ RETURN_ERR( new_bufs( min( bufs_max, count + extra_chans ) ) );
+
+ for ( int i = bufs_size; --i >= 0; )
+ RETURN_ERR( bufs [i].set_sample_rate( sample_rate(), length() ) );
+
+ for ( int i = chans.size(); --i >= 0; )
+ {
+ chan_t& ch = chans [i];
+ ch.cfg.vol = 1.0f;
+ ch.cfg.pan = 0.0f;
+ ch.cfg.surround = false;
+ ch.cfg.echo = false;
+ }
+ // side channels with echo
+ chans [2].cfg.echo = true;
+ chans [3].cfg.echo = true;
+
+ clock_rate( clock_rate_ );
+ bass_freq( bass_freq_ );
+ apply_config();
+ clear();
+
+ return blargg_ok;
+}
+
+void Effects_Buffer::clear_echo()
+{
+ if ( echo.size() )
+ memset( echo.begin(), 0, echo.size() * sizeof echo [0] );
+}
+
+void Effects_Buffer::clear()
+{
+ echo_pos = 0;
+ s.low_pass [0] = 0;
+ s.low_pass [1] = 0;
+ mixer.samples_read = 0;
+
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].clear();
+ clear_echo();
+}
+
+Effects_Buffer::channel_t Effects_Buffer::channel( int i )
+{
+ i += extra_chans;
+ require( extra_chans <= i && i < (int) chans.size() );
+ return chans [i].channel;
+}
+
+
+// Configuration
+
+// 3 wave positions with/without surround, 2 multi (one with same config as wave)
+int const simple_bufs = 3 * 2 + 2 - 1;
+
+Simple_Effects_Buffer::Simple_Effects_Buffer() :
+ Effects_Buffer( extra_chans + simple_bufs, 18 * 1024 )
+{
+ config_.echo = 0.20f;
+ config_.stereo = 0.20f;
+ config_.surround = true;
+ config_.enabled = false;
+}
+
+void Simple_Effects_Buffer::apply_config()
+{
+ Effects_Buffer::config_t& c = Effects_Buffer::config();
+
+ c.enabled = config_.enabled;
+ if ( c.enabled )
+ {
+ c.delay [0] = 120;
+ c.delay [1] = 122;
+ c.feedback = config_.echo * 0.7f;
+ c.treble = 0.6f - 0.3f * config_.echo;
+
+ float sep = config_.stereo + 0.80f;
+ if ( sep > 1.0f )
+ sep = 1.0f;
+
+ c.side_chans [0].pan = -sep;
+ c.side_chans [1].pan = +sep;
+
+ for ( int i = channel_count(); --i >= 0; )
+ {
+ chan_config_t& ch = Effects_Buffer::chan_config( i );
+
+ ch.pan = 0.0f;
+ ch.surround = config_.surround;
+ ch.echo = false;
+
+ int const type = (channel_types() ? channel_types() [i] : 0);
+ if ( !(type & noise_type) )
+ {
+ int index = (type & type_index_mask) % 6 - 3;
+ if ( index < 0 )
+ {
+ index += 3;
+ ch.surround = false;
+ ch.echo = true;
+ }
+ if ( index >= 1 )
+ {
+ ch.pan = config_.stereo;
+ if ( index == 1 )
+ ch.pan = -ch.pan;
+ }
+ }
+ else if ( type & 1 )
+ {
+ ch.surround = false;
+ }
+ }
+ }
+
+ Effects_Buffer::apply_config();
+}
+
+int Effects_Buffer::min_delay() const
+{
+ require( sample_rate() );
+ return max_read * 1000 / sample_rate();
+}
+
+int Effects_Buffer::max_delay() const
+{
+ require( sample_rate() );
+ return (echo_size / stereo - max_read) * 1000 / sample_rate();
+}
+
+void Effects_Buffer::apply_config()
+{
+ int i;
+
+ if ( !bufs_size )
+ return;
+
+ s.treble = TO_FIXED( config_.treble );
+
+ bool echo_dirty = false;
+
+ fixed_t old_feedback = s.feedback;
+ s.feedback = TO_FIXED( config_.feedback );
+ if ( !old_feedback && s.feedback )
+ echo_dirty = true;
+
+ // delays
+ for ( i = stereo; --i >= 0; )
+ {
+ int delay = config_.delay [i] * sample_rate() / 1000 * stereo;
+ delay = max( delay, (int) (max_read * stereo) );
+ delay = min( delay, (int) (echo_size - max_read * stereo) );
+ if ( s.delay [i] != delay )
+ {
+ s.delay [i] = delay;
+ echo_dirty = true;
+ }
+ }
+
+ // side channels
+ for ( i = 2; --i >= 0; )
+ {
+ chans [i+2].cfg.vol = chans [i].cfg.vol = config_.side_chans [i].vol * 0.5f;
+ chans [i+2].cfg.pan = chans [i].cfg.pan = config_.side_chans [i].pan;
+ }
+
+ // convert volumes
+ for ( i = chans.size(); --i >= 0; )
+ {
+ chan_t& ch = chans [i];
+ ch.vol [0] = TO_FIXED( ch.cfg.vol - ch.cfg.vol * ch.cfg.pan );
+ ch.vol [1] = TO_FIXED( ch.cfg.vol + ch.cfg.vol * ch.cfg.pan );
+ if ( ch.cfg.surround )
+ ch.vol [0] = -ch.vol [0];
+ }
+
+ assign_buffers();
+
+ // set side channels
+ for ( i = chans.size(); --i >= 0; )
+ {
+ chan_t& ch = chans [i];
+ ch.channel.left = chans [ch.cfg.echo*2 ].channel.center;
+ ch.channel.right = chans [ch.cfg.echo*2+1].channel.center;
+ }
+
+ bool old_echo = !no_echo && !no_effects;
+
+ // determine whether effects and echo are needed at all
+ no_effects = true;
+ no_echo = true;
+ for ( i = chans.size(); --i >= extra_chans; )
+ {
+ chan_t& ch = chans [i];
+ if ( ch.cfg.echo && s.feedback )
+ no_echo = false;
+
+ if ( ch.vol [0] != TO_FIXED( 1 ) || ch.vol [1] != TO_FIXED( 1 ) )
+ no_effects = false;
+ }
+ if ( !no_echo )
+ no_effects = false;
+
+ if ( chans [0].vol [0] != TO_FIXED( 1 ) ||
+ chans [0].vol [1] != TO_FIXED( 0 ) ||
+ chans [1].vol [0] != TO_FIXED( 0 ) ||
+ chans [1].vol [1] != TO_FIXED( 1 ) )
+ no_effects = false;
+
+ if ( !config_.enabled )
+ no_effects = true;
+
+ if ( no_effects )
+ {
+ for ( i = chans.size(); --i >= 0; )
+ {
+ chan_t& ch = chans [i];
+ ch.channel.center = &bufs [2];
+ ch.channel.left = &bufs [0];
+ ch.channel.right = &bufs [1];
+ }
+ }
+
+ mixer.bufs [0] = &bufs [0];
+ mixer.bufs [1] = &bufs [1];
+ mixer.bufs [2] = &bufs [2];
+
+ if ( echo_dirty || (!old_echo && (!no_echo && !no_effects)) )
+ clear_echo();
+
+ channels_changed();
+}
+
+void Effects_Buffer::assign_buffers()
+{
+ // assign channels to buffers
+ int buf_count = 0;
+ for ( int i = 0; i < (int) chans.size(); i++ )
+ {
+ // put second two side channels at end to give priority to main channels
+ // in case closest matching is necessary
+ int x = i;
+ if ( i > 1 )
+ x += 2;
+ if ( x >= (int) chans.size() )
+ x -= (chans.size() - 2);
+ chan_t& ch = chans [x];
+
+ int b = 0;
+ for ( ; b < buf_count; b++ )
+ {
+ if ( ch.vol [0] == bufs [b].vol [0] &&
+ ch.vol [1] == bufs [b].vol [1] &&
+ (ch.cfg.echo == bufs [b].echo || !s.feedback) )
+ break;
+ }
+
+ if ( b >= buf_count )
+ {
+ if ( buf_count < bufs_max )
+ {
+ bufs [b].vol [0] = ch.vol [0];
+ bufs [b].vol [1] = ch.vol [1];
+ bufs [b].echo = ch.cfg.echo;
+ buf_count++;
+ }
+ else
+ {
+ // TODO: this is a mess, needs refinement
+ dprintf( "Effects_Buffer ran out of buffers; using closest match\n" );
+ b = 0;
+ fixed_t best_dist = TO_FIXED( 8 );
+ for ( int h = buf_count; --h >= 0; )
+ {
+ #define CALC_LEVELS( vols, sum, diff, surround ) \
+ fixed_t sum, diff;\
+ bool surround = false;\
+ {\
+ fixed_t vol_0 = vols [0];\
+ if ( vol_0 < 0 ) vol_0 = -vol_0, surround = true;\
+ fixed_t vol_1 = vols [1];\
+ if ( vol_1 < 0 ) vol_1 = -vol_1, surround = true;\
+ sum = vol_0 + vol_1;\
+ diff = vol_0 - vol_1;\
+ }
+ CALC_LEVELS( ch.vol, ch_sum, ch_diff, ch_surround );
+ CALC_LEVELS( bufs [h].vol, buf_sum, buf_diff, buf_surround );
+
+ fixed_t dist = abs( ch_sum - buf_sum ) + abs( ch_diff - buf_diff );
+
+ if ( ch_surround != buf_surround )
+ dist += TO_FIXED( 1 ) / 2;
+
+ if ( s.feedback && ch.cfg.echo != bufs [h].echo )
+ dist += TO_FIXED( 1 ) / 2;
+
+ if ( best_dist > dist )
+ {
+ best_dist = dist;
+ b = h;
+ }
+ }
+ }
+ }
+
+ //dprintf( "ch %d->buf %d\n", x, b );
+ ch.channel.center = &bufs [b];
+ }
+}
+
+
+// Mixing
+
+void Effects_Buffer::end_frame( blip_time_t time )
+{
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].end_frame( time );
+}
+
+int Effects_Buffer::read_samples( blip_sample_t out [], int out_size )
+{
+ out_size = min( out_size, samples_avail() );
+
+ int pair_count = int (out_size >> 1);
+ require( pair_count * stereo == out_size ); // must read an even number of samples
+ if ( pair_count )
+ {
+ if ( no_effects )
+ {
+ mixer.read_pairs( out, pair_count );
+ }
+ else
+ {
+ int pairs_remain = pair_count;
+ do
+ {
+ // mix at most max_read pairs at a time
+ int count = max_read;
+ if ( count > pairs_remain )
+ count = pairs_remain;
+
+ if ( no_echo )
+ {
+ // optimization: clear echo here to keep mix_effects() a leaf function
+ echo_pos = 0;
+ memset( echo.begin(), 0, count * stereo * sizeof echo [0] );
+ }
+ mix_effects( out, count );
+
+ int new_echo_pos = echo_pos + count * stereo;
+ if ( new_echo_pos >= echo_size )
+ new_echo_pos -= echo_size;
+ echo_pos = new_echo_pos;
+ assert( echo_pos < echo_size );
+
+ out += count * stereo;
+ mixer.samples_read += count;
+ pairs_remain -= count;
+ }
+ while ( pairs_remain );
+ }
+
+ if ( samples_avail() <= 0 || immediate_removal() )
+ {
+ for ( int i = bufs_size; --i >= 0; )
+ {
+ buf_t& b = bufs [i];
+ // TODO: might miss non-silence settling since it checks END of last read
+ if ( b.non_silent() )
+ b.remove_samples( mixer.samples_read );
+ else
+ b.remove_silence( mixer.samples_read );
+ }
+ mixer.samples_read = 0;
+ }
+ }
+ return out_size;
+}
+
+void Effects_Buffer::mix_effects( blip_sample_t out_ [], int pair_count )
+{
+ typedef fixed_t stereo_fixed_t [stereo];
+
+ // add channels with echo, do echo, add channels without echo, then convert to 16-bit and output
+ int echo_phase = 1;
+ do
+ {
+ // mix any modified buffers
+ {
+ buf_t* buf = bufs;
+ int bufs_remain = bufs_size;
+ do
+ {
+ if ( buf->non_silent() && buf->echo == echo_phase )
+ {
+ stereo_fixed_t* BLARGG_RESTRICT out = (stereo_fixed_t*) &echo [echo_pos];
+ int const bass = BLIP_READER_BASS( *buf );
+ BLIP_READER_BEGIN( in, *buf );
+ BLIP_READER_ADJ_( in, mixer.samples_read );
+ fixed_t const vol_0 = buf->vol [0];
+ fixed_t const vol_1 = buf->vol [1];
+
+ int count = (unsigned) (echo_size - echo_pos) / stereo;
+ int remain = pair_count;
+ if ( count > remain )
+ count = remain;
+ do
+ {
+ remain -= count;
+ BLIP_READER_ADJ_( in, count );
+
+ out += count;
+ int offset = -count;
+ do
+ {
+ fixed_t s = BLIP_READER_READ( in );
+ BLIP_READER_NEXT_IDX_( in, bass, offset );
+
+ out [offset] [0] += s * vol_0;
+ out [offset] [1] += s * vol_1;
+ }
+ while ( ++offset );
+
+ out = (stereo_fixed_t*) echo.begin();
+ count = remain;
+ }
+ while ( remain );
+
+ BLIP_READER_END( in, *buf );
+ }
+ buf++;
+ }
+ while ( --bufs_remain );
+ }
+
+ // add echo
+ if ( echo_phase && !no_echo )
+ {
+ fixed_t const feedback = s.feedback;
+ fixed_t const treble = s.treble;
+
+ int i = 1;
+ do
+ {
+ fixed_t low_pass = s.low_pass [i];
+
+ fixed_t* echo_end = &echo [echo_size + i];
+ fixed_t const* BLARGG_RESTRICT in_pos = &echo [echo_pos + i];
+ int out_offset = echo_pos + i + s.delay [i];
+ if ( out_offset >= echo_size )
+ out_offset -= echo_size;
+ assert( out_offset < echo_size );
+ fixed_t* BLARGG_RESTRICT out_pos = &echo [out_offset];
+
+ // break into up to three chunks to avoid having to handle wrap-around
+ // in middle of core loop
+ int remain = pair_count;
+ do
+ {
+ fixed_t const* pos = in_pos;
+ if ( pos < out_pos )
+ pos = out_pos;
+ int count = (unsigned) ((char*) echo_end - (char const*) pos) /
+ (unsigned) (stereo * sizeof (fixed_t));
+ if ( count > remain )
+ count = remain;
+ remain -= count;
+
+ in_pos += count * stereo;
+ out_pos += count * stereo;
+ int offset = -count;
+ do
+ {
+ low_pass += FROM_FIXED( in_pos [offset * stereo] - low_pass ) * treble;
+ out_pos [offset * stereo] = FROM_FIXED( low_pass ) * feedback;
+ }
+ while ( ++offset );
+
+ if ( in_pos >= echo_end ) in_pos -= echo_size;
+ if ( out_pos >= echo_end ) out_pos -= echo_size;
+ }
+ while ( remain );
+
+ s.low_pass [i] = low_pass;
+ }
+ while ( --i >= 0 );
+ }
+ }
+ while ( --echo_phase >= 0 );
+
+ // clamp to 16 bits
+ {
+ stereo_fixed_t const* BLARGG_RESTRICT in = (stereo_fixed_t*) &echo [echo_pos];
+ typedef blip_sample_t stereo_blip_sample_t [stereo];
+ stereo_blip_sample_t* BLARGG_RESTRICT out = (stereo_blip_sample_t*) out_;
+ int count = (unsigned) (echo_size - echo_pos) / (unsigned) stereo;
+ int remain = pair_count;
+ if ( count > remain )
+ count = remain;
+ do
+ {
+ remain -= count;
+ in += count;
+ out += count;
+ int offset = -count;
+ do
+ {
+ fixed_t in_0 = FROM_FIXED( in [offset] [0] );
+ fixed_t in_1 = FROM_FIXED( in [offset] [1] );
+
+ BLIP_CLAMP( in_0, in_0 );
+ out [offset] [0] = (blip_sample_t) in_0;
+
+ BLIP_CLAMP( in_1, in_1 );
+ out [offset] [1] = (blip_sample_t) in_1;
+ }
+ while ( ++offset );
+
+ in = (stereo_fixed_t*) echo.begin();
+ count = remain;
+ }
+ while ( remain );
+ }
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.h b/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.h
new file mode 100644
index 00000000..348c74c7
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Effects_Buffer.h
@@ -0,0 +1,149 @@
+// Multi-channel effects buffer with echo and individual panning for each channel
+
+// Game_Music_Emu 0.6-pre
+#ifndef EFFECTS_BUFFER_H
+#define EFFECTS_BUFFER_H
+
+#include "Multi_Buffer.h"
+
+// See Simple_Effects_Buffer (below) for a simpler interface
+
+class Effects_Buffer : public Multi_Buffer {
+public:
+ // To reduce memory usage, fewer buffers can be used (with a best-fit
+ // approach if there are too few), and maximum echo delay can be reduced
+ Effects_Buffer( int max_bufs = 32, int echo_size = 24 * 1024 );
+
+ struct pan_vol_t
+ {
+ float vol; // 0.0 = silent, 0.5 = half volume, 1.0 = normal
+ float pan; // -1.0 = left, 0.0 = center, +1.0 = right
+ };
+
+ // Global configuration
+ struct config_t
+ {
+ bool enabled; // false = disable all effects
+
+ // Current sound is echoed at adjustable left/right delay,
+ // with reduced treble and volume (feedback).
+ float treble; // 1.0 = full treble, 0.1 = very little, 0.0 = silent
+ int delay [2]; // left, right delays (msec)
+ float feedback; // 0.0 = no echo, 0.5 = each echo half previous, 1.0 = cacophony
+ pan_vol_t side_chans [2]; // left and right side channel volume and pan
+ };
+ config_t& config() { return config_; }
+
+ // Limits of delay (msec)
+ int min_delay() const;
+ int max_delay() const;
+
+ // Per-channel configuration. Two or more channels with matching parameters are
+ // optimized to internally use the same buffer.
+ struct chan_config_t : pan_vol_t
+ {
+ // (inherited from pan_vol_t)
+ //float vol; // these only affect center channel
+ //float pan;
+ bool surround; // if true, negates left volume to put sound in back
+ bool echo; // false = channel doesn't have any echo
+ };
+ chan_config_t& chan_config( int i ) { return chans [i + extra_chans].cfg; }
+
+ // Applies any changes made to config() and chan_config()
+ virtual void apply_config();
+
+// Implementation
+public:
+ ~Effects_Buffer();
+ blargg_err_t set_sample_rate( int samples_per_sec, int msec = blip_default_length );
+ blargg_err_t set_channel_count( int, int const* = NULL );
+ void clock_rate( int );
+ void bass_freq( int );
+ void clear();
+ channel_t channel( int );
+ void end_frame( blip_time_t );
+ int read_samples( blip_sample_t [], int );
+ int samples_avail() const { return (bufs [0].samples_avail() - mixer.samples_read) * 2; }
+ enum { stereo = 2 };
+ typedef int fixed_t;
+
+protected:
+ enum { extra_chans = stereo * stereo };
+
+private:
+ config_t config_;
+ int clock_rate_;
+ int bass_freq_;
+
+ int echo_size;
+
+ struct chan_t
+ {
+ fixed_t vol [stereo];
+ chan_config_t cfg;
+ channel_t channel;
+ };
+ blargg_vector<chan_t> chans;
+
+ struct buf_t : Tracked_Blip_Buffer
+ {
+ // nasty: Blip_Buffer has something called fixed_t
+ Effects_Buffer::fixed_t vol [stereo];
+ bool echo;
+
+ void* operator new ( size_t, void* p ) { return p; }
+ void operator delete ( void* ) { }
+
+ ~buf_t() { }
+ };
+ buf_t* bufs;
+ int bufs_size;
+ int bufs_max; // bufs_size <= bufs_max, to limit memory usage
+ Stereo_Mixer mixer;
+
+ struct {
+ int delay [stereo];
+ fixed_t treble;
+ fixed_t feedback;
+ fixed_t low_pass [stereo];
+ } s;
+
+ blargg_vector<fixed_t> echo;
+ int echo_pos;
+
+ bool no_effects;
+ bool no_echo;
+
+ void assign_buffers();
+ void clear_echo();
+ void mix_effects( blip_sample_t out [], int pair_count );
+ blargg_err_t new_bufs( int size );
+ void delete_bufs();
+};
+
+// Simpler interface and lower memory usage
+class Simple_Effects_Buffer : public Effects_Buffer {
+public:
+ struct config_t
+ {
+ bool enabled; // false = disable all effects
+
+ float echo; // 0.0 = none, 1.0 = lots
+ float stereo; // 0.0 = channels in center, 1.0 = channels on left/right
+ bool surround; // true = put some channels in back
+ };
+ config_t& config() { return config_; }
+
+ // Applies any changes made to config()
+ void apply_config();
+
+// Implementation
+public:
+ Simple_Effects_Buffer();
+private:
+ config_t config_;
+ void chan_config(); // hide
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.cpp
new file mode 100644
index 00000000..b46ad922
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.cpp
@@ -0,0 +1,123 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Fir_Resampler.h"
+
+#include <math.h>
+
+/* Copyright (C) 2004-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#undef PI
+#define PI 3.1415926535897932384626433832795029
+
+static void gen_sinc( double rolloff, int width, double offset, double spacing, double scale,
+ int count, short* out )
+{
+ double const maxh = 256;
+ double const step = PI / maxh * spacing;
+ double const to_w = maxh * 2 / width;
+ double const pow_a_n = pow( rolloff, maxh );
+ scale /= maxh * 2;
+
+ double angle = (count / 2 - 1 + offset) * -step;
+ while ( count-- )
+ {
+ *out++ = 0;
+ double w = angle * to_w;
+ if ( fabs( w ) < PI )
+ {
+ double rolloff_cos_a = rolloff * cos( angle );
+ double num = 1 - rolloff_cos_a -
+ pow_a_n * cos( maxh * angle ) +
+ pow_a_n * rolloff * cos( (maxh - 1) * angle );
+ double den = 1 - rolloff_cos_a - rolloff_cos_a + rolloff * rolloff;
+ double sinc = scale * num / den - scale;
+
+ out [-1] = (short) (cos( w ) * sinc + sinc);
+ }
+ angle += step;
+ }
+}
+
+Fir_Resampler_::Fir_Resampler_( int width, sample_t impulses_ [] ) :
+ width_( width ),
+ impulses( impulses_ )
+{
+ imp = NULL;
+}
+
+void Fir_Resampler_::clear_()
+{
+ imp = impulses;
+ Resampler::clear_();
+}
+
+blargg_err_t Fir_Resampler_::set_rate_( double new_factor )
+{
+ double const rolloff = 0.999;
+ double const gain = 1.0;
+
+ // determine number of sub-phases that yield lowest error
+ double ratio_ = 0.0;
+ int res = -1;
+ {
+ double least_error = 2;
+ double pos = 0;
+ for ( int r = 1; r <= max_res; r++ )
+ {
+ pos += new_factor;
+ double nearest = floor( pos + 0.5 );
+ double error = fabs( pos - nearest );
+ if ( error < least_error )
+ {
+ res = r;
+ ratio_ = nearest / res;
+ least_error = error;
+ }
+ }
+ }
+ RETURN_ERR( Resampler::set_rate_( ratio_ ) );
+
+ // how much of input is used for each output sample
+ int const step = stereo * (int) floor( ratio_ );
+ double fraction = fmod( ratio_, 1.0 );
+
+ double const filter = (ratio_ < 1.0) ? 1.0 : 1.0 / ratio_;
+ double pos = 0.0;
+ //int input_per_cycle = 0;
+ sample_t* out = impulses;
+ for ( int n = res; --n >= 0; )
+ {
+ gen_sinc( rolloff, int (width_ * filter + 1) & ~1, pos, filter,
+ double (0x7FFF * gain * filter), (int) width_, out );
+ out += width_;
+
+ int cur_step = step;
+ pos += fraction;
+ if ( pos >= 0.9999999 )
+ {
+ pos -= 1.0;
+ cur_step += stereo;
+ }
+
+ *out++ = (cur_step - width_ * 2 + 4) * sizeof (sample_t);
+ *out++ = 4 * sizeof (sample_t);
+ //input_per_cycle += cur_step;
+ }
+ // last offset moves back to beginning of impulses
+ out [-1] -= (char*) out - (char*) impulses;
+
+ imp = impulses;
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.h
new file mode 100644
index 00000000..daabf146
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Fir_Resampler.h
@@ -0,0 +1,101 @@
+// Finite impulse response (FIR) resampler with adjustable FIR size
+
+// Game_Music_Emu 0.6-pre
+#ifndef FIR_RESAMPLER_H
+#define FIR_RESAMPLER_H
+
+#include "Resampler.h"
+
+template<int width>
+class Fir_Resampler;
+
+// Use one of these typedefs
+typedef Fir_Resampler< 8> Fir_Resampler_Fast;
+typedef Fir_Resampler<16> Fir_Resampler_Norm;
+typedef Fir_Resampler<24> Fir_Resampler_Good;
+
+// Implementation
+class Fir_Resampler_ : public Resampler {
+protected:
+ virtual blargg_err_t set_rate_( double );
+ virtual void clear_();
+
+protected:
+ enum { stereo = 2 };
+ enum { max_res = 32 }; // TODO: eliminate and keep impulses on freestore?
+ sample_t const* imp;
+ int const width_;
+ sample_t* impulses;
+
+ Fir_Resampler_( int width, sample_t [] );
+};
+
+// Width is number of points in FIR. More points give better quality and
+// rolloff effectiveness, and take longer to calculate.
+template<int width>
+class Fir_Resampler : public Fir_Resampler_ {
+ enum { min_width = (width < 4 ? 4 : width) };
+ enum { adj_width = min_width / 4 * 4 + 2 };
+ enum { write_offset = adj_width * stereo };
+ short impulses [max_res * (adj_width + 2)];
+public:
+ Fir_Resampler() : Fir_Resampler_( adj_width, impulses ) { }
+
+protected:
+ virtual sample_t const* resample_( sample_t**, sample_t const*, sample_t const [], int );
+};
+
+template<int width>
+Resampler::sample_t const* Fir_Resampler<width>::resample_( sample_t** out_,
+ sample_t const* out_end, sample_t const in [], int in_size )
+{
+ in_size -= write_offset;
+ if ( in_size > 0 )
+ {
+ sample_t* BLARGG_RESTRICT out = *out_;
+ sample_t const* const in_end = in + in_size;
+ sample_t const* imp = this->imp;
+
+ do
+ {
+ // accumulate in extended precision
+ int pt = imp [0];
+ int l = pt * in [0];
+ int r = pt * in [1];
+ if ( out >= out_end )
+ break;
+ for ( int n = (adj_width - 2) / 2; n; --n )
+ {
+ pt = imp [1];
+ l += pt * in [2];
+ r += pt * in [3];
+
+ // pre-increment more efficient on some RISC processors
+ imp += 2;
+ pt = imp [0];
+ r += pt * in [5];
+ in += 4;
+ l += pt * in [0];
+ }
+ pt = imp [1];
+ l += pt * in [2];
+ r += pt * in [3];
+
+ // these two "samples" after the end of the impulse give the
+ // proper offsets to the next input sample and next impulse
+ in = (sample_t const*) ((char const*) in + imp [2]); // some negative value
+ imp = (sample_t const*) ((char const*) imp + imp [3]); // small positive or large negative
+
+ out [0] = sample_t (l >> 15);
+ out [1] = sample_t (r >> 15);
+ out += 2;
+ }
+ while ( in < in_end );
+
+ this->imp = imp;
+ *out_ = out;
+ }
+ return in;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.cpp
new file mode 100644
index 00000000..af5954f1
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.cpp
@@ -0,0 +1,407 @@
+// Gb_Snd_Emu 0.1.4. http://www.slack.net/~ant/
+
+#include "Gb_Apu.h"
+
+//#include "gb_apu_logger.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const vol_reg = 0xFF24;
+int const stereo_reg = 0xFF25;
+int const status_reg = 0xFF26;
+int const wave_ram = 0xFF30;
+
+int const power_mask = 0x80;
+
+void Gb_Apu::treble_eq( blip_eq_t const& eq )
+{
+ norm_synth.treble_eq( eq );
+ fast_synth.treble_eq( eq );
+}
+
+inline int Gb_Apu::calc_output( int osc ) const
+{
+ int bits = regs [stereo_reg - io_addr] >> osc;
+ return (bits >> 3 & 2) | (bits & 1);
+}
+
+void Gb_Apu::set_output( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ // Must be silent (all NULL), mono (left and right NULL), or stereo (none NULL)
+ require( !center || (center && !left && !right) || (center && left && right) );
+ require( (unsigned) i < osc_count ); // fails if you pass invalid osc index
+
+ if ( !center || !left || !right )
+ {
+ left = center;
+ right = center;
+ }
+
+ Gb_Osc& o = *oscs [i];
+ o.outputs [1] = right;
+ o.outputs [2] = left;
+ o.outputs [3] = center;
+ o.output = o.outputs [calc_output( i )];
+}
+
+void Gb_Apu::synth_volume( int iv )
+{
+ double v = volume_ * 0.60 / osc_count / 15 /*steps*/ / 8 /*master vol range*/ * iv;
+ norm_synth.volume( v );
+ fast_synth.volume( v );
+}
+
+void Gb_Apu::apply_volume()
+{
+ // TODO: Doesn't handle differing left and right volumes (panning).
+ // Not worth the complexity.
+ int data = regs [vol_reg - io_addr];
+ int left = data >> 4 & 7;
+ int right = data & 7;
+ //if ( data & 0x88 ) dprintf( "Vin: %02X\n", data & 0x88 );
+ //if ( left != right ) dprintf( "l: %d r: %d\n", left, right );
+ synth_volume( max( left, right ) + 1 );
+}
+
+void Gb_Apu::volume( double v )
+{
+ if ( volume_ != v )
+ {
+ volume_ = v;
+ apply_volume();
+ }
+}
+
+void Gb_Apu::reset_regs()
+{
+ for ( int i = 0; i < 0x20; i++ )
+ regs [i] = 0;
+
+ square1.reset();
+ square2.reset();
+ wave .reset();
+ noise .reset();
+
+ apply_volume();
+}
+
+void Gb_Apu::reset_lengths()
+{
+ square1.length_ctr = 64;
+ square2.length_ctr = 64;
+ wave .length_ctr = 256;
+ noise .length_ctr = 64;
+}
+
+void Gb_Apu::reduce_clicks( bool reduce )
+{
+ reduce_clicks_ = reduce;
+
+ // Click reduction makes DAC off generate same output as volume 0
+ int dac_off_amp = 0;
+ if ( reduce && wave.mode != mode_agb ) // AGB already eliminates clicks
+ dac_off_amp = -Gb_Osc::dac_bias;
+
+ for ( int i = 0; i < osc_count; i++ )
+ oscs [i]->dac_off_amp = dac_off_amp;
+
+ // AGB always eliminates clicks on wave channel using same method
+ if ( wave.mode == mode_agb )
+ wave.dac_off_amp = -Gb_Osc::dac_bias;
+}
+
+void Gb_Apu::reset( mode_t mode, bool agb_wave )
+{
+ // Hardware mode
+ if ( agb_wave )
+ mode = mode_agb; // using AGB wave features implies AGB hardware
+ wave.agb_mask = agb_wave ? 0xFF : 0;
+ for ( int i = 0; i < osc_count; i++ )
+ oscs [i]->mode = mode;
+ reduce_clicks( reduce_clicks_ );
+
+ // Reset state
+ frame_time = 0;
+ last_time = 0;
+ frame_phase = 0;
+
+ reset_regs();
+ reset_lengths();
+
+ // Load initial wave RAM
+ static byte const initial_wave [2] [16] = {
+ {0x84,0x40,0x43,0xAA,0x2D,0x78,0x92,0x3C,0x60,0x59,0x59,0xB0,0x34,0xB8,0x2E,0xDA},
+ {0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF,0x00,0xFF},
+ };
+ for ( int b = 2; --b >= 0; )
+ {
+ // Init both banks (does nothing if not in AGB mode)
+ // TODO: verify that this works
+ write_register( 0, 0xFF1A, b * 0x40 );
+ for ( unsigned i = 0; i < sizeof initial_wave [0]; i++ )
+ write_register( 0, i + wave_ram, initial_wave [(mode != mode_dmg)] [i] );
+ }
+}
+
+void Gb_Apu::set_tempo( double t )
+{
+ frame_period = 4194304 / 512; // 512 Hz
+ if ( t != 1.0 )
+ frame_period = t ? blip_time_t (frame_period / t) : blip_time_t(0);
+}
+
+Gb_Apu::Gb_Apu()
+{
+ wave.wave_ram = &regs [wave_ram - io_addr];
+
+ oscs [0] = &square1;
+ oscs [1] = &square2;
+ oscs [2] = &wave;
+ oscs [3] = &noise;
+
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Gb_Osc& o = *oscs [i];
+ o.regs = &regs [i * 5];
+ o.output = NULL;
+ o.outputs [0] = NULL;
+ o.outputs [1] = NULL;
+ o.outputs [2] = NULL;
+ o.outputs [3] = NULL;
+ o.norm_synth = &norm_synth;
+ o.fast_synth = &fast_synth;
+ }
+
+ reduce_clicks_ = false;
+ set_tempo( 1.0 );
+ volume_ = 1.0;
+ reset();
+}
+
+void Gb_Apu::run_until_( blip_time_t end_time )
+{
+ if ( !frame_period )
+ frame_time += end_time - last_time;
+
+ while ( true )
+ {
+ // run oscillators
+ blip_time_t time = end_time;
+ if ( time > frame_time )
+ time = frame_time;
+
+ square1.run( last_time, time );
+ square2.run( last_time, time );
+ wave .run( last_time, time );
+ noise .run( last_time, time );
+ last_time = time;
+
+ if ( time == end_time )
+ break;
+
+ // run frame sequencer
+ assert( frame_period );
+ frame_time += frame_period * Gb_Osc::clk_mul;
+ switch ( frame_phase++ )
+ {
+ case 2:
+ case 6:
+ // 128 Hz
+ square1.clock_sweep();
+ case 0:
+ case 4:
+ // 256 Hz
+ square1.clock_length();
+ square2.clock_length();
+ wave .clock_length();
+ noise .clock_length();
+ break;
+
+ case 7:
+ // 64 Hz
+ frame_phase = 0;
+ square1.clock_envelope();
+ square2.clock_envelope();
+ noise .clock_envelope();
+ }
+ }
+}
+
+inline void Gb_Apu::run_until( blip_time_t time )
+{
+ require( time >= last_time ); // end_time must not be before previous time
+ if ( time > last_time )
+ run_until_( time );
+}
+
+void Gb_Apu::end_frame( blip_time_t end_time )
+{
+ #ifdef LOG_FRAME
+ LOG_FRAME( end_time );
+ #endif
+
+ if ( end_time > last_time )
+ run_until( end_time );
+
+ frame_time -= end_time;
+ assert( frame_time >= 0 );
+
+ last_time -= end_time;
+ assert( last_time >= 0 );
+}
+
+void Gb_Apu::silence_osc( Gb_Osc& o )
+{
+ int delta = -o.last_amp;
+ if ( reduce_clicks_ )
+ delta += o.dac_off_amp;
+
+ if ( delta )
+ {
+ o.last_amp = o.dac_off_amp;
+ if ( o.output )
+ {
+ o.output->set_modified();
+ fast_synth.offset( last_time, delta, o.output );
+ }
+ }
+}
+
+void Gb_Apu::apply_stereo()
+{
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Gb_Osc& o = *oscs [i];
+ Blip_Buffer* out = o.outputs [calc_output( i )];
+ if ( o.output != out )
+ {
+ silence_osc( o );
+ o.output = out;
+ }
+ }
+}
+
+void Gb_Apu::write_register( blip_time_t time, int addr, int data )
+{
+ require( (unsigned) data < 0x100 );
+
+ int reg = addr - io_addr;
+ if ( (unsigned) reg >= io_size )
+ {
+ require( false );
+ return;
+ }
+
+ #ifdef LOG_WRITE
+ LOG_WRITE( time, addr, data );
+ #endif
+
+ if ( addr < status_reg && !(regs [status_reg - io_addr] & power_mask) )
+ {
+ // Power is off
+
+ // length counters can only be written in DMG mode
+ if ( wave.mode != mode_dmg || (reg != 1 && reg != 5+1 && reg != 10+1 && reg != 15+1) )
+ return;
+
+ if ( reg < 10 )
+ data &= 0x3F; // clear square duty
+ }
+
+ run_until( time );
+
+ if ( addr >= wave_ram )
+ {
+ wave.write( addr, data );
+ }
+ else
+ {
+ int old_data = regs [reg];
+ regs [reg] = data;
+
+ if ( addr < vol_reg )
+ {
+ // Oscillator
+ write_osc( reg, old_data, data );
+ }
+ else if ( addr == vol_reg && data != old_data )
+ {
+ // Master volume
+ for ( int i = osc_count; --i >= 0; )
+ silence_osc( *oscs [i] );
+
+ apply_volume();
+ }
+ else if ( addr == stereo_reg )
+ {
+ // Stereo panning
+ apply_stereo();
+ }
+ else if ( addr == status_reg && (data ^ old_data) & power_mask )
+ {
+ // Power control
+ frame_phase = 0;
+ for ( int i = osc_count; --i >= 0; )
+ silence_osc( *oscs [i] );
+
+ reset_regs();
+ if ( wave.mode != mode_dmg )
+ reset_lengths();
+
+ regs [status_reg - io_addr] = data;
+ }
+ }
+}
+
+int Gb_Apu::read_register( blip_time_t time, int addr )
+{
+ if ( addr >= status_reg )
+ run_until( time );
+
+ int reg = addr - io_addr;
+ if ( (unsigned) reg >= io_size )
+ {
+ require( false );
+ return 0;
+ }
+
+ if ( addr >= wave_ram )
+ return wave.read( addr );
+
+ // Value read back has some bits always set
+ static byte const masks [] = {
+ 0x80,0x3F,0x00,0xFF,0xBF,
+ 0xFF,0x3F,0x00,0xFF,0xBF,
+ 0x7F,0xFF,0x9F,0xFF,0xBF,
+ 0xFF,0xFF,0x00,0x00,0xBF,
+ 0x00,0x00,0x70,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
+ };
+ int mask = masks [reg];
+ if ( wave.agb_mask && (reg == 10 || reg == 12) )
+ mask = 0x1F; // extra implemented bits in wave regs on AGB
+ int data = regs [reg] | mask;
+
+ // Status register
+ if ( addr == status_reg )
+ {
+ data &= 0xF0;
+ data |= (int) square1.enabled << 0;
+ data |= (int) square2.enabled << 1;
+ data |= (int) wave .enabled << 2;
+ data |= (int) noise .enabled << 3;
+ }
+
+ return data;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.h
new file mode 100644
index 00000000..f7ffb037
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Apu.h
@@ -0,0 +1,193 @@
+// Nintendo Game Boy sound hardware emulator with save state support
+
+// Gb_Snd_Emu 0.1.4
+#ifndef GB_APU_H
+#define GB_APU_H
+
+#include "Gb_Oscs.h"
+
+struct gb_apu_state_t;
+
+class Gb_Apu {
+public:
+// Basics
+
+ // Sets buffer(s) to generate sound into, or NULL to mute. If only center is not NULL,
+ // output is mono.
+ void set_output( Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Emulates to time t, then writes data to addr
+ void write_register( blip_time_t t, int addr, int data );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Clock rate sound hardware runs at
+ enum { clock_rate = 4194304 * GB_APU_OVERCLOCK };
+
+ // Registers are at io_addr to io_addr+io_size-1
+ enum { io_addr = 0xFF10 };
+ enum { io_size = 0x30 };
+
+ // Emulates to time t, then reads from addr
+ int read_register( blip_time_t t, int addr );
+
+ // Resets hardware to state after power, BEFORE boot ROM runs. Mode selects
+ // sound hardware. If agb_wave is true, enables AGB's extra wave features.
+ enum mode_t {
+ mode_dmg, // Game Boy monochrome
+ mode_cgb, // Game Boy Color
+ mode_agb // Game Boy Advance
+ };
+ void reset( mode_t mode = mode_cgb, bool agb_wave = false );
+
+ // Same as set_output(), but for a particular channel
+ // 0: Square 1, 1: Square 2, 2: Wave, 3: Noise
+ enum { osc_count = 4 }; // 0 <= chan < osc_count
+ void set_output( int chan, Blip_Buffer* center,
+ Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Sets overall volume, where 1.0 is normal
+ void volume( double );
+
+ // Sets treble equalization
+ void treble_eq( blip_eq_t const& );
+
+ // Treble and bass values for various hardware.
+ enum {
+ speaker_treble = -47, // speaker on system
+ speaker_bass = 2000,
+ dmg_treble = 0, // headphones on each system
+ dmg_bass = 30,
+ cgb_treble = 0,
+ cgb_bass = 300, // CGB has much less bass
+ agb_treble = 0,
+ agb_bass = 30
+ };
+
+ // If true, reduces clicking by disabling DAC biasing. Note that this reduces
+ // emulation accuracy, since the clicks are authentic.
+ void reduce_clicks( bool reduce = true );
+
+ // Sets frame sequencer rate, where 1.0 is normal. Meant for adjusting the
+ // tempo in a music player.
+ void set_tempo( double );
+
+ // Saves full emulation state to state_out. Data format is portable and
+ // includes some extra space to avoid expansion in case more state needs
+ // to be stored in the future.
+ void save_state( gb_apu_state_t* state_out );
+
+ // Loads state. You should call reset() BEFORE this.
+ blargg_err_t load_state( gb_apu_state_t const& in );
+
+private:
+ // noncopyable
+ Gb_Apu( const Gb_Apu& );
+ Gb_Apu& operator = ( const Gb_Apu& );
+
+// Implementation
+public:
+ Gb_Apu();
+
+ // Use set_output() in place of these
+ BLARGG_DEPRECATED( void output ( Blip_Buffer* c ); )
+ BLARGG_DEPRECATED( void output ( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ); )
+ BLARGG_DEPRECATED( void osc_output( int i, Blip_Buffer* c ) { set_output( i, c, c, c ); } )
+ BLARGG_DEPRECATED( void osc_output( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( i, c, l, r ); } )
+
+ BLARGG_DEPRECATED_TEXT( enum { start_addr = 0xFF10 }; )
+ BLARGG_DEPRECATED_TEXT( enum { end_addr = 0xFF3F }; )
+ BLARGG_DEPRECATED_TEXT( enum { register_count = end_addr - start_addr + 1 }; )
+
+private:
+ Gb_Osc* oscs [osc_count];
+ blip_time_t last_time; // time sound emulator has been run to
+ blip_time_t frame_period; // clocks between each frame sequencer step
+ double volume_;
+ bool reduce_clicks_;
+
+ Gb_Sweep_Square square1;
+ Gb_Square square2;
+ Gb_Wave wave;
+ Gb_Noise noise;
+ blip_time_t frame_time; // time of next frame sequencer action
+ int frame_phase; // phase of next frame sequencer step
+ enum { regs_size = io_size + 0x10 };
+ BOOST::uint8_t regs [regs_size];// last values written to registers
+
+ // large objects after everything else
+ Blip_Synth_Norm norm_synth;
+ Blip_Synth_Fast fast_synth;
+
+ void reset_lengths();
+ void reset_regs();
+ int calc_output( int osc ) const;
+ void apply_stereo();
+ void apply_volume();
+ void synth_volume( int );
+ void run_until_( blip_time_t );
+ void run_until( blip_time_t );
+ void silence_osc( Gb_Osc& );
+ void write_osc( int reg, int old_data, int data );
+ const char* save_load( gb_apu_state_t*, bool save );
+ void save_load2( gb_apu_state_t*, bool save );
+ friend class Gb_Apu2;
+};
+
+// Format of save state. Should be stable across versions of the library,
+// with earlier versions properly opening later save states. Includes some
+// room for expansion so the state size shouldn't increase.
+struct gb_apu_state_t
+{
+#if GB_APU_CUSTOM_STATE
+ // Values stored as plain int so your code can read/write them easily.
+ // Structure can NOT be written to disk, since format is not portable.
+ typedef int val_t;
+#else
+ // Values written in portable little-endian format, allowing structure
+ // to be written directly to disk.
+ typedef unsigned char val_t [4];
+#endif
+
+ enum { format0 = 0x50414247 }; // 'GBAP'
+
+ val_t format; // format of all following data
+ val_t version; // later versions just add fields to end
+
+ unsigned char regs [0x40];
+ val_t frame_time;
+ val_t frame_phase;
+
+ val_t sweep_freq;
+ val_t sweep_delay;
+ val_t sweep_enabled;
+ val_t sweep_neg;
+ val_t noise_divider;
+ val_t wave_buf;
+
+ val_t delay [4];
+ val_t length_ctr [4];
+ val_t phase [4];
+ val_t enabled [4];
+
+ val_t env_delay [3];
+ val_t env_volume [3];
+ val_t env_enabled [3];
+
+ val_t unused [13]; // for future expansion
+};
+
+inline void Gb_Apu::set_output( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ for ( int i = osc_count; --i >= 0; )
+ set_output( i, c, l, r );
+}
+
+BLARGG_DEPRECATED_TEXT( inline void Gb_Apu::output( Blip_Buffer* c ) { set_output( c, c, c ); } )
+BLARGG_DEPRECATED_TEXT( inline void Gb_Apu::output( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( c, l, r ); } )
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.cpp
new file mode 100644
index 00000000..4a97ffb5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.cpp
@@ -0,0 +1,51 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gb_Cpu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+inline void Gb_Cpu::set_code_page( int i, void* p )
+{
+ byte* p2 = STATIC_CAST(byte*,p) - GB_CPU_OFFSET( i * page_size );
+ cpu_state_.code_map [i] = p2;
+ cpu_state->code_map [i] = p2;
+}
+
+void Gb_Cpu::reset( void* unmapped )
+{
+ check( cpu_state == &cpu_state_ );
+ cpu_state = &cpu_state_;
+
+ cpu_state_.time = 0;
+
+ for ( int i = 0; i < page_count + 1; ++i )
+ set_code_page( i, unmapped );
+
+ memset( &r, 0, sizeof r );
+
+ blargg_verify_byte_order();
+}
+
+void Gb_Cpu::map_code( addr_t start, int size, void* data )
+{
+ // address range must begin and end on page boundaries
+ require( start % page_size == 0 );
+ require( size % page_size == 0 );
+ require( start + size <= mem_size );
+
+ for ( int offset = 0; offset < size; offset += page_size )
+ set_code_page( (start + offset) >> page_bits, STATIC_CAST(char*,data) + offset );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.h b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.h
new file mode 100644
index 00000000..1aeccdfd
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu.h
@@ -0,0 +1,82 @@
+// Nintendo Game Boy CPU emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef GB_CPU_H
+#define GB_CPU_H
+
+#include "blargg_common.h"
+
+class Gb_Cpu {
+public:
+ typedef int addr_t;
+ typedef BOOST::uint8_t byte;
+
+ enum { mem_size = 0x10000 };
+
+ // Clears registers and map all pages to unmapped
+ void reset( void* unmapped = NULL );
+
+ // Maps code memory (memory accessed via the program counter). Start and size
+ // must be multiple of page_size.
+ enum { page_bits = 13 };
+ enum { page_size = 1 << page_bits };
+ void map_code( addr_t start, int size, void* code );
+
+ // Accesses emulated memory as CPU does
+ byte* get_code( addr_t );
+
+ // Game Boy Z-80 registers. NOT kept updated during emulation.
+ struct core_regs_t {
+ BOOST::uint16_t bc, de, hl, fa;
+ };
+
+ struct registers_t : core_regs_t {
+ int pc; // more than 16 bits to allow overflow detection
+ BOOST::uint16_t sp;
+ };
+ registers_t r;
+
+ // Base address for RST vectors, to simplify GBS player (normally 0)
+ addr_t rst_base;
+
+ // Current time.
+ int time() const { return cpu_state->time; }
+
+ // Changes time. Must not be called during emulation.
+ // Should be negative, because emulation stops once it becomes >= 0.
+ void set_time( int t ) { cpu_state->time = t; }
+
+ // Emulator reads this many bytes past end of a page
+ enum { cpu_padding = 8 };
+
+
+// Implementation
+public:
+ Gb_Cpu() : rst_base( 0 ) { cpu_state = &cpu_state_; }
+ enum { page_count = mem_size >> page_bits };
+
+ struct cpu_state_t {
+ byte* code_map [page_count + 1];
+ int time;
+ };
+ cpu_state_t* cpu_state; // points to state_ or a local copy within run()
+ cpu_state_t cpu_state_;
+
+private:
+ void set_code_page( int, void* );
+};
+
+#define GB_CPU_PAGE( addr ) ((unsigned) (addr) >> Gb_Cpu::page_bits)
+
+#if BLARGG_NONPORTABLE
+ #define GB_CPU_OFFSET( addr ) (addr)
+#else
+ #define GB_CPU_OFFSET( addr ) ((addr) & (Gb_Cpu::page_size - 1))
+#endif
+
+inline BOOST::uint8_t* Gb_Cpu::get_code( addr_t addr )
+{
+ return cpu_state_.code_map [GB_CPU_PAGE( addr )] + GB_CPU_OFFSET( addr );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu_run.h b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu_run.h
new file mode 100644
index 00000000..85f190e2
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Cpu_run.h
@@ -0,0 +1,1183 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#if 0
+/* Define these macros in the source file before #including this file.
+- Parameters might be expressions, so they are best evaluated only once,
+though they NEVER have side-effects, so multiple evaluation is OK.
+- Output parameters might be a multiple-assignment expression like "a=x",
+so they must NOT be parenthesized.
+- Macros "returning" void may use a {} statement block. */
+
+ // 0 <= addr <= 0xFFFF + page_size
+ // time functions can be used
+ int READ_MEM( addr_t );
+ void WRITE_MEM( addr_t, int data );
+
+ // Access of 0xFF00 + offset
+ // 0 <= offset <= 0xFF
+ int READ_IO( int offset );
+ void WRITE_IO( int offset, int data );
+
+ // Often-used instructions use this instead of READ_MEM
+ void READ_FAST( addr_t, int& out );
+
+// The following can be used within macros:
+
+ // Current time
+ cpu_time_t TIME();
+#endif
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+// Common instructions:
+//
+// 365880 FA LD A,(nn)
+// 355863 20 JR NZ
+// 313655 21 LD HL,nn
+// 274580 28 JR Z
+// 252878 FE CP n
+// 230541 7E LD A,(HL)
+// 226209 2A LD A,(HL+)
+// 217467 CD CALL
+// 212034 C9 RET
+// 208376 CB CB prefix
+//
+// 27486 CB 7E BIT 7,(HL)
+// 15925 CB 76 BIT 6,(HL)
+// 13035 CB 19 RR C
+// 11557 CB 7F BIT 7,A
+// 10898 CB 37 SWAP A
+// 10208 CB 66 BIT 4,(HL)
+
+// Allows MWCW debugger to step through code properly
+#ifdef CPU_BEGIN
+ CPU_BEGIN
+#endif
+
+#define TIME() s.time
+
+#define CODE_PAGE( addr ) s.code_map [GB_CPU_PAGE( addr )]
+#define READ_CODE( addr ) (CODE_PAGE( addr ) [GB_CPU_OFFSET( addr )])
+
+// Flags with hex value for clarity when used as mask.
+// Stored in indicated variable during emulation.
+int const z80 = 0x80; // cz
+int const n40 = 0x40; // ph
+int const h20 = 0x20; // ph
+int const c10 = 0x10; // cz
+
+#define SET_FLAGS( in )\
+{\
+ cz = ((in) << 4 & 0x100) + (~(in) >> 7 & 1);\
+ ph = (~(in) << 2 & 0x100) + ((in) >> 1 & 0x10);\
+}
+
+// random bits in cz to catch misuse of them
+#define SET_FLAGS_DEBUG( in )\
+{\
+ cz = ((in) << 4 & 0x100) | (rand() & ~0x1FF) | ((in) & 0x80 ? 0 : (rand() & 0xFF) | 1);\
+ ph = (~(in) << 2 & 0x100) | (((in) >> 1 & 0x10) ^ BYTE( cz ));\
+}
+
+#define GET_FLAGS( out )\
+{\
+ out = (cz >> 4 & c10);\
+ out += ~ph >> 2 & n40;\
+ out += (ph ^ cz) << 1 & h20;\
+ if ( !BYTE( cz ) )\
+ out += z80;\
+}
+
+#define CC_NZ() ( BYTE( cz ))
+#define CC_Z() (!BYTE( cz ))
+#define CC_NC() (!(cz & 0x100))
+#define CC_C() ( cz & 0x100 )
+
+// Truncation
+#define BYTE( n ) ((BOOST::uint8_t ) (n)) /* (unsigned) n & 0xFF */
+#define SBYTE( n ) ((BOOST::int8_t ) (n)) /* (BYTE( n ) ^ 0x80) - 0x80 */
+#define WORD( n ) ((BOOST::uint16_t) (n)) /* (unsigned) n & 0xFFFF */
+
+{
+ Gb_Cpu::cpu_state_t s;
+ CPU.cpu_state = &s;
+ memcpy( &s, &CPU.cpu_state_, sizeof s );
+
+ union {
+ struct {
+ #if BLARGG_BIG_ENDIAN
+ byte b, c, d, e, h, l, flags, a;
+ #else
+ byte c, b, e, d, l, h, a, flags;
+ #endif
+ } rg; // individual registers
+ Gb_Cpu::core_regs_t rp; // pairs
+
+ byte r8_ [8]; // indexed registers (use R8 macro due to endian dependence)
+ BOOST::uint16_t r16 [4]; // indexed pairs
+ };
+ BLARGG_STATIC_ASSERT( sizeof rg == 8 && sizeof rp == 8 );
+
+ #if BLARGG_BIG_ENDIAN
+ #define R8( n ) (r8_ [n])
+ #elif BLARGG_LITTLE_ENDIAN
+ #define R8( n ) (r8_ [(n) ^ 1])
+ #else
+ // Be sure "blargg_endian.h" has been #included in the file that #includes this
+ #error "Byte order of CPU must be known"
+ #endif
+
+ rp = CPU.r;
+ int pc = CPU.r.pc;
+ int sp = CPU.r.sp;
+ int ph;
+ int cz;
+ SET_FLAGS( rg.flags );
+
+ int time = s.time;
+
+loop:
+
+ check( (unsigned) pc < 0x10000 + 1 ); // +1 so emulator can catch wrap-around
+ check( (unsigned) sp < 0x10000 );
+
+ byte const* instr = CODE_PAGE( pc );
+ int op;
+
+ if ( GB_CPU_OFFSET(~0) == ~0 )
+ {
+ op = instr [pc];
+ pc++;
+ instr += pc;
+ }
+ else
+ {
+ instr += GB_CPU_OFFSET( pc );
+ op = *instr++;
+ pc++;
+ }
+
+#define GET_ADDR() GET_LE16( instr )
+
+ static byte const instr_times [256*2] = {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 4,12, 8, 8, 4, 4, 8, 4,20, 8, 8, 8, 4, 4, 8, 4,// 0
+ 4,12, 8, 8, 4, 4, 8, 4,12, 8, 8, 8, 4, 4, 8, 4,// 1
+ 8,12, 8, 8, 4, 4, 8, 4, 8, 8, 8, 8, 4, 4, 8, 4,// 2
+ 8,12, 8, 8,12,12,12, 4, 8, 8, 8, 8, 4, 4, 8, 4,// 3
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// 4
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// 5
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// 6
+ 8, 8, 8, 8, 8, 8, 0, 8, 4, 4, 4, 4, 4, 4, 8, 4,// 7
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// 8
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// 9
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// A
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,// B
+ 8,12,16,16,12,16, 8,16, 8,16,16, 0,12,24, 8,16,// C
+ 8,12,16, 0,12,16, 8,16, 8,16,16, 0,12, 0, 8,16,// D
+ 12,12, 8, 0, 0,16, 8,16,16, 4,16, 0, 0, 0, 8,16,// E
+ 12,12, 8, 4, 0,16, 8,16,12, 8,16, 4, 0, 0, 8,16,// F
+
+ // CB prefixed
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 0
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 1
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 2
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 3
+ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,// 4
+ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,// 5
+ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,// 6
+ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,// 7
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 8
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// 9
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// A
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// B
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// C
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// D
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// E
+ 8, 8, 8, 8, 8, 8,16, 8, 8, 8, 8, 8, 8, 8,16, 8,// F
+ };
+
+ if ( time >= 0 )
+ goto stop;
+
+ time += instr_times [op];
+
+ int data;
+ data = *instr;
+ s.time = time;
+
+ #ifdef CPU_INSTR_HOOK
+ { CPU_INSTR_HOOK( (pc-1), (instr-1), rg.a, rp.bc, rp.de, rp.hl, sp ); }
+ #endif
+
+ switch ( op )
+ {
+
+// TODO: more efficient way to handle negative branch that wraps PC around
+#define BRANCH_( cond, clocks )\
+{\
+ pc++;\
+ if ( !(cond) )\
+ goto loop;\
+ pc = WORD( pc + SBYTE( data ) );\
+ time += clocks;\
+ goto loop;\
+}
+
+#define BRANCH( cond ) BRANCH_( cond, 4 )
+
+// Most Common
+
+ case 0x20: // JR NZ
+ BRANCH( CC_NZ() )
+
+ case 0x21: // LD HL,IMM (common)
+ rp.hl = GET_ADDR();
+ pc += 2;
+ goto loop;
+
+ case 0x28: // JR Z
+ BRANCH( CC_Z() )
+
+ case 0xF2: // LD A,(0xFF00+C)
+ READ_IO( rg.c, rg.a );
+ goto loop;
+
+ case 0xF0: // LD A,(0xFF00+imm)
+ pc++;
+ READ_IO( data, rg.a );
+ goto loop;
+
+ {
+ int temp;
+ case 0x0A: // LD A,(BC)
+ temp = rp.bc;
+ goto ld_a_ind_comm;
+
+ case 0x3A: // LD A,(HL-)
+ temp = rp.hl;
+ rp.hl = temp - 1;
+ goto ld_a_ind_comm;
+
+ case 0x1A: // LD A,(DE)
+ temp = rp.de;
+ goto ld_a_ind_comm;
+
+ case 0x2A: // LD A,(HL+) (common)
+ temp = rp.hl;
+ rp.hl = temp + 1;
+ goto ld_a_ind_comm;
+
+ case 0xFA: // LD A,IND16 (common)
+ temp = GET_ADDR();
+ pc += 2;
+ ld_a_ind_comm:
+ READ_FAST( temp, rg.a );
+ goto loop;
+ }
+
+ {
+ int temp;
+ case 0xBE: // CP (HL)
+ temp = READ_MEM( rp.hl );
+ goto cmp_comm;
+
+ case 0xB8: // CP B
+ case 0xB9: // CP C
+ case 0xBA: // CP D
+ case 0xBB: // CP E
+ case 0xBC: // CP H
+ case 0xBD: // CP L
+ case 0xBF: // CP A
+ temp = R8( op & 7 );
+ cmp_comm:
+ ph = rg.a ^ temp; // N=1 H=*
+ cz = rg.a - temp; // C=* Z=*
+ goto loop;
+ }
+
+ case 0xFE: // CP IMM
+ pc++;
+ ph = rg.a ^ data; // N=1 H=*
+ cz = rg.a - data; // C=* Z=*
+ goto loop;
+
+ case 0x46: // LD B,(HL)
+ case 0x4E: // LD C,(HL)
+ case 0x56: // LD D,(HL)
+ case 0x5E: // LD E,(HL)
+ case 0x66: // LD H,(HL)
+ case 0x6E: // LD L,(HL)
+ case 0x7E:{// LD A,(HL)
+ int addr = rp.hl;
+ READ_FAST( addr, R8( op >> 3 & 7 ) );
+ goto loop;
+ }
+
+ case 0xC4: // CNZ (next-most-common)
+ pc += 2;
+ if ( CC_Z() )
+ goto loop;
+ call:
+ time += 12;
+ pc -= 2;
+ case 0xCD: // CALL (most-common)
+ data = pc + 2;
+ pc = GET_ADDR();
+ push: {
+ int addr = WORD( sp - 1 );
+ WRITE_MEM( addr, (data >> 8) );
+ sp = WORD( sp - 2 );
+ WRITE_MEM( sp, data );
+ goto loop;
+ }
+
+ case 0xC8: // RET Z (next-most-common)
+ if ( CC_NZ() )
+ goto loop;
+ ret:
+ time += 12;
+ case 0xD9: // RETI
+ case 0xC9:{// RET (most common)
+ pc = READ_MEM( sp );
+ int addr = sp + 1;
+ sp = WORD( sp + 2 );
+ pc += 0x100 * READ_MEM( addr );
+ goto loop;
+ }
+
+ case 0x00: // NOP
+ case 0x40: // LD B,B
+ case 0x49: // LD C,C
+ case 0x52: // LD D,D
+ case 0x5B: // LD E,E
+ case 0x64: // LD H,H
+ case 0x6D: // LD L,L
+ case 0x7F: // LD A,A
+ goto loop;
+
+// CB Instructions
+
+ case 0xCB:
+ time += (instr_times + 256) [data];
+ pc++;
+ // now data is the opcode
+ switch ( data ) {
+
+ case 0x46: // BIT b,(HL)
+ case 0x4E:
+ case 0x56:
+ case 0x5E:
+ case 0x66:
+ case 0x6E:
+ case 0x76:
+ case 0x7E: {
+ int addr = rp.hl;
+ READ_FAST( addr, op );
+ goto bit_comm;
+ }
+
+ case 0x40: case 0x41: case 0x42: case 0x43: // BIT b,r
+ case 0x44: case 0x45: case 0x47: case 0x48:
+ case 0x49: case 0x4A: case 0x4B: case 0x4C:
+ case 0x4D: case 0x4F: case 0x50: case 0x51:
+ case 0x52: case 0x53: case 0x54: case 0x55:
+ case 0x57: case 0x58: case 0x59: case 0x5A:
+ case 0x5B: case 0x5C: case 0x5D: case 0x5F:
+ case 0x60: case 0x61: case 0x62: case 0x63:
+ case 0x64: case 0x65: case 0x67: case 0x68:
+ case 0x69: case 0x6A: case 0x6B: case 0x6C:
+ case 0x6D: case 0x6F: case 0x70: case 0x71:
+ case 0x72: case 0x73: case 0x74: case 0x75:
+ case 0x77: case 0x78: case 0x79: case 0x7A:
+ case 0x7B: case 0x7C: case 0x7D: case 0x7F:
+ op = R8( data & 7 );
+ bit_comm:
+ ph = op >> (data >> 3 & 7) & 1;
+ cz = (cz & 0x100) + ph;
+ ph ^= 0x110; // N=0 H=1
+ goto loop;
+
+ case 0x86: // RES b,(HL)
+ case 0x8E:
+ case 0x96:
+ case 0x9E:
+ case 0xA6:
+ case 0xAE:
+ case 0xB6:
+ case 0xBE: {
+ int temp = READ_MEM( rp.hl );
+ temp &= ~(1 << (data >> 3 & 7));
+ WRITE_MEM( rp.hl, temp );
+ goto loop;
+ }
+
+ case 0xC6: // SET b,(HL)
+ case 0xCE:
+ case 0xD6:
+ case 0xDE:
+ case 0xE6:
+ case 0xEE:
+ case 0xF6:
+ case 0xFE: {
+ int temp = READ_MEM( rp.hl );
+ temp |= 1 << (data >> 3 & 7);
+ WRITE_MEM( rp.hl, temp );
+ goto loop;
+ }
+
+ case 0xC0: case 0xC1: case 0xC2: case 0xC3: // SET b,r
+ case 0xC4: case 0xC5: case 0xC7: case 0xC8:
+ case 0xC9: case 0xCA: case 0xCB: case 0xCC:
+ case 0xCD: case 0xCF: case 0xD0: case 0xD1:
+ case 0xD2: case 0xD3: case 0xD4: case 0xD5:
+ case 0xD7: case 0xD8: case 0xD9: case 0xDA:
+ case 0xDB: case 0xDC: case 0xDD: case 0xDF:
+ case 0xE0: case 0xE1: case 0xE2: case 0xE3:
+ case 0xE4: case 0xE5: case 0xE7: case 0xE8:
+ case 0xE9: case 0xEA: case 0xEB: case 0xEC:
+ case 0xED: case 0xEF: case 0xF0: case 0xF1:
+ case 0xF2: case 0xF3: case 0xF4: case 0xF5:
+ case 0xF7: case 0xF8: case 0xF9: case 0xFA:
+ case 0xFB: case 0xFC: case 0xFD: case 0xFF:
+ R8( data & 7 ) |= 1 << (data >> 3 & 7);
+ goto loop;
+
+ case 0x80: case 0x81: case 0x82: case 0x83: // RES b,r
+ case 0x84: case 0x85: case 0x87: case 0x88:
+ case 0x89: case 0x8A: case 0x8B: case 0x8C:
+ case 0x8D: case 0x8F: case 0x90: case 0x91:
+ case 0x92: case 0x93: case 0x94: case 0x95:
+ case 0x97: case 0x98: case 0x99: case 0x9A:
+ case 0x9B: case 0x9C: case 0x9D: case 0x9F:
+ case 0xA0: case 0xA1: case 0xA2: case 0xA3:
+ case 0xA4: case 0xA5: case 0xA7: case 0xA8:
+ case 0xA9: case 0xAA: case 0xAB: case 0xAC:
+ case 0xAD: case 0xAF: case 0xB0: case 0xB1:
+ case 0xB2: case 0xB3: case 0xB4: case 0xB5:
+ case 0xB7: case 0xB8: case 0xB9: case 0xBA:
+ case 0xBB: case 0xBC: case 0xBD: case 0xBF:
+ R8( data & 7 ) &= ~(1 << (data >> 3 & 7));
+ goto loop;
+
+ case 0x36: // SWAP (HL)
+ op = READ_MEM( rp.hl );
+ goto swap_comm;
+
+ case 0x30: // SWAP B
+ case 0x31: // SWAP C
+ case 0x32: // SWAP D
+ case 0x33: // SWAP E
+ case 0x34: // SWAP H
+ case 0x35: // SWAP L
+ case 0x37: // SWAP A
+ op = R8( data & 7 );
+ swap_comm:
+ op = (op >> 4) + (op << 4);
+ cz = BYTE( op );
+ ph = cz + 0x100;
+ if ( data == 0x36 )
+ goto write_hl_op_ff;
+ R8( data & 7 ) = op;
+ goto loop;
+
+// Shift/Rotate
+
+ case 0x26: // SLA (HL)
+ cz = 0;
+ case 0x16: // RL (HL)
+ cz = (cz >> 8 & 1) + (READ_MEM( rp.hl ) << 1);
+ goto rl_hl_common;
+
+ case 0x06: // RLC (HL)
+ cz = READ_MEM( rp.hl );
+ cz = (cz << 1) + (cz >> 7 & 1);
+ rl_hl_common:
+ // Z=* C=*
+ ph = cz | 0x100; // N=0 H=0
+ WRITE_MEM( rp.hl, cz );
+ goto loop;
+
+ case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x27: // SLA r
+ cz = 0;
+ case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x17: // RL r
+ cz = (cz >> 8 & 1) + (R8( data & 7 ) << 1);
+ goto rl_common;
+
+ case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x07: // RLC r
+ cz = R8( data & 7 );
+ cz = (cz << 1) + (cz >> 7 & 1);
+ rl_common:
+ // Z=* C=*
+ ph = cz | 0x100; // N=0 H=0
+ R8( data & 7 ) = cz;
+ goto loop;
+
+ case 0x0E: // RRC (HL)
+ cz = READ_MEM( rp.hl );
+ cz += cz << 8 & 0x100;
+ goto rr_hl_common;
+
+ case 0x2E: // SRA (HL)
+ cz = READ_MEM( rp.hl );
+ cz += cz << 1 & 0x100;
+ goto rr_hl_common;
+
+ case 0x3E: // SRL (HL)
+ cz = 0;
+ case 0x1E: // RR (HL)
+ cz = (cz & 0x100) + READ_MEM( rp.hl );
+ rr_hl_common:
+ cz = (cz << 8) + (cz >> 1); // Z=* C=*
+ ph = cz | 0x100; // N=0 H=0
+ WRITE_MEM( rp.hl, cz );
+ goto loop;
+
+ case 0x08: case 0x09: case 0x0A: case 0x0B: case 0x0C: case 0x0D: case 0x0F: // RRC r
+ cz = R8( data & 7 );
+ cz += cz << 8 & 0x100;
+ goto rr_common;
+
+ case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2F: // SRA r
+ cz = R8( data & 7 );
+ cz += cz << 1 & 0x100;
+ goto rr_common;
+
+ case 0x38: case 0x39: case 0x3A: case 0x3B: case 0x3C: case 0x3D: case 0x3F: // SRL r
+ cz = 0;
+ case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1F: // RR r
+ cz = (cz & 0x100) + R8( data & 7 );
+ rr_common:
+ cz = (cz << 8) + (cz >> 1); // Z=* C=*
+ ph = cz | 0x100; // N=0 H=0
+ R8( data & 7 ) = cz;
+ goto loop;
+
+ } // CB op
+ assert( false ); // unhandled CB op
+
+ case 0x07: // RLCA
+ cz = rg.a >> 7;
+ goto rlc_common;
+ case 0x17: // RLA
+ cz = cz >> 8 & 1;
+ rlc_common:
+ cz += rg.a << 1;
+ ph = cz | 0x100;
+ rg.a = BYTE( cz );
+ cz |= 1;
+ goto loop;
+
+ case 0x0F: // RRCA
+ ph = rg.a << 8;
+ goto rrc_common;
+ case 0x1F: // RRA
+ ph = cz;
+ rrc_common:
+ cz = (rg.a << 8) + 1; // Z=0 C=*
+ rg.a = ((ph & 0x100) + rg.a) >> 1;
+ ph = 0x100; // N=0 H=0
+ goto loop;
+
+// Load
+
+ case 0x70: // LD (HL),B
+ case 0x71: // LD (HL),C
+ case 0x72: // LD (HL),D
+ case 0x73: // LD (HL),E
+ case 0x74: // LD (HL),H
+ case 0x75: // LD (HL),L
+ case 0x77: // LD (HL),A
+ op = R8( op & 7 );
+ write_hl_op_ff:
+ WRITE_MEM( rp.hl, op );
+ goto loop;
+
+ case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x47: // LD r,r
+ case 0x48: case 0x4A: case 0x4B: case 0x4C: case 0x4D: case 0x4F:
+ case 0x50: case 0x51: case 0x53: case 0x54: case 0x55: case 0x57:
+ case 0x58: case 0x59: case 0x5A: case 0x5C: case 0x5D: case 0x5F:
+ case 0x60: case 0x61: case 0x62: case 0x63: case 0x65: case 0x67:
+ case 0x68: case 0x69: case 0x6A: case 0x6B: case 0x6C: case 0x6F:
+ case 0x78: case 0x79: case 0x7A: case 0x7B: case 0x7C: case 0x7D:
+ R8( op >> 3 & 7 ) = R8( op & 7 );
+ goto loop;
+
+ case 0x08: // LD IND16,SP
+ data = GET_ADDR();
+ pc += 2;
+ WRITE_MEM( data, sp );
+ data++;
+ WRITE_MEM( data, (sp >> 8) );
+ goto loop;
+
+ case 0xF9: // LD SP,HL
+ sp = rp.hl;
+ goto loop;
+
+ case 0x31: // LD SP,IMM
+ sp = GET_ADDR();
+ pc += 2;
+ goto loop;
+
+ case 0x01: // LD BC,IMM
+ case 0x11: // LD DE,IMM
+ r16 [(unsigned) op >> 4] = GET_ADDR();
+ pc += 2;
+ goto loop;
+
+ case 0xE2: // LD (0xFF00+C),A
+ WRITE_IO( rg.c, rg.a );
+ goto loop;
+
+ case 0xE0: // LD (0xFF00+imm),A
+ pc++;
+ WRITE_IO( data, rg.a );
+ goto loop;
+
+ {
+ int temp;
+ case 0x32: // LD (HL-),A
+ temp = rp.hl;
+ rp.hl = temp - 1;
+ goto write_data_rg_a;
+
+ case 0x02: // LD (BC),A
+ temp = rp.bc;
+ goto write_data_rg_a;
+
+ case 0x12: // LD (DE),A
+ temp = rp.de;
+ goto write_data_rg_a;
+
+ case 0x22: // LD (HL+),A
+ temp = rp.hl;
+ rp.hl = temp + 1;
+ goto write_data_rg_a;
+
+ case 0xEA: // LD IND16,A (common)
+ temp = GET_ADDR();
+ pc += 2;
+ write_data_rg_a:
+ WRITE_MEM( temp, rg.a );
+ goto loop;
+ }
+
+ case 0x06: // LD B,IMM
+ rg.b = data;
+ pc++;
+ goto loop;
+
+ case 0x0E: // LD C,IMM
+ rg.c = data;
+ pc++;
+ goto loop;
+
+ case 0x16: // LD D,IMM
+ rg.d = data;
+ pc++;
+ goto loop;
+
+ case 0x1E: // LD E,IMM
+ rg.e = data;
+ pc++;
+ goto loop;
+
+ case 0x26: // LD H,IMM
+ rg.h = data;
+ pc++;
+ goto loop;
+
+ case 0x2E: // LD L,IMM
+ rg.l = data;
+ pc++;
+ goto loop;
+
+ case 0x36: // LD (HL),IMM
+ WRITE_MEM( rp.hl, data );
+ pc++;
+ goto loop;
+
+ case 0x3E: // LD A,IMM
+ rg.a = data;
+ pc++;
+ goto loop;
+
+// Increment/decrement
+
+ case 0x03: // INC BC
+ case 0x13: // INC DE
+ case 0x23: // INC HL
+ r16 [(unsigned) op >> 4]++;
+ goto loop;
+
+ case 0x33: // INC SP
+ sp = WORD( sp + 1 );
+ goto loop;
+
+ case 0x0B: // DEC BC
+ case 0x1B: // DEC DE
+ case 0x2B: // DEC HL
+ r16 [(unsigned) op >> 4]--;
+ goto loop;
+
+ case 0x3B: // DEC SP
+ sp = WORD( sp - 1 );
+ goto loop;
+
+ case 0x34: // INC (HL)
+ op = rp.hl;
+ data = READ_MEM( op );
+ data++;
+ WRITE_MEM( op, data );
+ goto inc_comm;
+
+ case 0x04: // INC B
+ case 0x0C: // INC C (common)
+ case 0x14: // INC D
+ case 0x1C: // INC E
+ case 0x24: // INC H
+ case 0x2C: // INC L
+ case 0x3C: // INC A
+ op = op >> 3 & 7;
+ data = R8( op ) + 1;
+ R8( op ) = data;
+ inc_comm:
+ ph = data - 0x101; // N=0 H=*
+ cz = (cz & 0x100) + BYTE( data ); // C=- Z=*
+ goto loop;
+
+ case 0x35: // DEC (HL)
+ op = rp.hl;
+ data = READ_MEM( op );
+ data--;
+ WRITE_MEM( op, data );
+ goto dec_comm;
+
+ case 0x05: // DEC B
+ case 0x0D: // DEC C
+ case 0x15: // DEC D
+ case 0x1D: // DEC E
+ case 0x25: // DEC H
+ case 0x2D: // DEC L
+ case 0x3D: // DEC A
+ op = op >> 3 & 7;
+ data = R8( op ) - 1;
+ R8( op ) = data;
+ dec_comm:
+ ph = data + 1; // N=1 H=*
+ cz = (cz & 0x100) + BYTE( data ); // C=- Z=*
+ goto loop;
+
+// Add 16-bit
+
+ case 0xF8: // LD HL,SP+n
+ case 0xE8:{// ADD SP,n
+ pc++;
+ int t = WORD( sp + SBYTE( data ) );
+ cz = ((BYTE( sp ) + data) & 0x100) + 1; // Z=0 C=*
+ ph = (sp ^ data ^ t) | 0x100; // N=0 H=*
+ if ( op == 0xF8 )
+ {
+ rp.hl = t;
+ goto loop;
+ }
+ sp = t;
+ goto loop;
+ }
+
+ case 0x39: // ADD HL,SP
+ data = sp;
+ goto add_hl_comm;
+
+ case 0x09: // ADD HL,BC
+ case 0x19: // ADD HL,DE
+ case 0x29: // ADD HL,HL
+ data = r16 [(unsigned) op >> 4];
+ add_hl_comm:
+ ph = rp.hl ^ data;
+ data += rp.hl;
+ rp.hl = WORD( data );
+ ph ^= data;
+ cz = BYTE( cz ) + (data >> 8 & 0x100); // C=* Z=-
+ ph = ((ph >> 8) ^ cz) | 0x100; // N=0 H=*
+ goto loop;
+
+ case 0x86: // ADD (HL)
+ data = READ_MEM( rp.hl );
+ goto add_comm;
+
+ case 0x80: // ADD B
+ case 0x81: // ADD C
+ case 0x82: // ADD D
+ case 0x83: // ADD E
+ case 0x84: // ADD H
+ case 0x85: // ADD L
+ case 0x87: // ADD A
+ data = R8( op & 7 );
+ goto add_comm;
+
+ case 0xC6: // ADD IMM
+ pc++;
+ add_comm:
+ ph = (rg.a ^ data) | 0x100; // N=1 H=*
+ cz = rg.a + data; // C=* Z=*
+ rg.a = cz;
+ goto loop;
+
+// Add/Subtract
+
+ case 0x8E: // ADC (HL)
+ data = READ_MEM( rp.hl );
+ goto adc_comm;
+
+ case 0x88: // ADC B
+ case 0x89: // ADC C
+ case 0x8A: // ADC D
+ case 0x8B: // ADC E
+ case 0x8C: // ADC H
+ case 0x8D: // ADC L
+ case 0x8F: // ADC A
+ data = R8( op & 7 );
+ goto adc_comm;
+
+ case 0xCE: // ADC IMM
+ pc++;
+ adc_comm:
+ ph = (rg.a ^ data) | 0x100; // N=1 H=*
+ cz = rg.a + data + (cz >> 8 & 1); // C=* Z=*
+ rg.a = cz;
+ goto loop;
+
+ case 0x96: // SUB (HL)
+ data = READ_MEM( rp.hl );
+ goto sub_comm;
+
+ case 0x90: // SUB B
+ case 0x91: // SUB C
+ case 0x92: // SUB D
+ case 0x93: // SUB E
+ case 0x94: // SUB H
+ case 0x95: // SUB L
+ case 0x97: // SUB A
+ data = R8( op & 7 );
+ goto sub_comm;
+
+ case 0xD6: // SUB IMM
+ pc++;
+ sub_comm:
+ ph = rg.a ^ data; // N=1 H=*
+ cz = rg.a - data; // C=* Z=*
+ rg.a = cz;
+ goto loop;
+
+ case 0x9E: // SBC (HL)
+ data = READ_MEM( rp.hl );
+ goto sbc_comm;
+
+ case 0x98: // SBC B
+ case 0x99: // SBC C
+ case 0x9A: // SBC D
+ case 0x9B: // SBC E
+ case 0x9C: // SBC H
+ case 0x9D: // SBC L
+ case 0x9F: // SBC A
+ data = R8( op & 7 );
+ goto sbc_comm;
+
+ case 0xDE: // SBC IMM
+ pc++;
+ sbc_comm:
+ ph = rg.a ^ data; // N=1 H=*
+ cz = rg.a - data - (cz >> 8 & 1); // C=* Z=*
+ rg.a = cz;
+ goto loop;
+
+// Logical
+
+ case 0xA0: // AND B
+ case 0xA1: // AND C
+ case 0xA2: // AND D
+ case 0xA3: // AND E
+ case 0xA4: // AND H
+ case 0xA5: // AND L
+ data = R8( op & 7 );
+ goto and_comm;
+
+ case 0xA6: // AND (HL)
+ data = READ_MEM( rp.hl );
+ goto and_comm;
+ case 0xE6: // AND IMM
+ pc++;
+ and_comm:
+ cz = rg.a & data; // C=0 Z=*
+ ph = ~cz; // N=0 H=1
+ rg.a = cz;
+ goto loop;
+
+ case 0xA7: // AND A
+ cz = rg.a; // C=0 Z=*
+ ph = ~rg.a; // N=0 H=1
+ goto loop;
+
+ case 0xB0: // OR B
+ case 0xB1: // OR C
+ case 0xB2: // OR D
+ case 0xB3: // OR E
+ case 0xB4: // OR H
+ case 0xB5: // OR L
+ data = R8( op & 7 );
+ goto or_comm;
+
+ case 0xB6: // OR (HL)
+ data = READ_MEM( rp.hl );
+ goto or_comm;
+ case 0xF6: // OR IMM
+ pc++;
+ or_comm:
+ cz = rg.a | data; // C=0 Z=*
+ ph = cz | 0x100; // N=0 H=0
+ rg.a = cz;
+ goto loop;
+
+ case 0xB7: // OR A
+ cz = rg.a; // C=0 Z=*
+ ph = rg.a + 0x100; // N=0 H=0
+ goto loop;
+
+ case 0xA8: // XOR B
+ case 0xA9: // XOR C
+ case 0xAA: // XOR D
+ case 0xAB: // XOR E
+ case 0xAC: // XOR H
+ case 0xAD: // XOR L
+ data = R8( op & 7 );
+ goto xor_comm;
+
+ case 0xAE: // XOR (HL)
+ data = READ_MEM( rp.hl );
+ pc--;
+ case 0xEE: // XOR IMM
+ pc++;
+ xor_comm:
+ cz = rg.a ^ data; // C=0 Z=*
+ ph = cz + 0x100; // N=0 H=0
+ rg.a = cz;
+ goto loop;
+
+ case 0xAF: // XOR A
+ rg.a = 0;
+ cz = 0; // C=0 Z=*
+ ph = 0x100; // N=0 H=0
+ goto loop;
+
+// Stack
+
+ case 0xF1: // POP AF
+ case 0xC1: // POP BC
+ case 0xD1: // POP DE
+ case 0xE1: // POP HL (common)
+ data = READ_MEM( sp );
+ r16 [op >> 4 & 3] = data + 0x100 * READ_MEM( (sp + 1) );
+ sp = WORD( sp + 2 );
+ if ( op != 0xF1 )
+ goto loop;
+
+ SET_FLAGS( rg.a );
+ rg.a = rg.flags;
+ goto loop;
+
+ case 0xC5: // PUSH BC
+ data = rp.bc;
+ goto push;
+
+ case 0xD5: // PUSH DE
+ data = rp.de;
+ goto push;
+
+ case 0xE5: // PUSH HL
+ data = rp.hl;
+ goto push;
+
+ case 0xF5: // PUSH AF
+ GET_FLAGS( data );
+ data += rg.a << 8;
+ goto push;
+
+// Flow control
+
+ case 0xFF: case 0xC7: case 0xCF: case 0xD7: // RST
+ case 0xDF: case 0xE7: case 0xEF: case 0xF7:
+ data = pc;
+ pc = (op & 0x38) + CPU.rst_base;
+ goto push;
+
+ case 0xCC: // CALL Z
+ pc += 2;
+ if ( CC_Z() )
+ goto call;
+ goto loop;
+
+ case 0xD4: // CALL NC
+ pc += 2;
+ if ( CC_NC() )
+ goto call;
+ goto loop;
+
+ case 0xDC: // CALL C
+ pc += 2;
+ if ( CC_C() )
+ goto call;
+ goto loop;
+
+ case 0xC0: // RET NZ
+ if ( CC_NZ() )
+ goto ret;
+ goto loop;
+
+ case 0xD0: // RET NC
+ if ( CC_NC() )
+ goto ret;
+ goto loop;
+
+ case 0xD8: // RET C
+ if ( CC_C() )
+ goto ret;
+ goto loop;
+
+ case 0x18: // JR
+ BRANCH_( true, 0 )
+
+ case 0x30: // JR NC
+ BRANCH( CC_NC() )
+
+ case 0x38: // JR C
+ BRANCH( CC_C() )
+
+ case 0xE9: // LD PC,HL
+ pc = rp.hl;
+ goto loop;
+
+ case 0xC3: // JP (next-most-common)
+ pc = GET_ADDR();
+ goto loop;
+
+ case 0xC2: // JP NZ
+ pc += 2;
+ if ( CC_NZ() )
+ goto jp_taken;
+ time -= 4;
+ goto loop;
+
+ case 0xCA: // JP Z (most common)
+ pc += 2;
+ if ( CC_Z() )
+ goto jp_taken;
+ time -= 4;
+ goto loop;
+
+ jp_taken:
+ pc -= 2;
+ pc = GET_ADDR();
+ goto loop;
+
+ case 0xD2: // JP NC
+ pc += 2;
+ if ( CC_NC() )
+ goto jp_taken;
+ time -= 4;
+ goto loop;
+
+ case 0xDA: // JP C
+ pc += 2;
+ if ( CC_C() )
+ goto jp_taken;
+ time -= 4;
+ goto loop;
+
+// Flags
+
+ case 0x2F: // CPL
+ rg.a = ~rg.a;
+ ph = BYTE( ~cz ); // N=1 H=1
+ goto loop;
+
+ case 0x3F: // CCF
+ ph = cz | 0x100; // N=0 H=0
+ cz ^= 0x100; // C=* Z=-
+ goto loop;
+
+ case 0x37: // SCF
+ ph = cz | 0x100; // N=0 H=0
+ cz |= 0x100; // C=1 Z=-
+ goto loop;
+
+ case 0xF3: // DI
+ goto loop;
+
+ case 0xFB: // EI
+ goto loop;
+
+ case 0x27:{// DAA
+ unsigned a = rg.a;
+ int h = ph ^ cz;
+ if ( ph & 0x100 )
+ {
+ if ( (h & 0x10) || (a & 0x0F) > 9 )
+ a += 6;
+
+ if ( (cz & 0x100) || a > 0x9F )
+ a += 0x60;
+ }
+ else
+ {
+ if ( h & 0x10 )
+ a = (a - 6) & 0xFF;
+
+ if ( cz & 0x100 )
+ a -= 0x60;
+ }
+ cz = (cz & 0x100) | a; // C=- Z=*
+ rg.a = a;
+ ph = (ph & 0x100) + BYTE( a ); // N=- H=0
+ goto loop;
+ }
+
+// Special
+
+ case 0x76: // HALT
+ case 0x10: // STOP
+ case 0xD3: case 0xDB: case 0xDD: // Illegal
+ case 0xE3: case 0xE4: case 0xEB: case 0xEC: case 0xED: // (all freeze CPU)
+ case 0xF4: case 0xFC: case 0xFD:
+ goto stop;
+ }
+
+ // If this fails then an opcode isn't handled above
+ assert( false );
+
+stop:
+ pc--;
+
+ // copy state back
+ CPU.cpu_state_.time = time;
+ CPU.r.pc = pc;
+ CPU.r.sp = sp;
+ {
+ int t;
+ GET_FLAGS( t );
+ rg.flags = t;
+ }
+ CPU.cpu_state = &CPU.cpu_state_;
+ STATIC_CAST(Gb_Cpu::core_regs_t&,CPU.r) = rp;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.cpp
new file mode 100644
index 00000000..b3a8a6ed
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.cpp
@@ -0,0 +1,712 @@
+// Gb_Snd_Emu 0.1.4. http://www.slack.net/~ant/
+
+#include "Gb_Apu.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+bool const cgb_02 = false; // enables bug in early CGB units that causes problems in some games
+bool const cgb_05 = false; // enables CGB-05 zombie behavior
+
+int const trigger_mask = 0x80;
+int const length_enabled = 0x40;
+
+void Gb_Osc::reset()
+{
+ output = NULL;
+ last_amp = 0;
+ delay = 0;
+ phase = 0;
+ enabled = false;
+}
+
+inline void Gb_Osc::update_amp( blip_time_t time, int new_amp )
+{
+ output->set_modified();
+ int delta = new_amp - last_amp;
+ if ( delta )
+ {
+ last_amp = new_amp;
+ fast_synth->offset( time, delta, output );
+ }
+}
+
+// Units
+
+void Gb_Osc::clock_length()
+{
+ if ( (regs [4] & length_enabled) && length_ctr )
+ {
+ if ( --length_ctr <= 0 )
+ enabled = false;
+ }
+}
+
+inline int Gb_Env::reload_env_timer()
+{
+ int raw = regs [2] & 7;
+ env_delay = (raw ? raw : 8);
+ return raw;
+}
+
+void Gb_Env::clock_envelope()
+{
+ if ( env_enabled && --env_delay <= 0 && reload_env_timer() )
+ {
+ int v = volume + (regs [2] & 0x08 ? +1 : -1);
+ if ( 0 <= v && v <= 15 )
+ volume = v;
+ else
+ env_enabled = false;
+ }
+}
+
+inline void Gb_Sweep_Square::reload_sweep_timer()
+{
+ sweep_delay = (regs [0] & period_mask) >> 4;
+ if ( !sweep_delay )
+ sweep_delay = 8;
+}
+
+void Gb_Sweep_Square::calc_sweep( bool update )
+{
+ int const shift = regs [0] & shift_mask;
+ int const delta = sweep_freq >> shift;
+ sweep_neg = (regs [0] & 0x08) != 0;
+ int const freq = sweep_freq + (sweep_neg ? -delta : delta);
+
+ if ( freq > 0x7FF )
+ {
+ enabled = false;
+ }
+ else if ( shift && update )
+ {
+ sweep_freq = freq;
+
+ regs [3] = freq & 0xFF;
+ regs [4] = (regs [4] & ~0x07) | (freq >> 8 & 0x07);
+ }
+}
+
+void Gb_Sweep_Square::clock_sweep()
+{
+ if ( --sweep_delay <= 0 )
+ {
+ reload_sweep_timer();
+ if ( sweep_enabled && (regs [0] & period_mask) )
+ {
+ calc_sweep( true );
+ calc_sweep( false );
+ }
+ }
+}
+
+int Gb_Wave::access( int addr ) const
+{
+ if ( enabled )
+ {
+ addr = phase & (bank_size - 1);
+ if ( mode == Gb_Apu::mode_dmg )
+ {
+ addr++;
+ if ( delay > clk_mul )
+ return -1; // can only access within narrow time window while playing
+ }
+ addr >>= 1;
+ }
+ return addr & 0x0F;
+}
+
+// write_register
+
+int Gb_Osc::write_trig( int frame_phase, int max_len, int old_data )
+{
+ int data = regs [4];
+
+ if ( (frame_phase & 1) && !(old_data & length_enabled) && length_ctr )
+ {
+ if ( (data & length_enabled) || cgb_02 )
+ length_ctr--;
+ }
+
+ if ( data & trigger_mask )
+ {
+ enabled = true;
+ if ( !length_ctr )
+ {
+ length_ctr = max_len;
+ if ( (frame_phase & 1) && (data & length_enabled) )
+ length_ctr--;
+ }
+ }
+
+ if ( !length_ctr )
+ enabled = false;
+
+ return data & trigger_mask;
+}
+
+inline void Gb_Env::zombie_volume( int old, int data )
+{
+ int v = volume;
+ if ( mode == Gb_Apu::mode_agb || cgb_05 )
+ {
+ // CGB-05 behavior, very close to AGB behavior as well
+ if ( (old ^ data) & 8 )
+ {
+ if ( !(old & 8) )
+ {
+ v++;
+ if ( old & 7 )
+ v++;
+ }
+
+ v = 16 - v;
+ }
+ else if ( (old & 0x0F) == 8 )
+ {
+ v++;
+ }
+ }
+ else
+ {
+ // CGB-04&02 behavior, very close to MGB behavior as well
+ if ( !(old & 7) && env_enabled )
+ v++;
+ else if ( !(old & 8) )
+ v += 2;
+
+ if ( (old ^ data) & 8 )
+ v = 16 - v;
+ }
+ volume = v & 0x0F;
+}
+
+bool Gb_Env::write_register( int frame_phase, int reg, int old, int data )
+{
+ int const max_len = 64;
+
+ switch ( reg )
+ {
+ case 1:
+ length_ctr = max_len - (data & (max_len - 1));
+ break;
+
+ case 2:
+ if ( !dac_enabled() )
+ enabled = false;
+
+ zombie_volume( old, data );
+
+ if ( (data & 7) && env_delay == 8 )
+ {
+ env_delay = 1;
+ clock_envelope(); // TODO: really happens at next length clock
+ }
+ break;
+
+ case 4:
+ if ( write_trig( frame_phase, max_len, old ) )
+ {
+ volume = regs [2] >> 4;
+ reload_env_timer();
+ env_enabled = true;
+ if ( frame_phase == 7 )
+ env_delay++;
+ if ( !dac_enabled() )
+ enabled = false;
+ return true;
+ }
+ }
+ return false;
+}
+
+bool Gb_Square::write_register( int frame_phase, int reg, int old_data, int data )
+{
+ bool result = Gb_Env::write_register( frame_phase, reg, old_data, data );
+ if ( result )
+ delay = (delay & (4 * clk_mul - 1)) + period();
+ return result;
+}
+
+inline void Gb_Noise::write_register( int frame_phase, int reg, int old_data, int data )
+{
+ if ( Gb_Env::write_register( frame_phase, reg, old_data, data ) )
+ {
+ phase = 0x7FFF;
+ delay += 8 * clk_mul;
+ }
+}
+
+inline void Gb_Sweep_Square::write_register( int frame_phase, int reg, int old_data, int data )
+{
+ if ( reg == 0 && sweep_enabled && sweep_neg && !(data & 0x08) )
+ enabled = false; // sweep negate disabled after used
+
+ if ( Gb_Square::write_register( frame_phase, reg, old_data, data ) )
+ {
+ sweep_freq = frequency();
+ sweep_neg = false;
+ reload_sweep_timer();
+ sweep_enabled = (regs [0] & (period_mask | shift_mask)) != 0;
+ if ( regs [0] & shift_mask )
+ calc_sweep( false );
+ }
+}
+
+void Gb_Wave::corrupt_wave()
+{
+ int pos = ((phase + 1) & (bank_size - 1)) >> 1;
+ if ( pos < 4 )
+ wave_ram [0] = wave_ram [pos];
+ else
+ for ( int i = 4; --i >= 0; )
+ wave_ram [i] = wave_ram [(pos & ~3) + i];
+}
+
+inline void Gb_Wave::write_register( int frame_phase, int reg, int old_data, int data )
+{
+ int const max_len = 256;
+
+ switch ( reg )
+ {
+ case 0:
+ if ( !dac_enabled() )
+ enabled = false;
+ break;
+
+ case 1:
+ length_ctr = max_len - data;
+ break;
+
+ case 4:
+ bool was_enabled = enabled;
+ if ( write_trig( frame_phase, max_len, old_data ) )
+ {
+ if ( !dac_enabled() )
+ enabled = false;
+ else if ( mode == Gb_Apu::mode_dmg && was_enabled &&
+ (unsigned) (delay - 2 * clk_mul) < 2 * clk_mul )
+ corrupt_wave();
+
+ phase = 0;
+ delay = period() + 6 * clk_mul;
+ }
+ }
+}
+
+void Gb_Apu::write_osc( int reg, int old_data, int data )
+{
+ int index = (reg * 3 + 3) >> 4; // avoids divide
+ assert( index == reg / 5 );
+ reg -= index * 5;
+ switch ( index )
+ {
+ case 0: square1.write_register( frame_phase, reg, old_data, data ); break;
+ case 1: square2.write_register( frame_phase, reg, old_data, data ); break;
+ case 2: wave .write_register( frame_phase, reg, old_data, data ); break;
+ case 3: noise .write_register( frame_phase, reg, old_data, data ); break;
+ }
+}
+
+// Synthesis
+
+void Gb_Square::run( blip_time_t time, blip_time_t end_time )
+{
+ // Calc duty and phase
+ static byte const duty_offsets [4] = { 1, 1, 3, 7 };
+ static byte const duties [4] = { 1, 2, 4, 6 };
+ int const duty_code = regs [1] >> 6;
+ int duty_offset = duty_offsets [duty_code];
+ int duty = duties [duty_code];
+ if ( mode == Gb_Apu::mode_agb )
+ {
+ // AGB uses inverted duty
+ duty_offset -= duty;
+ duty = 8 - duty;
+ }
+ int ph = (this->phase + duty_offset) & 7;
+
+ // Determine what will be generated
+ int vol = 0;
+ Blip_Buffer* const out = this->output;
+ if ( out )
+ {
+ int amp = dac_off_amp;
+ if ( dac_enabled() )
+ {
+ if ( enabled )
+ vol = this->volume;
+
+ amp = -dac_bias;
+ if ( mode == Gb_Apu::mode_agb )
+ amp = -(vol >> 1);
+
+ // Play inaudible frequencies as constant amplitude
+ if ( frequency() >= 0x7FA && delay < 32 * clk_mul )
+ {
+ amp += (vol * duty) >> 3;
+ vol = 0;
+ }
+
+ if ( ph < duty )
+ {
+ amp += vol;
+ vol = -vol;
+ }
+ }
+ update_amp( time, amp );
+ }
+
+ // Generate wave
+ time += delay;
+ if ( time < end_time )
+ {
+ int const per = this->period();
+ if ( !vol )
+ {
+ #if GB_APU_FAST
+ time = end_time;
+ #else
+ // Maintain phase when not playing
+ int count = (end_time - time + per - 1) / per;
+ ph += count; // will be masked below
+ time += (blip_time_t) count * per;
+ #endif
+ }
+ else
+ {
+ // Output amplitude transitions
+ int delta = vol;
+ do
+ {
+ ph = (ph + 1) & 7;
+ if ( ph == 0 || ph == duty )
+ {
+ norm_synth->offset_inline( time, delta, out );
+ delta = -delta;
+ }
+ time += per;
+ }
+ while ( time < end_time );
+
+ if ( delta != vol )
+ last_amp -= delta;
+ }
+ this->phase = (ph - duty_offset) & 7;
+ }
+ delay = time - end_time;
+}
+
+#if !GB_APU_FAST
+// Quickly runs LFSR for a large number of clocks. For use when noise is generating
+// no sound.
+static unsigned run_lfsr( unsigned s, unsigned mask, int count )
+{
+ bool const optimized = true; // set to false to use only unoptimized loop in middle
+
+ // optimization used in several places:
+ // ((s & (1 << b)) << n) ^ ((s & (1 << b)) << (n + 1)) = (s & (1 << b)) * (3 << n)
+
+ if ( mask == 0x4000 && optimized )
+ {
+ if ( count >= 32767 )
+ count %= 32767;
+
+ // Convert from Fibonacci to Galois configuration,
+ // shifted left 1 bit
+ s ^= (s & 1) * 0x8000;
+
+ // Each iteration is equivalent to clocking LFSR 255 times
+ while ( (count -= 255) > 0 )
+ s ^= ((s & 0xE) << 12) ^ ((s & 0xE) << 11) ^ (s >> 3);
+ count += 255;
+
+ // Each iteration is equivalent to clocking LFSR 15 times
+ // (interesting similarity to single clocking below)
+ while ( (count -= 15) > 0 )
+ s ^= ((s & 2) * (3 << 13)) ^ (s >> 1);
+ count += 15;
+
+ // Remaining singles
+ while ( --count >= 0 )
+ s = ((s & 2) * (3 << 13)) ^ (s >> 1);
+
+ // Convert back to Fibonacci configuration
+ s &= 0x7FFF;
+ }
+ else if ( count < 8 || !optimized )
+ {
+ // won't fully replace upper 8 bits, so have to do the unoptimized way
+ while ( --count >= 0 )
+ s = (s >> 1 | mask) ^ (mask & -((s - 1) & 2));
+ }
+ else
+ {
+ if ( count > 127 )
+ {
+ count %= 127;
+ if ( !count )
+ count = 127; // must run at least once
+ }
+
+ // Need to keep one extra bit of history
+ s = s << 1 & 0xFF;
+
+ // Convert from Fibonacci to Galois configuration,
+ // shifted left 2 bits
+ s ^= (s & 2) * 0x80;
+
+ // Each iteration is equivalent to clocking LFSR 7 times
+ // (interesting similarity to single clocking below)
+ while ( (count -= 7) > 0 )
+ s ^= ((s & 4) * (3 << 5)) ^ (s >> 1);
+ count += 7;
+
+ // Remaining singles
+ while ( --count >= 0 )
+ s = ((s & 4) * (3 << 5)) ^ (s >> 1);
+
+ // Convert back to Fibonacci configuration and
+ // repeat last 8 bits above significant 7
+ s = (s << 7 & 0x7F80) | (s >> 1 & 0x7F);
+ }
+
+ return s;
+}
+#endif
+
+void Gb_Noise::run( blip_time_t time, blip_time_t end_time )
+{
+ // Determine what will be generated
+ int vol = 0;
+ Blip_Buffer* const out = this->output;
+ if ( out )
+ {
+ int amp = dac_off_amp;
+ if ( dac_enabled() )
+ {
+ if ( enabled )
+ vol = this->volume;
+
+ amp = -dac_bias;
+ if ( mode == Gb_Apu::mode_agb )
+ amp = -(vol >> 1);
+
+ if ( !(phase & 1) )
+ {
+ amp += vol;
+ vol = -vol;
+ }
+ }
+
+ // AGB negates final output
+ if ( mode == Gb_Apu::mode_agb )
+ {
+ vol = -vol;
+ amp = -amp;
+ }
+
+ update_amp( time, amp );
+ }
+
+ // Run timer and calculate time of next LFSR clock
+ static byte const period1s [8] = { 1, 2, 4, 6, 8, 10, 12, 14 };
+ int const period1 = period1s [regs [3] & 7] * clk_mul;
+
+ #if GB_APU_FAST
+ time += delay;
+ #else
+ {
+ int extra = (end_time - time) - delay;
+ int const per2 = this->period2();
+ time += delay + ((divider ^ (per2 >> 1)) & (per2 - 1)) * period1;
+
+ int count = (extra < 0 ? 0 : (extra + period1 - 1) / period1);
+ divider = (divider - count) & period2_mask;
+ delay = count * period1 - extra;
+ }
+ #endif
+
+ // Generate wave
+ if ( time < end_time )
+ {
+ unsigned const mask = this->lfsr_mask();
+ unsigned bits = this->phase;
+
+ int per = period2( period1 * 8 );
+ #if GB_APU_FAST
+ // Noise can be THE biggest time hog; adjust as necessary
+ int const min_period = 24;
+ if ( per < min_period )
+ per = min_period;
+ #endif
+ if ( period2_index() >= 0xE )
+ {
+ time = end_time;
+ }
+ else if ( !vol )
+ {
+ #if GB_APU_FAST
+ time = end_time;
+ #else
+ // Maintain phase when not playing
+ int count = (end_time - time + per - 1) / per;
+ time += (blip_time_t) count * per;
+ bits = run_lfsr( bits, ~mask, count );
+ #endif
+ }
+ else
+ {
+ Blip_Synth_Fast const* const synth = fast_synth; // cache
+
+ // Output amplitude transitions
+ int delta = -vol;
+ do
+ {
+ unsigned changed = bits + 1;
+ bits = bits >> 1 & mask;
+ if ( changed & 2 )
+ {
+ bits |= ~mask;
+ delta = -delta;
+ synth->offset_inline( time, delta, out );
+ }
+ time += per;
+ }
+ while ( time < end_time );
+
+ if ( delta == vol )
+ last_amp += delta;
+ }
+ this->phase = bits;
+ }
+
+ #if GB_APU_FAST
+ delay = time - end_time;
+ #endif
+}
+
+void Gb_Wave::run( blip_time_t time, blip_time_t end_time )
+{
+ // Calc volume
+#if GB_APU_NO_AGB
+ static byte const shifts [4] = { 4+4, 0+4, 1+4, 2+4 };
+ int const volume_idx = regs [2] >> 5 & 3;
+ int const volume_shift = shifts [volume_idx];
+ int const volume_mul = 1;
+#else
+ static byte const volumes [8] = { 0, 4, 2, 1, 3, 3, 3, 3 };
+ int const volume_shift = 2 + 4;
+ int const volume_idx = regs [2] >> 5 & (agb_mask | 3); // 2 bits on DMG/CGB, 3 on AGB
+ int const volume_mul = volumes [volume_idx];
+#endif
+
+ // Determine what will be generated
+ int playing = false;
+ Blip_Buffer* const out = this->output;
+ if ( out )
+ {
+ int amp = dac_off_amp;
+ if ( dac_enabled() )
+ {
+ // Play inaudible frequencies as constant amplitude
+ amp = 8 << 4; // really depends on average of all samples in wave
+
+ // if delay is larger, constant amplitude won't start yet
+ if ( frequency() <= 0x7FB || delay > 15 * clk_mul )
+ {
+ if ( volume_mul && volume_shift != 4+4 )
+ playing = (int) enabled;
+
+ amp = (sample_buf << (phase << 2 & 4) & 0xF0) * playing;
+ }
+
+ amp = ((amp * volume_mul) >> volume_shift) - dac_bias;
+ }
+ update_amp( time, amp );
+ }
+
+ // Generate wave
+ time += delay;
+ if ( time < end_time )
+ {
+ byte const* wave = this->wave_ram;
+
+ // wave size and bank
+ #if GB_APU_NO_AGB
+ int const wave_mask = 0x1F;
+ int const swap_banks = 0;
+ #else
+ int const size20_mask = 0x20;
+ int const flags = regs [0] & agb_mask;
+ int const wave_mask = (flags & size20_mask) | 0x1F;
+ int swap_banks = 0;
+ if ( flags & bank40_mask )
+ {
+ swap_banks = flags & size20_mask;
+ wave += bank_size/2 - (swap_banks >> 1);
+ }
+ #endif
+
+ int ph = this->phase ^ swap_banks;
+ ph = (ph + 1) & wave_mask; // pre-advance
+
+ int const per = this->period();
+ if ( !playing )
+ {
+ #if GB_APU_FAST
+ time = end_time;
+ #else
+ // Maintain phase when not playing
+ int count = (end_time - time + per - 1) / per;
+ ph += count; // will be masked below
+ time += (blip_time_t) count * per;
+ #endif
+ }
+ else
+ {
+ Blip_Synth_Fast const* const synth = fast_synth; // cache
+
+ // Output amplitude transitions
+ int lamp = this->last_amp + dac_bias;
+ do
+ {
+ // Extract nibble
+ int nibble = wave [ph >> 1] << (ph << 2 & 4) & 0xF0;
+ ph = (ph + 1) & wave_mask;
+
+ // Scale by volume
+ int amp = (nibble * volume_mul) >> volume_shift;
+
+ int delta = amp - lamp;
+ if ( delta )
+ {
+ lamp = amp;
+ synth->offset_inline( time, delta, out );
+ }
+ time += per;
+ }
+ while ( time < end_time );
+ this->last_amp = lamp - dac_bias;
+ }
+ ph = (ph - 1) & wave_mask; // undo pre-advance and mask position
+
+ // Keep track of last byte read
+ if ( enabled )
+ sample_buf = wave [ph >> 1];
+
+ this->phase = ph ^ swap_banks; // undo swapped banks
+ }
+ delay = time - end_time;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.h b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.h
new file mode 100644
index 00000000..100b4f2d
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gb_Oscs.h
@@ -0,0 +1,188 @@
+// Private oscillators used by Gb_Apu
+
+// Gb_Snd_Emu 0.1.4
+#ifndef GB_OSCS_H
+#define GB_OSCS_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+#ifndef GB_APU_OVERCLOCK
+ #define GB_APU_OVERCLOCK 1
+#endif
+
+#if GB_APU_OVERCLOCK & (GB_APU_OVERCLOCK - 1)
+ #error "GB_APU_OVERCLOCK must be a power of 2"
+#endif
+
+class Gb_Osc {
+protected:
+
+ // 11-bit frequency in NRx3 and NRx4
+ int frequency() const { return (regs [4] & 7) * 0x100 + regs [3]; }
+
+ void update_amp( blip_time_t, int new_amp );
+ int write_trig( int frame_phase, int max_len, int old_data );
+public:
+
+ enum { clk_mul = GB_APU_OVERCLOCK };
+ enum { dac_bias = 7 };
+
+ Blip_Buffer* outputs [4];// NULL, right, left, center
+ Blip_Buffer* output; // where to output sound
+ BOOST::uint8_t* regs; // osc's 5 registers
+ int mode; // mode_dmg, mode_cgb, mode_agb
+ int dac_off_amp;// amplitude when DAC is off
+ int last_amp; // current amplitude in Blip_Buffer
+ Blip_Synth_Norm const* norm_synth;
+ Blip_Synth_Fast const* fast_synth;
+
+ int delay; // clocks until frequency timer expires
+ int length_ctr; // length counter
+ unsigned phase; // waveform phase (or equivalent)
+ bool enabled; // internal enabled flag
+
+ void clock_length();
+ void reset();
+};
+
+class Gb_Env : public Gb_Osc {
+public:
+ int env_delay;
+ int volume;
+ bool env_enabled;
+
+ void clock_envelope();
+ bool write_register( int frame_phase, int reg, int old_data, int data );
+
+ void reset()
+ {
+ env_delay = 0;
+ volume = 0;
+ Gb_Osc::reset();
+ }
+protected:
+ // Non-zero if DAC is enabled
+ int dac_enabled() const { return regs [2] & 0xF8; }
+private:
+ void zombie_volume( int old, int data );
+ int reload_env_timer();
+};
+
+class Gb_Square : public Gb_Env {
+public:
+ bool write_register( int frame_phase, int reg, int old_data, int data );
+ void run( blip_time_t, blip_time_t );
+
+ void reset()
+ {
+ Gb_Env::reset();
+ delay = 0x40000000; // TODO: something less hacky (never clocked until first trigger)
+ }
+private:
+ // Frequency timer period
+ int period() const { return (2048 - frequency()) * (4 * clk_mul); }
+};
+
+class Gb_Sweep_Square : public Gb_Square {
+public:
+ int sweep_freq;
+ int sweep_delay;
+ bool sweep_enabled;
+ bool sweep_neg;
+
+ void clock_sweep();
+ void write_register( int frame_phase, int reg, int old_data, int data );
+
+ void reset()
+ {
+ sweep_freq = 0;
+ sweep_delay = 0;
+ sweep_enabled = false;
+ sweep_neg = false;
+ Gb_Square::reset();
+ }
+private:
+ enum { period_mask = 0x70 };
+ enum { shift_mask = 0x07 };
+
+ void calc_sweep( bool update );
+ void reload_sweep_timer();
+};
+
+class Gb_Noise : public Gb_Env {
+public:
+
+ int divider; // noise has more complex frequency divider setup
+
+ void run( blip_time_t, blip_time_t );
+ void write_register( int frame_phase, int reg, int old_data, int data );
+
+ void reset()
+ {
+ divider = 0;
+ Gb_Env::reset();
+ delay = 4 * clk_mul; // TODO: remove?
+ }
+private:
+ enum { period2_mask = 0x1FFFF };
+
+ int period2_index() const { return regs [3] >> 4; }
+ int period2( int base = 8 ) const { return base << period2_index(); }
+ unsigned lfsr_mask() const { return (regs [3] & 0x08) ? ~0x4040 : ~0x4000; }
+};
+
+class Gb_Wave : public Gb_Osc {
+public:
+ int sample_buf; // last wave RAM byte read (hardware has this as well)
+
+ void write_register( int frame_phase, int reg, int old_data, int data );
+ void run( blip_time_t, blip_time_t );
+
+ // Reads/writes wave RAM
+ int read( int addr ) const;
+ void write( int addr, int data );
+
+ void reset()
+ {
+ sample_buf = 0;
+ Gb_Osc::reset();
+ }
+
+private:
+ enum { bank40_mask = 0x40 };
+ enum { bank_size = 32 };
+
+ int agb_mask; // 0xFF if AGB features enabled, 0 otherwise
+ BOOST::uint8_t* wave_ram; // 32 bytes (64 nybbles), stored in APU
+
+ friend class Gb_Apu;
+
+ // Frequency timer period
+ int period() const { return (2048 - frequency()) * (2 * clk_mul); }
+
+ // Non-zero if DAC is enabled
+ int dac_enabled() const { return regs [0] & 0x80; }
+
+ void corrupt_wave();
+
+ BOOST::uint8_t* wave_bank() const { return &wave_ram [(~regs [0] & bank40_mask) >> 2 & agb_mask]; }
+
+ // Wave index that would be accessed, or -1 if no access would occur
+ int access( int addr ) const;
+};
+
+inline int Gb_Wave::read( int addr ) const
+{
+ int index = access( addr );
+ return (index < 0 ? 0xFF : wave_bank() [index]);
+}
+
+inline void Gb_Wave::write( int addr, int data )
+{
+ int index = access( addr );
+ if ( index >= 0 )
+ wave_bank() [index] = data;;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.cpp
new file mode 100644
index 00000000..1c366d2a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.cpp
@@ -0,0 +1,208 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gbs_Core.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const tempo_unit = 16;
+int const idle_addr = 0xF00D;
+int const bank_size = 0x4000;
+
+Gbs_Core::Gbs_Core() : rom( bank_size )
+{
+ tempo = tempo_unit;
+ assert( offsetof (header_t,copyright [32]) == header_t::size );
+}
+
+Gbs_Core::~Gbs_Core() { }
+
+void Gbs_Core::unload()
+{
+ header_.timer_mode = 0; // set_tempo() reads this
+ rom.clear();
+ Gme_Loader::unload();
+}
+
+bool Gbs_Core::header_t::valid_tag() const
+{
+ return 0 == memcmp( tag, "GBS", 3 );
+}
+
+blargg_err_t Gbs_Core::load_( Data_Reader& in )
+{
+ RETURN_ERR( rom.load( in, header_.size, &header_, 0 ) );
+
+ if ( !header_.valid_tag() )
+ return blargg_err_file_type;
+
+ if ( header_.vers != 1 )
+ set_warning( "Unknown file version" );
+
+ if ( header_.timer_mode & 0x78 )
+ set_warning( "Invalid timer mode" );
+
+ addr_t load_addr = get_le16( header_.load_addr );
+ if ( (header_.load_addr [1] | header_.init_addr [1] | header_.play_addr [1]) > 0x7F ||
+ load_addr < 0x400 )
+ set_warning( "Invalid load/init/play address" );
+
+ cpu.rst_base = load_addr;
+ rom.set_addr( load_addr );
+
+ return blargg_ok;
+}
+
+void Gbs_Core::set_bank( int n )
+{
+ addr_t addr = rom.mask_addr( n * bank_size );
+ if ( addr == 0 && rom.size() > bank_size )
+ addr = bank_size; // MBC1&2 behavior, bank 0 acts like bank 1
+ cpu.map_code( bank_size, bank_size, rom.at_addr( addr ) );
+}
+
+void Gbs_Core::update_timer()
+{
+ play_period_ = 70224 / tempo_unit; // 59.73 Hz
+
+ if ( header_.timer_mode & 0x04 )
+ {
+ // Using custom rate
+ static byte const rates [4] = { 6, 0, 2, 4 };
+ // TODO: emulate double speed CPU mode rather than halving timer rate
+ int double_speed = header_.timer_mode >> 7;
+ int shift = rates [ram [hi_page + 7] & 3] - double_speed;
+ play_period_ = (256 - ram [hi_page + 6]) << shift;
+ }
+
+ play_period_ *= tempo;
+}
+
+void Gbs_Core::set_tempo( double t )
+{
+ tempo = (int) (tempo_unit / t + 0.5);
+ apu_.set_tempo( t );
+ update_timer();
+}
+
+// Jumps to routine, given pointer to address in file header. Pushes idle_addr
+// as return address, NOT old PC.
+void Gbs_Core::jsr_then_stop( byte const addr [] )
+{
+ check( cpu.r.sp == get_le16( header_.stack_ptr ) );
+ cpu.r.pc = get_le16( addr );
+ write_mem( --cpu.r.sp, idle_addr >> 8 );
+ write_mem( --cpu.r.sp, idle_addr );
+}
+
+blargg_err_t Gbs_Core::start_track( int track, Gb_Apu::mode_t mode )
+{
+ // Reset APU to state expected by most rips
+ static byte const sound_data [] = {
+ 0x80, 0xBF, 0x00, 0x00, 0xB8, // square 1 DAC disabled
+ 0x00, 0x3F, 0x00, 0x00, 0xB8, // square 2 DAC disabled
+ 0x7F, 0xFF, 0x9F, 0x00, 0xB8, // wave DAC disabled
+ 0x00, 0xFF, 0x00, 0x00, 0xB8, // noise DAC disabled
+ 0x77, 0xFF, 0x80, // max volume, all chans in center, power on
+ };
+ apu_.reset( mode );
+ apu_.write_register( 0, 0xFF26, 0x80 ); // power on
+ for ( int i = 0; i < (int) sizeof sound_data; i++ )
+ apu_.write_register( 0, i + apu_.io_addr, sound_data [i] );
+ apu_.end_frame( 1 ); // necessary to get click out of the way
+
+ // Init memory and I/O registers
+ memset( ram, 0, 0x4000 );
+ memset( ram + 0x4000, 0xFF, 0x1F80 );
+ memset( ram + 0x5F80, 0, sizeof ram - 0x5F80 );
+ ram [hi_page] = 0; // joypad reads back as 0
+ ram [idle_addr - ram_addr] = 0xED; // illegal instruction
+ ram [hi_page + 6] = header_.timer_modulo;
+ ram [hi_page + 7] = header_.timer_mode;
+
+ // Map memory
+ cpu.reset( rom.unmapped() );
+ cpu.map_code( ram_addr, 0x10000 - ram_addr, ram );
+ cpu.map_code( 0, bank_size, rom.at_addr( 0 ) );
+ set_bank( rom.size() > bank_size );
+
+ // CPU registers, timing
+ update_timer();
+ next_play = play_period_;
+ cpu.r.fa = track;
+ cpu.r.sp = get_le16( header_.stack_ptr );
+ jsr_then_stop( header_.init_addr );
+
+ return blargg_ok;
+}
+
+blargg_err_t Gbs_Core::run_until( int end )
+{
+ end_time = end;
+ cpu.set_time( cpu.time() - end );
+ while ( true )
+ {
+ run_cpu();
+ if ( cpu.time() >= 0 )
+ break;
+
+ if ( cpu.r.pc == idle_addr )
+ {
+ if ( next_play > end_time )
+ {
+ cpu.set_time( 0 );
+ break;
+ }
+
+ if ( cpu.time() < next_play - end_time )
+ cpu.set_time( next_play - end_time );
+ next_play += play_period_;
+ jsr_then_stop( header_.play_addr );
+ }
+ else if ( cpu.r.pc > 0xFFFF )
+ {
+ dprintf( "PC wrapped around\n" );
+ cpu.r.pc &= 0xFFFF;
+ }
+ else
+ {
+ set_warning( "Emulation error (illegal/unsupported instruction)" );
+ dprintf( "Bad opcode $%02X at $%04X\n",
+ (int) *cpu.get_code( cpu.r.pc ), (int) cpu.r.pc );
+ cpu.r.pc = (cpu.r.pc + 1) & 0xFFFF;
+ cpu.set_time( cpu.time() + 6 );
+ }
+ }
+
+ return blargg_ok;
+}
+
+blargg_err_t Gbs_Core::end_frame( int end )
+{
+ RETURN_ERR( run_until( end ) );
+
+ next_play -= end;
+ if ( next_play < 0 ) // happens when play routine takes too long
+ {
+ #if !GBS_IGNORE_STARVED_PLAY
+ check( false );
+ #endif
+ next_play = 0;
+ }
+
+ apu_.end_frame( end );
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h
new file mode 100644
index 00000000..f5a3ca69
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Core.h
@@ -0,0 +1,106 @@
+// Nintendo Game Boy GBS music file emulator core
+
+// Game_Music_Emu 0.6-pre
+#ifndef GBS_CORE_H
+#define GBS_CORE_H
+
+#include "Gme_Loader.h"
+#include "Rom_Data.h"
+#include "Gb_Cpu.h"
+#include "Gb_Apu.h"
+
+class Gbs_Core : public Gme_Loader {
+public:
+
+ // GBS file header
+ struct header_t
+ {
+ enum { size = 112 };
+
+ char tag [ 3];
+ byte vers;
+ byte track_count;
+ byte first_track;
+ byte load_addr [ 2];
+ byte init_addr [ 2];
+ byte play_addr [ 2];
+ byte stack_ptr [ 2];
+ byte timer_modulo;
+ byte timer_mode;
+ char game [32]; // strings can be 32 chars, NOT terminated
+ char author [32];
+ char copyright [32];
+
+ // True if header has valid file signature
+ bool valid_tag() const;
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return header_; }
+
+ // Sound chip
+ Gb_Apu& apu() { return apu_; }
+
+ // Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
+ void set_tempo( double );
+
+ // Starts track, where 0 is the first. Uses specified APU mode.
+ blargg_err_t start_track( int, Gb_Apu::mode_t = Gb_Apu::mode_cgb );
+
+ // Ends time frame at time t
+ typedef int time_t; // clock count
+ blargg_err_t end_frame( time_t t );
+
+ // Clocks between calls to play routine
+ time_t play_period() const { return play_period_; }
+
+protected:
+ typedef int addr_t;
+
+ // Current time
+ time_t time() const { return cpu.time() + end_time; }
+
+ // Runs emulator to time t
+ blargg_err_t run_until( time_t t );
+
+ // Runs CPU until time becomes >= 0
+ void run_cpu();
+
+ // Reads/writes memory and I/O
+ int read_mem( addr_t );
+ void write_mem( addr_t, int );
+
+// Implementation
+public:
+ Gbs_Core();
+ ~Gbs_Core();
+ virtual void unload();
+
+protected:
+ virtual blargg_err_t load_( Data_Reader& );
+
+private:
+ enum { ram_addr = 0xA000 };
+ enum { io_base = 0xFF00 };
+ enum { hi_page = io_base - ram_addr };
+
+ Rom_Data rom;
+ int tempo;
+ time_t end_time;
+ time_t play_period_;
+ time_t next_play;
+ header_t header_;
+ Gb_Cpu cpu;
+ Gb_Apu apu_;
+ byte ram [0x4000 + 0x2000 + Gb_Cpu::cpu_padding];
+
+ void update_timer();
+ void jsr_then_stop( byte const [] );
+ void set_bank( int n );
+ void write_io_inline( int offset, int data, int base );
+ void write_io_( int offset, int data );
+ int read_io( int offset );
+ void write_io( int offset, int data );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Cpu.cpp
new file mode 100644
index 00000000..b683eee2
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Cpu.cpp
@@ -0,0 +1,134 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gbs_Core.h"
+
+#include "blargg_endian.h"
+
+//#include "gb_cpu_log.h"
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifndef LOG_MEM
+ #define LOG_MEM( addr, str, data ) data
+#endif
+
+int Gbs_Core::read_mem( addr_t addr )
+{
+ int result = *cpu.get_code( addr );
+ if ( (unsigned) (addr - apu_.io_addr) < apu_.io_size )
+ result = apu_.read_register( time(), addr );
+
+#ifndef NDEBUG
+ else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
+ dprintf( "Unmapped read $%04X\n", (unsigned) addr );
+ else if ( unsigned (addr - 0xFF01) < 0xFF80 - 0xFF01 && addr != 0xFF70 && addr != 0xFF05 )
+ dprintf( "Unmapped read $%04X\n", (unsigned) addr );
+#endif
+
+ return LOG_MEM( addr, ">", result );
+}
+
+inline void Gbs_Core::write_io_inline( int offset, int data, int base )
+{
+ if ( (unsigned) (offset - (apu_.io_addr - base)) < apu_.io_size )
+ apu_.write_register( time(), offset + base, data & 0xFF );
+ else if ( (unsigned) (offset - (0xFF06 - base)) < 2 )
+ update_timer();
+ else if ( offset == io_base - base )
+ ram [base - ram_addr + offset] = 0; // keep joypad return value 0
+ else
+ ram [base - ram_addr + offset] = 0xFF;
+
+ //if ( offset == 0xFFFF - base )
+ // dprintf( "Wrote interrupt mask\n" );
+}
+
+void Gbs_Core::write_mem( addr_t addr, int data )
+{
+ (void) LOG_MEM( addr, "<", data );
+
+ int offset = addr - ram_addr;
+ if ( (unsigned) offset < 0x10000 - ram_addr )
+ {
+ ram [offset] = data;
+
+ offset -= 0xE000 - ram_addr;
+ if ( (unsigned) offset < 0x1F80 )
+ write_io_inline( offset, data, 0xE000 );
+ }
+ else if ( (unsigned) (offset - (0x2000 - ram_addr)) < 0x2000 )
+ {
+ set_bank( data & 0xFF );
+ }
+#ifndef NDEBUG
+ else if ( unsigned (addr - 0x8000) < 0x2000 || unsigned (addr - 0xE000) < 0x1F00 )
+ {
+ dprintf( "Unmapped write $%04X\n", (unsigned) addr );
+ }
+#endif
+}
+
+void Gbs_Core::write_io_( int offset, int data )
+{
+ write_io_inline( offset, data, io_base );
+}
+
+inline void Gbs_Core::write_io( int offset, int data )
+{
+ (void) LOG_MEM( offset + io_base, "<", data );
+
+ ram [io_base - ram_addr + offset] = data;
+ if ( (unsigned) offset < 0x80 )
+ write_io_( offset, data );
+}
+
+int Gbs_Core::read_io( int offset )
+{
+ int const io_base = 0xFF00;
+ int result = ram [io_base - ram_addr + offset];
+
+ if ( (unsigned) (offset - (apu_.io_addr - io_base)) < apu_.io_size )
+ {
+ result = apu_.read_register( time(), offset + io_base );
+ (void) LOG_MEM( offset + io_base, ">", result );
+ }
+ else
+ {
+ check( result == read_mem( offset + io_base ) );
+ }
+ return result;
+}
+
+#define READ_FAST( addr, out ) \
+{\
+ out = READ_CODE( addr );\
+ if ( (unsigned) (addr - apu_.io_addr) < apu_.io_size )\
+ out = LOG_MEM( addr, ">", apu_.read_register( TIME() + end_time, addr ) );\
+ else\
+ check( out == read_mem( addr ) );\
+}
+
+#define READ_MEM( addr ) read_mem( addr )
+#define WRITE_MEM( addr, data ) write_mem( addr, data )
+
+#define WRITE_IO( addr, data ) write_io( addr, data )
+#define READ_IO( addr, out ) out = read_io( addr )
+
+#define CPU cpu
+
+#define CPU_BEGIN \
+void Gbs_Core::run_cpu()\
+{
+ #include "Gb_Cpu_run.h"
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.cpp
new file mode 100644
index 00000000..81fa42f2
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.cpp
@@ -0,0 +1,143 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gbs_Emu.h"
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Gbs_Emu::equalizer_t const Gbs_Emu::handheld_eq = { -47.0, 2000 };
+Gbs_Emu::equalizer_t const Gbs_Emu::cgb_eq = { 0.0, 300 };
+Gbs_Emu::equalizer_t const Gbs_Emu::headphones_eq = { 0.0, 30 }; // DMG
+
+Gbs_Emu::Gbs_Emu()
+{
+ sound_hardware = sound_gbs;
+ enable_clicking( false );
+ set_type( gme_gbs_type );
+ set_silence_lookahead( 6 );
+ set_max_initial_silence( 21 );
+ set_gain( 1.2 );
+
+ // kind of midway between headphones and speaker
+ static equalizer_t const eq = { -1.0, 120 };
+ set_equalizer( eq );
+}
+
+Gbs_Emu::~Gbs_Emu() { }
+
+void Gbs_Emu::unload()
+{
+ core_.unload();
+ Music_Emu::unload();
+}
+
+// Track info
+
+static void copy_gbs_fields( Gbs_Emu::header_t const& h, track_info_t* out )
+{
+ GME_COPY_FIELD( h, out, game );
+ GME_COPY_FIELD( h, out, author );
+ GME_COPY_FIELD( h, out, copyright );
+}
+
+blargg_err_t Gbs_Emu::track_info_( track_info_t* out, int ) const
+{
+ copy_gbs_fields( header(), out );
+ return blargg_ok;
+}
+
+struct Gbs_File : Gme_Info_
+{
+ Gbs_Emu::header_t h;
+
+ Gbs_File() { set_type( gme_gbs_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ blargg_err_t err = in.read( &h, h.size );
+ if ( err )
+ return (blargg_is_err_type( err, blargg_err_file_eof ) ? blargg_err_file_type : err);
+
+ set_track_count( h.track_count );
+ if ( !h.valid_tag() )
+ return blargg_err_file_type;
+
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_gbs_fields( h, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_gbs_emu () { return BLARGG_NEW Gbs_Emu ; }
+static Music_Emu* new_gbs_file() { return BLARGG_NEW Gbs_File; }
+
+gme_type_t_ const gme_gbs_type [1] = {{ "Game Boy", 0, &new_gbs_emu, &new_gbs_file, "GBS", 1 }};
+
+// Setup
+
+blargg_err_t Gbs_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( core_.load( in ) );
+ set_warning( core_.warning() );
+ set_track_count( header().track_count );
+ set_voice_count( Gb_Apu::osc_count );
+ core_.apu().volume( gain() );
+
+ static const char* const names [Gb_Apu::osc_count] = {
+ "Square 1", "Square 2", "Wave", "Noise"
+ };
+ set_voice_names( names );
+
+ static int const types [Gb_Apu::osc_count] = {
+ wave_type+1, wave_type+2, wave_type+3, mixed_type+1
+ };
+ set_voice_types( types );
+
+ return setup_buffer( 4194304 );
+}
+
+void Gbs_Emu::update_eq( blip_eq_t const& eq )
+{
+ core_.apu().treble_eq( eq );
+}
+
+void Gbs_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ core_.apu().set_output( i, c, l, r );
+}
+
+void Gbs_Emu::set_tempo_( double t )
+{
+ core_.set_tempo( t );
+}
+
+blargg_err_t Gbs_Emu::start_track_( int track )
+{
+ sound_t mode = sound_hardware;
+ if ( mode == sound_gbs )
+ mode = (header().timer_mode & 0x80) ? sound_cgb : sound_dmg;
+
+ RETURN_ERR( core_.start_track( track, (Gb_Apu::mode_t) mode ) );
+
+ // clear buffer AFTER track is started, eliminating initial click
+ return Classic_Emu::start_track_( track );
+}
+
+blargg_err_t Gbs_Emu::run_clocks( blip_time_t& duration, int )
+{
+ return core_.end_frame( duration );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.h
new file mode 100644
index 00000000..96fd56c9
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gbs_Emu.h
@@ -0,0 +1,61 @@
+// Nintendo Game Boy GBS music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef GBS_EMU_H
+#define GBS_EMU_H
+
+#include "Classic_Emu.h"
+#include "Gbs_Core.h"
+
+class Gbs_Emu : public Classic_Emu {
+public:
+ // Equalizer profiles for Game Boy speaker and headphones
+ static equalizer_t const handheld_eq;
+ static equalizer_t const headphones_eq;
+ static equalizer_t const cgb_eq; // Game Boy Color headphones have less bass
+
+ // GBS file header (see Gbs_Core.h)
+ typedef Gbs_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core_.header(); }
+
+ // Selects which sound hardware to use. AGB hardware is cleaner than the
+ // others. Doesn't take effect until next start_track().
+ enum sound_t {
+ sound_dmg = Gb_Apu::mode_dmg, // Game Boy monochrome
+ sound_cgb = Gb_Apu::mode_cgb, // Game Boy Color
+ sound_agb = Gb_Apu::mode_agb, // Game Boy Advance
+ sound_gbs // Use DMG/CGB based on GBS (default)
+ };
+ void set_sound( sound_t s ) { sound_hardware = s; }
+
+ // If true, makes APU more accurate, which results in more clicking.
+ void enable_clicking( bool enable = true ) { core_.apu().reduce_clicks( !enable ); }
+
+ static gme_type_t static_type() { return gme_gbs_type; }
+
+ Gbs_Core& core() { return core_; }
+
+// Internal
+public:
+ Gbs_Emu();
+ ~Gbs_Emu();
+
+protected:
+ // Overrides
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+ virtual void unload();
+
+private:
+ sound_t sound_hardware;
+ Gbs_Core core_;
+};
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gme_File.cpp
index 6821c3a5..5930dcbf 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Gme_File.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gme_File.cpp
@@ -1,216 +1,183 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Gme_File.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-const char gme_wrong_file_type [] = "Wrong file type for this emulator";
-
-void Gme_File::clear_playlist()
-{
- playlist.clear();
- clear_playlist_();
- track_count_ = raw_track_count_;
-}
-
-void Gme_File::unload()
-{
- clear_playlist(); // *before* clearing track count
- track_count_ = 0;
- raw_track_count_ = 0;
- file_data.clear();
-}
-
-Gme_File::Gme_File()
-{
- type_ = 0;
- user_data_ = 0;
- user_cleanup_ = 0;
- unload(); // clears fields
- blargg_verify_byte_order(); // used by most emulator types, so save them the trouble
-}
-
-Gme_File::~Gme_File()
-{
- if ( user_cleanup_ )
- user_cleanup_( user_data_ );
-}
-
-blargg_err_t Gme_File::load_mem_( byte const* data, long size )
-{
- require( data != file_data.begin() ); // load_mem_() or load_() must be overridden
- Mem_File_Reader in( data, size );
- return load_( in );
-}
-
-blargg_err_t Gme_File::load_( Data_Reader& in )
-{
- RETURN_ERR( file_data.resize( in.remain() ) );
- RETURN_ERR( in.read( file_data.begin(), file_data.size() ) );
- return load_mem_( file_data.begin(), file_data.size() );
-}
-
-// public load functions call this at beginning
-void Gme_File::pre_load() { unload(); }
-
-void Gme_File::post_load_() { }
-
-// public load functions call this at end
-blargg_err_t Gme_File::post_load( blargg_err_t err )
-{
- if ( !track_count() )
- set_track_count( type()->track_count );
- if ( !err )
- post_load_();
- else
- unload();
-
- return err;
-}
-
-// Public load functions
-
-blargg_err_t Gme_File::load_mem( void const* in, long size )
-{
- pre_load();
- return post_load( load_mem_( (byte const*) in, size ) );
-}
-
-blargg_err_t Gme_File::load( Data_Reader& in )
-{
- pre_load();
- return post_load( load_( in ) );
-}
-
-blargg_err_t Gme_File::load_file( const char* path )
-{
- pre_load();
- GME_FILE_READER in;
- RETURN_ERR( in.open( path ) );
- return post_load( load_( in ) );
-}
-
-blargg_err_t Gme_File::load_remaining_( void const* h, long s, Data_Reader& in )
-{
- Remaining_Reader rem( h, s, &in );
- return load( rem );
-}
-
-// Track info
-
-void Gme_File::copy_field_( char* out, const char* in, int in_size )
-{
- if ( !in || !*in )
- return;
-
- // remove spaces/junk from beginning
- while ( in_size && unsigned (*in - 1) <= ' ' - 1 )
- {
- in++;
- in_size--;
- }
-
- // truncate
- if ( in_size > max_field_ )
- in_size = max_field_;
-
- // find terminator
- int len = 0;
- while ( len < in_size && in [len] )
- len++;
-
- // remove spaces/junk from end
- while ( len && unsigned (in [len - 1]) <= ' ' )
- len--;
-
- // copy
- out [len] = 0;
- memcpy( out, in, len );
-
- // strip out stupid fields that should have been left blank
- if ( !strcmp( out, "?" ) || !strcmp( out, "<?>" ) || !strcmp( out, "< ? >" ) )
- out [0] = 0;
-}
-
-void Gme_File::copy_field_( char* out, const char* in )
-{
- copy_field_( out, in, max_field_ );
-}
-
-blargg_err_t Gme_File::remap_track_( int* track_io ) const
-{
- if ( (unsigned) *track_io >= (unsigned) track_count() )
- return "Invalid track";
-
- if ( (unsigned) *track_io < (unsigned) playlist.size() )
- {
- M3u_Playlist::entry_t const& e = playlist [*track_io];
- *track_io = 0;
- if ( e.track >= 0 )
- {
- *track_io = e.track;
- if ( !(type_->flags_ & 0x02) )
- *track_io -= e.decimal_track;
- }
- if ( *track_io >= raw_track_count_ )
- return "Invalid track in m3u playlist";
- }
- else
- {
- check( !playlist.size() );
- }
- return 0;
-}
-
-blargg_err_t Gme_File::track_info( track_info_t* out, int track ) const
-{
- out->track_count = track_count();
- out->length = -1;
- out->loop_length = -1;
- out->intro_length = -1;
- out->song [0] = 0;
-
- out->game [0] = 0;
- out->author [0] = 0;
- out->copyright [0] = 0;
- out->comment [0] = 0;
- out->dumper [0] = 0;
- out->system [0] = 0;
-
- copy_field_( out->system, type()->system );
-
- int remapped = track;
- RETURN_ERR( remap_track_( &remapped ) );
- RETURN_ERR( track_info_( out, remapped ) );
-
- // override with m3u info
- if ( playlist.size() )
- {
- M3u_Playlist::info_t const& i = playlist.info();
- copy_field_( out->game , i.title );
- copy_field_( out->author, i.engineer );
- copy_field_( out->author, i.composer );
- copy_field_( out->dumper, i.ripping );
-
- M3u_Playlist::entry_t const& e = playlist [track];
- copy_field_( out->song, e.name );
- if ( e.length >= 0 ) out->length = e.length * 1000L;
- if ( e.intro >= 0 ) out->intro_length = e.intro * 1000L;
- if ( e.loop >= 0 ) out->loop_length = e.loop * 1000L;
- }
- return 0;
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gme_File.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void Gme_File::unload()
+{
+ clear_playlist(); // BEFORE clearing track count
+ track_count_ = 0;
+ raw_track_count_ = 0;
+ Gme_Loader::unload();
+}
+
+Gme_File::Gme_File()
+{
+ type_ = NULL;
+ user_data_ = NULL;
+ user_cleanup_ = NULL;
+ Gme_File::unload(); // clears fields
+}
+
+Gme_File::~Gme_File()
+{
+ if ( user_cleanup_ )
+ user_cleanup_( user_data_ );
+}
+
+blargg_err_t Gme_File::post_load()
+{
+ if ( !track_count() )
+ set_track_count( type()->track_count );
+ return Gme_Loader::post_load();
+}
+
+void Gme_File::clear_playlist()
+{
+ playlist.clear();
+ clear_playlist_();
+ track_count_ = raw_track_count_;
+}
+
+void Gme_File::copy_field_( char out [], const char* in, int in_size )
+{
+ if ( !in || !*in )
+ return;
+
+ // remove spaces/junk from beginning
+ while ( in_size && unsigned (*in - 1) <= ' ' - 1 )
+ {
+ in++;
+ in_size--;
+ }
+
+ // truncate
+ if ( in_size > max_field_ )
+ in_size = max_field_;
+
+ // find terminator
+ int len = 0;
+ while ( len < in_size && in [len] )
+ len++;
+
+ // remove spaces/junk from end
+ while ( len && unsigned (in [len - 1]) <= ' ' )
+ len--;
+
+ // copy
+ out [len] = 0;
+ memcpy( out, in, len );
+
+ // strip out stupid fields that should have been left blank
+ if ( !strcmp( out, "?" ) || !strcmp( out, "<?>" ) || !strcmp( out, "< ? >" ) )
+ out [0] = 0;
+}
+
+void Gme_File::copy_field_( char out [], const char* in )
+{
+ copy_field_( out, in, max_field_ );
+}
+
+blargg_err_t Gme_File::remap_track_( int* track_io ) const
+{
+ if ( (unsigned) *track_io >= (unsigned) track_count() )
+ return BLARGG_ERR( BLARGG_ERR_CALLER, "invalid track" );
+
+ if ( (unsigned) *track_io < (unsigned) playlist.size() )
+ {
+ M3u_Playlist::entry_t const& e = playlist [*track_io];
+ *track_io = 0;
+ if ( e.track >= 0 )
+ {
+ *track_io = e.track;
+ // TODO: really needs to be removed?
+ //if ( !(type_->flags_ & 0x02) )
+ // *track_io -= e.decimal_track;
+ }
+ if ( *track_io >= raw_track_count_ )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "invalid track in m3u playlist" );
+ }
+ else
+ {
+ check( !playlist.size() );
+ }
+ return blargg_ok;
+}
+
+blargg_err_t Gme_File::track_info( track_info_t* out, int track ) const
+{
+ out->track_count = track_count();
+ out->length = -1;
+ out->loop_length = -1;
+ out->intro_length = -1;
+ out->fade_length = -1;
+ out->play_length = -1;
+ out->repeat_count = -1;
+ out->song [0] = 0;
+ out->game [0] = 0;
+ out->author [0] = 0;
+ out->composer [0] = 0;
+ out->engineer [0] = 0;
+ out->sequencer [0] = 0;
+ out->tagger [0] = 0;
+ out->copyright [0] = 0;
+ out->date [0] = 0;
+ out->comment [0] = 0;
+ out->dumper [0] = 0;
+ out->system [0] = 0;
+ out->disc [0] = 0;
+ out->track [0] = 0;
+ out->ost [0] = 0;
+
+ copy_field_( out->system, type()->system );
+
+ int remapped = track;
+ RETURN_ERR( remap_track_( &remapped ) );
+ RETURN_ERR( track_info_( out, remapped ) );
+
+ // override with m3u info
+ if ( playlist.size() )
+ {
+ M3u_Playlist::info_t const& i = playlist.info();
+ copy_field_( out->game , i.title );
+ copy_field_( out->author , i.artist );
+ copy_field_( out->engineer , i.engineer );
+ copy_field_( out->composer , i.composer );
+ copy_field_( out->sequencer, i.sequencer );
+ copy_field_( out->copyright, i.copyright );
+ copy_field_( out->dumper , i.ripping );
+ copy_field_( out->tagger , i.tagging );
+ copy_field_( out->date , i.date );
+
+ M3u_Playlist::entry_t const& e = playlist [track];
+ if ( e.length >= 0 ) out->length = e.length;
+ if ( e.intro >= 0 ) out->intro_length = e.intro;
+ if ( e.loop >= 0 ) out->loop_length = e.loop;
+ if ( e.fade >= 0 ) out->fade_length = e.fade;
+ if ( e.repeat >= 0 ) out->repeat_count = e.repeat;
+ copy_field_( out->song, e.name );
+ }
+
+ // play_length
+ out->play_length = out->length;
+ if ( out->play_length <= 0 )
+ {
+ out->play_length = out->intro_length + 2 * out->loop_length; // intro + 2 loops
+ if ( out->play_length <= 0 )
+ out->play_length = 150 * 1000; // 2.5 minutes
+ }
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gme_File.h b/plugins/gme/game-music-emu-0.6pre/gme/Gme_File.h
new file mode 100644
index 00000000..9ed83f54
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gme_File.h
@@ -0,0 +1,152 @@
+// Common interface for track information
+
+// Game_Music_Emu 0.6-pre
+#ifndef GME_FILE_H
+#define GME_FILE_H
+
+#include "gme.h"
+#include "Gme_Loader.h"
+#include "M3u_Playlist.h"
+
+struct track_info_t
+{
+ int track_count;
+
+ /* times in milliseconds; -1 if unknown */
+ int length; /* total length, if file specifies it */
+ int intro_length; /* length of song up to looping section */
+ int loop_length; /* length of looping section */
+ int fade_length;
+ int repeat_count;
+
+ /* Length if available, otherwise intro_length+loop_length*2 if available,
+ otherwise a default of 150000 (2.5 minutes). */
+ int play_length;
+
+ /* empty string if not available */
+ char system [256];
+ char game [256];
+ char song [256];
+ char author [256];
+ char composer [256];
+ char engineer [256];
+ char sequencer [256];
+ char tagger [256];
+ char copyright [256];
+ char date [256];
+ char comment [256];
+ char dumper [256];
+ char disc [256];
+ char track [256];
+ char ost [256];
+};
+enum { gme_max_field = 255 };
+
+class Gme_File : public Gme_Loader {
+public:
+ // Type of emulator. For example if this returns gme_nsfe_type, this object
+ // is an NSFE emulator, and you can downcast to an Nsfe_Emu* if necessary.
+ gme_type_t type() const;
+
+ // Loads an m3u playlist. Must be done AFTER loading main music file.
+ blargg_err_t load_m3u( const char path [] );
+ blargg_err_t load_m3u( Data_Reader& in );
+
+ // Clears any loaded m3u playlist and any internal playlist that the music
+ // format supports (NSFE for example).
+ void clear_playlist();
+
+ // Number of tracks or 0 if no file has been loaded
+ int track_count() const;
+
+ // Gets information for a track (length, name, author, etc.)
+ // See gme.h for definition of struct track_info_t.
+ blargg_err_t track_info( track_info_t* out, int track ) const;
+
+// User data/cleanup
+
+ // Sets/gets pointer to data you want to associate with this emulator.
+ // You can use this for whatever you want.
+ void set_user_data( void* p ) { user_data_ = p; }
+ void* user_data() const { return user_data_; }
+
+ // Registers cleanup function to be called when deleting emulator, or NULL to
+ // clear it. Passes user_data to cleanup function.
+ void set_user_cleanup( gme_user_cleanup_t func ) { user_cleanup_ = func; }
+
+public:
+ Gme_File();
+ ~Gme_File();
+
+protected:
+ // Services
+ void set_type( gme_type_t t ) { type_ = t; }
+ void set_track_count( int n ) { track_count_ = raw_track_count_ = n; }
+
+ // Must be overridden
+ virtual blargg_err_t track_info_( track_info_t* out, int track ) const BLARGG_PURE( ; )
+
+ // Optionally overridden
+ virtual void clear_playlist_() { }
+
+protected: // Gme_Loader overrides
+ virtual void unload();
+ virtual blargg_err_t post_load();
+
+protected:
+ blargg_err_t remap_track_( int* track_io ) const; // need by Music_Emu
+private:
+ gme_type_t type_;
+ void* user_data_;
+ gme_user_cleanup_t user_cleanup_;
+ int track_count_;
+ int raw_track_count_;
+ M3u_Playlist playlist;
+ char playlist_warning [64];
+
+ blargg_err_t load_m3u_( blargg_err_t );
+
+public:
+ // track_info field copying
+ enum { max_field_ = 255 };
+ static void copy_field_( char out [], const char* in );
+ static void copy_field_( char out [], const char* in, int len );
+};
+
+struct gme_type_t_
+{
+ const char* system; /* name of system this music file type is generally for */
+ int track_count; /* non-zero for formats with a fixed number of tracks */
+ Music_Emu* (*new_emu)(); /* Create new emulator for this type (C++ only) */
+ Music_Emu* (*new_info)();/* Create new info reader for this type (C++ only) */
+
+ /* internal */
+ const char* extension_;
+ int flags_;
+};
+
+/* Emulator type constants for each supported file type */
+extern const gme_type_t_
+ gme_ay_type [1],
+ gme_gbs_type [1],
+ gme_gym_type [1],
+ gme_hes_type [1],
+ gme_kss_type [1],
+ gme_nsf_type [1],
+ gme_nsfe_type [1],
+ gme_sap_type [1],
+ gme_sgc_type [1],
+ gme_spc_type [1],
+ gme_vgm_type [1],
+ gme_vgz_type [1];
+
+#define GME_COPY_FIELD( in, out, name ) \
+ { Gme_File::copy_field_( out->name, in.name, sizeof in.name ); }
+
+inline gme_type_t Gme_File::type() const { return type_; }
+
+inline int Gme_File::track_count() const { return track_count_; }
+
+inline blargg_err_t Gme_File::track_info_( track_info_t*, int ) const { return blargg_ok; }
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.cpp
new file mode 100644
index 00000000..186d84b7
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.cpp
@@ -0,0 +1,86 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gme_Loader.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void Gme_Loader::unload()
+{
+ file_begin_ = NULL;
+ file_end_ = NULL;
+ file_data.clear();
+}
+
+Gme_Loader::Gme_Loader()
+{
+ warning_ = NULL;
+ Gme_Loader::unload();
+ blargg_verify_byte_order(); // used by most emulator types, so save them the trouble
+}
+
+Gme_Loader::~Gme_Loader() { }
+
+blargg_err_t Gme_Loader::load_mem_( byte const data [], int size )
+{
+ require( data != file_data.begin() ); // load_mem_() or load_() must be overridden
+ Mem_File_Reader in( data, size );
+ return load_( in );
+}
+
+inline blargg_err_t Gme_Loader::load_mem_wrapper( byte const data [], int size )
+{
+ file_begin_ = data;
+ file_end_ = data + size;
+ return load_mem_( data, size );
+}
+
+blargg_err_t Gme_Loader::load_( Data_Reader& in )
+{
+ RETURN_ERR( file_data.resize( in.remain() ) );
+ RETURN_ERR( in.read( file_data.begin(), file_data.size() ) );
+ return load_mem_wrapper( file_data.begin(), file_data.size() );
+}
+
+blargg_err_t Gme_Loader::post_load_( blargg_err_t err )
+{
+ if ( err )
+ {
+ unload();
+ return err;
+ }
+
+ return post_load();
+}
+
+blargg_err_t Gme_Loader::load_mem( void const* in, long size )
+{
+ pre_load();
+ return post_load_( load_mem_wrapper( (byte const*) in, (int) size ) );
+}
+
+blargg_err_t Gme_Loader::load( Data_Reader& in )
+{
+ pre_load();
+ return post_load_( load_( in ) );
+}
+
+blargg_err_t Gme_Loader::load_file( const char path [] )
+{
+ pre_load();
+ GME_FILE_READER in;
+ RETURN_ERR( in.open( path ) );
+ return post_load_( load_( in ) );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.h b/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.h
new file mode 100644
index 00000000..d92d97a0
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gme_Loader.h
@@ -0,0 +1,92 @@
+// Common interface for loading file data from various sources
+
+// Game_Music_Emu 0.6-pre
+#ifndef GME_LOADER_H
+#define GME_LOADER_H
+
+#include "blargg_common.h"
+#include "Data_Reader.h"
+
+class Gme_Loader {
+public:
+
+ // Each loads game music data from a file and returns an error if
+ // file is wrong type or is seriously corrupt. Minor problems are
+ // reported using warning().
+
+ // Loads from file on disk
+ blargg_err_t load_file( const char path [] );
+
+ // Loads from custom data source (see Data_Reader.h)
+ blargg_err_t load( Data_Reader& );
+
+ // Loads from file already read into memory. Object might keep pointer to
+ // data; if it does, you MUST NOT free it until you're done with the file.
+ blargg_err_t load_mem( void const* data, long size );
+
+ // Most recent warning string, or NULL if none. Clears current warning after
+ // returning.
+ const char* warning();
+
+ // Unloads file from memory
+ virtual void unload();
+
+ virtual ~Gme_Loader();
+
+protected:
+ typedef BOOST::uint8_t byte;
+
+ // File data in memory, or 0 if data was loaded with load_()
+ byte const* file_begin() const { return file_begin_; }
+ byte const* file_end() const { return file_end_; }
+ int file_size() const { return (int) (file_end_ - file_begin_); }
+
+ // Sets warning string
+ void set_warning( const char s [] ) { warning_ = s; }
+
+ // At least one must be overridden
+ virtual blargg_err_t load_( Data_Reader& ); // default loads then calls load_mem_()
+ virtual blargg_err_t load_mem_( byte const data [], int size ); // use data in memory
+
+ // Optionally overridden
+ virtual void pre_load() { unload(); } // called before load_()/load_mem_()
+ virtual blargg_err_t post_load() { return blargg_ok; } // called after load_()/load_mem_() succeeds
+
+private:
+ // noncopyable
+ Gme_Loader( const Gme_Loader& );
+ Gme_Loader& operator = ( const Gme_Loader& );
+
+// Implementation
+public:
+ Gme_Loader();
+ BLARGG_DISABLE_NOTHROW
+
+ blargg_vector<byte> file_data; // used only when loading from file to load_mem_()
+ byte const* file_begin_;
+ byte const* file_end_;
+ const char* warning_;
+
+ blargg_err_t load_mem_wrapper( byte const [], int );
+ blargg_err_t post_load_( blargg_err_t err );
+};
+
+// Files are read with GME_FILE_READER. Default supports gzip if zlib is available.
+#ifndef GME_FILE_READER
+ #ifdef HAVE_ZLIB_H
+ #define GME_FILE_READER Gzip_File_Reader
+ #else
+ #define GME_FILE_READER Std_File_Reader
+ #endif
+#elif defined (GME_FILE_READER_INCLUDE)
+ #include GME_FILE_READER_INCLUDE
+#endif
+
+inline const char* Gme_Loader::warning()
+{
+ const char* s = warning_;
+ warning_ = NULL;
+ return s;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.cpp
new file mode 100644
index 00000000..ce27877a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.cpp
@@ -0,0 +1,405 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Gym_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+double const min_tempo = 0.25;
+double const oversample = 5 / 3.0;
+double const fm_gain = 3.0;
+
+int const base_clock = 53700300;
+int const clock_rate = base_clock / 15;
+
+Gym_Emu::Gym_Emu()
+{
+ resampler.set_callback( play_frame_, this );
+ pos = NULL;
+ disable_oversampling_ = false;
+ set_type( gme_gym_type );
+ set_silence_lookahead( 1 ); // tracks should already be trimmed
+ pcm_buf = stereo_buf.center();
+}
+
+Gym_Emu::~Gym_Emu() { }
+
+// Track info
+
+static void get_gym_info( Gym_Emu::header_t const& h, int length, track_info_t* out )
+{
+ if ( 0 != memcmp( h.tag, "GYMX", 4 ) )
+ return;
+
+ length = length * 50 / 3; // 1000 / 60
+ int loop = get_le32( h.loop_start );
+ if ( loop )
+ {
+ out->intro_length = loop * 50 / 3;
+ out->loop_length = length - out->intro_length;
+ }
+ else
+ {
+ out->length = length;
+ out->intro_length = length; // make it clear that track is no longer than length
+ out->loop_length = 0;
+ }
+
+ // more stupidity where the field should have been left blank
+ if ( strcmp( h.song, "Unknown Song" ) )
+ GME_COPY_FIELD( h, out, song );
+
+ if ( strcmp( h.game, "Unknown Game" ) )
+ GME_COPY_FIELD( h, out, game );
+
+ if ( strcmp( h.copyright, "Unknown Publisher" ) )
+ GME_COPY_FIELD( h, out, copyright );
+
+ if ( strcmp( h.dumper, "Unknown Person" ) )
+ GME_COPY_FIELD( h, out, dumper );
+
+ if ( strcmp( h.comment, "Header added by YMAMP" ) )
+ GME_COPY_FIELD( h, out, comment );
+}
+
+static int gym_track_length( byte const p [], byte const* end )
+{
+ int time = 0;
+ while ( p < end )
+ {
+ switch ( *p++ )
+ {
+ case 0:
+ time++;
+ break;
+
+ case 1:
+ case 2:
+ p += 2;
+ break;
+
+ case 3:
+ p += 1;
+ break;
+ }
+ }
+ return time;
+}
+
+blargg_err_t Gym_Emu::track_info_( track_info_t* out, int ) const
+{
+ get_gym_info( header_, gym_track_length( log_begin(), file_end() ), out );
+ return blargg_ok;
+}
+
+static blargg_err_t check_header( byte const in [], int size, int* data_offset = NULL )
+{
+ if ( size < 4 )
+ return blargg_err_file_type;
+
+ if ( memcmp( in, "GYMX", 4 ) == 0 )
+ {
+ if ( size < Gym_Emu::header_t::size + 1 )
+ return blargg_err_file_type;
+
+ if ( memcmp( ((Gym_Emu::header_t const*) in)->packed, "\0\0\0\0", 4 ) != 0 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_FEATURE, "packed GYM file" );
+
+ if ( data_offset )
+ *data_offset = Gym_Emu::header_t::size;
+ }
+ else if ( *in > 3 )
+ {
+ return blargg_err_file_type;
+ }
+
+ return blargg_ok;
+}
+
+struct Gym_File : Gme_Info_
+{
+ int data_offset;
+
+ Gym_File() { set_type( gme_gym_type ); }
+
+ blargg_err_t load_mem_( byte const in [], int size )
+ {
+ data_offset = 0;
+ return check_header( in, size, &data_offset );
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ int length = gym_track_length( &file_begin() [data_offset], file_end() );
+ get_gym_info( *(Gym_Emu::header_t const*) file_begin(), length, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_gym_emu () { return BLARGG_NEW Gym_Emu ; }
+static Music_Emu* new_gym_file() { return BLARGG_NEW Gym_File; }
+
+gme_type_t_ const gme_gym_type [1] = {{ "Sega Genesis", 1, &new_gym_emu, &new_gym_file, "GYM", 0 }};
+
+// Setup
+
+blargg_err_t Gym_Emu::set_sample_rate_( int sample_rate )
+{
+ blip_eq_t eq( -32, 8000, sample_rate );
+ apu.treble_eq( eq );
+ pcm_synth.treble_eq( eq );
+
+ apu.volume( 0.135 * fm_gain * gain() );
+
+ double factor = oversample;
+ if ( disable_oversampling_ )
+ factor = (double) base_clock / 7 / 144 / sample_rate;
+ RETURN_ERR( resampler.setup( factor, 0.990, fm_gain * gain() ) );
+ factor = resampler.rate();
+ double fm_rate = sample_rate * factor;
+
+ RETURN_ERR( stereo_buf.set_sample_rate( sample_rate, int (1000 / 60.0 / min_tempo) ) );
+ stereo_buf.clock_rate( clock_rate );
+
+ RETURN_ERR( fm.set_rate( fm_rate, base_clock / 7.0 ) );
+ RETURN_ERR( resampler.reset( (int) (1.0 / 60 / min_tempo * sample_rate) ) );
+
+ return blargg_ok;
+}
+
+void Gym_Emu::set_tempo_( double t )
+{
+ if ( t < min_tempo )
+ {
+ set_tempo( min_tempo );
+ return;
+ }
+
+ if ( stereo_buf.sample_rate() )
+ {
+ double denom = tempo() * 60;
+ clocks_per_frame = (int) (clock_rate / denom);
+ resampler.resize( (int) (sample_rate() / denom) );
+ }
+}
+
+void Gym_Emu::mute_voices_( int mask )
+{
+ Music_Emu::mute_voices_( mask );
+ fm.mute_voices( mask );
+ apu.set_output( (mask & 0x80) ? 0 : stereo_buf.center() );
+ pcm_synth.volume( (mask & 0x40) ? 0.0 : 0.125 / 256 * fm_gain * gain() );
+}
+
+blargg_err_t Gym_Emu::load_mem_( byte const in [], int size )
+{
+ assert( offsetof (header_t,packed [4]) == header_t::size );
+ log_offset = 0;
+ RETURN_ERR( check_header( in, size, &log_offset ) );
+
+ loop_begin = NULL;
+
+ static const char* const names [] = {
+ "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "PCM", "PSG"
+ };
+ set_voice_names( names );
+
+ set_voice_count( 8 );
+
+ if ( log_offset )
+ header_ = *(header_t const*) in;
+ else
+ memset( &header_, 0, sizeof header_ );
+
+ return blargg_ok;
+}
+
+// Emulation
+
+blargg_err_t Gym_Emu::start_track_( int track )
+{
+ RETURN_ERR( Music_Emu::start_track_( track ) );
+
+ pos = log_begin();
+ loop_remain = get_le32( header_.loop_start );
+
+ prev_pcm_count = 0;
+ pcm_enabled = 0;
+ pcm_amp = -1;
+
+ fm.reset();
+ apu.reset();
+ stereo_buf.clear();
+ resampler.clear();
+ pcm_buf = stereo_buf.center();
+ return blargg_ok;
+}
+
+void Gym_Emu::run_pcm( byte const pcm_in [], int pcm_count )
+{
+ // Guess beginning and end of sample and adjust rate and buffer position accordingly.
+
+ // count dac samples in next frame
+ int next_pcm_count = 0;
+ const byte* p = this->pos;
+ int cmd;
+ while ( (cmd = *p++) != 0 )
+ {
+ int data = *p++;
+ if ( cmd <= 2 )
+ ++p;
+ if ( cmd == 1 && data == 0x2A )
+ next_pcm_count++;
+ }
+
+ // detect beginning and end of sample
+ int rate_count = pcm_count;
+ int start = 0;
+ if ( !prev_pcm_count && next_pcm_count && pcm_count < next_pcm_count )
+ {
+ rate_count = next_pcm_count;
+ start = next_pcm_count - pcm_count;
+ }
+ else if ( prev_pcm_count && !next_pcm_count && pcm_count < prev_pcm_count )
+ {
+ rate_count = prev_pcm_count;
+ }
+
+ // Evenly space samples within buffer section being used
+ blip_resampled_time_t period = pcm_buf->resampled_duration( clocks_per_frame ) / rate_count;
+
+ blip_resampled_time_t time = pcm_buf->resampled_time( 0 ) + period * start + (unsigned) period / 2;
+
+ int pcm_amp = this->pcm_amp;
+ if ( pcm_amp < 0 )
+ pcm_amp = pcm_in [0];
+
+ for ( int i = 0; i < pcm_count; i++ )
+ {
+ int delta = pcm_in [i] - pcm_amp;
+ pcm_amp += delta;
+ pcm_synth.offset_resampled( time, delta, pcm_buf );
+ time += period;
+ }
+ this->pcm_amp = pcm_amp;
+ pcm_buf->set_modified();
+}
+
+void Gym_Emu::parse_frame()
+{
+ byte pcm [1024]; // all PCM writes for frame
+ int pcm_size = 0;
+ const byte* pos = this->pos;
+
+ if ( loop_remain && !--loop_remain )
+ loop_begin = pos; // find loop on first time through sequence
+
+ int cmd;
+ while ( (cmd = *pos++) != 0 )
+ {
+ int data = *pos++;
+ if ( cmd == 1 )
+ {
+ int data2 = *pos++;
+ if ( data == 0x2A )
+ {
+ pcm [pcm_size] = data2;
+ if ( pcm_size < (int) sizeof pcm - 1 )
+ pcm_size += pcm_enabled;
+ }
+ else
+ {
+ if ( data == 0x2B )
+ pcm_enabled = data2 >> 7 & 1;
+
+ fm.write0( data, data2 );
+ }
+ }
+ else if ( cmd == 2 )
+ {
+ int data2 = *pos++;
+ if ( data == 0xB6 )
+ {
+ Blip_Buffer * pcm_buf = NULL;
+ switch ( data2 >> 6 )
+ {
+ case 0: pcm_buf = NULL; break;
+ case 1: pcm_buf = stereo_buf.right(); break;
+ case 2: pcm_buf = stereo_buf.left(); break;
+ case 3: pcm_buf = stereo_buf.center(); break;
+ }
+ /*if ( this->pcm_buf != pcm_buf )
+ {
+ if ( this->pcm_buf ) pcm_synth.offset_inline( 0, -pcm_amp, this->pcm_buf );
+ if ( pcm_buf ) pcm_synth.offset_inline( 0, pcm_amp, pcm_buf );
+ }*/
+ this->pcm_buf = pcm_buf;
+ }
+ fm.write1( data, data2 );
+ }
+ else if ( cmd == 3 )
+ {
+ apu.write_data( 0, data );
+ }
+ else
+ {
+ // to do: many GYM streams are full of errors, and error count should
+ // reflect cases where music is really having problems
+ //log_error();
+ --pos; // put data back
+ }
+ }
+
+ if ( pos >= file_end() )
+ {
+ // Reached end
+ check( pos == file_end() );
+
+ if ( loop_begin )
+ pos = loop_begin;
+ else
+ set_track_ended();
+ }
+ this->pos = pos;
+
+ // PCM
+ if ( pcm_buf && pcm_size )
+ run_pcm( pcm, pcm_size );
+ prev_pcm_count = pcm_size;
+}
+
+inline int Gym_Emu::play_frame( blip_time_t blip_time, int sample_count, sample_t buf [] )
+{
+ if ( !track_ended() )
+ parse_frame();
+
+ apu.end_frame( blip_time );
+
+ memset( buf, 0, sample_count * sizeof *buf );
+ fm.run( sample_count >> 1, buf );
+
+ return sample_count;
+}
+
+int Gym_Emu::play_frame_( void* p, blip_time_t a, int b, sample_t c [] )
+{
+ return STATIC_CAST(Gym_Emu*,p)->play_frame( a, b, c );
+}
+
+blargg_err_t Gym_Emu::play_( int count, sample_t out [] )
+{
+ resampler.dual_play( count, out, stereo_buf );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.h
new file mode 100644
index 00000000..e8df596b
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Gym_Emu.h
@@ -0,0 +1,86 @@
+// Sega Genesis/Mega Drive GYM music file emulator
+// Performs PCM timing recovery to improve sample quality.
+
+// Game_Music_Emu 0.6-pre
+#ifndef GYM_EMU_H
+#define GYM_EMU_H
+
+#include "Dual_Resampler.h"
+#include "Ym2612_Emu.h"
+#include "Music_Emu.h"
+#include "Sms_Apu.h"
+
+class Gym_Emu : public Music_Emu {
+public:
+
+ // GYM file header (optional; many files have NO header at all)
+ struct header_t
+ {
+ enum { size = 428 };
+
+ char tag [ 4];
+ char song [ 32];
+ char game [ 32];
+ char copyright [ 32];
+ char emulator [ 32];
+ char dumper [ 32];
+ char comment [256];
+ byte loop_start [ 4]; // in 1/60 seconds, 0 if not looped
+ byte packed [ 4];
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return header_; }
+
+ static gme_type_t static_type() { return gme_gym_type; }
+
+ // Disables running FM chips at higher than normal rate. Will result in slightly
+ // more aliasing of high notes.
+ void disable_oversampling( bool disable = true ) { disable_oversampling_ = disable; }
+
+// Implementation
+public:
+ Gym_Emu();
+ ~Gym_Emu();
+
+protected:
+ virtual blargg_err_t load_mem_( byte const [], int );
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t set_sample_rate_( int sample_rate );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t play_( int count, sample_t [] );
+ virtual void mute_voices_( int );
+ virtual void set_tempo_( double );
+
+private:
+ // Log
+ byte const* pos; // current position
+ byte const* loop_begin;
+ int log_offset; // size of header (0 or header_t::size)
+ int loop_remain; // frames remaining until loop_begin has been located
+ int clocks_per_frame;
+
+ bool disable_oversampling_;
+
+ // PCM
+ int pcm_amp;
+ int prev_pcm_count; // for detecting beginning/end of group of samples
+ int pcm_enabled;
+
+ // large objects
+ Dual_Resampler resampler;
+ Stereo_Buffer stereo_buf;
+ Blip_Buffer * pcm_buf;
+ Ym2612_Emu fm;
+ Sms_Apu apu;
+ Blip_Synth_Fast pcm_synth;
+ header_t header_;
+
+ byte const* log_begin() const { return file_begin() + log_offset; }
+ void parse_frame();
+ void run_pcm( byte const in [], int count );
+ int play_frame( blip_time_t blip_time, int sample_count, sample_t buf [] );
+ static int play_frame_( void*, blip_time_t, int, sample_t [] );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.cpp
new file mode 100644
index 00000000..99afdf87
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.cpp
@@ -0,0 +1,361 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Hes_Apu.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+bool const center_waves = true; // reduces asymmetry and clamping when starting notes
+
+Hes_Apu::Hes_Apu()
+{
+ for ( Osc* osc = &oscs [osc_count]; osc != oscs; )
+ {
+ osc--;
+ osc->output [0] = NULL;
+ osc->output [1] = NULL;
+ osc->outputs [0] = NULL;
+ osc->outputs [1] = NULL;
+ osc->outputs [2] = NULL;
+ }
+
+ reset();
+}
+
+void Hes_Apu::reset()
+{
+ latch = 0;
+ balance = 0xFF;
+
+ for ( Osc* osc = &oscs [osc_count]; osc != oscs; )
+ {
+ osc--;
+ memset( osc, 0, offsetof (Osc,output) );
+ osc->lfsr = 0;
+ osc->control = 0x40;
+ osc->balance = 0xFF;
+ }
+
+ // Only last two oscs support noise
+ oscs [osc_count - 2].lfsr = 0x200C3; // equivalent to 1 in Fibonacci LFSR
+ oscs [osc_count - 1].lfsr = 0x200C3;
+}
+
+void Hes_Apu::set_output( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ // Must be silent (all NULL), mono (left and right NULL), or stereo (none NULL)
+ require( !center || (center && !left && !right) || (center && left && right) );
+ require( (unsigned) i < osc_count ); // fails if you pass invalid osc index
+
+ if ( !center || !left || !right )
+ {
+ left = center;
+ right = center;
+ }
+
+ Osc& o = oscs [i];
+ o.outputs [0] = center;
+ o.outputs [1] = left;
+ o.outputs [2] = right;
+ balance_changed( o );
+}
+
+void Hes_Apu::run_osc( Blip_Synth_Fast& syn, Osc& o, blip_time_t end_time )
+{
+ int vol0 = o.volume [0];
+ int vol1 = o.volume [1];
+ int dac = o.dac;
+
+ Blip_Buffer* out0 = o.output [0]; // cache often-used values
+ Blip_Buffer* out1 = o.output [1];
+ if ( !(o.control & 0x80) )
+ out0 = NULL;
+
+ if ( out0 )
+ {
+ // Update amplitudes
+ if ( out1 )
+ {
+ int delta = dac * vol1 - o.last_amp [1];
+ if ( delta )
+ {
+ syn.offset( o.last_time, delta, out1 );
+ out1->set_modified();
+ }
+ }
+ int delta = dac * vol0 - o.last_amp [0];
+ if ( delta )
+ {
+ syn.offset( o.last_time, delta, out0 );
+ out0->set_modified();
+ }
+
+ // Don't generate if silent
+ if ( !(vol0 | vol1) )
+ out0 = NULL;
+ }
+
+ // Generate noise
+ int noise = 0;
+ if ( o.lfsr )
+ {
+ noise = o.noise & 0x80;
+
+ blip_time_t time = o.last_time + o.noise_delay;
+ if ( time < end_time )
+ {
+ int period = (~o.noise & 0x1F) * 128;
+ if ( !period )
+ period = 64;
+
+ if ( noise && out0 )
+ {
+ unsigned lfsr = o.lfsr;
+ do
+ {
+ int new_dac = -(lfsr & 1);
+ lfsr = (lfsr >> 1) ^ (0x30061 & new_dac);
+
+ int delta = (new_dac &= 0x1F) - dac;
+ if ( delta )
+ {
+ dac = new_dac;
+ syn.offset( time, delta * vol0, out0 );
+ if ( out1 )
+ syn.offset( time, delta * vol1, out1 );
+ }
+ time += period;
+ }
+ while ( time < end_time );
+
+ if ( !lfsr )
+ {
+ lfsr = 1;
+ check( false );
+ }
+ o.lfsr = lfsr;
+
+ out0->set_modified();
+ if ( out1 )
+ out1->set_modified();
+ }
+ else
+ {
+ // Maintain phase when silent
+ int count = (end_time - time + period - 1) / period;
+ time += count * period;
+
+ // not worth it
+ //while ( count-- )
+ // o.lfsr = (o.lfsr >> 1) ^ (0x30061 * (o.lfsr & 1));
+ }
+ }
+ o.noise_delay = time - end_time;
+ }
+
+ // Generate wave
+ blip_time_t time = o.last_time + o.delay;
+ if ( time < end_time )
+ {
+ int phase = (o.phase + 1) & 0x1F; // pre-advance for optimal inner loop
+ int period = o.period * 2;
+
+ if ( period >= 14 && out0 && !((o.control & 0x40) | noise) )
+ {
+ do
+ {
+ int new_dac = o.wave [phase];
+ phase = (phase + 1) & 0x1F;
+ int delta = new_dac - dac;
+ if ( delta )
+ {
+ dac = new_dac;
+ syn.offset( time, delta * vol0, out0 );
+ if ( out1 )
+ syn.offset( time, delta * vol1, out1 );
+ }
+ time += period;
+ }
+ while ( time < end_time );
+ out0->set_modified();
+ if ( out1 )
+ out1->set_modified();
+ }
+ else
+ {
+ // Maintain phase when silent
+ int count = end_time - time;
+ if ( !period )
+ period = 1;
+ count = (count + period - 1) / period;
+
+ phase += count; // phase will be masked below
+ time += count * period;
+ }
+
+ // TODO: Find whether phase increments even when both volumes are zero.
+ // CAN'T simply check for out0 being non-NULL, since it could be NULL
+ // if channel is muted in player, but still has non-zero volume.
+ // City Hunter breaks when this check is removed.
+ if ( !(o.control & 0x40) && (vol0 | vol1) )
+ o.phase = (phase - 1) & 0x1F; // undo pre-advance
+ }
+ o.delay = time - end_time;
+ check( o.delay >= 0 );
+
+ o.last_time = end_time;
+ o.dac = dac;
+ o.last_amp [0] = dac * vol0;
+ o.last_amp [1] = dac * vol1;
+}
+
+void Hes_Apu::balance_changed( Osc& osc )
+{
+ static short const log_table [32] = { // ~1.5 db per step
+ #define ENTRY( factor ) short (factor * amp_range / 31.0 + 0.5)
+ ENTRY( 0.000000 ),ENTRY( 0.005524 ),ENTRY( 0.006570 ),ENTRY( 0.007813 ),
+ ENTRY( 0.009291 ),ENTRY( 0.011049 ),ENTRY( 0.013139 ),ENTRY( 0.015625 ),
+ ENTRY( 0.018581 ),ENTRY( 0.022097 ),ENTRY( 0.026278 ),ENTRY( 0.031250 ),
+ ENTRY( 0.037163 ),ENTRY( 0.044194 ),ENTRY( 0.052556 ),ENTRY( 0.062500 ),
+ ENTRY( 0.074325 ),ENTRY( 0.088388 ),ENTRY( 0.105112 ),ENTRY( 0.125000 ),
+ ENTRY( 0.148651 ),ENTRY( 0.176777 ),ENTRY( 0.210224 ),ENTRY( 0.250000 ),
+ ENTRY( 0.297302 ),ENTRY( 0.353553 ),ENTRY( 0.420448 ),ENTRY( 0.500000 ),
+ ENTRY( 0.594604 ),ENTRY( 0.707107 ),ENTRY( 0.840896 ),ENTRY( 1.000000 ),
+ #undef ENTRY
+ };
+
+ int vol = (osc.control & 0x1F) - 0x1E * 2;
+
+ int left = vol + (osc.balance >> 3 & 0x1E) + (balance >> 3 & 0x1E);
+ if ( left < 0 ) left = 0;
+
+ int right = vol + (osc.balance << 1 & 0x1E) + (balance << 1 & 0x1E);
+ if ( right < 0 ) right = 0;
+
+ // optimizing for the common case of being centered also allows easy
+ // panning using Effects_Buffer
+
+ // Separate balance into center volume and additional on either left or right
+ osc.output [0] = osc.outputs [0]; // center
+ osc.output [1] = osc.outputs [2]; // right
+ int base = log_table [left ];
+ int side = log_table [right] - base;
+ if ( side < 0 )
+ {
+ base += side;
+ side = -side;
+ osc.output [1] = osc.outputs [1]; // left
+ }
+
+ // Optimize when output is far left, center, or far right
+ if ( !base || osc.output [0] == osc.output [1] )
+ {
+ base += side;
+ side = 0;
+ osc.output [0] = osc.output [1];
+ osc.output [1] = NULL;
+ osc.last_amp [1] = 0;
+ }
+
+ if ( center_waves )
+ {
+ // TODO: this can leave a non-zero level in a buffer (minor)
+ osc.last_amp [0] += (base - osc.volume [0]) * 16;
+ osc.last_amp [1] += (side - osc.volume [1]) * 16;
+ }
+
+ osc.volume [0] = base;
+ osc.volume [1] = side;
+}
+
+void Hes_Apu::write_data( blip_time_t time, int addr, int data )
+{
+ if ( addr == 0x800 )
+ {
+ latch = data & 7;
+ }
+ else if ( addr == 0x801 )
+ {
+ if ( balance != data )
+ {
+ balance = data;
+
+ for ( Osc* osc = &oscs [osc_count]; osc != oscs; )
+ {
+ osc--;
+ run_osc( synth, *osc, time );
+ balance_changed( *oscs );
+ }
+ }
+ }
+ else if ( latch < osc_count )
+ {
+ Osc& osc = oscs [latch];
+ run_osc( synth, osc, time );
+ switch ( addr )
+ {
+ case 0x802:
+ osc.period = (osc.period & 0xF00) | data;
+ break;
+
+ case 0x803:
+ osc.period = (osc.period & 0x0FF) | ((data & 0x0F) << 8);
+ break;
+
+ case 0x804:
+ if ( osc.control & 0x40 & ~data )
+ osc.phase = 0;
+ osc.control = data;
+ balance_changed( osc );
+ break;
+
+ case 0x805:
+ osc.balance = data;
+ balance_changed( osc );
+ break;
+
+ case 0x806:
+ data &= 0x1F;
+ if ( !(osc.control & 0x40) )
+ {
+ osc.wave [osc.phase] = data;
+ osc.phase = (osc.phase + 1) & 0x1F;
+ }
+ else if ( osc.control & 0x80 )
+ {
+ osc.dac = data;
+ }
+ break;
+
+ case 0x807:
+ osc.noise = data;
+ break;
+
+ case 0x809:
+ if ( !(data & 0x80) && (data & 0x03) != 0 )
+ dprintf( "HES LFO not supported\n" );
+ }
+ }
+}
+
+void Hes_Apu::end_frame( blip_time_t end_time )
+{
+ for ( Osc* osc = &oscs [osc_count]; osc != oscs; )
+ {
+ osc--;
+ if ( end_time > osc->last_time )
+ run_osc( synth, *osc, end_time );
+ osc->last_time -= end_time;
+ check( osc->last_time >= 0 );
+ }
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.h
new file mode 100644
index 00000000..6375993c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu.h
@@ -0,0 +1,87 @@
+// Turbo Grafx 16 (PC Engine) PSG sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef HES_APU_H
+#define HES_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Hes_Apu {
+public:
+// Basics
+
+ // Sets buffer(s) to generate sound into, or 0 to mute. If only center is not 0,
+ // output is mono.
+ void set_output( Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Emulates to time t, then writes data to addr
+ void write_data( blip_time_t t, int addr, int data );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Resets sound chip
+ void reset();
+
+ // Same as set_output(), but for a particular channel
+ enum { osc_count = 6 }; // 0 <= chan < osc_count
+ void set_output( int chan, Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Sets treble equalization
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+ // Sets overall volume, where 1.0 is normal
+ void volume( double v ) { synth.volume( 1.8 / osc_count / amp_range * v ); }
+
+ // Registers are at io_addr to io_addr+io_size-1
+ enum { io_addr = 0x0800 };
+ enum { io_size = 10 };
+
+// Implementation
+public:
+ Hes_Apu();
+ typedef BOOST::uint8_t byte;
+
+private:
+ enum { amp_range = 0x8000 };
+ struct Osc
+ {
+ byte wave [32];
+ int delay;
+ int period;
+ int phase;
+
+ int noise_delay;
+ byte noise;
+ unsigned lfsr;
+
+ byte control;
+ byte balance;
+ byte dac;
+ short volume [2];
+ int last_amp [2];
+
+ blip_time_t last_time;
+ Blip_Buffer* output [2];
+ Blip_Buffer* outputs [3];
+ };
+ Osc oscs [osc_count];
+ int latch;
+ int balance;
+ Blip_Synth_Fast synth;
+
+ void balance_changed( Osc& );
+ static void run_osc( Blip_Synth_Fast&, Osc&, blip_time_t );
+};
+
+inline void Hes_Apu::set_output( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ for ( int i = osc_count; --i >= 0; )
+ set_output( i, c, l, r );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.cpp
new file mode 100644
index 00000000..14eb6910
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.cpp
@@ -0,0 +1,309 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Hes_Apu_Adpcm.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Hes_Apu_Adpcm::Hes_Apu_Adpcm()
+{
+ output = NULL;
+
+ memset( &state, 0, sizeof( state ) );
+
+ reset();
+}
+
+void Hes_Apu_Adpcm::reset()
+{
+ last_time = 0;
+ next_timer = 0;
+ last_amp = 0;
+
+ memset( &state.pcmbuf, 0, sizeof(state.pcmbuf) );
+ memset( &state.port, 0, sizeof(state.port) );
+
+ state.ad_sample = 0;
+ state.ad_ref_index = 0;
+
+ state.addr = 0;
+ state.freq = 0;
+ state.writeptr = 0;
+ state.readptr = 0;
+ state.playflag = 0;
+ state.repeatflag = 0;
+ state.length = 0;
+ state.volume = 0xFF;
+ state.fadetimer = 0;
+ state.fadecount = 0;
+}
+
+void Hes_Apu_Adpcm::set_output( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ // Must be silent (all NULL), mono (left and right NULL), or stereo (none NULL)
+ require( !center || (center && !left && !right) || (center && left && right) );
+ require( (unsigned) i < osc_count ); // fails if you pass invalid osc index
+
+ if ( !center || !left || !right )
+ {
+ left = center;
+ right = center;
+ }
+
+ output = center;
+}
+
+void Hes_Apu_Adpcm::run_until( blip_time_t end_time )
+{
+ int volume = state.volume;
+ int fadetimer = state.fadetimer;
+ int fadecount = state.fadecount;
+ int last_time = this->last_time;
+ double next_timer = this->next_timer;
+ int last_amp = this->last_amp;
+
+ Blip_Buffer* output = this->output; // cache often-used values
+
+ while ( state.playflag && last_time < end_time )
+ {
+ while ( last_time >= next_timer )
+ {
+ if ( fadetimer )
+ {
+ if ( fadecount > 0 )
+ {
+ fadecount--;
+ volume = 0xFF * fadecount / fadetimer;
+ }
+ else if ( fadecount < 0 )
+ {
+ fadecount++;
+ volume = 0xFF - ( 0xFF * fadecount / fadetimer );
+ }
+ }
+ next_timer += 7159.091;
+ }
+ int amp;
+ if ( state.ad_low_nibble )
+ {
+ amp = adpcm_decode( state.pcmbuf[ state.playptr ] & 0x0F );
+ state.ad_low_nibble = false;
+ state.playptr++;
+ state.playedsamplecount++;
+ if ( state.playedsamplecount == state.playlength )
+ {
+ state.playflag = 0;
+ }
+ }
+ else
+ {
+ amp = adpcm_decode( state.pcmbuf[ state.playptr ] >> 4 );
+ state.ad_low_nibble = true;
+ }
+ amp = amp * volume / 0xFF;
+ int delta = amp - last_amp;
+ if ( output && delta )
+ {
+ last_amp = amp;
+ synth.offset_inline( last_time, delta, output );
+ }
+ last_time += state.freq;
+ }
+
+ if ( !state.playflag )
+ {
+ while ( next_timer <= end_time ) next_timer += 7159.091;
+ last_time = end_time;
+ }
+
+ this->last_time = last_time;
+ this->next_timer = next_timer;
+ this->last_amp = last_amp;
+ state.volume = volume;
+ state.fadetimer = fadetimer;
+ state.fadecount = fadecount;
+}
+
+void Hes_Apu_Adpcm::write_data( blip_time_t time, int addr, int data )
+{
+ if ( time > last_time ) run_until( time );
+
+ data &= 0xFF;
+ state.port[ addr & 15 ] = data;
+ switch ( addr & 15 )
+ {
+ case 8:
+ state.addr &= 0xFF00;
+ state.addr |= data;
+ break;
+ case 9:
+ state.addr &= 0xFF;
+ state.addr |= data << 8;
+ break;
+ case 10:
+ state.pcmbuf[ state.writeptr++ ] = data;
+ state.playlength ++;
+ break;
+ case 11:
+ dprintf("ADPCM DMA 0x%02X", data);
+ break;
+ case 13:
+ if ( data & 0x80 )
+ {
+ state.addr = 0;
+ state.freq = 0;
+ state.writeptr = 0;
+ state.readptr = 0;
+ state.playflag = 0;
+ state.repeatflag = 0;
+ state.length = 0;
+ state.volume = 0xFF;
+ }
+ if ( ( data & 3 ) == 3 )
+ {
+ state.writeptr = state.addr;
+ }
+ if ( data & 8 )
+ {
+ state.readptr = state.addr ? state.addr - 1 : state.addr;
+ }
+ if ( data & 0x10 )
+ {
+ state.length = state.addr;
+ }
+ state.repeatflag = data & 0x20;
+ state.playflag = data & 0x40;
+ if ( state.playflag )
+ {
+ state.playptr = state.readptr;
+ state.playlength = state.length + 1;
+ state.playedsamplecount = 0;
+ state.ad_sample = 0;
+ state.ad_low_nibble = false;
+ }
+ break;
+ case 14:
+ state.freq = 7159091 / ( 32000 / ( 16 - ( data & 15 ) ) );
+ break;
+ case 15:
+ switch ( data & 15 )
+ {
+ case 0:
+ case 8:
+ case 12:
+ state.fadetimer = -100;
+ state.fadecount = state.fadetimer;
+ break;
+ case 10:
+ state.fadetimer = 5000;
+ state.fadecount = state.fadetimer;
+ break;
+ case 14:
+ state.fadetimer = 1500;
+ state.fadecount = state.fadetimer;
+ break;
+ }
+ break;
+ }
+}
+
+int Hes_Apu_Adpcm::read_data( blip_time_t time, int addr )
+{
+ if ( time > last_time ) run_until( time );
+
+ switch ( addr & 15 )
+ {
+ case 10:
+ return state.pcmbuf [state.readptr++];
+ case 11:
+ return state.port [11] & ~1;
+ case 12:
+ if (!state.playflag)
+ {
+ state.port [12] |= 1;
+ state.port [12] &= ~8;
+ }
+ else
+ {
+ state.port [12] &= ~1;
+ state.port [12] |= 8;
+ }
+ return state.port [12];
+ case 13:
+ return state.port [13];
+ }
+
+ return 0xFF;
+}
+
+void Hes_Apu_Adpcm::end_frame( blip_time_t end_time )
+{
+ run_until( end_time );
+ last_time -= end_time;
+ next_timer -= (double)end_time;
+ check( last_time >= 0 );
+ if ( output )
+ output->set_modified();
+}
+
+static short stepsize[49] = {
+ 16, 17, 19, 21, 23, 25, 28,
+ 31, 34, 37, 41, 45, 50, 55,
+ 60, 66, 73, 80, 88, 97, 107,
+ 118, 130, 143, 157, 173, 190, 209,
+ 230, 253, 279, 307, 337, 371, 408,
+ 449, 494, 544, 598, 658, 724, 796,
+ 876, 963,1060,1166,1282,1411,1552
+};
+
+int Hes_Apu_Adpcm::adpcm_decode( int code )
+{
+ int step = stepsize[state.ad_ref_index];
+ int delta;
+ int c = code & 7;
+#if 1
+ delta = 0;
+ if ( c & 4 ) delta += step;
+ step >>= 1;
+ if ( c & 2 ) delta += step;
+ step >>= 1;
+ if ( c & 1 ) delta += step;
+ step >>= 1;
+ delta += step;
+#else
+ delta = ( ( c + c + 1 ) * step ) / 8; // maybe faster, but introduces rounding
+#endif
+ if ( c != code )
+ {
+ state.ad_sample -= delta;
+ if ( state.ad_sample < -2048 )
+ state.ad_sample = -2048;
+ }
+ else
+ {
+ state.ad_sample += delta;
+ if ( state.ad_sample > 2047 )
+ state.ad_sample = 2047;
+ }
+
+ static int const steps [8] = {
+ -1, -1, -1, -1, 2, 4, 6, 8
+ };
+ state.ad_ref_index += steps [c];
+ if ( state.ad_ref_index < 0 )
+ state.ad_ref_index = 0;
+ else if ( state.ad_ref_index > 48 )
+ state.ad_ref_index = 48;
+
+ return state.ad_sample;
+} \ No newline at end of file
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.h b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.h
new file mode 100644
index 00000000..a75b369a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Apu_Adpcm.h
@@ -0,0 +1,94 @@
+// Turbo Grafx 16 (PC Engine) ADPCM sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef HES_APU_ADPCM_H
+#define HES_APU_ADPCM_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Hes_Apu_Adpcm {
+public:
+// Basics
+
+ // Sets buffer(s) to generate sound into, or 0 to mute. If only center is not 0,
+ // output is mono.
+ void set_output( Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Emulates to time t, then writes data to addr
+ void write_data( blip_time_t t, int addr, int data );
+
+ // Emulates to time t, then reads from addr
+ int read_data( blip_time_t t, int addr );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Resets sound chip
+ void reset();
+
+ // Same as set_output(), but for a particular channel
+ enum { osc_count = 1 }; // 0 <= chan < osc_count
+ void set_output( int chan, Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Sets treble equalization
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+ // Sets overall volume, where 1.0 is normal
+ void volume( double v ) { synth.volume( 0.6 / osc_count / amp_range * v ); }
+
+ // Registers are at io_addr to io_addr+io_size-1
+ enum { io_addr = 0x1800 };
+ enum { io_size = 0x400 };
+
+// Implementation
+public:
+ Hes_Apu_Adpcm();
+ typedef BOOST::uint8_t byte;
+
+private:
+ enum { amp_range = 2048 };
+
+ struct State
+ {
+ byte pcmbuf [0x10000];
+ byte port [0x10];
+ int ad_sample;
+ int ad_ref_index;
+ bool ad_low_nibble;
+ int freq;
+ unsigned short addr;
+ unsigned short writeptr;
+ unsigned short readptr;
+ unsigned short playptr;
+ byte playflag;
+ byte repeatflag;
+ int length;
+ int playlength;
+ int playedsamplecount;
+ int volume;
+ int fadetimer;
+ int fadecount;
+ };
+ State state;
+ Blip_Synth_Fast synth;
+
+ Blip_Buffer* output;
+ blip_time_t last_time;
+ double next_timer;
+ int last_amp;
+
+ void run_until( blip_time_t );
+
+ int adpcm_decode( int );
+};
+
+inline void Hes_Apu_Adpcm::set_output( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ set_output( 0, c, l, r );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.cpp
new file mode 100644
index 00000000..2640ad1f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.cpp
@@ -0,0 +1,408 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Hes_Core.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const timer_mask = 0x04;
+int const vdp_mask = 0x02;
+int const i_flag_mask = 0x04;
+int const unmapped = 0xFF;
+
+int const period_60hz = 262 * 455; // scanlines * clocks per scanline
+
+Hes_Core::Hes_Core() : rom( Hes_Cpu::page_size )
+{
+ timer.raw_load = 0;
+}
+
+Hes_Core::~Hes_Core() { }
+
+void Hes_Core::unload()
+{
+ rom.clear();
+ Gme_Loader::unload();
+}
+
+bool Hes_Core::header_t::valid_tag() const
+{
+ return 0 == memcmp( tag, "HESM", 4 );
+}
+
+blargg_err_t Hes_Core::load_( Data_Reader& in )
+{
+ assert( offsetof (header_t,unused [4]) == header_t::size );
+ RETURN_ERR( rom.load( in, header_t::size, &header_, unmapped ) );
+
+ if ( !header_.valid_tag() )
+ return blargg_err_file_type;
+
+ if ( header_.vers != 0 )
+ set_warning( "Unknown file version" );
+
+ if ( memcmp( header_.data_tag, "DATA", 4 ) )
+ set_warning( "Data header missing" );
+
+ if ( memcmp( header_.unused, "\0\0\0\0", 4 ) )
+ set_warning( "Unknown header data" );
+
+ // File spec supports multiple blocks, but I haven't found any, and
+ // many files have bad sizes in the only block, so it's simpler to
+ // just try to load the damn data as best as possible.
+
+ int addr = get_le32( header_.addr );
+ int size = get_le32( header_.data_size );
+ int const rom_max = 0x100000;
+ if ( (unsigned) addr >= (unsigned) rom_max )
+ {
+ set_warning( "Invalid address" );
+ addr &= rom_max - 1;
+ }
+ if ( (unsigned) (addr + size) > (unsigned) rom_max )
+ set_warning( "Invalid size" );
+
+ if ( size != rom.file_size() )
+ {
+ if ( size <= rom.file_size() - 4 && !memcmp( rom.begin() + size, "DATA", 4 ) )
+ set_warning( "Multiple DATA not supported" );
+ else if ( size < rom.file_size() )
+ set_warning( "Extra file data" );
+ else
+ set_warning( "Missing file data" );
+ }
+
+ rom.set_addr( addr );
+
+ return blargg_ok;
+}
+
+void Hes_Core::recalc_timer_load()
+{
+ timer.load = timer.raw_load * timer_base + 1;
+}
+
+void Hes_Core::set_tempo( double t )
+{
+ play_period = (time_t) (period_60hz / t);
+ timer_base = (int) (1024 / t);
+ recalc_timer_load();
+}
+
+blargg_err_t Hes_Core::start_track( int track )
+{
+ memset( ram, 0, sizeof ram ); // some HES music relies on zero fill
+ memset( sgx, 0, sizeof sgx );
+
+ apu_.reset();
+ adpcm_.reset();
+ cpu.reset();
+
+ for ( int i = 0; i < (int) sizeof header_.banks; i++ )
+ set_mmr( i, header_.banks [i] );
+ set_mmr( cpu.page_count, 0xFF ); // unmapped beyond end of address space
+
+ irq.disables = timer_mask | vdp_mask;
+ irq.timer = cpu.future_time;
+ irq.vdp = cpu.future_time;
+
+ timer.enabled = false;
+ timer.raw_load = 0x80;
+ timer.count = timer.load;
+ timer.fired = false;
+ timer.last_time = 0;
+
+ vdp.latch = 0;
+ vdp.control = 0;
+ vdp.next_vbl = 0;
+
+ ram [0x1FF] = (idle_addr - 1) >> 8;
+ ram [0x1FE] = (idle_addr - 1) & 0xFF;
+ cpu.r.sp = 0xFD;
+ cpu.r.pc = get_le16( header_.init_addr );
+ cpu.r.a = track;
+
+ recalc_timer_load();
+
+ return blargg_ok;
+}
+
+// Hardware
+
+void Hes_Core::run_until( time_t present )
+{
+ while ( vdp.next_vbl < present )
+ vdp.next_vbl += play_period;
+
+ time_t elapsed = present - timer.last_time;
+ if ( elapsed > 0 )
+ {
+ if ( timer.enabled )
+ {
+ timer.count -= elapsed;
+ if ( timer.count <= 0 )
+ timer.count += timer.load;
+ }
+ timer.last_time = present;
+ }
+}
+
+void Hes_Core::write_vdp( int addr, int data )
+{
+ switch ( addr )
+ {
+ case 0:
+ vdp.latch = data & 0x1F;
+ break;
+
+ case 2:
+ if ( vdp.latch == 5 )
+ {
+ if ( data & 0x04 )
+ set_warning( "Scanline interrupt unsupported" );
+ run_until( cpu.time() );
+ vdp.control = data;
+ irq_changed();
+ }
+ else
+ {
+ dprintf( "VDP not supported: $%02X <- $%02X\n", vdp.latch, data );
+ }
+ break;
+
+ case 3:
+ dprintf( "VDP MSB not supported: $%02X <- $%02X\n", vdp.latch, data );
+ break;
+ }
+}
+
+void Hes_Core::write_mem_( addr_t addr, int data )
+{
+ time_t time = cpu.time();
+ if ( (unsigned) (addr - apu_.io_addr) < apu_.io_size )
+ {
+ // Avoid going way past end when a long block xfer is writing to I/O space.
+ // Not a problem for other registers below because they don't write to
+ // Blip_Buffer.
+ time_t t = min( time, cpu.end_time() + 8 );
+ apu_.write_data( t, addr, data );
+ return;
+ }
+ if ( (unsigned) (addr - adpcm_.io_addr) < adpcm_.io_size )
+ {
+ time_t t = min( time, cpu.end_time() + 6 );
+ adpcm_.write_data( t, addr, data );
+ return;
+ }
+
+ switch ( addr )
+ {
+ case 0x0000:
+ case 0x0002:
+ case 0x0003:
+ write_vdp( addr, data );
+ return;
+
+ case 0x0C00: {
+ run_until( time );
+ timer.raw_load = (data & 0x7F) + 1;
+ recalc_timer_load();
+ timer.count = timer.load;
+ break;
+ }
+
+ case 0x0C01:
+ data &= 1;
+ if ( timer.enabled == data )
+ return;
+ run_until( time );
+ timer.enabled = data;
+ if ( data )
+ timer.count = timer.load;
+ break;
+
+ case 0x1402:
+ run_until( time );
+ irq.disables = data;
+ if ( (data & 0xF8) && (data & 0xF8) != 0xF8 ) // flag questionable values
+ dprintf( "Int mask: $%02X\n", data );
+ break;
+
+ case 0x1403:
+ run_until( time );
+ if ( timer.enabled )
+ timer.count = timer.load;
+ timer.fired = false;
+ break;
+
+#ifndef NDEBUG
+ case 0x1000: // I/O port
+ case 0x0402: // palette
+ case 0x0403:
+ case 0x0404:
+ case 0x0405:
+ return;
+
+ default:
+ dprintf( "unmapped write $%04X <- $%02X\n", addr, data );
+ return;
+#endif
+ }
+
+ irq_changed();
+}
+
+int Hes_Core::read_mem_( addr_t addr )
+{
+ time_t time = cpu.time();
+ addr &= cpu.page_size - 1;
+ switch ( addr )
+ {
+ case 0x0000:
+ if ( irq.vdp > time )
+ return 0;
+ irq.vdp = cpu.future_time;
+ run_until( time );
+ irq_changed();
+ return 0x20;
+
+ case 0x0002:
+ case 0x0003:
+ dprintf( "VDP read not supported: %d\n", addr );
+ return 0;
+
+ case 0x0C01:
+ //return timer.enabled; // TODO: remove?
+ case 0x0C00:
+ run_until( time );
+ dprintf( "Timer count read\n" );
+ return (unsigned) (timer.count - 1) / timer_base;
+
+ case 0x1402:
+ return irq.disables;
+
+ case 0x1403:
+ {
+ int status = 0;
+ if ( irq.timer <= time ) status |= timer_mask;
+ if ( irq.vdp <= time ) status |= vdp_mask;
+ return status;
+ }
+
+ case 0x180A:
+ case 0x180B:
+ case 0x180C:
+ case 0x180D:
+ return adpcm_.read_data( time, addr );
+
+ #ifndef NDEBUG
+ case 0x1000: // I/O port
+ //case 0x180C: // CD-ROM
+ //case 0x180D:
+ break;
+
+ default:
+ dprintf( "unmapped read $%04X\n", addr );
+ #endif
+ }
+
+ return unmapped;
+}
+
+void Hes_Core::irq_changed()
+{
+ time_t present = cpu.time();
+
+ if ( irq.timer > present )
+ {
+ irq.timer = cpu.future_time;
+ if ( timer.enabled && !timer.fired )
+ irq.timer = present + timer.count;
+ }
+
+ if ( irq.vdp > present )
+ {
+ irq.vdp = cpu.future_time;
+ if ( vdp.control & 0x08 )
+ irq.vdp = vdp.next_vbl;
+ }
+
+ time_t time = cpu.future_time;
+ if ( !(irq.disables & timer_mask) ) time = irq.timer;
+ if ( !(irq.disables & vdp_mask) ) time = min( time, irq.vdp );
+
+ cpu.set_irq_time( time );
+}
+
+int Hes_Core::cpu_done()
+{
+ check( cpu.time() >= cpu.end_time() ||
+ (!(cpu.r.flags & i_flag_mask) && cpu.time() >= cpu.irq_time()) );
+
+ if ( !(cpu.r.flags & i_flag_mask) )
+ {
+ time_t present = cpu.time();
+
+ if ( irq.timer <= present && !(irq.disables & timer_mask) )
+ {
+ timer.fired = true;
+ irq.timer = cpu.future_time;
+ irq_changed(); // overkill, but not worth writing custom code
+ return 0x0A;
+ }
+
+ if ( irq.vdp <= present && !(irq.disables & vdp_mask) )
+ {
+ // work around for bugs with music not acknowledging VDP
+ //run_until( present );
+ //irq.vdp = cpu.future_time;
+ //irq_changed();
+ return 0x08;
+ }
+ }
+ return -1;
+}
+
+static void adjust_time( Hes_Core::time_t& time, Hes_Core::time_t delta )
+{
+ if ( time < Hes_Cpu::future_time )
+ {
+ time -= delta;
+ if ( time < 0 )
+ time = 0;
+ }
+}
+
+blargg_err_t Hes_Core::end_frame( time_t duration )
+{
+ if ( run_cpu( duration ) )
+ set_warning( "Emulation error (illegal instruction)" );
+
+ check( cpu.time() >= duration );
+ //check( time() - duration < 20 ); // Txx instruction could cause going way over
+
+ run_until( duration );
+
+ // end time frame
+ timer.last_time -= duration;
+ vdp.next_vbl -= duration;
+ cpu.end_frame( duration );
+ ::adjust_time( irq.timer, duration );
+ ::adjust_time( irq.vdp, duration );
+ apu_.end_frame( duration );
+ adpcm_.end_frame( duration );
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.h
new file mode 100644
index 00000000..0f5cbf8c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Core.h
@@ -0,0 +1,119 @@
+// TurboGrafx-16/PC Engine HES music file emulator core
+
+// Game_Music_Emu 0.6-pre
+#ifndef HES_CORE_H
+#define HES_CORE_H
+
+#include "Gme_Loader.h"
+#include "Rom_Data.h"
+#include "Hes_Apu.h"
+#include "Hes_Apu_Adpcm.h"
+#include "Hes_Cpu.h"
+
+class Hes_Core : public Gme_Loader {
+public:
+
+ // HES file header
+ enum { info_offset = 0x20 };
+ struct header_t
+ {
+ enum { size = 0x20 };
+
+ byte tag [4];
+ byte vers;
+ byte first_track;
+ byte init_addr [2];
+ byte banks [8];
+ byte data_tag [4];
+ byte data_size [4];
+ byte addr [4];
+ byte unused [4];
+
+ // True if header has valid file signature
+ bool valid_tag() const;
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return header_; }
+
+ // Pointer to ROM data, for getting track information from
+ byte const* data() const { return rom.begin(); }
+
+ // Adjusts rate play routine is called at, where 1.0 is normal.
+ // Can be changed while track is playing.
+ void set_tempo( double );
+
+ // Sound chip
+ Hes_Apu& apu() { return apu_; }
+
+ Hes_Apu_Adpcm& adpcm() { return adpcm_; }
+
+ // Starts track
+ blargg_err_t start_track( int );
+
+ // Ends time frame at time t
+ typedef int time_t;
+ blargg_err_t end_frame( time_t );
+
+// Implementation
+public:
+ Hes_Core();
+ ~Hes_Core();
+ virtual void unload();
+
+protected:
+ virtual blargg_err_t load_( Data_Reader& );
+
+private:
+ enum { idle_addr = 0x1FFF };
+
+ typedef int addr_t;
+ Hes_Cpu cpu;
+ Rom_Data rom;
+ header_t header_;
+ time_t play_period;
+ int timer_base;
+
+ struct {
+ time_t last_time;
+ int count;
+ int load;
+ int raw_load;
+ byte enabled;
+ byte fired;
+ } timer;
+
+ struct {
+ time_t next_vbl;
+ byte latch;
+ byte control;
+ } vdp;
+
+ struct {
+ time_t timer;
+ time_t vdp;
+ byte disables;
+ } irq;
+
+ void recalc_timer_load();
+
+ // large items
+ byte* write_pages [Hes_Cpu::page_count + 1]; // 0 if unmapped or I/O space
+ Hes_Apu apu_;
+ Hes_Apu_Adpcm adpcm_;
+ byte ram [Hes_Cpu::page_size];
+ byte sgx [3 * Hes_Cpu::page_size + Hes_Cpu::cpu_padding];
+
+ void irq_changed();
+ void run_until( time_t );
+ bool run_cpu( time_t end );
+ int read_mem_( addr_t );
+ int read_mem( addr_t );
+ void write_mem_( addr_t, int data );
+ void write_mem( addr_t, int );
+ void write_vdp( int addr, int data );
+ void set_mmr( int reg, int bank );
+ int cpu_done();
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.cpp
new file mode 100644
index 00000000..6c1f7d73
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.cpp
@@ -0,0 +1,123 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Hes_Cpu.h"
+
+#include "blargg_endian.h"
+#include "Hes_Core.h"
+
+//#include "hes_cpu_log.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define PAGE HES_CPU_PAGE
+
+int Hes_Core::read_mem( addr_t addr )
+{
+ check( addr < 0x10000 );
+ int result = *cpu.get_code( addr );
+ if ( cpu.mmr [PAGE( addr )] == 0xFF )
+ result = read_mem_( addr );
+ return result;
+}
+
+void Hes_Core::write_mem( addr_t addr, int data )
+{
+ check( addr < 0x10000 );
+ byte* out = write_pages [PAGE( addr )];
+ if ( out )
+ out [addr & (cpu.page_size - 1)] = data;
+ else if ( cpu.mmr [PAGE( addr )] == 0xFF )
+ write_mem_( addr, data );
+}
+
+void Hes_Core::set_mmr( int page, int bank )
+{
+ write_pages [page] = 0;
+ byte* data = rom.at_addr( bank * cpu.page_size );
+ if ( bank >= 0x80 )
+ {
+ data = 0;
+ switch ( bank )
+ {
+ case 0xF8:
+ data = ram;
+ break;
+
+ case 0xF9:
+ case 0xFA:
+ case 0xFB:
+ data = &sgx [(bank - 0xF9) * cpu.page_size];
+ break;
+
+ default:
+ if ( bank != 0xFF )
+ dprintf( "Unmapped bank $%02X\n", bank );
+ data = rom.unmapped();
+ goto end;
+ }
+
+ write_pages [page] = data;
+ }
+end:
+ cpu.set_mmr( page, bank, data );
+}
+
+#define READ_FAST( addr, out ) \
+{\
+ out = READ_CODE( addr );\
+ if ( CPU.mmr [PAGE( addr )] == 0xFF )\
+ {\
+ FLUSH_TIME();\
+ out = read_mem_( addr );\
+ CACHE_TIME();\
+ }\
+}
+
+#define WRITE_FAST( addr, data ) \
+{\
+ int page = PAGE( addr );\
+ byte* out = write_pages [page];\
+ addr &= CPU.page_size - 1;\
+ if ( out )\
+ {\
+ out [addr] = data;\
+ }\
+ else if ( CPU.mmr [page] == 0xFF )\
+ {\
+ FLUSH_TIME();\
+ write_mem_( addr, data );\
+ CACHE_TIME();\
+ }\
+}
+
+#define READ_LOW( addr ) (ram [addr])
+#define WRITE_LOW( addr, data ) (ram [addr] = data)
+#define READ_MEM( addr ) read_mem( addr )
+#define WRITE_MEM( addr, data ) write_mem( addr, data )
+#define WRITE_VDP( addr, data ) write_vdp( addr, data )
+#define CPU_DONE( result_out ) { FLUSH_TIME(); result_out = cpu_done(); CACHE_TIME(); }
+#define SET_MMR( reg, bank ) set_mmr( reg, bank )
+
+#define CPU cpu
+#define IDLE_ADDR idle_addr
+
+#define CPU_BEGIN \
+bool Hes_Core::run_cpu( time_t end_time )\
+{\
+ cpu.set_end_time( end_time );
+
+ #include "Hes_Cpu_run.h"
+
+ return illegal_encountered;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.h b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.h
new file mode 100644
index 00000000..b71cbc64
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu.h
@@ -0,0 +1,139 @@
+// PC Engine CPU emulator for use with HES music files
+
+// Game_Music_Emu 0.6-pre
+#ifndef HES_CPU_H
+#define HES_CPU_H
+
+#include "blargg_common.h"
+
+class Hes_Cpu {
+public:
+ typedef BOOST::uint8_t byte;
+ typedef int time_t;
+ typedef int addr_t;
+ enum { future_time = INT_MAX/2 + 1 };
+
+ void reset();
+
+ enum { page_bits = 13 };
+ enum { page_size = 1 << page_bits };
+ enum { page_count = 0x10000 / page_size };
+ void set_mmr( int reg, int bank, void const* code );
+
+ byte const* get_code( addr_t );
+
+ // NOT kept updated during emulation.
+ struct registers_t {
+ BOOST::uint16_t pc;
+ byte a;
+ byte x;
+ byte y;
+ byte flags;
+ byte sp;
+ };
+ registers_t r;
+
+ // page mapping registers
+ byte mmr [page_count + 1];
+
+ // Time of beginning of next instruction to be executed
+ time_t time() const { return cpu_state->time + cpu_state->base; }
+ void set_time( time_t t ) { cpu_state->time = t - cpu_state->base; }
+ void adjust_time( int delta ) { cpu_state->time += delta; }
+
+ // Clocks past end (negative if before)
+ int time_past_end() const { return cpu_state->time; }
+
+ // Time of next IRQ
+ time_t irq_time() const { return irq_time_; }
+ void set_irq_time( time_t );
+
+ // Emulation stops once time >= end_time
+ time_t end_time() const { return end_time_; }
+ void set_end_time( time_t );
+
+ // Subtracts t from all times
+ void end_frame( time_t t );
+
+ // Can read this many bytes past end of a page
+ enum { cpu_padding = 8 };
+
+private:
+ // noncopyable
+ Hes_Cpu( const Hes_Cpu& );
+ Hes_Cpu& operator = ( const Hes_Cpu& );
+
+
+// Implementation
+public:
+ Hes_Cpu() { cpu_state = &cpu_state_; }
+ enum { irq_inhibit_mask = 0x04 };
+
+ struct cpu_state_t {
+ byte const* code_map [page_count + 1];
+ time_t base;
+ int time;
+ };
+ cpu_state_t* cpu_state; // points to cpu_state_ or a local copy
+ cpu_state_t cpu_state_;
+ time_t irq_time_;
+ time_t end_time_;
+
+private:
+ void set_code_page( int, void const* );
+ inline void update_end_time( time_t end, time_t irq );
+};
+
+#define HES_CPU_PAGE( addr ) ((unsigned) (addr) >> Hes_Cpu::page_bits)
+
+#if BLARGG_NONPORTABLE
+ #define HES_CPU_OFFSET( addr ) (addr)
+#else
+ #define HES_CPU_OFFSET( addr ) ((addr) & (Hes_Cpu::page_size - 1))
+#endif
+
+inline BOOST::uint8_t const* Hes_Cpu::get_code( addr_t addr )
+{
+ return cpu_state_.code_map [HES_CPU_PAGE( addr )] + HES_CPU_OFFSET( addr );
+}
+
+inline void Hes_Cpu::update_end_time( time_t end, time_t irq )
+{
+ if ( end > irq && !(r.flags & irq_inhibit_mask) )
+ end = irq;
+
+ cpu_state->time += cpu_state->base - end;
+ cpu_state->base = end;
+}
+
+inline void Hes_Cpu::set_irq_time( time_t t )
+{
+ irq_time_ = t;
+ update_end_time( end_time_, t );
+}
+
+inline void Hes_Cpu::set_end_time( time_t t )
+{
+ end_time_ = t;
+ update_end_time( t, irq_time_ );
+}
+
+inline void Hes_Cpu::end_frame( time_t t )
+{
+ assert( cpu_state == &cpu_state_ );
+ cpu_state_.base -= t;
+ if ( irq_time_ < future_time ) irq_time_ -= t;
+ if ( end_time_ < future_time ) end_time_ -= t;
+}
+
+inline void Hes_Cpu::set_mmr( int reg, int bank, void const* code )
+{
+ assert( (unsigned) reg <= page_count ); // allow page past end to be set
+ assert( (unsigned) bank < 0x100 );
+ mmr [reg] = bank;
+ byte const* p = STATIC_CAST(byte const*,code) - HES_CPU_OFFSET( reg << page_bits );
+ cpu_state->code_map [reg] = p;
+ cpu_state_.code_map [reg] = p;
+}
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu_run.h
index 2615a0bb..2374d217 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Hes_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Cpu_run.h
@@ -1,12 +1,52 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
-#include "Hes_Cpu.h"
+#if 0
+/* Define these macros in the source file before #including this file.
+- Parameters might be expressions, so they are best evaluated only once,
+though they NEVER have side-effects, so multiple evaluation is OK.
+- Output parameters might be a multiple-assignment expression like "a=x",
+so they must NOT be parenthesized.
+- Except where noted, time() and related functions will NOT work
+correctly inside a macro. TIME() is always correct, and FLUSH_TIME() and
+CACHE_TIME() allow the time changing functions to work.
+- Macros "returning" void may use a {} statement block. */
-#include "blargg_endian.h"
+ // 0 <= addr <= 0xFFFF + page_size
+ // time functions can be used
+ int READ_MEM( addr_t );
+ void WRITE_MEM( addr_t, int data );
+
+ // 0 <= addr <= 0x1FF
+ int READ_LOW( addr_t );
+ void WRITE_LOW( addr_t, int data );
-//#include "hes_cpu_log.h"
+ // 0 <= addr <= 0xFFFF + page_size
+ // Used by common instructions.
+ int READ_FAST( addr_t, int& out );
+ void WRITE_FAST( addr_t, int data );
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
+ // 0 <= addr <= 2
+ // ST0, ST1, ST2 instructions
+ void WRITE_VDP( int addr, int data );
+
+// The following can be used within macros:
+
+ // Current time
+ time_t TIME();
+
+ // Allows use of time functions
+ void FLUSH_TIME();
+
+ // Must be used before end of macro if FLUSH_TIME() was used earlier
+ void CACHE_TIME();
+
+// Configuration (optional; commented behavior if defined)
+
+ // Expanded just before beginning of code, to help debugger
+ #define CPU_BEGIN void my_run_cpu() {
+#endif
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -23,130 +63,118 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
// reduce efficiency quite a bit
int const ram_addr = 0x2000;
-#define FLUSH_TIME() (void) (s.time = s_time)
-#define CACHE_TIME() (void) (s_time = s.time)
-
-#include "hes_cpu_io.h"
-
-#include "blargg_source.h"
-
-#if BLARGG_NONPORTABLE
- #define PAGE_OFFSET( addr ) (addr)
-#else
- #define PAGE_OFFSET( addr ) ((addr) & (page_size - 1))
-#endif
-
-// status flags
-int const st_n = 0x80;
-int const st_v = 0x40;
-int const st_t = 0x20;
-int const st_b = 0x10;
-int const st_d = 0x08;
-int const st_i = 0x04;
-int const st_z = 0x02;
-int const st_c = 0x01;
-
void Hes_Cpu::reset()
{
- check( state == &state_ );
- state = &state_;
-
- state_.time = 0;
- state_.base = 0;
- irq_time_ = future_hes_time;
- end_time_ = future_hes_time;
-
- r.status = st_i;
- r.sp = 0;
- r.pc = 0;
- r.a = 0;
- r.x = 0;
- r.y = 0;
-
+ check( cpu_state == &cpu_state_ );
+ cpu_state = &cpu_state_;
+
+ cpu_state_.time = 0;
+ cpu_state_.base = 0;
+ irq_time_ = future_time;
+ end_time_ = future_time;
+
+ r.flags = 0x04;
+ r.sp = 0;
+ r.pc = 0;
+ r.a = 0;
+ r.x = 0;
+ r.y = 0;
+
+ // Be sure "blargg_endian.h" has been #included
blargg_verify_byte_order();
}
-void Hes_Cpu::set_mmr( int reg, int bank )
-{
- assert( (unsigned) reg <= page_count ); // allow page past end to be set
- assert( (unsigned) bank < 0x100 );
- mmr [reg] = bank;
- uint8_t const* code = CPU_SET_MMR( this, reg, bank );
- state->code_map [reg] = code - PAGE_OFFSET( reg << page_shift );
-}
+// Allows MWCW debugger to step through code properly
+#ifdef CPU_BEGIN
+ CPU_BEGIN
+#endif
-#define TIME (s_time + s.base)
+// Time
+#define TIME() (s_time + s.base)
+#define FLUSH_TIME() {s.time = s_time;}
+#define CACHE_TIME() {s_time = s.time;}
-#define READ( addr ) CPU_READ( this, (addr), TIME )
-#define WRITE( addr, data ) {CPU_WRITE( this, (addr), (data), TIME );}
-#define READ_LOW( addr ) (ram [int (addr)])
-#define WRITE_LOW( addr, data ) (void) (READ_LOW( addr ) = (data))
-#define READ_PROG( addr ) (s.code_map [(addr) >> page_shift] [PAGE_OFFSET( addr )])
+// Memory
+#define READ_STACK READ_LOW
+#define WRITE_STACK WRITE_LOW
+#define CODE_PAGE( addr ) s.code_map [HES_CPU_PAGE( addr )]
+#define CODE_OFFSET( addr ) HES_CPU_OFFSET( addr )
+#define READ_CODE( addr ) CODE_PAGE( addr ) [CODE_OFFSET( addr )]
+
+// Stack
#define SET_SP( v ) (sp = ((v) + 1) | 0x100)
#define GET_SP() ((sp - 1) & 0xFF)
-#define PUSH( v ) ((sp = (sp - 1) | 0x100), WRITE_LOW( sp, v ))
+#define SP( o ) ((sp + (o - (o>0)*0x100)) | 0x100)
-// even on x86, using short and unsigned char was slower
-typedef int fint16;
-typedef unsigned fuint16;
-typedef unsigned fuint8;
-typedef blargg_long fint32;
+// Truncation
+#define BYTE( n ) ((BOOST::uint8_t ) (n)) /* (unsigned) n & 0xFF */
+#define SBYTE( n ) ((BOOST::int8_t ) (n)) /* (BYTE( n ) ^ 0x80) - 0x80 */
+#define WORD( n ) ((BOOST::uint16_t) (n)) /* (unsigned) n & 0xFFFF */
-bool Hes_Cpu::run( hes_time_t end_time )
+// Flags with hex value for clarity when used as mask.
+// Stored in indicated variable during emulation.
+int const n80 = 0x80; // nz
+int const v40 = 0x40; // flags
+//int const t20 = 0x20;
+int const b10 = 0x10;
+int const d08 = 0x08; // flags
+int const i04 = 0x04; // flags
+int const z02 = 0x02; // nz
+int const c01 = 0x01; // c
+
+#define IS_NEG (nz & 0x8080)
+
+#define GET_FLAGS( out ) \
+{\
+ out = flags & (v40 | d08 | i04);\
+ out += ((nz >> 8) | nz) & n80;\
+ out += c >> 8 & c01;\
+ if ( !BYTE( nz ) )\
+ out += z02;\
+}
+
+#define SET_FLAGS( in ) \
+{\
+ flags = in & (v40 | d08 | i04);\
+ c = nz = in << 8;\
+ nz += ~in & z02;\
+}
+
+bool illegal_encountered = false;
{
- bool illegal_encountered = false;
- set_end_time( end_time );
- state_t s = this->state_;
- this->state = &s;
+ Hes_Cpu::cpu_state_t s = CPU.cpu_state_;
+ CPU.cpu_state = &s;
// even on x86, using s.time in place of s_time was slower
- fint16 s_time = s.time;
+ int s_time = s.time;
// registers
- fuint16 pc = r.pc;
- fuint8 a = r.a;
- fuint8 x = r.x;
- fuint8 y = r.y;
- fuint16 sp;
- SET_SP( r.sp );
-
- #define IS_NEG (nz & 0x8080)
-
- #define CALC_STATUS( out ) do {\
- out = status & (st_v | st_d | st_i);\
- out |= ((nz >> 8) | nz) & st_n;\
- out |= c >> 8 & st_c;\
- if ( !(nz & 0xFF) ) out |= st_z;\
- } while ( 0 )
-
- #define SET_STATUS( in ) do {\
- status = in & (st_v | st_d | st_i);\
- nz = in << 8;\
- c = nz;\
- nz |= ~in & st_z;\
- } while ( 0 )
-
- fuint8 status;
- fuint16 c; // carry set if (c & 0x100) != 0
- fuint16 nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x8080) != 0
+ int pc = CPU.r.pc;
+ int a = CPU.r.a;
+ int x = CPU.r.x;
+ int y = CPU.r.y;
+ int sp;
+ SET_SP( CPU.r.sp );
+
+ // Flags
+ int flags;
+ int c; // carry set if (c & 0x100) != 0
+ int nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x8080) != 0
{
- fuint8 temp = r.status;
- SET_STATUS( temp );
+ int temp = CPU.r.flags;
+ SET_FLAGS( temp );
}
- goto loop;
-branch_not_taken:
- s_time -= 2;
loop:
#ifndef NDEBUG
{
- hes_time_t correct = end_time_;
- if ( !(status & st_i) && correct > irq_time_ )
- correct = irq_time_;
+ time_t correct = CPU.end_time_;
+ if ( !(flags & i04) && correct > CPU.irq_time_ )
+ correct = CPU.irq_time_;
check( s.base == correct );
/*
- static long count;
+ static int count;
if ( count == 1844 ) Debugger();
if ( s.base != correct ) dprintf( "%ld\n", count );
count++;
@@ -154,94 +182,97 @@ loop:
}
#endif
- check( (unsigned) GET_SP() < 0x100 );
+ // Check all values
+ check( (unsigned) sp - 0x100 < 0x100 );
+ check( (unsigned) pc < 0x10000 + 0x100 ); // +0x100 so emulator can catch wrap-around
check( (unsigned) a < 0x100 );
check( (unsigned) x < 0x100 );
+ check( (unsigned) y < 0x100 );
- uint8_t const* instr = s.code_map [pc >> page_shift];
- fuint8 opcode;
+ // Read instruction
+ byte const* instr = CODE_PAGE( pc );
+ int opcode;
- // TODO: eliminate this special case
- #if BLARGG_NONPORTABLE
+ if ( CODE_OFFSET(~0) == ~0 )
+ {
opcode = instr [pc];
pc++;
instr += pc;
- #else
- instr += PAGE_OFFSET( pc );
+ }
+ else
+ {
+ instr += CODE_OFFSET( pc );
opcode = *instr++;
pc++;
- #endif
+ }
// TODO: each reference lists slightly different timing values, ugh
- static uint8_t const clock_table [256] =
+ static byte const clock_table [256] =
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 1,7,3, 4,6,4,6,7,3,2,2,2,7,5,7,6,// 0
- 4,7,7, 4,6,4,6,7,2,5,2,2,7,5,7,6,// 1
- 7,7,3, 4,4,4,6,7,4,2,2,2,5,5,7,6,// 2
- 4,7,7, 2,4,4,6,7,2,5,2,2,5,5,7,6,// 3
- 7,7,3, 4,8,4,6,7,3,2,2,2,4,5,7,6,// 4
- 4,7,7, 5,2,4,6,7,2,5,3,2,2,5,7,6,// 5
- 7,7,2, 2,4,4,6,7,4,2,2,2,7,5,7,6,// 6
- 4,7,7,17,4,4,6,7,2,5,4,2,7,5,7,6,// 7
- 4,7,2, 7,4,4,4,7,2,2,2,2,5,5,5,6,// 8
- 4,7,7, 8,4,4,4,7,2,5,2,2,5,5,5,6,// 9
- 2,7,2, 7,4,4,4,7,2,2,2,2,5,5,5,6,// A
- 4,7,7, 8,4,4,4,7,2,5,2,2,5,5,5,6,// B
- 2,7,2,17,4,4,6,7,2,2,2,2,5,5,7,6,// C
- 4,7,7,17,2,4,6,7,2,5,3,2,2,5,7,6,// D
- 2,7,2,17,4,4,6,7,2,2,2,2,5,5,7,6,// E
- 4,7,7,17,2,4,6,7,2,5,4,2,2,5,7,6 // F
+ 1,7,3, 4,6,4,6,7,3,2,2,2,7,5,7,4,// 0
+ 2,7,7, 4,6,4,6,7,2,5,2,2,7,5,7,4,// 1
+ 7,7,3, 4,4,4,6,7,4,2,2,2,5,5,7,4,// 2
+ 2,7,7, 2,4,4,6,7,2,5,2,2,5,5,7,4,// 3
+ 7,7,3, 4,8,4,6,7,3,2,2,2,4,5,7,4,// 4
+ 2,7,7, 5,2,4,6,7,2,5,3,2,2,5,7,4,// 5
+ 7,7,2, 2,4,4,6,7,4,2,2,2,7,5,7,4,// 6
+ 2,7,7,17,4,4,6,7,2,5,4,2,7,5,7,4,// 7
+ 4,7,2, 7,4,4,4,7,2,2,2,2,5,5,5,4,// 8
+ 2,7,7, 8,4,4,4,7,2,5,2,2,5,5,5,4,// 9
+ 2,7,2, 7,4,4,4,7,2,2,2,2,5,5,5,4,// A
+ 2,7,7, 8,4,4,4,7,2,5,2,2,5,5,5,4,// B
+ 2,7,2,17,4,4,6,7,2,2,2,2,5,5,7,4,// C
+ 2,7,7,17,2,4,6,7,2,5,3,2,2,5,7,4,// D
+ 2,7,2,17,4,4,6,7,2,2,2,2,5,5,7,4,// E
+ 2,7,7,17,2,4,6,7,2,5,4,2,2,5,7,4 // F
}; // 0x00 was 8
- fuint16 data;
- data = clock_table [opcode];
- if ( (s_time += data) >= 0 )
- goto possibly_out_of_time;
-almost_out_of_time:
-
- data = *instr;
+ // Update time
+ if ( s_time >= 0 )
+ goto out_of_time;
#ifdef HES_CPU_LOG_H
log_cpu( "new", pc - 1, opcode, instr [0], instr [1], instr [2],
- instr [3], instr [4], instr [5] );
+ instr [3], instr [4], instr [5], a, x, y );
//log_opcode( opcode );
#endif
+
+ s_time += clock_table [opcode];
+
+ int data;
+ data = *instr;
switch ( opcode )
{
-possibly_out_of_time:
- if ( s_time < (int) data )
- goto almost_out_of_time;
- s_time -= data;
- goto out_of_time;
-
// Macros
-#define GET_MSB() (instr [1])
-#define ADD_PAGE( out ) (pc++, out = data + 0x100 * GET_MSB());
-#define GET_ADDR() GET_LE16( instr )
+#define GET_MSB() (instr [1])
+#define ADD_PAGE( out ) (pc++, out = data + 0x100 * GET_MSB());
+#define GET_ADDR() GET_LE16( instr )
// TODO: is the penalty really always added? the original 6502 was much better
-//#define PAGE_CROSS_PENALTY( lsb ) (void) (s_time += (lsb) >> 8)
-#define PAGE_CROSS_PENALTY( lsb )
+//#define PAGE_PENALTY( lsb ) (void) (s_time += (lsb) >> 8)
+#define PAGE_PENALTY( lsb )
// Branch
// TODO: more efficient way to handle negative branch that wraps PC around
-#define BRANCH( cond )\
+#define BRANCH_( cond, adj )\
{\
- fint16 offset = (BOOST::int8_t) data;\
pc++;\
- if ( !(cond) ) goto branch_not_taken;\
- pc = BOOST::uint16_t (pc + offset);\
+ if ( !(cond) ) goto loop;\
+ pc = (BOOST::uint16_t) (pc + SBYTE( data ));\
+ s_time += adj;\
goto loop;\
}
+#define BRANCH( cond ) BRANCH_( cond, 2 )
+
case 0xF0: // BEQ
- BRANCH( !((uint8_t) nz) );
+ BRANCH( !BYTE( nz ) );
case 0xD0: // BNE
- BRANCH( (uint8_t) nz );
+ BRANCH( BYTE( nz ) );
case 0x10: // BPL
BRANCH( !IS_NEG );
@@ -253,21 +284,26 @@ possibly_out_of_time:
BRANCH( IS_NEG )
case 0x50: // BVC
- BRANCH( !(status & st_v) )
+ BRANCH( !(flags & v40) )
case 0x70: // BVS
- BRANCH( status & st_v )
+ BRANCH( flags & v40 )
case 0xB0: // BCS
BRANCH( c & 0x100 )
case 0x80: // BRA
branch_taken:
- BRANCH( true );
+ BRANCH_( true, 0 );
case 0xFF:
- if ( pc == idle_addr + 1 )
- goto idle_done;
+ #ifdef IDLE_ADDR
+ if ( pc == IDLE_ADDR + 1 )
+ goto idle_done;
+ #endif
+
+ pc = (BOOST::uint16_t) pc;
+
case 0x0F: // BBRn
case 0x1F:
case 0x2F:
@@ -283,7 +319,8 @@ possibly_out_of_time:
case 0xCF:
case 0xDF:
case 0xEF: {
- fuint16 t = 0x101 * READ_LOW( data );
+ // Make two copies of bits, one negated
+ int t = 0x101 * READ_LOW( data );
t ^= 0xFF;
pc++;
data = GET_MSB();
@@ -298,31 +335,31 @@ possibly_out_of_time:
data += x;
case 0x6C:{// JMP (ind)
data += 0x100 * GET_MSB();
- pc = GET_LE16( &READ_PROG( data ) );
+ pc = GET_LE16( &READ_CODE( data ) );
goto loop;
}
// Subroutine
case 0x44: // BSR
- WRITE_LOW( 0x100 | (sp - 1), pc >> 8 );
- sp = (sp - 2) | 0x100;
- WRITE_LOW( sp, pc );
+ WRITE_STACK( SP( -1 ), pc >> 8 );
+ sp = SP( -2 );
+ WRITE_STACK( sp, pc );
goto branch_taken;
case 0x20: { // JSR
- fuint16 temp = pc + 1;
+ int temp = pc + 1;
pc = GET_ADDR();
- WRITE_LOW( 0x100 | (sp - 1), temp >> 8 );
- sp = (sp - 2) | 0x100;
- WRITE_LOW( sp, temp );
+ WRITE_STACK( SP( -1 ), temp >> 8 );
+ sp = SP( -2 );
+ WRITE_STACK( sp, temp );
goto loop;
}
case 0x60: // RTS
- pc = 0x100 * READ_LOW( 0x100 | (sp - 0xFF) );
- pc += 1 + READ_LOW( sp );
- sp = (sp - 0xFE) | 0x100;
+ pc = 1 + READ_STACK( sp );
+ pc += 0x100 * READ_STACK( SP( 1 ) );
+ sp = SP( 2 );
goto loop;
case 0x00: // BRK
@@ -331,32 +368,32 @@ possibly_out_of_time:
// Common
case 0xBD:{// LDA abs,X
- PAGE_CROSS_PENALTY( data + x );
- fuint16 addr = GET_ADDR() + x;
+ PAGE_PENALTY( data + x );
+ int addr = GET_ADDR() + x;
pc += 2;
- CPU_READ_FAST( this, addr, TIME, nz );
+ READ_FAST( addr, nz );
a = nz;
goto loop;
}
case 0x9D:{// STA abs,X
- fuint16 addr = GET_ADDR() + x;
+ int addr = GET_ADDR() + x;
pc += 2;
- CPU_WRITE_FAST( this, addr, a, TIME );
+ WRITE_FAST( addr, a );
goto loop;
}
case 0x95: // STA zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x85: // STA zp
pc++;
WRITE_LOW( data, a );
goto loop;
case 0xAE:{// LDX abs
- fuint16 addr = GET_ADDR();
+ int addr = GET_ADDR();
pc += 2;
- CPU_READ_FAST( this, addr, TIME, nz );
+ READ_FAST( addr, nz );
x = nz;
goto loop;
}
@@ -369,17 +406,17 @@ possibly_out_of_time:
// Load/store
{
- fuint16 addr;
+ int addr;
case 0x91: // STA (ind),Y
- addr = 0x100 * READ_LOW( uint8_t (data + 1) );
+ addr = 0x100 * READ_LOW( BYTE( data + 1 ) );
addr += READ_LOW( data ) + y;
pc++;
goto sta_ptr;
case 0x81: // STA (ind,X)
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x92: // STA (ind)
- addr = 0x100 * READ_LOW( uint8_t (data + 1) );
+ addr = 0x100 * READ_LOW( BYTE( data + 1 ) );
addr += READ_LOW( data );
pc++;
goto sta_ptr;
@@ -390,51 +427,51 @@ possibly_out_of_time:
addr = data + 0x100 * GET_MSB();
pc += 2;
sta_ptr:
- CPU_WRITE_FAST( this, addr, a, TIME );
+ WRITE_FAST( addr, a );
goto loop;
}
{
- fuint16 addr;
+ int addr;
case 0xA1: // LDA (ind,X)
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0xB2: // LDA (ind)
- addr = 0x100 * READ_LOW( uint8_t (data + 1) );
+ addr = 0x100 * READ_LOW( BYTE( data + 1 ) );
addr += READ_LOW( data );
pc++;
goto a_nz_read_addr;
case 0xB1:// LDA (ind),Y
addr = READ_LOW( data ) + y;
- PAGE_CROSS_PENALTY( addr );
- addr += 0x100 * READ_LOW( (uint8_t) (data + 1) );
+ PAGE_PENALTY( addr );
+ addr += 0x100 * READ_LOW( BYTE( data + 1 ) );
pc++;
goto a_nz_read_addr;
case 0xB9: // LDA abs,Y
data += y;
- PAGE_CROSS_PENALTY( data );
+ PAGE_PENALTY( data );
case 0xAD: // LDA abs
addr = data + 0x100 * GET_MSB();
pc += 2;
a_nz_read_addr:
- CPU_READ_FAST( this, addr, TIME, nz );
+ READ_FAST( addr, nz );
a = nz;
goto loop;
}
case 0xBE:{// LDX abs,y
- PAGE_CROSS_PENALTY( data + y );
- fuint16 addr = GET_ADDR() + y;
+ PAGE_PENALTY( data + y );
+ int addr = GET_ADDR() + y;
pc += 2;
FLUSH_TIME();
- x = nz = READ( addr );
+ x = nz = READ_MEM( addr );
CACHE_TIME();
goto loop;
}
case 0xB5: // LDA zp,x
- a = nz = READ_LOW( uint8_t (data + x) );
+ a = nz = READ_LOW( BYTE( data + x ) );
pc++;
goto loop;
@@ -449,30 +486,29 @@ possibly_out_of_time:
case 0x3C: // BIT abs,x
data += x;
case 0x2C:{// BIT abs
- fuint16 addr;
+ int addr;
ADD_PAGE( addr );
FLUSH_TIME();
- nz = READ( addr );
+ nz = READ_MEM( addr );
CACHE_TIME();
goto bit_common;
}
case 0x34: // BIT zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x24: // BIT zp
data = READ_LOW( data );
case 0x89: // BIT imm
nz = data;
bit_common:
pc++;
- status &= ~st_v;
- status |= nz & st_v;
+ flags = (flags & ~v40) + (nz & v40);
if ( nz & a )
goto loop; // Z should be clear, and nz must be non-zero if nz & a is
nz <<= 8; // set Z flag without affecting N flag
goto loop;
{
- fuint16 addr;
+ int addr;
case 0xB3: // TST abs,x
addr = GET_MSB() + x;
@@ -484,47 +520,45 @@ possibly_out_of_time:
addr += 0x100 * instr [2];
pc++;
FLUSH_TIME();
- nz = READ( addr );
+ nz = READ_MEM( addr );
CACHE_TIME();
goto tst_common;
}
case 0xA3: // TST zp,x
- nz = READ_LOW( uint8_t (GET_MSB() + x) );
+ nz = READ_LOW( BYTE( GET_MSB() + x ) );
goto tst_common;
case 0x83: // TST zp
nz = READ_LOW( GET_MSB() );
tst_common:
pc += 2;
- status &= ~st_v;
- status |= nz & st_v;
+ flags = (flags & ~v40) + (nz & v40);
if ( nz & data )
goto loop; // Z should be clear, and nz must be non-zero if nz & data is
nz <<= 8; // set Z flag without affecting N flag
goto loop;
{
- fuint16 addr;
+ int addr;
case 0x0C: // TSB abs
case 0x1C: // TRB abs
addr = GET_ADDR();
pc++;
goto txb_addr;
- // TODO: everyone lists different behaviors for the status flags, ugh
+ // TODO: everyone lists different behaviors for the flags flags, ugh
case 0x04: // TSB zp
case 0x14: // TRB zp
addr = data + ram_addr;
txb_addr:
FLUSH_TIME();
- nz = a | READ( addr );
+ nz = a | READ_MEM( addr );
if ( opcode & 0x10 )
nz ^= a; // bits from a will already be set, so this clears them
- status &= ~st_v;
- status |= nz & st_v;
+ flags = (flags & ~v40) + (nz & v40);
pc++;
- WRITE( addr, nz );
+ WRITE_MEM( addr, nz );
CACHE_TIME();
goto loop;
}
@@ -561,33 +595,33 @@ possibly_out_of_time:
ADD_PAGE( data );
pc++;
FLUSH_TIME();
- WRITE( data, 0 );
+ WRITE_MEM( data, 0 );
CACHE_TIME();
goto loop;
case 0x74: // STZ zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x64: // STZ zp
pc++;
WRITE_LOW( data, 0 );
goto loop;
case 0x94: // STY zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x84: // STY zp
pc++;
WRITE_LOW( data, y );
goto loop;
case 0x96: // STX zp,y
- data = uint8_t (data + y);
+ data = BYTE( data + y );
case 0x86: // STX zp
pc++;
WRITE_LOW( data, x );
goto loop;
case 0xB6: // LDX zp,y
- data = uint8_t (data + y);
+ data = BYTE( data + y );
case 0xA6: // LDX zp
data = READ_LOW( data );
case 0xA2: // LDX #imm
@@ -597,7 +631,7 @@ possibly_out_of_time:
goto loop;
case 0xB4: // LDY zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0xA4: // LDY zp
data = READ_LOW( data );
case 0xA0: // LDY #imm
@@ -608,29 +642,27 @@ possibly_out_of_time:
case 0xBC: // LDY abs,X
data += x;
- PAGE_CROSS_PENALTY( data );
+ PAGE_PENALTY( data );
case 0xAC:{// LDY abs
- fuint16 addr = data + 0x100 * GET_MSB();
+ int addr = data + 0x100 * GET_MSB();
pc += 2;
FLUSH_TIME();
- y = nz = READ( addr );
+ y = nz = READ_MEM( addr );
CACHE_TIME();
goto loop;
}
{
- fuint8 temp;
+ int temp;
case 0x8C: // STY abs
temp = y;
- goto store_abs;
-
+ if ( 0 )
case 0x8E: // STX abs
- temp = x;
- store_abs:
- fuint16 addr = GET_ADDR();
+ temp = x;
+ int addr = GET_ADDR();
pc += 2;
FLUSH_TIME();
- WRITE( addr, temp );
+ WRITE_MEM( addr, temp );
CACHE_TIME();
goto loop;
}
@@ -638,10 +670,10 @@ possibly_out_of_time:
// Compare
case 0xEC:{// CPX abs
- fuint16 addr = GET_ADDR();
+ int addr = GET_ADDR();
pc++;
FLUSH_TIME();
- data = READ( addr );
+ data = READ_MEM( addr );
CACHE_TIME();
goto cpx_data;
}
@@ -653,14 +685,14 @@ possibly_out_of_time:
nz = x - data;
pc++;
c = ~nz;
- nz &= 0xFF;
+ nz = BYTE( nz );
goto loop;
case 0xCC:{// CPY abs
- fuint16 addr = GET_ADDR();
+ int addr = GET_ADDR();
pc++;
FLUSH_TIME();
- data = READ( addr );
+ data = READ_MEM( addr );
CACHE_TIME();
goto cpy_data;
}
@@ -672,25 +704,25 @@ possibly_out_of_time:
nz = y - data;
pc++;
c = ~nz;
- nz &= 0xFF;
+ nz = BYTE( nz );
goto loop;
// Logical
#define ARITH_ADDR_MODES( op )\
case op - 0x04: /* (ind,x) */\
- data = uint8_t (data + x);\
+ data = BYTE( data + x );\
case op + 0x0D: /* (ind) */\
- data = 0x100 * READ_LOW( uint8_t (data + 1) ) + READ_LOW( data );\
+ data = 0x100 * READ_LOW( BYTE( data + 1 ) ) + READ_LOW( data );\
goto ptr##op;\
case op + 0x0C:{/* (ind),y */\
- fuint16 temp = READ_LOW( data ) + y;\
- PAGE_CROSS_PENALTY( temp );\
- data = temp + 0x100 * READ_LOW( uint8_t (data + 1) );\
+ int temp = READ_LOW( data ) + y;\
+ PAGE_PENALTY( temp );\
+ data = temp + 0x100 * READ_LOW( BYTE( data + 1 ) );\
goto ptr##op;\
}\
case op + 0x10: /* zp,X */\
- data = uint8_t (data + x);\
+ data = BYTE( data + x );\
case op + 0x00: /* zp */\
data = READ_LOW( data );\
goto imm##op;\
@@ -700,12 +732,12 @@ possibly_out_of_time:
case op + 0x18: /* abs,X */\
data += x;\
ind##op:\
- PAGE_CROSS_PENALTY( data );\
+ PAGE_PENALTY( data );\
case op + 0x08: /* abs */\
ADD_PAGE( data );\
ptr##op:\
FLUSH_TIME();\
- data = READ( data );\
+ data = READ_MEM( data );\
CACHE_TIME();\
case op + 0x04: /* imm */\
imm##op:
@@ -714,7 +746,7 @@ possibly_out_of_time:
nz = a - data;
pc++;
c = ~nz;
- nz &= 0xFF;
+ nz = BYTE( nz );
goto loop;
ARITH_ADDR_MODES( 0x25 ) // AND
@@ -740,15 +772,14 @@ possibly_out_of_time:
ARITH_ADDR_MODES( 0x65 ) // ADC
adc_imm: {
- if ( status & st_d )
+ if ( flags & d08 )
dprintf( "Decimal mode not supported\n" );
- fint16 carry = c >> 8 & 1;
- fint16 ov = (a ^ 0x80) + carry + (BOOST::int8_t) data; // sign-extend
- status &= ~st_v;
- status |= ov >> 2 & 0x40;
+ int carry = c >> 8 & 1;
+ int ov = (a ^ 0x80) + carry + SBYTE( data );
+ flags = (flags & ~v40) + (ov >> 2 & v40);
c = nz = a + data + carry;
pc++;
- a = (uint8_t) nz;
+ a = BYTE( nz );
goto loop;
}
@@ -759,22 +790,22 @@ possibly_out_of_time:
case 0x6A: // ROR A
nz = c >> 1 & 0x80;
c = a << 8;
- nz |= a >> 1;
+ nz += a >> 1;
a = nz;
goto loop;
case 0x0A: // ASL A
nz = a << 1;
c = nz;
- a = (uint8_t) nz;
+ a = BYTE( nz );
goto loop;
case 0x2A: { // ROL A
nz = a << 1;
- fint16 temp = c >> 8 & 1;
+ int temp = c >> 8 & 1;
c = nz;
- nz |= temp;
- a = (uint8_t) nz;
+ nz += temp;
+ a = BYTE( nz );
goto loop;
}
@@ -786,8 +817,8 @@ possibly_out_of_time:
ror_abs: {
ADD_PAGE( data );
FLUSH_TIME();
- int temp = READ( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
+ int temp = READ_MEM( data );
+ nz = (c >> 1 & 0x80) + (temp >> 1);
c = temp << 8;
goto rotate_common;
}
@@ -805,10 +836,10 @@ possibly_out_of_time:
ADD_PAGE( data );
nz = c >> 8 & 1;
FLUSH_TIME();
- nz |= (c = READ( data ) << 1);
+ nz += (c = READ_MEM( data ) << 1);
rotate_common:
pc++;
- WRITE( data, (uint8_t) nz );
+ WRITE_MEM( data, BYTE( nz ) );
CACHE_TIME();
goto loop;
@@ -817,67 +848,67 @@ possibly_out_of_time:
goto ror_abs;
case 0x76: // ROR zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
goto ror_zp;
case 0x56: // LSR zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x46: // LSR zp
c = 0;
case 0x66: // ROR zp
ror_zp: {
int temp = READ_LOW( data );
- nz = (c >> 1 & 0x80) | (temp >> 1);
+ nz = (c >> 1 & 0x80) + (temp >> 1);
c = temp << 8;
goto write_nz_zp;
}
case 0x36: // ROL zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
goto rol_zp;
case 0x16: // ASL zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0x06: // ASL zp
c = 0;
case 0x26: // ROL zp
rol_zp:
nz = c >> 8 & 1;
- nz |= (c = READ_LOW( data ) << 1);
+ nz += (c = READ_LOW( data ) << 1);
goto write_nz_zp;
// Increment/decrement
-#define INC_DEC_AXY( reg, n ) reg = uint8_t (nz = reg + n); goto loop;
+#define INC_DEC( reg, n ) reg = BYTE( nz = reg + n ); goto loop;
case 0x1A: // INA
- INC_DEC_AXY( a, +1 )
+ INC_DEC( a, +1 )
case 0xE8: // INX
- INC_DEC_AXY( x, +1 )
+ INC_DEC( x, +1 )
case 0xC8: // INY
- INC_DEC_AXY( y, +1 )
+ INC_DEC( y, +1 )
case 0x3A: // DEA
- INC_DEC_AXY( a, -1 )
+ INC_DEC( a, -1 )
case 0xCA: // DEX
- INC_DEC_AXY( x, -1 )
+ INC_DEC( x, -1 )
case 0x88: // DEY
- INC_DEC_AXY( y, -1 )
+ INC_DEC( y, -1 )
case 0xF6: // INC zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0xE6: // INC zp
nz = 1;
goto add_nz_zp;
case 0xD6: // DEC zp,x
- data = uint8_t (data + x);
+ data = BYTE( data + x );
case 0xC6: // DEC zp
- nz = (unsigned) -1;
+ nz = -1;
add_nz_zp:
nz += READ_LOW( data );
write_nz_zp:
@@ -902,35 +933,31 @@ possibly_out_of_time:
case 0xCE: // DEC abs
data = GET_ADDR();
dec_ptr:
- nz = (unsigned) -1;
+ nz = -1;
inc_common:
FLUSH_TIME();
- nz += READ( data );
pc += 2;
- WRITE( data, (uint8_t) nz );
+ nz += READ_MEM( data );
+ WRITE_MEM( data, BYTE( nz ) );
CACHE_TIME();
goto loop;
// Transfer
case 0xA8: // TAY
- y = a;
- nz = a;
+ y = nz = a;
goto loop;
case 0x98: // TYA
- a = y;
- nz = y;
+ a = nz = y;
goto loop;
case 0xAA: // TAX
- x = a;
- nz = a;
+ x = nz = a;
goto loop;
case 0x8A: // TXA
- a = x;
- nz = x;
+ a = nz = x;
goto loop;
case 0x9A: // TXS
@@ -942,7 +969,7 @@ possibly_out_of_time:
goto loop;
#define SWAP_REGS( r1, r2 ) {\
- fuint8 t = r1;\
+ int t = r1;\
r1 = r2;\
r2 = t;\
goto loop;\
@@ -972,74 +999,79 @@ possibly_out_of_time:
// Stack
case 0x48: // PHA
- PUSH( a );
+ sp = SP( -1 );
+ WRITE_STACK( sp, a );
goto loop;
+ case 0x68: // PLA
+ a = nz = READ_STACK( sp );
+ sp = SP( 1 );
+ goto loop;
+
case 0xDA: // PHX
- PUSH( x );
+ sp = SP( -1 );
+ WRITE_STACK( sp, x );
goto loop;
case 0x5A: // PHY
- PUSH( y );
+ sp = SP( -1 );
+ WRITE_STACK( sp, y );
goto loop;
case 0x40:{// RTI
- fuint8 temp = READ_LOW( sp );
- pc = READ_LOW( 0x100 | (sp - 0xFF) );
- pc |= READ_LOW( 0x100 | (sp - 0xFE) ) * 0x100;
- sp = (sp - 0xFD) | 0x100;
- data = status;
- SET_STATUS( temp );
- this->r.status = status; // update externally-visible I flag
- if ( (data ^ status) & st_i )
+ pc = READ_STACK( SP( 1 ) );
+ pc += READ_STACK( SP( 2 ) ) * 0x100;
+ int temp = READ_STACK( sp );
+ sp = SP( 3 );
+ data = flags;
+ SET_FLAGS( temp );
+ CPU.r.flags = flags; // update externally-visible I flag
+ if ( (data ^ flags) & i04 )
{
- hes_time_t new_time = end_time_;
- if ( !(status & st_i) && new_time > irq_time_ )
- new_time = irq_time_;
- blargg_long delta = s.base - new_time;
+ time_t new_time = CPU.end_time_;
+ if ( !(flags & i04) && new_time > CPU.irq_time_ )
+ new_time = CPU.irq_time_;
+ int delta = s.base - new_time;
s.base = new_time;
s_time += delta;
}
goto loop;
}
- #define POP() READ_LOW( sp ); sp = (sp - 0xFF) | 0x100
-
- case 0x68: // PLA
- a = nz = POP();
- goto loop;
-
case 0xFA: // PLX
- x = nz = POP();
+ x = nz = READ_STACK( sp );
+ sp = SP( 1 );
goto loop;
case 0x7A: // PLY
- y = nz = POP();
+ y = nz = READ_STACK( sp );
+ sp = SP( 1 );
goto loop;
case 0x28:{// PLP
- fuint8 temp = POP();
- fuint8 changed = status ^ temp;
- SET_STATUS( temp );
- if ( !(changed & st_i) )
+ int temp = READ_STACK( sp );
+ sp = SP( 1 );
+ int changed = flags ^ temp;
+ SET_FLAGS( temp );
+ if ( !(changed & i04) )
goto loop; // I flag didn't change
- if ( status & st_i )
+ if ( flags & i04 )
goto handle_sei;
goto handle_cli;
}
- #undef POP
- case 0x08: { // PHP
- fuint8 temp;
- CALC_STATUS( temp );
- PUSH( temp | st_b );
+ case 0x08:{// PHP
+ int temp;
+ GET_FLAGS( temp );
+ sp = SP( -1 );
+ WRITE_STACK( sp, temp | b10 );
goto loop;
}
// Flags
case 0x38: // SEC
- c = (unsigned) ~0;
+ c = 0x100;
goto loop;
case 0x18: // CLC
@@ -1047,31 +1079,32 @@ possibly_out_of_time:
goto loop;
case 0xB8: // CLV
- status &= ~st_v;
+ flags &= ~v40;
goto loop;
case 0xD8: // CLD
- status &= ~st_d;
+ flags &= ~d08;
goto loop;
case 0xF8: // SED
- status |= st_d;
+ flags |= d08;
goto loop;
case 0x58: // CLI
- if ( !(status & st_i) )
+ if ( !(flags & i04) )
goto loop;
- status &= ~st_i;
+ flags &= ~i04;
handle_cli: {
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - irq_time_;
+ //dprintf( "CLI at %d\n", TIME );
+ CPU.r.flags = flags; // update externally-visible I flag
+ int delta = s.base - CPU.irq_time_;
if ( delta <= 0 )
{
- if ( TIME < irq_time_ )
+ if ( TIME() < CPU.irq_time_ )
goto loop;
goto delayed_cli;
}
- s.base = irq_time_;
+ s.base = CPU.irq_time_;
s_time += delta;
if ( s_time < 0 )
goto loop;
@@ -1081,43 +1114,46 @@ possibly_out_of_time:
// delayed irq until after next instruction
s.base += s_time + 1;
s_time = -1;
- irq_time_ = s.base; // TODO: remove, as only to satisfy debug check in loop
+ CPU.irq_time_ = s.base; // TODO: remove, as only to satisfy debug check in loop
goto loop;
}
+
+ // TODO: implement
delayed_cli:
- dprintf( "Delayed CLI not supported\n" ); // TODO: implement
+ dprintf( "Delayed CLI not supported\n" );
goto loop;
}
case 0x78: // SEI
- if ( status & st_i )
+ if ( flags & i04 )
goto loop;
- status |= st_i;
+ flags |= i04;
handle_sei: {
- this->r.status = status; // update externally-visible I flag
- blargg_long delta = s.base - end_time_;
- s.base = end_time_;
+ CPU.r.flags = flags; // update externally-visible I flag
+ int delta = s.base - CPU.end_time_;
+ s.base = CPU.end_time_;
s_time += delta;
if ( s_time < 0 )
goto loop;
- dprintf( "Delayed SEI not supported\n" ); // TODO: implement
+
+ dprintf( "Delayed SEI not supported\n" );
goto loop;
}
// Special
case 0x53:{// TAM
- fuint8 const bits = data; // avoid using data across function call
+ int bits = data; // avoid using data across function call
pc++;
for ( int i = 0; i < 8; i++ )
if ( bits & (1 << i) )
- set_mmr( i, a );
+ SET_MMR( i, a );
goto loop;
}
case 0x43:{// TMA
pc++;
- byte const* in = mmr;
+ byte const* in = CPU.mmr;
do
{
if ( data & 1 )
@@ -1131,12 +1167,12 @@ possibly_out_of_time:
case 0x03: // ST0
case 0x13: // ST1
case 0x23:{// ST2
- fuint16 addr = opcode >> 4;
+ int addr = opcode >> 4;
if ( addr )
addr++;
pc++;
FLUSH_TIME();
- CPU_WRITE_VDP( this, addr, data, TIME );
+ WRITE_VDP( addr, data );
CACHE_TIME();
goto loop;
}
@@ -1153,7 +1189,7 @@ possibly_out_of_time:
goto loop;
case 0xF4: { // SET
- //fuint16 operand = GET_MSB();
+ //int operand = GET_MSB();
dprintf( "SET not handled\n" );
//switch ( data )
//{
@@ -1165,10 +1201,10 @@ possibly_out_of_time:
// Block transfer
{
- fuint16 in_alt;
- fint16 in_inc;
- fuint16 out_alt;
- fint16 out_inc;
+ int in_alt;
+ int in_inc;
+ int out_alt;
+ int out_inc;
case 0xE3: // TIA
in_alt = 0;
@@ -1199,28 +1235,26 @@ possibly_out_of_time:
in_alt = 0;
out_alt = 0;
bxfer:
- fuint16 in = GET_LE16( instr + 0 );
- fuint16 out = GET_LE16( instr + 2 );
- int count = GET_LE16( instr + 4 );
+ int in = GET_LE16( instr + 0 );
+ int out = GET_LE16( instr + 2 );
+ int count = GET_LE16( instr + 4 );
if ( !count )
count = 0x10000;
pc += 6;
- WRITE_LOW( 0x100 | (sp - 1), y );
- WRITE_LOW( 0x100 | (sp - 2), a );
- WRITE_LOW( 0x100 | (sp - 3), x );
+ WRITE_STACK( SP( -1 ), y );
+ WRITE_STACK( SP( -2 ), a );
+ WRITE_STACK( SP( -3 ), x );
FLUSH_TIME();
do
{
- // TODO: reads from $0800-$1400 in I/O page return 0 and don't access I/O
- fuint8 t = READ( in );
- in += in_inc;
- in &= 0xFFFF;
+ // TODO: reads from $0800-$1400 in I/O page should do I/O
+ int t = READ_MEM( in );
+ in = WORD( in + in_inc );
s.time += 6;
if ( in_alt )
in_inc = -in_inc;
- WRITE( out, t );
- out += out_inc;
- out &= 0xFFFF;
+ WRITE_MEM( out, t );
+ out = WORD( out + out_inc );
if ( out_alt )
out_inc = -out_inc;
}
@@ -1232,12 +1266,12 @@ possibly_out_of_time:
// Illegal
default:
- assert( (unsigned) opcode <= 0xFF );
+ check( (unsigned) opcode <= 0xFF );
dprintf( "Illegal opcode $%02X at $%04X\n", (int) opcode, (int) pc - 1 );
illegal_encountered = true;
goto loop;
}
- assert( false );
+ assert( false ); // catch missing 'goto loop' or accidental 'break'
int result_;
handle_brk:
@@ -1248,56 +1282,61 @@ interrupt:
{
s_time += 7;
- WRITE_LOW( 0x100 | (sp - 1), pc >> 8 );
- WRITE_LOW( 0x100 | (sp - 2), pc );
- pc = GET_LE16( &READ_PROG( 0xFFF0 ) + result_ );
+ // Save PC and read vector
+ WRITE_STACK( SP( -1 ), pc >> 8 );
+ WRITE_STACK( SP( -2 ), pc );
+ pc = GET_LE16( &READ_CODE( 0xFFF0 ) + result_ );
- sp = (sp - 3) | 0x100;
- fuint8 temp;
- CALC_STATUS( temp );
+ // Save flags
+ int temp;
+ GET_FLAGS( temp );
if ( result_ == 6 )
- temp |= st_b;
- WRITE_LOW( sp, temp );
+ temp |= b10; // BRK sets B bit
+ sp = SP( -3 );
+ WRITE_STACK( sp, temp );
- status &= ~st_d;
- status |= st_i;
- this->r.status = status; // update externally-visible I flag
+ // Update I flag in externally-visible flags
+ flags &= ~d08;
+ CPU.r.flags = (flags |= i04);
- blargg_long delta = s.base - end_time_;
- s.base = end_time_;
+ // Update time
+ int delta = s.base - CPU.end_time_;
+ if ( delta >= 0 )
+ goto loop;
s_time += delta;
+ s.base = CPU.end_time_;
goto loop;
}
idle_done:
s_time = 0;
+
out_of_time:
pc--;
- FLUSH_TIME();
- CPU_DONE( this, TIME, result_ );
- CACHE_TIME();
- if ( result_ > 0 )
- goto interrupt;
- if ( s_time < 0 )
- goto loop;
-
- s.time = s_time;
-
- r.pc = pc;
- r.sp = GET_SP();
- r.a = a;
- r.x = x;
- r.y = y;
+ // Optional action that triggers interrupt or changes irq/end time
+ #ifdef CPU_DONE
{
- fuint8 temp;
- CALC_STATUS( temp );
- r.status = temp;
+ CPU_DONE( result_ );
+ if ( result_ >= 0 )
+ goto interrupt;
+ if ( s_time < 0 )
+ goto loop;
}
+ #endif
- this->state_ = s;
- this->state = &this->state_;
+ // Flush cached state
+ CPU.r.pc = pc;
+ CPU.r.sp = GET_SP();
+ CPU.r.a = a;
+ CPU.r.x = x;
+ CPU.r.y = y;
- return illegal_encountered;
+ int temp;
+ GET_FLAGS( temp );
+ CPU.r.flags = temp;
+
+ CPU.cpu_state_.base = s.base;
+ CPU.cpu_state_.time = s_time;
+ CPU.cpu_state = &CPU.cpu_state_;
}
-
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.cpp
new file mode 100644
index 00000000..0253fce3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.cpp
@@ -0,0 +1,163 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Hes_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Hes_Emu::Hes_Emu()
+{
+ set_type( gme_hes_type );
+ set_silence_lookahead( 6 );
+ set_gain( 1.11 );
+}
+
+Hes_Emu::~Hes_Emu() { }
+
+void Hes_Emu::unload()
+{
+ core.unload();
+ Music_Emu::unload();
+}
+
+static byte const* copy_field( byte const in [], char* out )
+{
+ if ( in )
+ {
+ int len = 0x20;
+ if ( in [0x1F] && !in [0x2F] )
+ len = 0x30; // fields are sometimes 16 bytes longer (ugh)
+
+ // since text fields are where any data could be, detect non-text
+ // and fields with data after zero byte terminator
+
+ int i = 0;
+ for ( ; i < len && in [i]; i++ )
+ if ( (unsigned) (in [i] - ' ') >= 0xFF - ' ' ) // also treat 0xFF as non-text
+ return 0; // non-ASCII found
+
+ for ( ; i < len; i++ )
+ if ( in [i] )
+ return 0; // data after terminator
+
+ Gme_File::copy_field_( out, (char const*) in, len );
+ in += len;
+ }
+ return in;
+}
+
+static void copy_hes_fields( byte const in [], track_info_t* out )
+{
+ if ( *in >= ' ' )
+ {
+ in = copy_field( in, out->game );
+ in = copy_field( in, out->author );
+ in = copy_field( in, out->copyright );
+ }
+}
+
+blargg_err_t Hes_Emu::track_info_( track_info_t* out, int ) const
+{
+ copy_hes_fields( core.data() + core.info_offset, out );
+ return blargg_ok;
+}
+
+struct Hes_File : Gme_Info_
+{
+ enum { fields_offset = Hes_Core::header_t::size + Hes_Core::info_offset };
+
+ union header_t {
+ Hes_Core::header_t header;
+ byte data [fields_offset + 0x30 * 3];
+ } h;
+
+ Hes_File()
+ {
+ set_type( gme_hes_type );
+ }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ blargg_err_t err = in.read( &h, sizeof h );
+ if ( err )
+ return (blargg_is_err_type( err, blargg_err_file_eof ) ? blargg_err_file_type : err);
+
+ if ( !h.header.valid_tag() )
+ return blargg_err_file_type;
+
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_hes_fields( h.data + fields_offset, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_hes_emu () { return BLARGG_NEW Hes_Emu ; }
+static Music_Emu* new_hes_file() { return BLARGG_NEW Hes_File; }
+
+gme_type_t_ const gme_hes_type [1] = {{ "PC Engine", 256, &new_hes_emu, &new_hes_file, "HES", 1 }};
+
+blargg_err_t Hes_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( core.load( in ) );
+
+ static const char* const names [Hes_Apu::osc_count + Hes_Apu_Adpcm::osc_count] = {
+ "Wave 1", "Wave 2", "Wave 3", "Wave 4", "Multi 1", "Multi 2", "ADPCM"
+ };
+ set_voice_names( names );
+
+ static int const types [Hes_Apu::osc_count + Hes_Apu_Adpcm::osc_count] = {
+ wave_type+0, wave_type+1, wave_type+2, wave_type+3, mixed_type+0, mixed_type+1, mixed_type+2
+ };
+ set_voice_types( types );
+
+ set_voice_count( core.apu().osc_count + core.adpcm().osc_count );
+ core.apu().volume( gain() );
+ core.adpcm().volume( gain() );
+
+ return setup_buffer( 7159091 );
+}
+
+void Hes_Emu::update_eq( blip_eq_t const& eq )
+{
+ core.apu().treble_eq( eq );
+}
+
+void Hes_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ if ( i < core.apu().osc_count )
+ core.apu().set_output( i, c, l, r );
+ else if ( i == core.apu().osc_count )
+ core.adpcm().set_output( 0, c, l, r );
+}
+
+void Hes_Emu::set_tempo_( double t )
+{
+ core.set_tempo( t );
+}
+
+blargg_err_t Hes_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+ return core.start_track( track );
+}
+
+blargg_err_t Hes_Emu::run_clocks( blip_time_t& duration_, int )
+{
+ return core.end_frame( duration_ );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.h
new file mode 100644
index 00000000..6d7293b6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Hes_Emu.h
@@ -0,0 +1,40 @@
+// TurboGrafx-16/PC Engine HES music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef HES_EMU_H
+#define HES_EMU_H
+
+#include "Classic_Emu.h"
+#include "Hes_Core.h"
+
+class Hes_Emu : public Classic_Emu {
+public:
+
+ static gme_type_t static_type() { return gme_hes_type; }
+
+ // HES file header (see Hes_Core.h)
+ typedef Hes_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core.header(); }
+
+// Implementation
+public:
+ Hes_Emu();
+ ~Hes_Emu();
+ virtual void unload();
+
+protected:
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+
+private:
+ Hes_Core core;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.cpp
new file mode 100644
index 00000000..01396016
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.cpp
@@ -0,0 +1,214 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Kss_Core.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Kss_Core::Kss_Core() : rom( Kss_Cpu::page_size )
+{
+ memset( unmapped_read, 0xFF, sizeof unmapped_read );
+}
+
+Kss_Core::~Kss_Core() { }
+
+void Kss_Core::unload()
+{
+ rom.clear();
+}
+
+static blargg_err_t check_kss_header( void const* header )
+{
+ if ( memcmp( header, "KSCC", 4 ) && memcmp( header, "KSSX", 4 ) )
+ return blargg_err_file_type;
+ return blargg_ok;
+}
+
+blargg_err_t Kss_Core::load_( Data_Reader& in )
+{
+ memset( &header_, 0, sizeof header_ );
+ assert( offsetof (header_t,msx_audio_vol) == header_t::size - 1 );
+ RETURN_ERR( rom.load( in, header_t::base_size, &header_, 0 ) );
+
+ RETURN_ERR( check_kss_header( header_.tag ) );
+
+ header_.last_track [0] = 255;
+ if ( header_.tag [3] == 'C' )
+ {
+ if ( header_.extra_header )
+ {
+ header_.extra_header = 0;
+ set_warning( "Unknown data in header" );
+ }
+ if ( header_.device_flags & ~0x0F )
+ {
+ header_.device_flags &= 0x0F;
+ set_warning( "Unknown data in header" );
+ }
+ }
+ else if ( header_.extra_header )
+ {
+ if ( header_.extra_header != header_.ext_size )
+ {
+ header_.extra_header = 0;
+ set_warning( "Invalid extra_header_size" );
+ }
+ else
+ {
+ memcpy( header_.data_size, rom.begin(), header_.ext_size );
+ }
+ }
+
+ #ifndef NDEBUG
+ {
+ int ram_mode = header_.device_flags & 0x84; // MSX
+ if ( header_.device_flags & 0x02 ) // SMS
+ ram_mode = (header_.device_flags & 0x88);
+
+ if ( ram_mode )
+ dprintf( "RAM not supported\n" ); // TODO: support
+ }
+ #endif
+
+ return blargg_ok;
+}
+
+void Kss_Core::jsr( byte const (&addr) [2] )
+{
+ ram [--cpu.r.sp] = idle_addr >> 8;
+ ram [--cpu.r.sp] = idle_addr & 0xFF;
+ cpu.r.pc = get_le16( addr );
+}
+
+blargg_err_t Kss_Core::start_track( int track )
+{
+ memset( ram, 0xC9, 0x4000 );
+ memset( ram + 0x4000, 0, sizeof ram - 0x4000 );
+
+ // copy driver code to lo RAM
+ static byte const bios [] = {
+ 0xD3, 0xA0, 0xF5, 0x7B, 0xD3, 0xA1, 0xF1, 0xC9, // $0001: WRTPSG
+ 0xD3, 0xA0, 0xDB, 0xA2, 0xC9 // $0009: RDPSG
+ };
+ static byte const vectors [] = {
+ 0xC3, 0x01, 0x00, // $0093: WRTPSG vector
+ 0xC3, 0x09, 0x00, // $0096: RDPSG vector
+ };
+ memcpy( ram + 0x01, bios, sizeof bios );
+ memcpy( ram + 0x93, vectors, sizeof vectors );
+
+ // copy non-banked data into RAM
+ int load_addr = get_le16( header_.load_addr );
+ int orig_load_size = get_le16( header_.load_size );
+ int load_size = min( orig_load_size, rom.file_size() );
+ load_size = min( load_size, (int) mem_size - load_addr );
+ if ( load_size != orig_load_size )
+ set_warning( "Excessive data size" );
+ memcpy( ram + load_addr, rom.begin() + header_.extra_header, load_size );
+
+ rom.set_addr( -load_size - header_.extra_header );
+
+ // check available bank data
+ int const bank_size = this->bank_size();
+ int max_banks = (rom.file_size() - load_size + bank_size - 1) / bank_size;
+ bank_count = header_.bank_mode & 0x7F;
+ if ( bank_count > max_banks )
+ {
+ bank_count = max_banks;
+ set_warning( "Bank data missing" );
+ }
+ //dprintf( "load_size : $%X\n", load_size );
+ //dprintf( "bank_size : $%X\n", bank_size );
+ //dprintf( "bank_count: %d (%d claimed)\n", bank_count, header_.bank_mode & 0x7F );
+
+ ram [idle_addr] = 0xFF;
+ cpu.reset( unmapped_write, unmapped_read );
+ cpu.map_mem( 0, mem_size, ram, ram );
+
+ cpu.r.sp = 0xF380;
+ cpu.r.b.a = track;
+ cpu.r.b.h = 0;
+ next_play = play_period;
+ gain_updated = false;
+ jsr( header_.init_addr );
+
+ return blargg_ok;
+}
+
+void Kss_Core::set_bank( int logical, int physical )
+{
+ int const bank_size = this->bank_size();
+
+ int addr = 0x8000;
+ if ( logical && bank_size == 8 * 1024 )
+ addr = 0xA000;
+
+ physical -= header_.first_bank;
+ if ( (unsigned) physical >= (unsigned) bank_count )
+ {
+ byte* data = ram + addr;
+ cpu.map_mem( addr, bank_size, data, data );
+ }
+ else
+ {
+ int phys = physical * bank_size;
+ for ( int offset = 0; offset < bank_size; offset += cpu.page_size )
+ cpu.map_mem( addr + offset, cpu.page_size,
+ unmapped_write, rom.at_addr( phys + offset ) );
+ }
+}
+
+void Kss_Core::cpu_out( time_t, addr_t addr, int data )
+{
+ dprintf( "OUT $%04X,$%02X\n", addr, data );
+}
+
+int Kss_Core::cpu_in( time_t, addr_t addr )
+{
+ dprintf( "IN $%04X\n", addr );
+ return 0xFF;
+}
+
+blargg_err_t Kss_Core::end_frame( time_t end )
+{
+ while ( cpu.time() < end )
+ {
+ time_t next = min( end, next_play );
+ run_cpu( next );
+ if ( cpu.r.pc == idle_addr )
+ cpu.set_time( next );
+
+ if ( cpu.time() >= next_play )
+ {
+ next_play += play_period;
+ if ( cpu.r.pc == idle_addr )
+ {
+ if ( !gain_updated )
+ {
+ gain_updated = true;
+ update_gain();
+ }
+
+ jsr( header_.play_addr );
+ }
+ }
+ }
+
+ next_play -= end;
+ check( next_play >= 0 );
+ cpu.adjust_time( -end );
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.h
new file mode 100644
index 00000000..3c9d8d9c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Core.h
@@ -0,0 +1,97 @@
+// MSX computer KSS music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef KSS_CORE_H
+#define KSS_CORE_H
+
+#include "Gme_Loader.h"
+#include "Rom_Data.h"
+#include "Z80_Cpu.h"
+
+class Kss_Core : public Gme_Loader {
+public:
+ // KSS file header
+ struct header_t
+ {
+ enum { size = 0x20 };
+ enum { base_size = 0x10 };
+ enum { ext_size = size - base_size };
+
+ byte tag [4];
+ byte load_addr [2];
+ byte load_size [2];
+ byte init_addr [2];
+ byte play_addr [2];
+ byte first_bank;
+ byte bank_mode;
+ byte extra_header;
+ byte device_flags;
+
+ // KSSX extended data, if extra_header==0x10
+ byte data_size [4];
+ byte unused [4];
+ byte first_track [2];
+ byte last_track [2]; // if no extended data, we set this to 0xFF
+ byte psg_vol;
+ byte scc_vol;
+ byte msx_music_vol;
+ byte msx_audio_vol;
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return header_; }
+
+ typedef int time_t;
+ void set_play_period( time_t p ) { play_period = p; }
+
+ blargg_err_t start_track( int );
+
+ blargg_err_t end_frame( time_t );
+
+protected:
+ typedef Z80_Cpu Kss_Cpu;
+ Kss_Cpu cpu;
+
+ void set_bank( int logical, int physical );
+
+ typedef int addr_t;
+ virtual void cpu_write( addr_t, int ) = 0;
+ virtual int cpu_in( time_t, addr_t );
+ virtual void cpu_out( time_t, addr_t, int );
+
+ // Called after one frame of emulation
+ virtual void update_gain() = 0;
+
+// Implementation
+public:
+ Kss_Core();
+ virtual ~Kss_Core();
+
+protected:
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual void unload();
+
+private:
+ enum { idle_addr = 0xFFFF };
+
+ Rom_Data rom;
+ header_t header_;
+ bool gain_updated;
+ int bank_count;
+ time_t play_period;
+ time_t next_play;
+
+ // large items
+ enum { mem_size = 0x10000 };
+ byte ram [mem_size + Kss_Cpu::cpu_padding];
+ byte unmapped_read [0x100]; // TODO: why isn't this page_size?
+ // because CPU can't read beyond this in last page? or because it will spill into unmapped_write?
+
+ byte unmapped_write [Kss_Cpu::page_size];
+
+ int bank_size() const { return (16 * 1024) >> (header_.bank_mode >> 7 & 1); }
+ bool run_cpu( time_t end );
+ void jsr( byte const (&addr) [2] );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Cpu.cpp
new file mode 100644
index 00000000..ef9f1040
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Cpu.cpp
@@ -0,0 +1,35 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Kss_Core.h"
+
+#include "blargg_endian.h"
+//#include "z80_cpu_log.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define OUT_PORT( addr, data ) cpu_out( TIME(), addr, data )
+#define IN_PORT( addr ) cpu_in( TIME(), addr )
+#define WRITE_MEM( addr, data ) {FLUSH_TIME(); cpu_write( addr, data );}
+#define IDLE_ADDR idle_addr
+#define CPU cpu
+
+#define CPU_BEGIN \
+bool Kss_Core::run_cpu( time_t end_time )\
+{\
+ cpu.set_end_time( end_time );
+
+ #include "Z80_Cpu_run.h"
+
+ return warning;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.cpp
new file mode 100644
index 00000000..9eac0756
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.cpp
@@ -0,0 +1,470 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Kss_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define IF_PTR( ptr ) if ( ptr ) (ptr)
+
+int const clock_rate = 3579545;
+
+#define FOR_EACH_APU( macro )\
+{\
+ macro( sms.psg );\
+ macro( sms.fm );\
+ macro( msx.psg );\
+ macro( msx.scc );\
+ macro( msx.music );\
+ macro( msx.audio );\
+}
+
+Kss_Emu::Kss_Emu() :
+ core( this )
+{
+ #define ACTION( apu ) { core.apu = NULL; }
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+
+ set_type( gme_kss_type );
+}
+
+Kss_Emu::~Kss_Emu()
+{
+ unload();
+}
+
+inline void Kss_Emu::Core::unload()
+{
+ #define ACTION( ptr ) { delete (ptr); (ptr) = 0; }
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+}
+
+void Kss_Emu::unload()
+{
+ core.unload();
+ Classic_Emu::unload();
+}
+
+// Track info
+
+static void copy_kss_fields( Kss_Core::header_t const& h, track_info_t* out )
+{
+ const char* system = "MSX";
+
+ if ( h.device_flags & 0x02 )
+ {
+ system = "Sega Master System";
+ if ( h.device_flags & 0x04 )
+ system = "Game Gear";
+
+ if ( h.device_flags & 0x01 )
+ system = "Sega Mark III";
+ }
+ else
+ {
+ if ( h.device_flags & 0x09 )
+ system = "MSX + FM Sound";
+ }
+ Gme_File::copy_field_( out->system, system );
+}
+
+blargg_err_t Kss_Emu::track_info_( track_info_t* out, int ) const
+{
+ copy_kss_fields( header(), out );
+// TODO: remove
+//if ( msx.music ) strcpy( out->system, "msxmusic" );
+//if ( msx.audio ) strcpy( out->system, "msxaudio" );
+//if ( sms.fm ) strcpy( out->system, "fmunit" );
+ return blargg_ok;
+}
+
+static blargg_err_t check_kss_header( void const* header )
+{
+ if ( memcmp( header, "KSCC", 4 ) && memcmp( header, "KSSX", 4 ) )
+ return blargg_err_file_type;
+
+ return blargg_ok;
+}
+
+struct Kss_File : Gme_Info_
+{
+ Kss_Emu::header_t header_;
+
+ Kss_File() { set_type( gme_kss_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ memset( &header_, 0, sizeof header_ );
+ blargg_err_t err = in.read( &header_, header_.size );
+ if ( err )
+ return (err == blargg_err_file_eof ? blargg_err_file_type : err);
+
+ if ( header_.tag [3] == 'X' && header_.extra_header == 0x10 )
+ set_track_count( get_le16( header_.last_track ) + 1 );
+
+ return check_kss_header( &header_ );
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_kss_fields( header_, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_kss_emu () { return BLARGG_NEW Kss_Emu ; }
+static Music_Emu* new_kss_file() { return BLARGG_NEW Kss_File; }
+
+gme_type_t_ const gme_kss_type [1] = {{
+ "MSX",
+ 256,
+ &new_kss_emu,
+ &new_kss_file,
+ "KSS",
+ 0x03
+}};
+
+// Setup
+
+void Kss_Emu::Core::update_gain_()
+{
+ double g = emu.gain();
+ if ( msx.music || msx.audio || sms.fm )
+ {
+ g *= 0.3;
+ }
+ else
+ {
+ g *= 1.2;
+ if ( scc_accessed )
+ g *= 1.4;
+ }
+
+ #define ACTION( apu ) IF_PTR( apu )->volume( g )
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+}
+
+static blargg_err_t new_opl_apu( Opl_Apu::type_t type, Opl_Apu** out )
+{
+ check( !*out );
+ CHECK_ALLOC( *out = BLARGG_NEW( Opl_Apu ) );
+ blip_time_t const period = 72;
+ int const rate = clock_rate / period;
+ return (*out)->init( rate * period, rate, period, type );
+}
+
+blargg_err_t Kss_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( core.load( in ) );
+ set_warning( core.warning() );
+
+ set_track_count( get_le16( header().last_track ) + 1 );
+
+ core.scc_enabled = false;
+ if ( header().device_flags & 0x02 ) // Sega Master System
+ {
+ int const osc_count = Sms_Apu::osc_count + Opl_Apu::osc_count;
+ static const char* const names [osc_count] = {
+ "Square 1", "Square 2", "Square 3", "Noise", "FM"
+ };
+ set_voice_names( names );
+
+ static int const types [osc_count] = {
+ wave_type+1, wave_type+3, wave_type+2, mixed_type+1, wave_type+0
+ };
+ set_voice_types( types );
+
+ // sms.psg
+ set_voice_count( Sms_Apu::osc_count );
+ check( !core.sms.psg );
+ CHECK_ALLOC( core.sms.psg = BLARGG_NEW Sms_Apu );
+
+ // sms.fm
+ if ( header().device_flags & 0x01 )
+ {
+ set_voice_count( osc_count );
+ RETURN_ERR( new_opl_apu( Opl_Apu::type_smsfmunit, &core.sms.fm ) );
+ }
+
+ }
+ else // MSX
+ {
+ int const osc_count = Ay_Apu::osc_count + Opl_Apu::osc_count;
+ static const char* const names [osc_count] = {
+ "Square 1", "Square 2", "Square 3", "FM"
+ };
+ set_voice_names( names );
+
+ static int const types [osc_count] = {
+ wave_type+1, wave_type+3, wave_type+2, wave_type+0
+ };
+ set_voice_types( types );
+
+ // msx.psg
+ set_voice_count( Ay_Apu::osc_count );
+ check( !core.msx.psg );
+ CHECK_ALLOC( core.msx.psg = BLARGG_NEW Ay_Apu );
+
+ if ( header().device_flags & 0x10 )
+ set_warning( "MSX stereo not supported" );
+
+ // msx.music
+ if ( header().device_flags & 0x01 )
+ {
+ set_voice_count( osc_count );
+ RETURN_ERR( new_opl_apu( Opl_Apu::type_msxmusic, &core.msx.music ) );
+ }
+
+ // msx.audio
+ if ( header().device_flags & 0x08 )
+ {
+ set_voice_count( osc_count );
+ RETURN_ERR( new_opl_apu( Opl_Apu::type_msxaudio, &core.msx.audio ) );
+ }
+
+ if ( !(header().device_flags & 0x80) )
+ {
+ if ( !(header().device_flags & 0x84) )
+ core.scc_enabled = core.scc_enabled_true;
+
+ // msx.scc
+ check( !core.msx.scc );
+ CHECK_ALLOC( core.msx.scc = BLARGG_NEW Scc_Apu );
+
+ int const osc_count = Ay_Apu::osc_count + Scc_Apu::osc_count;
+ static const char* const names [osc_count] = {
+ "Square 1", "Square 2", "Square 3",
+ "Wave 1", "Wave 2", "Wave 3", "Wave 4", "Wave 5"
+ };
+ set_voice_names( names );
+
+ static int const types [osc_count] = {
+ wave_type+1, wave_type+3, wave_type+2,
+ wave_type+0, wave_type+4, wave_type+5, wave_type+6, wave_type+7,
+ };
+ set_voice_types( types );
+
+ set_voice_count( osc_count );
+ }
+ }
+
+ set_silence_lookahead( 6 );
+ if ( core.sms.fm || core.msx.music || core.msx.audio )
+ {
+ if ( !Opl_Apu::supported() )
+ set_warning( "FM sound not supported" );
+ else
+ set_silence_lookahead( 3 ); // Opl_Apu is really slow
+ }
+
+ return setup_buffer( ::clock_rate );
+}
+
+void Kss_Emu::update_eq( blip_eq_t const& eq )
+{
+ #define ACTION( apu ) IF_PTR( core.apu )->treble_eq( eq )
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+}
+
+void Kss_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ if ( core.sms.psg ) // Sega Master System
+ {
+ i -= core.sms.psg->osc_count;
+ if ( i < 0 )
+ {
+ core.sms.psg->set_output( i + core.sms.psg->osc_count, center, left, right );
+ return;
+ }
+
+ if ( core.sms.fm && i < core.sms.fm->osc_count )
+ core.sms.fm->set_output( i, center, NULL, NULL );
+ }
+ else if ( core.msx.psg ) // MSX
+ {
+ i -= core.msx.psg->osc_count;
+ if ( i < 0 )
+ {
+ core.msx.psg->set_output( i + core.msx.psg->osc_count, center );
+ return;
+ }
+
+ if ( core.msx.scc && i < core.msx.scc->osc_count ) core.msx.scc ->set_output( i, center );
+ if ( core.msx.music && i < core.msx.music->osc_count ) core.msx.music->set_output( i, center, NULL, NULL );
+ if ( core.msx.audio && i < core.msx.audio->osc_count ) core.msx.audio->set_output( i, center, NULL, NULL );
+ }
+}
+
+void Kss_Emu::set_tempo_( double t )
+{
+ int period = (header().device_flags & 0x40 ? ::clock_rate / 50 : ::clock_rate / 60);
+ core.set_play_period( (Kss_Core::time_t) (period / t) );
+}
+
+blargg_err_t Kss_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+
+ #define ACTION( apu ) IF_PTR( core.apu )->reset()
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+
+ core.scc_accessed = false;
+ core.update_gain_();
+
+ return core.start_track( track );
+}
+
+void Kss_Emu::Core::cpu_write_( addr_t addr, int data )
+{
+ // TODO: SCC+ support
+
+ data &= 0xFF;
+ switch ( addr )
+ {
+ case 0x9000:
+ set_bank( 0, data );
+ return;
+
+ case 0xB000:
+ set_bank( 1, data );
+ return;
+
+ case 0xBFFE: // selects between mapping areas (we just always enable both)
+ if ( data == 0 || data == 0x20 )
+ return;
+ }
+
+ int scc_addr = (addr & 0xDFFF) - 0x9800;
+ if ( (unsigned) scc_addr < 0xB0 && msx.scc )
+ {
+ scc_accessed = true;
+ //if ( (unsigned) (scc_addr - 0x90) < 0x10 )
+ // scc_addr -= 0x10; // 0x90-0x9F mirrors to 0x80-0x8F
+ if ( scc_addr < Scc_Apu::reg_count )
+ msx.scc->write( cpu.time(), addr, data );
+ return;
+ }
+
+ dprintf( "LD ($%04X),$%02X\n", addr, data );
+}
+
+void Kss_Emu::Core::cpu_write( addr_t addr, int data )
+{
+ *cpu.write( addr ) = data;
+ if ( (addr & scc_enabled) == 0x8000 )
+ cpu_write_( addr, data );
+}
+
+void Kss_Emu::Core::cpu_out( time_t time, addr_t addr, int data )
+{
+ data &= 0xFF;
+ switch ( addr & 0xFF )
+ {
+ case 0xA0:
+ if ( msx.psg )
+ msx.psg->write_addr( data );
+ return;
+
+ case 0xA1:
+ if ( msx.psg )
+ msx.psg->write_data( time, data );
+ return;
+
+ case 0x06:
+ if ( sms.psg && (header().device_flags & 0x04) )
+ {
+ sms.psg->write_ggstereo( time, data );
+ return;
+ }
+ break;
+
+ case 0x7E:
+ case 0x7F:
+ if ( sms.psg )
+ {
+ sms.psg->write_data( time, data );
+ return;
+ }
+ break;
+
+ #define OPL_WRITE_HANDLER( base, opl )\
+ case base : if ( opl ) { opl->write_addr( data ); return; } break;\
+ case base+1: if ( opl ) { opl->write_data( time, data ); return; } break;
+
+ OPL_WRITE_HANDLER( 0x7C, msx.music )
+ OPL_WRITE_HANDLER( 0xC0, msx.audio )
+ OPL_WRITE_HANDLER( 0xF0, sms.fm )
+
+ case 0xFE:
+ set_bank( 0, data );
+ return;
+
+ #ifndef NDEBUG
+ case 0xA8: // PPI
+ return;
+ #endif
+ }
+
+ Kss_Core::cpu_out( time, addr, data );
+}
+
+int Kss_Emu::Core::cpu_in( time_t time, addr_t addr )
+{
+ switch ( addr & 0xFF )
+ {
+ case 0xC0:
+ case 0xC1:
+ if ( msx.audio )
+ return msx.audio->read( time, addr & 1 );
+ break;
+
+ case 0xA2:
+ if ( msx.psg )
+ return msx.psg->read();
+ break;
+
+ #ifndef NDEBUG
+ case 0xA8: // PPI
+ return 0;
+ #endif
+ }
+
+ return Kss_Core::cpu_in( time, addr );
+}
+
+void Kss_Emu::Core::update_gain()
+{
+ if ( scc_accessed )
+ {
+ dprintf( "SCC accessed\n" );
+ update_gain_();
+ }
+}
+
+blargg_err_t Kss_Emu::run_clocks( blip_time_t& duration, int )
+{
+ RETURN_ERR( core.end_frame( duration ) );
+
+ #define ACTION( apu ) IF_PTR( core.apu )->end_frame( duration )
+ FOR_EACH_APU( ACTION );
+ #undef ACTION
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.h
new file mode 100644
index 00000000..78f251b2
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Emu.h
@@ -0,0 +1,77 @@
+// MSX computer KSS music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef KSS_EMU_H
+#define KSS_EMU_H
+
+#include "Classic_Emu.h"
+#include "Kss_Core.h"
+#include "Kss_Scc_Apu.h"
+#include "Sms_Apu.h"
+#include "Ay_Apu.h"
+#include "Opl_Apu.h"
+
+class Kss_Emu : public Classic_Emu {
+public:
+ // KSS file header (see Kss_Core.h)
+ typedef Kss_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core.header(); }
+
+ static gme_type_t static_type() { return gme_kss_type; }
+
+// Implementation
+public:
+ Kss_Emu();
+ ~Kss_Emu();
+
+protected:
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+ virtual void unload();
+
+private:
+ struct Core;
+ friend struct Core;
+ struct Core : Kss_Core {
+ Kss_Emu& emu;
+
+ // detection of tunes that use SCC so they can be made louder
+ bool scc_accessed;
+
+ enum { scc_enabled_true = 0xC000 };
+ unsigned scc_enabled; // 0 or 0xC000
+ int ay_latch;
+
+ struct {
+ Sms_Apu* psg;
+ Opl_Apu* fm;
+ } sms;
+
+ struct {
+ Ay_Apu* psg;
+ Scc_Apu* scc;
+ Opl_Apu* music;
+ Opl_Apu* audio;
+ } msx;
+
+ Core( Kss_Emu* e ) : emu( *e ) { }
+
+ virtual void cpu_write( addr_t, int );
+ virtual int cpu_in( time_t, addr_t );
+ virtual void cpu_out( time_t, addr_t, int );
+ virtual void update_gain();
+
+ void cpu_write_( addr_t addr, int data );
+ void update_gain_();
+ void unload();
+ } core;
+};
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.cpp
index 1660ac3d..18625894 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Scc_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.cpp
@@ -1,8 +1,8 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
#include "Kss_Scc_Apu.h"
-/* Copyright (C) 2006 Shay Green. This module is free software; you
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -17,79 +17,106 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
// Tones above this frequency are treated as disabled tone at half volume.
// Power of two is more efficient (avoids division).
-unsigned const inaudible_freq = 16384;
+int const inaudible_freq = 16384;
int const wave_size = 0x20;
+void Scc_Apu::set_output( Blip_Buffer* buf )
+{
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, buf );
+}
+
+void Scc_Apu::volume( double v )
+{
+ synth.volume( 0.43 / osc_count / amp_range * v );
+}
+
+void Scc_Apu::reset()
+{
+ last_time = 0;
+
+ for ( int i = osc_count; --i >= 0; )
+ memset( &oscs [i], 0, offsetof (osc_t,output) );
+
+ memset( regs, 0, sizeof regs );
+}
+
+Scc_Apu::Scc_Apu()
+{
+ set_output( NULL );
+ volume( 1.0 );
+ reset();
+}
+
void Scc_Apu::run_until( blip_time_t end_time )
{
for ( int index = 0; index < osc_count; index++ )
{
osc_t& osc = oscs [index];
-
+
Blip_Buffer* const output = osc.output;
if ( !output )
continue;
- output->set_modified();
-
- blip_time_t period = (regs [0x80 + index * 2 + 1] & 0x0F) * 0x100 +
- regs [0x80 + index * 2] + 1;
+
+ blip_time_t period = (regs [0xA0 + index * 2 + 1] & 0x0F) * 0x100 +
+ regs [0xA0 + index * 2] + 1;
int volume = 0;
- if ( regs [0x8F] & (1 << index) )
+ if ( regs [0xAF] & (1 << index) )
{
- blip_time_t inaudible_period = (blargg_ulong) (output->clock_rate() +
- inaudible_freq * 32) / (inaudible_freq * 16);
+ blip_time_t inaudible_period = (unsigned) (output->clock_rate() +
+ inaudible_freq * 32) / (unsigned) (inaudible_freq * 16);
if ( period > inaudible_period )
- volume = (regs [0x8A + index] & 0x0F) * (amp_range / 256 / 15);
+ volume = (regs [0xAA + index] & 0x0F) * (amp_range / 256 / 15);
}
-
+
BOOST::int8_t const* wave = (BOOST::int8_t*) regs + index * wave_size;
- if ( index == osc_count - 1 )
- wave -= wave_size; // last two oscs share wave
+ /*if ( index == osc_count - 1 )
+ wave -= wave_size; // last two oscs share same wave RAM*/
+
{
- int amp = wave [osc.phase] * volume;
- int delta = amp - osc.last_amp;
+ int delta = wave [osc.phase] * volume - osc.last_amp;
if ( delta )
{
- osc.last_amp = amp;
+ osc.last_amp += delta;
+ output->set_modified();
synth.offset( last_time, delta, output );
}
}
-
+
blip_time_t time = last_time + osc.delay;
if ( time < end_time )
{
+ int phase = osc.phase;
if ( !volume )
{
// maintain phase
- blargg_long count = (end_time - time + period - 1) / period;
- osc.phase = (osc.phase + count) & (wave_size - 1);
- time += count * period;
+ int count = (end_time - time + period - 1) / period;
+ phase += count; // will be masked below
+ time += count * period;
}
else
{
-
- int phase = osc.phase;
int last_wave = wave [phase];
phase = (phase + 1) & (wave_size - 1); // pre-advance for optimal inner loop
-
do
{
- int amp = wave [phase];
+ int delta = wave [phase] - last_wave;
phase = (phase + 1) & (wave_size - 1);
- int delta = amp - last_wave;
if ( delta )
{
- last_wave = amp;
- synth.offset( time, delta * volume, output );
+ last_wave += delta;
+ synth.offset_inline( time, delta * volume, output );
}
time += period;
}
while ( time < end_time );
-
- osc.phase = phase = (phase - 1) & (wave_size - 1); // undo pre-advance
- osc.last_amp = wave [phase] * volume;
+
+ osc.last_amp = last_wave * volume;
+ output->set_modified();
+ phase--; // undo pre-advance
}
+ osc.phase = phase & (wave_size - 1);
}
osc.delay = time - end_time;
}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.h
new file mode 100644
index 00000000..ee9234a4
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Kss_Scc_Apu.h
@@ -0,0 +1,111 @@
+// Konami SCC sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef KSS_SCC_APU_H
+#define KSS_SCC_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Scc_Apu {
+public:
+// Basics
+
+ // Sets buffer to generate sound into, or 0 to mute.
+ void set_output( Blip_Buffer* );
+
+ // Emulates to time t, then writes data to reg
+ enum { reg_count = 0xB0 }; // 0 <= reg < reg_count
+ void write( blip_time_t t, int reg, int data );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Resets sound chip
+ void reset();
+
+ // Same as set_output(), but for a particular channel
+ enum { osc_count = 5 };
+ void set_output( int chan, Blip_Buffer* );
+
+ // Set overall volume, where 1.0 is normal
+ void volume( double );
+
+ // Set treble equalization
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+private:
+ // noncopyable
+ Scc_Apu( const Scc_Apu& );
+ Scc_Apu& operator = ( const Scc_Apu& );
+
+
+// Implementation
+public:
+ Scc_Apu();
+ BLARGG_DISABLE_NOTHROW
+
+private:
+ enum { amp_range = 0x8000 };
+ struct osc_t
+ {
+ int delay;
+ int phase;
+ int last_amp;
+ Blip_Buffer* output;
+ };
+ osc_t oscs [osc_count];
+ blip_time_t last_time;
+ unsigned char regs [reg_count];
+ Blip_Synth_Fast synth;
+
+ void run_until( blip_time_t );
+};
+
+inline void Scc_Apu::set_output( int index, Blip_Buffer* b )
+{
+ assert( (unsigned) index < osc_count );
+ oscs [index].output = b;
+}
+
+inline void Scc_Apu::write( blip_time_t time, int addr, int data )
+{
+ //assert( (unsigned) addr < reg_count );
+ assert( ( addr >= 0x9800 && addr <= 0x988F ) || ( addr >= 0xB800 && addr <= 0xB8AF ) );
+ run_until( time );
+
+ addr -= 0x9800;
+ if ( ( unsigned ) addr < 0x90 )
+ {
+ if ( ( unsigned ) addr < 0x60 )
+ regs [addr] = data;
+ else if ( ( unsigned ) addr < 0x80 )
+ {
+ regs [addr] = regs[addr + 0x20] = data;
+ }
+ else if ( ( unsigned ) addr < 0x90 )
+ {
+ regs [addr + 0x20] = data;
+ }
+ }
+ else
+ {
+ addr -= 0xB800 - 0x9800;
+ if ( ( unsigned ) addr < 0xB0 )
+ regs [addr] = data;
+ }
+}
+
+inline void Scc_Apu::end_frame( blip_time_t end_time )
+{
+ if ( end_time > last_time )
+ run_until( end_time );
+
+ last_time -= end_time;
+ assert( last_time >= 0 );
+}
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.cpp b/plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.cpp
index 0a1475db..1f1a6522 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.cpp
@@ -1,426 +1,476 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "M3u_Playlist.h"
-#include "Music_Emu.h"
-
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-// gme functions defined here to avoid linking in m3u code unless it's used
-
-blargg_err_t Gme_File::load_m3u_( blargg_err_t err )
-{
- require( raw_track_count_ ); // file must be loaded first
-
- if ( !err )
- {
- if ( playlist.size() )
- track_count_ = playlist.size();
-
- int line = playlist.first_error();
- if ( line )
- {
- // avoid using bloated printf()
- char* out = &playlist_warning [sizeof playlist_warning];
- *--out = 0;
- do {
- *--out = line % 10 + '0';
- } while ( (line /= 10) > 0 );
-
- static const char str [] = "Problem in m3u at line ";
- out -= sizeof str - 1;
- memcpy( out, str, sizeof str - 1 );
- set_warning( out );
- }
- }
- return err;
-}
-
-blargg_err_t Gme_File::load_m3u( const char* path ) { return load_m3u_( playlist.load( path ) ); }
-
-blargg_err_t Gme_File::load_m3u( Data_Reader& in ) { return load_m3u_( playlist.load( in ) ); }
-
-gme_err_t gme_load_m3u( Music_Emu* me, const char* path ) { return me->load_m3u( path ); }
-
-gme_err_t gme_load_m3u_data( Music_Emu* me, const void* data, long size )
-{
- Mem_File_Reader in( data, size );
- return me->load_m3u( in );
-}
-
-
-
-static char* skip_white( char* in )
-{
- while ( *in == ' ' )
- in++;
- return in;
-}
-
-inline unsigned from_dec( unsigned n ) { return n - '0'; }
-
-static char* parse_filename( char* in, M3u_Playlist::entry_t& entry )
-{
- entry.file = in;
- entry.type = "";
- char* out = in;
- while ( 1 )
- {
- int c = *in;
- if ( !c ) break;
- in++;
-
- if ( c == ',' ) // commas in filename
- {
- char* p = skip_white( in );
- if ( *p == '$' || from_dec( *p ) <= 9 )
- {
- in = p;
- break;
- }
- }
-
- if ( c == ':' && in [0] == ':' && in [1] && in [2] != ',' ) // ::type suffix
- {
- entry.type = ++in;
- while ( (c = *in) != 0 && c != ',' )
- in++;
- if ( c == ',' )
- {
- *in++ = 0; // terminate type
- in = skip_white( in );
- }
- break;
- }
-
- if ( c == '\\' ) // \ prefix for special characters
- {
- c = *in;
- if ( !c ) break;
- in++;
- }
- *out++ = (char) c;
- }
- *out = 0; // terminate string
- return in;
-}
-
-static char* next_field( char* in, int* result )
-{
- while ( 1 )
- {
- in = skip_white( in );
-
- if ( !*in )
- break;
-
- if ( *in == ',' )
- {
- in++;
- break;
- }
-
- *result = 1;
- in++;
- }
- return skip_white( in );
-}
-
-static char* parse_int_( char* in, int* out )
-{
- int n = 0;
- while ( 1 )
- {
- unsigned d = from_dec( *in );
- if ( d > 9 )
- break;
- in++;
- n = n * 10 + d;
- *out = n;
- }
- return in;
-}
-
-static char* parse_int( char* in, int* out, int* result )
-{
- return next_field( parse_int_( in, out ), result );
-}
-
-// Returns 16 or greater if not hex
-inline int from_hex_char( int h )
-{
- h -= 0x30;
- if ( (unsigned) h > 9 )
- h = ((h - 0x11) & 0xDF) + 10;
- return h;
-}
-
-static char* parse_track( char* in, M3u_Playlist::entry_t& entry, int* result )
-{
- if ( *in == '$' )
- {
- in++;
- int n = 0;
- while ( 1 )
- {
- int h = from_hex_char( *in );
- if ( h > 15 )
- break;
- in++;
- n = n * 16 + h;
- entry.track = n;
- }
- }
- else
- {
- in = parse_int_( in, &entry.track );
- if ( entry.track >= 0 )
- entry.decimal_track = 1;
- }
- return next_field( in, result );
-}
-
-static char* parse_time_( char* in, int* out )
-{
- *out = -1;
- int n = -1;
- in = parse_int_( in, &n );
- if ( n >= 0 )
- {
- *out = n;
- if ( *in == ':' )
- {
- n = -1;
- in = parse_int_( in + 1, &n );
- if ( n >= 0 )
- *out = *out * 60 + n;
- }
- }
- return in;
-}
-
-static char* parse_time( char* in, int* out, int* result )
-{
- return next_field( parse_time_( in, out ), result );
-}
-
-static char* parse_name( char* in )
-{
- char* out = in;
- while ( 1 )
- {
- int c = *in;
- if ( !c ) break;
- in++;
-
- if ( c == ',' ) // commas in string
- {
- char* p = skip_white( in );
- if ( *p == ',' || *p == '-' || from_dec( *p ) <= 9 )
- {
- in = p;
- break;
- }
- }
-
- if ( c == '\\' ) // \ prefix for special characters
- {
- c = *in;
- if ( !c ) break;
- in++;
- }
- *out++ = (char) c;
- }
- *out = 0; // terminate string
- return in;
-}
-
-static int parse_line( char* in, M3u_Playlist::entry_t& entry )
-{
- int result = 0;
-
- // file
- entry.file = in;
- entry.type = "";
- in = parse_filename( in, entry );
-
- // track
- entry.track = -1;
- entry.decimal_track = 0;
- in = parse_track( in, entry, &result );
-
- // name
- entry.name = in;
- in = parse_name( in );
-
- // time
- entry.length = -1;
- in = parse_time( in, &entry.length, &result );
-
- // loop
- entry.intro = -1;
- entry.loop = -1;
- if ( *in == '-' )
- {
- entry.loop = entry.length;
- in++;
- }
- else
- {
- in = parse_time_( in, &entry.loop );
- if ( entry.loop >= 0 )
- {
- entry.intro = 0;
- if ( *in == '-' ) // trailing '-' means that intro length was specified
- {
- in++;
- entry.intro = entry.loop;
- entry.loop = entry.length - entry.intro;
- }
- }
- }
- in = next_field( in, &result );
-
- // fade
- entry.fade = -1;
- in = parse_time( in, &entry.fade, &result );
-
- // repeat
- entry.repeat = -1;
- in = parse_int( in, &entry.repeat, &result );
-
- return result;
-}
-
-static void parse_comment( char* in, M3u_Playlist::info_t& info, bool first )
-{
- in = skip_white( in + 1 );
- const char* field = in;
- while ( *in && *in != ':' )
- in++;
-
- if ( *in == ':' )
- {
- const char* text = skip_white( in + 1 );
- if ( *text )
- {
- *in = 0;
- if ( !strcmp( "Composer", field ) ) info.composer = text;
- else if ( !strcmp( "Engineer", field ) ) info.engineer = text;
- else if ( !strcmp( "Ripping" , field ) ) info.ripping = text;
- else if ( !strcmp( "Tagging" , field ) ) info.tagging = text;
- else
- text = 0;
- if ( text )
- return;
- *in = ':';
- }
- }
-
- if ( first )
- info.title = field;
-}
-
-blargg_err_t M3u_Playlist::parse_()
-{
- info_.title = "";
- info_.composer = "";
- info_.engineer = "";
- info_.ripping = "";
- info_.tagging = "";
-
- int const CR = 13;
- int const LF = 10;
-
- data.end() [-1] = LF; // terminate input
-
- first_error_ = 0;
- bool first_comment = true;
- int line = 0;
- int count = 0;
- char* in = data.begin();
- while ( in < data.end() )
- {
- // find end of line and terminate it
- line++;
- char* begin = in;
- while ( *in != CR && *in != LF )
- {
- if ( !*in )
- return "Not an m3u playlist";
- in++;
- }
- if ( in [0] == CR && in [1] == LF ) // treat CR,LF as a single line
- *in++ = 0;
- *in++ = 0;
-
- // parse line
- if ( *begin == '#' )
- {
- parse_comment( begin, info_, first_comment );
- first_comment = false;
- }
- else if ( *begin )
- {
- if ( (int) entries.size() <= count )
- RETURN_ERR( entries.resize( count * 2 + 64 ) );
-
- if ( !parse_line( begin, entries [count] ) )
- count++;
- else if ( !first_error_ )
- first_error_ = line;
- first_comment = false;
- }
- }
- if ( count <= 0 )
- return "Not an m3u playlist";
-
- if ( !(info_.composer [0] | info_.engineer [0] | info_.ripping [0] | info_.tagging [0]) )
- info_.title = "";
-
- return entries.resize( count );
-}
-
-blargg_err_t M3u_Playlist::parse()
-{
- blargg_err_t err = parse_();
- if ( err )
- {
- entries.clear();
- data.clear();
- }
- return err;
-}
-
-blargg_err_t M3u_Playlist::load( Data_Reader& in )
-{
- RETURN_ERR( data.resize( in.remain() + 1 ) );
- RETURN_ERR( in.read( data.begin(), data.size() - 1 ) );
- return parse();
-}
-
-blargg_err_t M3u_Playlist::load( const char* path )
-{
- GME_FILE_READER in;
- RETURN_ERR( in.open( path ) );
- return load( in );
-}
-
-blargg_err_t M3u_Playlist::load( void const* in, long size )
-{
- RETURN_ERR( data.resize( size + 1 ) );
- memcpy( data.begin(), in, size );
- return parse();
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "M3u_Playlist.h"
+#include "Music_Emu.h"
+
+/* Copyright (C) 2006 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// gme functions defined here to avoid linking in m3u code unless it's used
+
+blargg_err_t Gme_File::load_m3u_( blargg_err_t err )
+{
+ if ( !err )
+ {
+ require( raw_track_count_ ); // file must be loaded first
+ if ( playlist.size() )
+ track_count_ = playlist.size();
+
+ int line = playlist.first_error();
+ if ( line )
+ {
+ // avoid using bloated printf()
+ char* out = &playlist_warning [sizeof playlist_warning];
+ *--out = 0;
+ do {
+ *--out = line % 10 + '0';
+ } while ( (line /= 10) > 0 );
+
+ static const char str [] = "Problem in m3u at line ";
+ out -= sizeof str - 1;
+ memcpy( out, str, sizeof str - 1 );
+ set_warning( out );
+ }
+ }
+ return err;
+}
+
+blargg_err_t Gme_File::load_m3u( const char path [] ) { return load_m3u_( playlist.load( path ) ); }
+
+blargg_err_t Gme_File::load_m3u( Data_Reader& in ) { return load_m3u_( playlist.load( in ) ); }
+
+gme_err_t gme_load_m3u( Music_Emu* me, const char path [] ) { return me->load_m3u( path ); }
+
+gme_err_t gme_load_m3u_data( Music_Emu* me, const void* data, long size )
+{
+ Mem_File_Reader in( data, size );
+ return me->load_m3u( in );
+}
+
+static char* skip_white( char* in )
+{
+ while ( unsigned (*in - 1) <= ' ' - 1 )
+ in++;
+ return in;
+}
+
+inline unsigned from_dec( unsigned n ) { return n - '0'; }
+
+static char* parse_filename( char* in, M3u_Playlist::entry_t& entry )
+{
+ entry.file = in;
+ entry.type = "";
+ char* out = in;
+ while ( 1 )
+ {
+ int c = *in;
+ if ( !c ) break;
+ in++;
+
+ if ( c == ',' ) // commas in filename
+ {
+ char* p = skip_white( in );
+ if ( *p == '$' || from_dec( *p ) <= 9 )
+ {
+ in = p;
+ break;
+ }
+ }
+
+ if ( c == ':' && in [0] == ':' && in [1] && in [2] != ',' ) // ::type suffix
+ {
+ entry.type = ++in;
+ while ( (c = *in) != 0 && c != ',' )
+ in++;
+ if ( c == ',' )
+ {
+ *in++ = 0; // terminate type
+ in = skip_white( in );
+ }
+ break;
+ }
+
+ if ( c == '\\' ) // \ prefix for special characters
+ {
+ c = *in;
+ if ( !c ) break;
+ in++;
+ }
+ *out++ = (char) c;
+ }
+ *out = 0; // terminate string
+ return in;
+}
+
+static char* next_field( char* in, int* result )
+{
+ while ( 1 )
+ {
+ in = skip_white( in );
+
+ if ( !*in )
+ break;
+
+ if ( *in == ',' )
+ {
+ in++;
+ break;
+ }
+
+ *result = 1;
+ in++;
+ }
+ return skip_white( in );
+}
+
+static char* parse_int_( char* in, int* out )
+{
+ int n = 0;
+ while ( 1 )
+ {
+ unsigned d = from_dec( *in );
+ if ( d > 9 )
+ break;
+ in++;
+ n = n * 10 + d;
+ *out = n;
+ }
+ return in;
+}
+
+static char* parse_int( char* in, int* out, int* result )
+{
+ return next_field( parse_int_( in, out ), result );
+}
+
+// Returns 16 or greater if not hex
+inline int from_hex_char( int h )
+{
+ h -= 0x30;
+ if ( (unsigned) h > 9 )
+ h = ((h - 0x11) & 0xDF) + 10;
+ return h;
+}
+
+static char* parse_track( char* in, M3u_Playlist::entry_t& entry, int* result )
+{
+ if ( *in == '$' )
+ {
+ in++;
+ int n = 0;
+ while ( 1 )
+ {
+ int h = from_hex_char( *in );
+ if ( h > 15 )
+ break;
+ in++;
+ n = n * 16 + h;
+ entry.track = n;
+ }
+ }
+ else
+ {
+ in = parse_int_( in, &entry.track );
+ if ( entry.track >= 0 )
+ entry.decimal_track = 1;
+ }
+ return next_field( in, result );
+}
+
+static char* parse_time_( char* in, int* out )
+{
+ *out = -1;
+ int n = -1;
+ in = parse_int_( in, &n );
+ if ( n >= 0 )
+ {
+ *out = n;
+ while ( *in == ':' )
+ {
+ n = -1;
+ in = parse_int_( in + 1, &n );
+ if ( n >= 0 )
+ *out = *out * 60 + n;
+ }
+ *out *= 1000;
+ if ( *in == '.' )
+ {
+ n = -1;
+ in = parse_int_( in + 1, &n );
+ if ( n >= 0 )
+ *out = *out + n;
+ }
+ }
+ return in;
+}
+
+static char* parse_time( char* in, int* out, int* result )
+{
+ return next_field( parse_time_( in, out ), result );
+}
+
+static char* parse_name( char* in )
+{
+ char* out = in;
+ while ( 1 )
+ {
+ int c = *in;
+ if ( !c ) break;
+ in++;
+
+ if ( c == ',' ) // commas in string
+ {
+ char* p = skip_white( in );
+ if ( *p == ',' || *p == '-' || from_dec( *p ) <= 9 )
+ {
+ in = p;
+ break;
+ }
+ }
+
+ if ( c == '\\' ) // \ prefix for special characters
+ {
+ c = *in;
+ if ( !c ) break;
+ in++;
+ }
+ *out++ = (char) c;
+ }
+ *out = 0; // terminate string
+ return in;
+}
+
+static int parse_line( char* in, M3u_Playlist::entry_t& entry )
+{
+ int result = 0;
+
+ // file
+ entry.file = in;
+ entry.type = "";
+ in = parse_filename( in, entry );
+
+ // track
+ entry.track = -1;
+ entry.decimal_track = 0;
+ in = parse_track( in, entry, &result );
+
+ // name
+ entry.name = in;
+ in = parse_name( in );
+
+ // time
+ entry.length = -1;
+ in = parse_time( in, &entry.length, &result );
+
+ // loop
+ entry.intro = -1;
+ entry.loop = -1;
+ if ( *in == '-' )
+ {
+ entry.loop = entry.length;
+ in++;
+ }
+ else
+ {
+ in = parse_time_( in, &entry.loop );
+ if ( entry.loop >= 0 )
+ {
+ entry.intro = entry.length - entry.loop;
+ if ( *in == '-' ) // trailing '-' means that intro length was specified
+ {
+ in++;
+ entry.intro = entry.loop;
+ entry.loop = entry.length - entry.intro;
+ }
+ }
+ }
+ in = next_field( in, &result );
+
+ // fade
+ entry.fade = -1;
+ in = parse_time( in, &entry.fade, &result );
+
+ // repeat
+ entry.repeat = -1;
+ in = parse_int( in, &entry.repeat, &result );
+
+ return result;
+}
+
+static void parse_comment( char* in, M3u_Playlist::info_t& info, char *& last_comment_value, bool first )
+{
+ in = skip_white( in + 1 );
+ const char* field = in;
+ if ( *field != '@' )
+ while ( *in && *in != ':' )
+ in++;
+
+ if ( *in == ':' )
+ {
+ const char* text = skip_white( in + 1 );
+ if ( *text )
+ {
+ *in = 0;
+ if ( !strcmp( "Composer" , field ) ) info.composer = text;
+ else if ( !strcmp( "Engineer" , field ) ) info.engineer = text;
+ else if ( !strcmp( "Ripping" , field ) ) info.ripping = text;
+ else if ( !strcmp( "Tagging" , field ) ) info.tagging = text;
+ else if ( !strcmp( "Game" , field ) ) info.title = text;
+ else if ( !strcmp( "Artist" , field ) ) info.artist = text;
+ else if ( !strcmp( "Copyright", field ) ) info.copyright = text;
+ else
+ text = 0;
+ if ( text )
+ return;
+ *in = ':';
+ }
+ }
+ else if ( *field == '@' )
+ {
+ ++field;
+ in = (char*)field;
+ while ( *in && *in > ' ' )
+ in++;
+ const char* text = skip_white( in );
+ if ( *text )
+ {
+ char saved = *in;
+ *in = 0;
+ if ( !strcmp( "TITLE" , field ) ) info.title = text;
+ else if ( !strcmp( "ARTIST", field ) ) info.artist = text;
+ else if ( !strcmp( "DATE", field ) ) info.date = text;
+ else if ( !strcmp( "COMPOSER", field ) ) info.composer = text;
+ else if ( !strcmp( "SEQUENCER", field ) ) info.sequencer = text;
+ else if ( !strcmp( "ENGINEER", field ) ) info.engineer = text;
+ else if ( !strcmp( "RIPPER", field ) ) info.ripping = text;
+ else if ( !strcmp( "TAGGER", field ) ) info.tagging = text;
+ else
+ text = 0;
+ if ( text )
+ {
+ last_comment_value = (char*)text;
+ return;
+ }
+ *in = saved;
+ }
+ }
+ else if ( last_comment_value )
+ {
+ size_t len = strlen( last_comment_value );
+ last_comment_value[ len ] = ',';
+ last_comment_value[ len + 1 ] = ' ';
+ size_t field_len = strlen( field );
+ memmove( last_comment_value + len + 2, field, field_len );
+ last_comment_value[ len + 2 + field_len ] = 0;
+ return;
+ }
+
+ if ( first )
+ info.title = field;
+}
+
+blargg_err_t M3u_Playlist::parse_()
+{
+ info_.title = "";
+ info_.artist = "";
+ info_.date = "";
+ info_.composer = "";
+ info_.sequencer = "";
+ info_.engineer = "";
+ info_.ripping = "";
+ info_.tagging = "";
+ info_.copyright = "";
+
+ int const CR = 13;
+ int const LF = 10;
+
+ data.end() [-1] = LF; // terminate input
+
+ first_error_ = 0;
+ bool first_comment = true;
+ int line = 0;
+ int count = 0;
+ char* in = data.begin();
+ char* last_comment_value = 0;
+ while ( in < data.end() )
+ {
+ // find end of line and terminate it
+ line++;
+ char* begin = in;
+ while ( *in != CR && *in != LF )
+ {
+ if ( !*in )
+ return blargg_err_file_type;
+ in++;
+ }
+ if ( in [0] == CR && in [1] == LF ) // treat CR,LF as a single line
+ *in++ = 0;
+ *in++ = 0;
+
+ // parse line
+ if ( *begin == '#' )
+ {
+ parse_comment( begin, info_, last_comment_value, first_comment );
+ first_comment = false;
+ }
+ else if ( *begin )
+ {
+ if ( (int) entries.size() <= count )
+ RETURN_ERR( entries.resize( count * 2 + 64 ) );
+
+ if ( !parse_line( begin, entries [count] ) )
+ count++;
+ else if ( !first_error_ )
+ first_error_ = line;
+ first_comment = false;
+ }
+ else last_comment_value = 0;
+ }
+ if ( count <= 0 )
+ return blargg_err_file_type;
+
+ // Treat first comment as title only if another field is also specified
+ if ( !(info_.artist [0] | info_.composer [0] | info_.date [0] | info_.engineer [0] | info_.ripping [0] | info_.sequencer [0] | info_.tagging [0] | info_.copyright[0]) )
+ info_.title = "";
+
+ return entries.resize( count );
+}
+
+blargg_err_t M3u_Playlist::parse()
+{
+ blargg_err_t err = parse_();
+ if ( err )
+ clear_();
+ return err;
+}
+
+blargg_err_t M3u_Playlist::load( Data_Reader& in )
+{
+ RETURN_ERR( data.resize( in.remain() + 1 ) );
+ RETURN_ERR( in.read( data.begin(), data.size() - 1 ) );
+ return parse();
+}
+
+blargg_err_t M3u_Playlist::load( const char path [] )
+{
+ GME_FILE_READER in;
+ RETURN_ERR( in.open( path ) );
+ return load( in );
+}
+
+blargg_err_t M3u_Playlist::load( void const* in, long size )
+{
+ RETURN_ERR( data.resize( size + 1 ) );
+ memcpy( data.begin(), in, size );
+ return parse();
+}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.h b/plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.h
index eda0dc89..5fe62ec3 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/M3u_Playlist.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/M3u_Playlist.h
@@ -1,67 +1,87 @@
-// M3U playlist file parser, with support for subtrack information
-
-// Game_Music_Emu 0.5.2
-#ifndef M3U_PLAYLIST_H
-#define M3U_PLAYLIST_H
-
-#include "blargg_common.h"
-#include "Data_Reader.h"
-
-class M3u_Playlist {
-public:
- // Load playlist data
- blargg_err_t load( const char* path );
- blargg_err_t load( Data_Reader& in );
- blargg_err_t load( void const* data, long size );
-
- // Line number of first parse error, 0 if no error. Any lines with parse
- // errors are ignored.
- int first_error() const { return first_error_; }
-
- struct info_t
- {
- const char* title;
- const char* composer;
- const char* engineer;
- const char* ripping;
- const char* tagging;
- };
- info_t const& info() const { return info_; }
-
- struct entry_t
- {
- const char* file; // filename without stupid ::TYPE suffix
- const char* type; // if filename has ::TYPE suffix, this will be "TYPE". "" if none.
- const char* name;
- bool decimal_track; // true if track was specified in hex
- // integers are -1 if not present
- int track; // 1-based
- int length; // seconds
- int intro;
- int loop;
- int fade;
- int repeat; // count
- };
- entry_t const& operator [] ( int i ) const { return entries [i]; }
- int size() const { return entries.size(); }
-
- void clear();
-
-private:
- blargg_vector<entry_t> entries;
- blargg_vector<char> data;
- int first_error_;
- info_t info_;
-
- blargg_err_t parse();
- blargg_err_t parse_();
-};
-
-inline void M3u_Playlist::clear()
-{
- first_error_ = 0;
- entries.clear();
- data.clear();
-}
-
-#endif
+// M3U playlist file parser, with support for subtrack information
+
+// Game_Music_Emu 0.6-pre
+#ifndef M3U_PLAYLIST_H
+#define M3U_PLAYLIST_H
+
+#include "blargg_common.h"
+#include "Data_Reader.h"
+
+class M3u_Playlist {
+public:
+ // Load playlist data
+ blargg_err_t load( const char* path );
+ blargg_err_t load( Data_Reader& in );
+ blargg_err_t load( void const* data, long size );
+
+ // Line number of first parse error, 0 if no error. Any lines with parse
+ // errors are ignored.
+ int first_error() const { return first_error_; }
+
+ // All string pointers point to valid string, or "" if not available
+ struct info_t
+ {
+ const char* title;
+ const char* artist;
+ const char* date;
+ const char* composer;
+ const char* sequencer;
+ const char* engineer;
+ const char* ripping;
+ const char* tagging;
+ const char* copyright;
+ };
+ info_t const& info() const { return info_; }
+
+ struct entry_t
+ {
+ const char* file; // filename without stupid ::TYPE suffix
+ const char* type; // if filename has ::TYPE suffix, this is "TYPE", otherwise ""
+ const char* name;
+ bool decimal_track; // true if track was specified in decimal
+ // integers are -1 if not present
+ int track;
+ int length; // milliseconds
+ int intro;
+ int loop;
+ int fade;
+ int repeat; // count
+ };
+ entry_t const& operator [] ( int i ) const { return entries [i]; }
+ int size() const { return entries.size(); }
+
+ void clear();
+
+private:
+ blargg_vector<entry_t> entries;
+ blargg_vector<char> data;
+ int first_error_;
+ info_t info_;
+
+ blargg_err_t parse();
+ blargg_err_t parse_();
+ void clear_();
+};
+
+inline void M3u_Playlist::clear_()
+{
+ info_.title = "";
+ info_.artist = "";
+ info_.date = "";
+ info_.composer = "";
+ info_.sequencer = "";
+ info_.engineer = "";
+ info_.ripping = "";
+ info_.tagging = "";
+ info_.copyright = "";
+ entries.clear();
+ data.clear();
+}
+
+inline void M3u_Playlist::clear()
+{
+ first_error_ = 0;
+ clear_();
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.cpp
new file mode 100644
index 00000000..c23b633e
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.cpp
@@ -0,0 +1,290 @@
+// Blip_Buffer 0.4.0. http://www.slack.net/~ant/
+
+#include "Multi_Buffer.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Multi_Buffer::Multi_Buffer( int spf ) : samples_per_frame_( spf )
+{
+ length_ = 0;
+ sample_rate_ = 0;
+ channels_changed_count_ = 1;
+ channel_types_ = NULL;
+ channel_count_ = 0;
+ immediate_removal_ = true;
+}
+
+Multi_Buffer::channel_t Multi_Buffer::channel( int /*index*/ )
+{
+ channel_t ch;
+ ch.center = ch.left = ch.right = NULL;
+ return ch;
+}
+
+// Silent_Buffer
+
+Silent_Buffer::Silent_Buffer() : Multi_Buffer( 1 ) // 0 channels would probably confuse
+{
+ // TODO: better to use empty Blip_Buffer so caller never has to check for NULL?
+ chan.left = NULL;
+ chan.center = NULL;
+ chan.right = NULL;
+}
+
+// Mono_Buffer
+
+Mono_Buffer::Mono_Buffer() : Multi_Buffer( 1 )
+{
+ chan.center = &buf;
+ chan.left = &buf;
+ chan.right = &buf;
+}
+
+Mono_Buffer::~Mono_Buffer() { }
+
+blargg_err_t Mono_Buffer::set_sample_rate( int rate, int msec )
+{
+ RETURN_ERR( buf.set_sample_rate( rate, msec ) );
+ return Multi_Buffer::set_sample_rate( buf.sample_rate(), buf.length() );
+}
+
+
+// Tracked_Blip_Buffer
+
+int const blip_buffer_extra = 32; // TODO: explain why this value
+
+Tracked_Blip_Buffer::Tracked_Blip_Buffer()
+{
+ last_non_silence = 0;
+}
+
+void Tracked_Blip_Buffer::clear()
+{
+ last_non_silence = 0;
+ Blip_Buffer::clear();
+}
+
+void Tracked_Blip_Buffer::end_frame( blip_time_t t )
+{
+ Blip_Buffer::end_frame( t );
+ if ( modified() )
+ {
+ clear_modified();
+ last_non_silence = samples_avail() + blip_buffer_extra;
+ }
+}
+
+unsigned Tracked_Blip_Buffer::non_silent() const
+{
+ return last_non_silence | unsettled();
+}
+
+inline void Tracked_Blip_Buffer::remove_( int n )
+{
+ if ( (last_non_silence -= n) < 0 )
+ last_non_silence = 0;
+}
+
+void Tracked_Blip_Buffer::remove_silence( int n )
+{
+ remove_( n );
+ Blip_Buffer::remove_silence( n );
+}
+
+void Tracked_Blip_Buffer::remove_samples( int n )
+{
+ remove_( n );
+ Blip_Buffer::remove_samples( n );
+}
+
+void Tracked_Blip_Buffer::remove_all_samples()
+{
+ int avail = samples_avail();
+ if ( !non_silent() )
+ remove_silence( avail );
+ else
+ remove_samples( avail );
+}
+
+int Tracked_Blip_Buffer::read_samples( blip_sample_t out [], int count )
+{
+ count = Blip_Buffer::read_samples( out, count );
+ remove_( count );
+ return count;
+}
+
+// Stereo_Buffer
+
+int const stereo = 2;
+
+Stereo_Buffer::Stereo_Buffer() : Multi_Buffer( 2 )
+{
+ chan.center = mixer.bufs [2] = &bufs [2];
+ chan.left = mixer.bufs [0] = &bufs [0];
+ chan.right = mixer.bufs [1] = &bufs [1];
+ mixer.samples_read = 0;
+}
+
+Stereo_Buffer::~Stereo_Buffer() { }
+
+blargg_err_t Stereo_Buffer::set_sample_rate( int rate, int msec )
+{
+ mixer.samples_read = 0;
+ for ( int i = bufs_size; --i >= 0; )
+ RETURN_ERR( bufs [i].set_sample_rate( rate, msec ) );
+ return Multi_Buffer::set_sample_rate( bufs [0].sample_rate(), bufs [0].length() );
+}
+
+void Stereo_Buffer::clock_rate( int rate )
+{
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].clock_rate( rate );
+}
+
+void Stereo_Buffer::bass_freq( int bass )
+{
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].bass_freq( bass );
+}
+
+void Stereo_Buffer::clear()
+{
+ mixer.samples_read = 0;
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].clear();
+}
+
+void Stereo_Buffer::end_frame( blip_time_t time )
+{
+ for ( int i = bufs_size; --i >= 0; )
+ bufs [i].end_frame( time );
+}
+
+int Stereo_Buffer::read_samples( blip_sample_t out [], int out_size )
+{
+ require( (out_size & 1) == 0 ); // must read an even number of samples
+ out_size = min( out_size, samples_avail() );
+
+ int pair_count = int (out_size >> 1);
+ if ( pair_count )
+ {
+ mixer.read_pairs( out, pair_count );
+
+ if ( samples_avail() <= 0 || immediate_removal() )
+ {
+ for ( int i = bufs_size; --i >= 0; )
+ {
+ buf_t& b = bufs [i];
+ // TODO: might miss non-silence settling since it checks END of last read
+ if ( !b.non_silent() )
+ b.remove_silence( mixer.samples_read );
+ else
+ b.remove_samples( mixer.samples_read );
+ }
+ mixer.samples_read = 0;
+ }
+ }
+ return out_size;
+}
+
+
+// Stereo_Mixer
+
+// mixers use a single index value to improve performance on register-challenged processors
+// offset goes from negative to zero
+
+void Stereo_Mixer::read_pairs( blip_sample_t out [], int count )
+{
+ // TODO: if caller never marks buffers as modified, uses mono
+ // except that buffer isn't cleared, so caller can encounter
+ // subtle problems and not realize the cause.
+ samples_read += count;
+ if ( bufs [0]->non_silent() | bufs [1]->non_silent() )
+ mix_stereo( out, count );
+ else
+ mix_mono( out, count );
+}
+
+void Stereo_Mixer::mix_mono( blip_sample_t out_ [], int count )
+{
+ int const bass = bufs [2]->highpass_shift();
+ Blip_Buffer::delta_t const* center = bufs [2]->read_pos() + samples_read;
+ int center_sum = bufs [2]->integrator();
+
+ typedef blip_sample_t stereo_blip_sample_t [stereo];
+ stereo_blip_sample_t* BLARGG_RESTRICT out = (stereo_blip_sample_t*) out_ + count;
+ int offset = -count;
+ do
+ {
+ int s = center_sum >> bufs [2]->delta_bits;
+
+ center_sum -= center_sum >> bass;
+ center_sum += center [offset];
+
+ BLIP_CLAMP( s, s );
+
+ out [offset] [0] = (blip_sample_t) s;
+ out [offset] [1] = (blip_sample_t) s;
+ }
+ while ( ++offset );
+
+ bufs [2]->set_integrator( center_sum );
+}
+
+void Stereo_Mixer::mix_stereo( blip_sample_t out_ [], int count )
+{
+ blip_sample_t* BLARGG_RESTRICT out = out_ + count * stereo;
+
+ // do left + center and right + center separately to reduce register load
+ Tracked_Blip_Buffer* const* buf = &bufs [2];
+ while ( true ) // loop runs twice
+ {
+ --buf;
+ --out;
+
+ int const bass = bufs [2]->highpass_shift();
+ Blip_Buffer::delta_t const* side = (*buf)->read_pos() + samples_read;
+ Blip_Buffer::delta_t const* center = bufs [2]->read_pos() + samples_read;
+
+ int side_sum = (*buf)->integrator();
+ int center_sum = bufs [2]->integrator();
+
+ int offset = -count;
+ do
+ {
+ int s = (center_sum + side_sum) >> Blip_Buffer::delta_bits;
+
+ side_sum -= side_sum >> bass;
+ center_sum -= center_sum >> bass;
+
+ side_sum += side [offset];
+ center_sum += center [offset];
+
+ BLIP_CLAMP( s, s );
+
+ ++offset; // before write since out is decremented to slightly before end
+ out [offset * stereo] = (blip_sample_t) s;
+ }
+ while ( offset );
+
+ (*buf)->set_integrator( side_sum );
+
+ if ( buf != bufs )
+ continue;
+
+ // only end center once
+ bufs [2]->set_integrator( center_sum );
+ break;
+ }
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.h b/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.h
new file mode 100644
index 00000000..57a41ba5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Multi_Buffer.h
@@ -0,0 +1,219 @@
+// Multi-channel sound buffer interface, and basic mono and stereo buffers
+
+// Blip_Buffer 0.4.0
+#ifndef MULTI_BUFFER_H
+#define MULTI_BUFFER_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+// Interface to one or more Blip_Buffers mapped to one or more channels
+// consisting of left, center, and right buffers.
+class Multi_Buffer {
+public:
+
+ // 1=mono, 2=stereo
+ Multi_Buffer( int samples_per_frame );
+ virtual ~Multi_Buffer() { }
+
+ // Sets the number of channels available and optionally their types
+ // (type information used by Effects_Buffer)
+ enum { type_index_mask = 0xFF };
+ enum { wave_type = 0x100, noise_type = 0x200, mixed_type = wave_type | noise_type };
+ virtual blargg_err_t set_channel_count( int, int const types [] = NULL );
+ int channel_count() const { return channel_count_; }
+
+ // Gets indexed channel, from 0 to channel_count()-1
+ struct channel_t {
+ Blip_Buffer* center;
+ Blip_Buffer* left;
+ Blip_Buffer* right;
+ };
+ virtual channel_t channel( int index ) BLARGG_PURE( ; )
+
+ // Number of samples per output frame (1 = mono, 2 = stereo)
+ int samples_per_frame() const;
+
+ // Count of changes to channel configuration. Incremented whenever
+ // a change is made to any of the Blip_Buffers for any channel.
+ unsigned channels_changed_count() { return channels_changed_count_; }
+
+ // See Blip_Buffer.h
+ virtual blargg_err_t set_sample_rate( int rate, int msec = blip_default_length ) BLARGG_PURE( ; )
+ int sample_rate() const;
+ int length() const;
+ virtual void clock_rate( int ) BLARGG_PURE( ; )
+ virtual void bass_freq( int ) BLARGG_PURE( ; )
+ virtual void clear() BLARGG_PURE( ; )
+ virtual void end_frame( blip_time_t ) BLARGG_PURE( ; )
+ virtual int read_samples( blip_sample_t [], int ) BLARGG_PURE( ; )
+ virtual int samples_avail() const BLARGG_PURE( ; )
+
+private:
+ // noncopyable
+ Multi_Buffer( const Multi_Buffer& );
+ Multi_Buffer& operator = ( const Multi_Buffer& );
+
+// Implementation
+public:
+ BLARGG_DISABLE_NOTHROW
+ void disable_immediate_removal() { immediate_removal_ = false; }
+
+protected:
+ bool immediate_removal() const { return immediate_removal_; }
+ int const* channel_types() const { return channel_types_; }
+ void channels_changed() { channels_changed_count_++; }
+
+private:
+ unsigned channels_changed_count_;
+ int sample_rate_;
+ int length_;
+ int channel_count_;
+ int const samples_per_frame_;
+ int const* channel_types_;
+ bool immediate_removal_;
+};
+
+
+// Uses a single buffer and outputs mono samples.
+class Mono_Buffer : public Multi_Buffer {
+public:
+ // Buffer used for all channels
+ Blip_Buffer* center() { return &buf; }
+
+// Implementation
+public:
+ Mono_Buffer();
+ ~Mono_Buffer();
+ virtual blargg_err_t set_sample_rate( int rate, int msec = blip_default_length );
+ virtual void clock_rate( int rate ) { buf.clock_rate( rate ); }
+ virtual void bass_freq( int freq ) { buf.bass_freq( freq ); }
+ virtual void clear() { buf.clear(); }
+ virtual int samples_avail() const { return buf.samples_avail(); }
+ virtual int read_samples( blip_sample_t p [], int s ) { return buf.read_samples( p, s ); }
+ virtual channel_t channel( int ) { return chan; }
+ virtual void end_frame( blip_time_t t ) { buf.end_frame( t ); }
+
+private:
+ Blip_Buffer buf;
+ channel_t chan;
+};
+
+ class Tracked_Blip_Buffer : public Blip_Buffer {
+ public:
+ // Non-zero if buffer still has non-silent samples in it. Requires that you call
+ // set_modified() appropriately.
+ unsigned non_silent() const;
+
+ // remove_samples( samples_avail() )
+ void remove_all_samples();
+
+ // Implementation
+ public:
+ BLARGG_DISABLE_NOTHROW
+ int read_samples( blip_sample_t [], int );
+ void remove_silence( int );
+ void remove_samples( int );
+ Tracked_Blip_Buffer();
+ void clear();
+ void end_frame( blip_time_t );
+
+ private:
+ int last_non_silence;
+
+ delta_t unsettled() const { return integrator() >> delta_bits; }
+ void remove_( int );
+ };
+
+ class Stereo_Mixer {
+ public:
+ Tracked_Blip_Buffer* bufs [3];
+ int samples_read;
+
+ Stereo_Mixer() : samples_read( 0 ) { }
+ void read_pairs( blip_sample_t out [], int count );
+
+ private:
+ void mix_mono ( blip_sample_t out [], int pair_count );
+ void mix_stereo( blip_sample_t out [], int pair_count );
+ };
+
+
+// Uses three buffers (one for center) and outputs stereo sample pairs.
+class Stereo_Buffer : public Multi_Buffer {
+public:
+
+ // Buffers used for all channels
+ Blip_Buffer* center() { return &bufs [2]; }
+ Blip_Buffer* left() { return &bufs [0]; }
+ Blip_Buffer* right() { return &bufs [1]; }
+
+// Implementation
+public:
+ Stereo_Buffer();
+ ~Stereo_Buffer();
+ virtual blargg_err_t set_sample_rate( int, int msec = blip_default_length );
+ virtual void clock_rate( int );
+ virtual void bass_freq( int );
+ virtual void clear();
+ virtual channel_t channel( int ) { return chan; }
+ virtual void end_frame( blip_time_t );
+ virtual int samples_avail() const { return (bufs [0].samples_avail() - mixer.samples_read) * 2; }
+ virtual int read_samples( blip_sample_t [], int );
+
+private:
+ enum { bufs_size = 3 };
+ typedef Tracked_Blip_Buffer buf_t;
+ buf_t bufs [bufs_size];
+ Stereo_Mixer mixer;
+ channel_t chan;
+ int samples_avail_;
+};
+
+
+// Silent_Buffer generates no samples, useful where no sound is wanted
+class Silent_Buffer : public Multi_Buffer {
+ channel_t chan;
+public:
+ Silent_Buffer();
+ virtual blargg_err_t set_sample_rate( int rate, int msec = blip_default_length );
+ virtual void clock_rate( int ) { }
+ virtual void bass_freq( int ) { }
+ virtual void clear() { }
+ virtual channel_t channel( int ) { return chan; }
+ virtual void end_frame( blip_time_t ) { }
+ virtual int samples_avail() const { return 0; }
+ virtual int read_samples( blip_sample_t [], int ) { return 0; }
+};
+
+
+inline blargg_err_t Multi_Buffer::set_sample_rate( int rate, int msec )
+{
+ sample_rate_ = rate;
+ length_ = msec;
+ return blargg_ok;
+}
+
+inline int Multi_Buffer::samples_per_frame() const { return samples_per_frame_; }
+inline int Multi_Buffer::sample_rate() const { return sample_rate_; }
+inline int Multi_Buffer::length() const { return length_; }
+inline void Multi_Buffer::clock_rate( int ) { }
+inline void Multi_Buffer::bass_freq( int ) { }
+inline void Multi_Buffer::clear() { }
+inline void Multi_Buffer::end_frame( blip_time_t ) { }
+inline int Multi_Buffer::read_samples( blip_sample_t [], int ) { return 0; }
+inline int Multi_Buffer::samples_avail() const { return 0; }
+
+inline blargg_err_t Multi_Buffer::set_channel_count( int n, int const types [] )
+{
+ channel_count_ = n;
+ channel_types_ = types;
+ return blargg_ok;
+}
+
+inline blargg_err_t Silent_Buffer::set_sample_rate( int rate, int msec )
+{
+ return Multi_Buffer::set_sample_rate( rate, msec );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.cpp
new file mode 100644
index 00000000..ed760afd
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.cpp
@@ -0,0 +1,235 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Music_Emu.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const stereo = 2; // number of channels for stereo
+
+Music_Emu::equalizer_t const Music_Emu::tv_eq = { -8.0, 180 };
+
+void Music_Emu::clear_track_vars()
+{
+ current_track_ = -1;
+ warning(); // clear warning
+ track_filter.stop();
+}
+
+void Music_Emu::unload()
+{
+ voice_count_ = 0;
+ clear_track_vars();
+ Gme_File::unload();
+}
+
+Music_Emu::gme_t()
+{
+ effects_buffer_ = NULL;
+ sample_rate_ = 0;
+ mute_mask_ = 0;
+ tempo_ = 1.0;
+ gain_ = 1.0;
+
+ // defaults
+ tfilter = track_filter.setup();
+ set_max_initial_silence( 15 );
+ set_silence_lookahead( 3 );
+ ignore_silence( false );
+
+ equalizer_.treble = -1.0;
+ equalizer_.bass = 60;
+
+ static const char* const names [] = {
+ "Voice 1", "Voice 2", "Voice 3", "Voice 4",
+ "Voice 5", "Voice 6", "Voice 7", "Voice 8"
+ };
+ set_voice_names( names );
+ Music_Emu::unload(); // clears fields
+}
+
+Music_Emu::~gme_t()
+{
+ assert( !effects_buffer_ );
+}
+
+blargg_err_t Music_Emu::set_sample_rate( int rate )
+{
+ require( !sample_rate() ); // sample rate can't be changed once set
+ RETURN_ERR( set_sample_rate_( rate ) );
+ RETURN_ERR( track_filter.init( this ) );
+ sample_rate_ = rate;
+ tfilter.max_silence = 6 * stereo * sample_rate();
+ return blargg_ok;
+}
+
+void Music_Emu::pre_load()
+{
+ require( sample_rate() ); // set_sample_rate() must be called before loading a file
+ Gme_File::pre_load();
+}
+
+void Music_Emu::set_equalizer( equalizer_t const& eq )
+{
+ // TODO: why is GCC generating memcpy call here?
+ // Without the 'if', valgrind flags it.
+ if ( &eq != &equalizer_ )
+ equalizer_ = eq;
+ set_equalizer_( eq );
+}
+
+void Music_Emu::mute_voice( int index, bool mute )
+{
+ require( (unsigned) index < (unsigned) voice_count() );
+ int bit = 1 << index;
+ int mask = mute_mask_ | bit;
+ if ( !mute )
+ mask ^= bit;
+ mute_voices( mask );
+}
+
+void Music_Emu::mute_voices( int mask )
+{
+ require( sample_rate() ); // sample rate must be set first
+ mute_mask_ = mask;
+ mute_voices_( mask );
+}
+
+const char* Music_Emu::voice_name( int i ) const
+{
+ if ( (unsigned) i < (unsigned) voice_count_ )
+ return voice_names_ [i];
+
+ //check( false ); // TODO: enable?
+ return "";
+}
+
+void Music_Emu::set_tempo( double t )
+{
+ require( sample_rate() ); // sample rate must be set first
+ double const min = 0.02;
+ double const max = 4.00;
+ if ( t < min ) t = min;
+ if ( t > max ) t = max;
+ tempo_ = t;
+ set_tempo_( t );
+}
+
+blargg_err_t Music_Emu::post_load()
+{
+ set_tempo( tempo_ );
+ remute_voices();
+ return Gme_File::post_load();
+}
+
+// Tell/Seek
+
+int Music_Emu::msec_to_samples( int msec ) const
+{
+ int sec = msec / 1000;
+ msec -= sec * 1000;
+ return (sec * sample_rate() + msec * sample_rate() / 1000) * stereo;
+}
+
+int Music_Emu::tell() const
+{
+ int rate = sample_rate() * stereo;
+ int sec = track_filter.sample_count() / rate;
+ return sec * 1000 + (track_filter.sample_count() - sec * rate) * 1000 / rate;
+}
+
+blargg_err_t Music_Emu::seek( int msec )
+{
+ int time = msec_to_samples( msec );
+ if ( time < track_filter.sample_count() )
+ RETURN_ERR( start_track( current_track_ ) );
+ return skip( time - track_filter.sample_count() );
+}
+
+blargg_err_t Music_Emu::skip( int count )
+{
+ require( current_track() >= 0 ); // start_track() must have been called already
+ return track_filter.skip( count );
+}
+
+blargg_err_t Music_Emu::skip_( int count )
+{
+ // for long skip, mute sound
+ const int threshold = 32768;
+ if ( count > threshold )
+ {
+ int saved_mute = mute_mask_;
+ mute_voices( ~0 );
+
+ int n = count - threshold/2;
+ n &= ~(2048-1); // round to multiple of 2048
+ count -= n;
+ RETURN_ERR( track_filter.skip_( n ) );
+
+ mute_voices( saved_mute );
+ }
+
+ return track_filter.skip_( count );
+}
+
+// Playback
+
+blargg_err_t Music_Emu::start_track( int track )
+{
+ clear_track_vars();
+
+ int remapped = track;
+ RETURN_ERR( remap_track_( &remapped ) );
+ current_track_ = track;
+ blargg_err_t err = start_track_( remapped );
+ if ( err )
+ {
+ current_track_ = -1;
+ return err;
+ }
+
+ // convert filter times to samples
+ Track_Filter::setup_t s = tfilter;
+ s.max_initial *= sample_rate() * stereo;
+ #if GME_DISABLE_SILENCE_LOOKAHEAD
+ s.lookahead = 1;
+ #endif
+ track_filter.setup( s );
+
+ return track_filter.start_track();
+}
+
+void Music_Emu::set_fade( int start_msec, int length_msec )
+{
+ track_filter.set_fade( msec_to_samples( start_msec ),
+ length_msec * sample_rate() / (1000 / stereo) );
+}
+
+blargg_err_t Music_Emu::play( int out_count, sample_t out [] )
+{
+ require( current_track() >= 0 );
+ require( out_count % stereo == 0 );
+
+ return track_filter.play( out_count, out );
+}
+
+// Gme_Info_
+
+blargg_err_t Gme_Info_::set_sample_rate_( int ) { return blargg_ok; }
+void Gme_Info_::pre_load() { Gme_File::pre_load(); } // skip Music_Emu
+blargg_err_t Gme_Info_::post_load() { return Gme_File::post_load(); } // skip Music_Emu
+void Gme_Info_::set_equalizer_( equalizer_t const& ){ check( false ); }
+void Gme_Info_::mute_voices_( int ) { check( false ); }
+void Gme_Info_::set_tempo_( double ) { }
+blargg_err_t Gme_Info_::start_track_( int ) { return BLARGG_ERR( BLARGG_ERR_CALLER, "can't play file opened for info only" ); }
+blargg_err_t Gme_Info_::play_( int, sample_t [] ) { return BLARGG_ERR( BLARGG_ERR_CALLER, "can't play file opened for info only" ); }
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.h
new file mode 100644
index 00000000..ccdc2288
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Music_Emu.h
@@ -0,0 +1,241 @@
+// Common interface to game music file emulators
+
+// Game_Music_Emu 0.6-pre
+#ifndef MUSIC_EMU_H
+#define MUSIC_EMU_H
+
+#include "Gme_File.h"
+#include "Track_Filter.h"
+class Multi_Buffer;
+
+struct gme_t : public Gme_File, private Track_Filter::callbacks_t {
+public:
+ // Sets output sample rate. Must be called only once before loading file.
+ blargg_err_t set_sample_rate( int sample_rate );
+
+ // Sample rate sound is generated at
+ int sample_rate() const;
+
+// File loading
+
+ // See Gme_Loader.h
+
+// Basic playback
+
+ // Starts a track, where 0 is the first track. Also clears warning string.
+ blargg_err_t start_track( int );
+
+ // Generates 'count' samples info 'buf'. Output is in stereo. Any emulation
+ // errors set warning string, and major errors also end track.
+ typedef short sample_t;
+ blargg_err_t play( int count, sample_t* buf );
+
+// Track information
+
+ // See Gme_File.h
+
+ // Index of current track or -1 if one hasn't been started
+ int current_track() const;
+
+ // Info for currently playing track
+ using Gme_File::track_info;
+ blargg_err_t track_info( track_info_t* out ) const;
+
+// Track status/control
+
+ // Number of milliseconds played since beginning of track (1000 per second)
+ int tell() const;
+
+ // Seeks to new time in track. Seeking backwards or far forward can take a while.
+ blargg_err_t seek( int msec );
+
+ // Skips n samples
+ blargg_err_t skip( int n );
+
+ // True if a track has reached its end
+ bool track_ended() const;
+
+ // Sets start time and length of track fade out. Once fade ends track_ended() returns
+ // true. Fade time must be set after track has been started, and can be changed
+ // at any time.
+ void set_fade( int start_msec, int length_msec = 8000 );
+
+ // Disables automatic end-of-track detection and skipping of silence at beginning
+ void ignore_silence( bool disable = true );
+
+// Voices
+
+ // Number of voices used by currently loaded file
+ int voice_count() const;
+
+ // Name of voice i, from 0 to voice_count()-1
+ const char* voice_name( int i ) const;
+
+ // Mutes/unmutes voice i, where voice 0 is first voice
+ void mute_voice( int index, bool mute = true );
+
+ // Sets muting state of all voices at once using a bit mask, where -1 mutes them all,
+ // 0 unmutes them all, 0x01 mutes just the first voice, etc.
+ void mute_voices( int mask );
+
+// Sound customization
+
+ // Adjusts song tempo, where 1.0 = normal, 0.5 = half speed, 2.0 = double speed.
+ // Track length as returned by track_info() assumes a tempo of 1.0.
+ void set_tempo( double );
+
+ // Changes overall output amplitude, where 1.0 results in minimal clamping.
+ // Must be called before set_sample_rate().
+ void set_gain( double );
+
+ // Requests use of custom multichannel buffer. Only supported by "classic" emulators;
+ // on others this has no effect. Should be called only once *before* set_sample_rate().
+ virtual void set_buffer( class Multi_Buffer* ) { }
+
+// Sound equalization (treble/bass)
+
+ // Frequency equalizer parameters (see gme.txt)
+ // See gme.h for definition of struct gme_equalizer_t.
+ typedef gme_equalizer_t equalizer_t;
+
+ // Current frequency equalizater parameters
+ equalizer_t const& equalizer() const;
+
+ // Sets frequency equalizer parameters
+ void set_equalizer( equalizer_t const& );
+
+ // Equalizer preset for a TV speaker
+ static equalizer_t const tv_eq;
+
+// Derived interface
+protected:
+ // Cause any further generated samples to be silence, instead of calling play_()
+ void set_track_ended() { track_filter.set_track_ended(); }
+
+ // If more than secs of silence are encountered, track is ended
+ void set_max_initial_silence( int secs ) { tfilter.max_initial = secs; }
+
+ // Sets rate emulator is run at when scanning ahead for silence. 1=100%, 2=200% etc.
+ void set_silence_lookahead( int rate ) { tfilter.lookahead = rate; }
+
+ // Sets number of voices
+ void set_voice_count( int n ) { voice_count_ = n; }
+
+ // Sets names of voices
+ void set_voice_names( const char* const names [] );
+
+ // Current gain
+ double gain() const { return gain_; }
+
+ // Current tempo
+ double tempo() const { return tempo_; }
+
+ // Re-applies muting mask using mute_voices_()
+ void remute_voices();
+
+// Overrides should do the indicated task
+
+ // Set sample rate as close as possible to sample_rate, then call
+ // Music_Emu::set_sample_rate_() with the actual rate used.
+ virtual blargg_err_t set_sample_rate_( int sample_rate ) BLARGG_PURE( ; )
+
+ // Set equalizer parameters
+ virtual void set_equalizer_( equalizer_t const& ) { }
+
+ // Mute voices based on mask
+ virtual void mute_voices_( int mask ) BLARGG_PURE( ; )
+
+ // Set tempo to t, which is constrained to the range 0.02 to 4.0.
+ virtual void set_tempo_( double t ) BLARGG_PURE( ; )
+
+ // Start track t, where 0 is the first track
+ virtual blargg_err_t start_track_( int t ) BLARGG_PURE( ; ) // tempo is set before this
+
+ // Generate count samples into *out. Count will always be even.
+ virtual blargg_err_t play_( int count, sample_t out [] ) BLARGG_PURE( ; )
+
+ // Skip count samples. Count will always be even.
+ virtual blargg_err_t skip_( int count );
+
+
+// Implementation
+public:
+ gme_t();
+ ~gme_t();
+ BLARGG_DEPRECATED( const char** voice_names() const { return CONST_CAST(const char**,voice_names_); } )
+
+protected:
+ virtual void unload();
+ virtual void pre_load();
+ virtual blargg_err_t post_load();
+
+private:
+ Track_Filter::setup_t tfilter;
+ Track_Filter track_filter;
+ equalizer_t equalizer_;
+ const char* const* voice_names_;
+ int voice_count_;
+ int mute_mask_;
+ double tempo_;
+ double gain_;
+ int sample_rate_;
+ int current_track_;
+
+ void clear_track_vars();
+ int msec_to_samples( int msec ) const;
+
+ friend Music_Emu* gme_new_emu( gme_type_t, int );
+ friend void gme_effects( Music_Emu const*, gme_effects_t* );
+ friend void gme_set_effects( Music_Emu*, gme_effects_t const* );
+ friend void gme_set_stereo_depth( Music_Emu*, double );
+ friend const char** gme_voice_names ( Music_Emu const* );
+
+protected:
+ Multi_Buffer* effects_buffer_;
+};
+
+// base class for info-only derivations
+struct Gme_Info_ : Music_Emu
+{
+ virtual blargg_err_t set_sample_rate_( int sample_rate );
+ virtual void set_equalizer_( equalizer_t const& );
+ virtual void mute_voices_( int mask );
+ virtual void set_tempo_( double );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t play_( int count, sample_t out [] );
+ virtual void pre_load();
+ virtual blargg_err_t post_load();
+};
+
+inline blargg_err_t Music_Emu::track_info( track_info_t* out ) const
+{
+ return track_info( out, current_track_ );
+}
+
+inline int Music_Emu::sample_rate() const { return sample_rate_; }
+inline int Music_Emu::voice_count() const { return voice_count_; }
+inline int Music_Emu::current_track() const { return current_track_; }
+inline bool Music_Emu::track_ended() const { return track_filter.track_ended(); }
+inline const Music_Emu::equalizer_t& Music_Emu::equalizer() const { return equalizer_; }
+
+inline void Music_Emu::ignore_silence( bool b ) { track_filter.ignore_silence( b ); }
+inline void Music_Emu::set_tempo_( double t ) { tempo_ = t; }
+inline void Music_Emu::remute_voices() { mute_voices( mute_mask_ ); }
+
+inline void Music_Emu::set_voice_names( const char* const p [] ) { voice_names_ = p; }
+
+inline void Music_Emu::mute_voices_( int ) { }
+
+inline void Music_Emu::set_gain( double g )
+{
+ assert( !sample_rate() ); // you must set gain before setting sample rate
+ gain_ = g;
+}
+
+inline blargg_err_t Music_Emu::start_track_( int ) { return blargg_ok; }
+
+inline blargg_err_t Music_Emu::set_sample_rate_( int ) { return blargg_ok; }
+
+inline blargg_err_t Music_Emu::play_( int, sample_t [] ) { return blargg_ok; }
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.cpp
index 8daf5d0e..675007a6 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.cpp
@@ -1,8 +1,8 @@
-// Nes_Snd_Emu 0.1.8. http://www.slack.net/~ant/
+// Nes_Snd_Emu 0.2.0-pre. http://www.slack.net/~ant/
#include "Nes_Apu.h"
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -23,8 +23,6 @@ Nes_Apu::Nes_Apu() :
{
tempo_ = 1.0;
dmc.apu = this;
- dmc.prg_reader = NULL;
- irq_notifier_ = NULL;
oscs [0] = &square1;
oscs [1] = &square2;
@@ -32,28 +30,28 @@ Nes_Apu::Nes_Apu() :
oscs [3] = &noise;
oscs [4] = &dmc;
- output( NULL );
+ set_output( NULL );
+ dmc.nonlinear = false;
volume( 1.0 );
reset( false );
}
void Nes_Apu::treble_eq( const blip_eq_t& eq )
{
- square_synth.treble_eq( eq );
+ square_synth .treble_eq( eq );
triangle.synth.treble_eq( eq );
- noise.synth.treble_eq( eq );
- dmc.synth.treble_eq( eq );
+ noise .synth.treble_eq( eq );
+ dmc .synth.treble_eq( eq );
}
-void Nes_Apu::enable_nonlinear( double v )
+void Nes_Apu::enable_nonlinear_( double sq, double tnd )
{
dmc.nonlinear = true;
- square_synth.volume( 1.3 * 0.25751258 / 0.742467605 * 0.25 / amp_range * v );
+ square_synth.volume( sq );
- const double tnd = 0.48 / 202 * nonlinear_tnd_gain();
- triangle.synth.volume( 3.0 * tnd );
- noise.synth.volume( 2.0 * tnd );
- dmc.synth.volume( tnd );
+ triangle.synth.volume( tnd * 2.752 );
+ noise .synth.volume( tnd * 1.849 );
+ dmc .synth.volume( tnd );
square1 .last_amp = 0;
square2 .last_amp = 0;
@@ -64,17 +62,20 @@ void Nes_Apu::enable_nonlinear( double v )
void Nes_Apu::volume( double v )
{
- dmc.nonlinear = false;
- square_synth.volume( 0.1128 / amp_range * v );
- triangle.synth.volume( 0.12765 / amp_range * v );
- noise.synth.volume( 0.0741 / amp_range * v );
- dmc.synth.volume( 0.42545 / 127 * v );
+ if ( !dmc.nonlinear )
+ {
+ v *= 1.0 / 1.11; // TODO: merge into values below
+ square_synth .volume( 0.125 / amp_range * v ); // was 0.1128 1.108
+ triangle.synth.volume( 0.150 / amp_range * v ); // was 0.12765 1.175
+ noise .synth.volume( 0.095 / amp_range * v ); // was 0.0741 1.282
+ dmc .synth.volume( 0.450 / 2048 * v ); // was 0.42545 1.058
+ }
}
-void Nes_Apu::output( Blip_Buffer* buffer )
+void Nes_Apu::set_output( Blip_Buffer* buffer )
{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, buffer );
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, buffer );
}
void Nes_Apu::set_tempo( double t )
@@ -105,7 +106,7 @@ void Nes_Apu::reset( bool pal_mode, int initial_dmc_dac )
write_register( 0, 0x4017, 0x00 );
write_register( 0, 0x4015, 0x00 );
- for ( nes_addr_t addr = start_addr; addr <= 0x4013; addr++ )
+ for ( int addr = io_addr; addr <= 0x4013; addr++ )
write_register( 0, addr, (addr & 3) ? 0x00 : 0x10 );
dmc.dac = initial_dmc_dac;
@@ -117,7 +118,7 @@ void Nes_Apu::reset( bool pal_mode, int initial_dmc_dac )
void Nes_Apu::irq_changed()
{
- nes_time_t new_irq = dmc.next_irq;
+ blip_time_t new_irq = dmc.next_irq;
if ( dmc.irq_flag | irq_flag ) {
new_irq = 0;
}
@@ -127,25 +128,25 @@ void Nes_Apu::irq_changed()
if ( new_irq != earliest_irq_ ) {
earliest_irq_ = new_irq;
- if ( irq_notifier_ )
- irq_notifier_( irq_data );
+ if ( irq_notifier.f )
+ irq_notifier.f( irq_notifier.data );
}
}
// frames
-void Nes_Apu::run_until( nes_time_t end_time )
+void Nes_Apu::run_until( blip_time_t end_time )
{
require( end_time >= last_dmc_time );
if ( end_time > next_dmc_read_time() )
{
- nes_time_t start = last_dmc_time;
+ blip_time_t start = last_dmc_time;
last_dmc_time = end_time;
dmc.run( start, end_time );
}
}
-void Nes_Apu::run_until_( nes_time_t end_time )
+void Nes_Apu::run_until_( blip_time_t end_time )
{
require( end_time >= last_time );
@@ -154,7 +155,7 @@ void Nes_Apu::run_until_( nes_time_t end_time )
if ( last_dmc_time < end_time )
{
- nes_time_t start = last_dmc_time;
+ blip_time_t start = last_dmc_time;
last_dmc_time = end_time;
dmc.run( start, end_time );
}
@@ -162,7 +163,7 @@ void Nes_Apu::run_until_( nes_time_t end_time )
while ( true )
{
// earlier of next frame time or end time
- nes_time_t time = last_time + frame_delay;
+ blip_time_t time = last_time + frame_delay;
if ( time > end_time )
time = end_time;
frame_delay -= time - last_time;
@@ -226,7 +227,7 @@ void Nes_Apu::run_until_( nes_time_t end_time )
}
template<class T>
-inline void zero_apu_osc( T* osc, nes_time_t time )
+inline void zero_apu_osc( T* osc, blip_time_t time )
{
Blip_Buffer* output = osc->output;
int last_amp = osc->last_amp;
@@ -235,7 +236,7 @@ inline void zero_apu_osc( T* osc, nes_time_t time )
osc->synth.offset( time, -last_amp, output );
}
-void Nes_Apu::end_frame( nes_time_t end_time )
+void Nes_Apu::end_frame( blip_time_t end_time )
{
if ( end_time > last_time )
run_until_( end_time );
@@ -280,13 +281,13 @@ static const unsigned char length_table [0x20] = {
0xC0, 0x18, 0x48, 0x1A, 0x10, 0x1C, 0x20, 0x1E
};
-void Nes_Apu::write_register( nes_time_t time, nes_addr_t addr, int data )
+void Nes_Apu::write_register( blip_time_t time, int addr, int data )
{
require( addr > 0x20 ); // addr must be actual address (i.e. 0x40xx)
require( (unsigned) data <= 0xFF );
// Ignore addresses outside range
- if ( unsigned (addr - start_addr) > end_addr - start_addr )
+ if ( unsigned (addr - io_addr) >= io_size )
return;
run_until_( time );
@@ -294,7 +295,7 @@ void Nes_Apu::write_register( nes_time_t time, nes_addr_t addr, int data )
if ( addr < 0x4014 )
{
// Write to channel
- int osc_index = (addr - start_addr) >> 2;
+ int osc_index = (addr - io_addr) >> 2;
Nes_Osc* osc = oscs [osc_index];
int reg = addr & 3;
@@ -366,7 +367,7 @@ void Nes_Apu::write_register( nes_time_t time, nes_addr_t addr, int data )
}
}
-int Nes_Apu::read_status( nes_time_t time )
+int Nes_Apu::read_status( blip_time_t time )
{
run_until_( time - 1 );
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.h
new file mode 100644
index 00000000..1004338a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Apu.h
@@ -0,0 +1,181 @@
+// NES 2A03 APU sound chip emulator
+
+// Nes_Snd_Emu 0.2.0-pre
+#ifndef NES_APU_H
+#define NES_APU_H
+
+#include "blargg_common.h"
+#include "Nes_Oscs.h"
+
+struct apu_state_t;
+class Nes_Buffer;
+
+class Nes_Apu {
+public:
+// Basics
+
+ typedef int nes_time_t; // NES CPU clock cycle count
+
+ // Sets memory reader callback used by DMC oscillator to fetch samples.
+ // When callback is invoked, 'user_data' is passed unchanged as the
+ // first parameter.
+ //void dmc_reader( int (*callback)( void* user_data, int addr ), void* user_data = NULL );
+
+ // Sets buffer to generate sound into, or 0 to mute output (reduces
+ // emulation accuracy).
+ void set_output( Blip_Buffer* );
+
+ // All time values are the number of CPU clock cycles relative to the
+ // beginning of the current time frame. Before resetting the CPU clock
+ // count, call end_frame( last_cpu_time ).
+
+ // Writes to register (0x4000-0x4013, and 0x4015 and 0x4017)
+ enum { io_addr = 0x4000 };
+ enum { io_size = 0x18 };
+ void write_register( nes_time_t, int addr, int data );
+
+ // Reads from status register (0x4015)
+ enum { status_addr = 0x4015 };
+ int read_status( nes_time_t );
+
+ // Runs all oscillators up to specified time, ends current time frame, then
+ // starts a new time frame at time 0. Time frames have no effect on emulation
+ // and each can be whatever length is convenient.
+ void end_frame( nes_time_t );
+
+// Optional
+
+ // Resets internal frame counter, registers, and all oscillators.
+ // Uses PAL timing if pal_timing is true, otherwise use NTSC timing.
+ // Sets the DMC oscillator's initial DAC value to initial_dmc_dac without
+ // any audible click.
+ void reset( bool pal_mode = false, int initial_dmc_dac = 0 );
+
+ // Same as set_output(), but for a particular channel
+ // 0: Square 1, 1: Square 2, 2: Triangle, 3: Noise, 4: DMC
+ enum { osc_count = 5 };
+ void set_output( int chan, Blip_Buffer* buf );
+
+ // Adjusts frame period
+ void set_tempo( double );
+
+ // Saves/loads exact emulation state
+ void save_state( apu_state_t* out ) const;
+ void load_state( apu_state_t const& );
+
+ // Sets overall volume (default is 1.0)
+ void volume( double );
+
+ // Sets treble equalization (see notes.txt)
+ void treble_eq( const blip_eq_t& );
+
+ // Sets IRQ time callback that is invoked when the time of earliest IRQ
+ // may have changed, or NULL to disable. When callback is invoked,
+ // 'user_data' is passed unchanged as the first parameter.
+ //void irq_notifier( void (*callback)( void* user_data ), void* user_data = NULL );
+
+ // Gets time that APU-generated IRQ will occur if no further register reads
+ // or writes occur. If IRQ is already pending, returns irq_waiting. If no
+ // IRQ will occur, returns no_irq.
+ enum { no_irq = INT_MAX/2 + 1 };
+ enum { irq_waiting = 0 };
+ nes_time_t earliest_irq( nes_time_t ) const;
+
+ // Counts number of DMC reads that would occur if 'run_until( t )' were executed.
+ // If last_read is not NULL, set *last_read to the earliest time that
+ // 'count_dmc_reads( time )' would result in the same result.
+ int count_dmc_reads( nes_time_t t, nes_time_t* last_read = NULL ) const;
+
+ // Time when next DMC memory read will occur
+ nes_time_t next_dmc_read_time() const;
+
+ // Runs DMC until specified time, so that any DMC memory reads can be
+ // accounted for (i.e. inserting CPU wait states).
+ void run_until( nes_time_t );
+
+
+// Implementation
+public:
+ Nes_Apu();
+ BLARGG_DISABLE_NOTHROW
+ // Use set_output() in place of these
+ BLARGG_DEPRECATED( void output ( Blip_Buffer* c ); )
+ BLARGG_DEPRECATED( void osc_output( int i, Blip_Buffer* c ); )
+
+ BLARGG_DEPRECATED_TEXT( enum { start_addr = 0x4000 }; )
+ BLARGG_DEPRECATED_TEXT( enum { end_addr = 0x4017 }; )
+
+ blargg_callback<int (*)( void* user_data, int addr )> dmc_reader;
+ blargg_callback<void (*)( void* user_data )> irq_notifier;
+
+ void enable_nonlinear_( double sq, double tnd );
+ static float tnd_total_() { return 196.015f; }
+
+private:
+ friend struct Nes_Dmc;
+
+ // noncopyable
+ Nes_Apu( const Nes_Apu& );
+ Nes_Apu& operator = ( const Nes_Apu& );
+
+ Nes_Osc* oscs [osc_count];
+ Nes_Square square1;
+ Nes_Square square2;
+ Nes_Noise noise;
+ Nes_Triangle triangle;
+ Nes_Dmc dmc;
+
+ double tempo_;
+ nes_time_t last_time; // has been run until this time in current frame
+ nes_time_t last_dmc_time;
+ nes_time_t earliest_irq_;
+ nes_time_t next_irq;
+ int frame_period;
+ int frame_delay; // cycles until frame counter runs next
+ int frame; // current frame (0-3)
+ int osc_enables;
+ int frame_mode;
+ bool irq_flag;
+ Nes_Square::Synth square_synth; // shared by squares
+
+ void irq_changed();
+ void state_restored();
+ void run_until_( nes_time_t );
+
+ // TODO: remove
+ friend class Nes_Core;
+};
+
+inline void Nes_Apu::set_output( int osc, Blip_Buffer* buf )
+{
+ assert( (unsigned) osc < osc_count );
+ oscs [osc]->output = buf;
+}
+
+inline Nes_Apu::nes_time_t Nes_Apu::earliest_irq( nes_time_t ) const
+{
+ return earliest_irq_;
+}
+
+inline int Nes_Apu::count_dmc_reads( nes_time_t time, nes_time_t* last_read ) const
+{
+ return dmc.count_reads( time, last_read );
+}
+
+inline Nes_Apu::nes_time_t Nes_Dmc::next_read_time() const
+{
+ if ( length_counter == 0 )
+ return Nes_Apu::no_irq; // not reading
+
+ return apu->last_dmc_time + delay + (bits_remain - 1) * period;
+}
+
+inline Nes_Apu::nes_time_t Nes_Apu::next_dmc_read_time() const { return dmc.next_read_time(); }
+
+BLARGG_DEPRECATED( typedef int nes_time_t; ) // use your own typedef
+BLARGG_DEPRECATED( typedef unsigned nes_addr_t; ) // use your own typedef
+
+BLARGG_DEPRECATED_TEXT( inline void Nes_Apu::output ( Blip_Buffer* c ) { set_output( c ); } )
+BLARGG_DEPRECATED_TEXT( inline void Nes_Apu::osc_output( int i, Blip_Buffer* c ) { set_output( i, c ); } )
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.cpp
new file mode 100644
index 00000000..5cfb3db3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.cpp
@@ -0,0 +1,62 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nes_Cpu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+inline void Nes_Cpu::set_code_page( int i, void const* p )
+{
+ byte const* p2 = STATIC_CAST(byte const*,p) - NES_CPU_OFFSET( i * page_size );
+ cpu_state->code_map [i] = p2;
+ cpu_state_.code_map [i] = p2;
+}
+
+void Nes_Cpu::map_code( addr_t start, int size, void const* data, int mirror_size )
+{
+ // address range must begin and end on page boundaries
+ require( start % page_size == 0 );
+ require( size % page_size == 0 );
+ require( start + size <= 0x10000 );
+ require( mirror_size % page_size == 0 );
+
+ for ( int offset = 0; offset < size; offset += page_size )
+ set_code_page( NES_CPU_PAGE( start + offset ),
+ STATIC_CAST(char const*,data) + (offset & ((unsigned) mirror_size - 1)) );
+}
+
+void Nes_Cpu::reset( void const* unmapped_page )
+{
+ check( cpu_state == &cpu_state_ );
+ cpu_state = &cpu_state_;
+
+ r.flags = irq_inhibit_mask;
+ r.sp = 0xFF;
+ r.pc = 0;
+ r.a = 0;
+ r.x = 0;
+ r.y = 0;
+
+ cpu_state_.time = 0;
+ cpu_state_.base = 0;
+ irq_time_ = future_time;
+ end_time_ = future_time;
+ error_count_ = 0;
+
+ set_code_page( page_count, unmapped_page );
+ map_code( 0, 0x10000, unmapped_page, page_size );
+
+ blargg_verify_byte_order();
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.h
new file mode 100644
index 00000000..41b5163c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu.h
@@ -0,0 +1,131 @@
+// NES CPU emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef NES_CPU_H
+#define NES_CPU_H
+
+#include "blargg_common.h"
+
+class Nes_Cpu {
+public:
+ typedef BOOST::uint8_t byte;
+ typedef int time_t;
+ typedef int addr_t;
+ enum { future_time = INT_MAX/2 + 1 };
+
+ // Clears registers and maps all pages to unmapped_page
+ void reset( void const* unmapped_page = NULL );
+
+ // Maps code memory (memory accessed via the program counter). Start and size
+ // must be multiple of page_size. If mirror_size is non-zero, the first
+ // mirror_size bytes are repeated over the range. mirror_size must be a
+ // multiple of page_size.
+ enum { page_bits = 11 };
+ enum { page_size = 1 << page_bits };
+ void map_code( addr_t start, int size, void const* code, int mirror_size = 0 );
+
+ // Accesses emulated memory as CPU does
+ byte const* get_code( addr_t ) const;
+
+ // NES 6502 registers. NOT kept updated during emulation.
+ struct registers_t {
+ BOOST::uint16_t pc;
+ byte a;
+ byte x;
+ byte y;
+ byte flags;
+ byte sp;
+ };
+ registers_t r;
+
+ // Time of beginning of next instruction to be executed
+ time_t time() const { return cpu_state->time + cpu_state->base; }
+ void set_time( time_t t ) { cpu_state->time = t - cpu_state->base; }
+ void adjust_time( int delta ) { cpu_state->time += delta; }
+
+ // Clocks past end (negative if before)
+ int time_past_end() const { return cpu_state->time; }
+
+ // Time of next IRQ
+ time_t irq_time() const { return irq_time_; }
+ void set_irq_time( time_t );
+
+ // Emulation stops once time >= end_time
+ time_t end_time() const { return end_time_; }
+ void set_end_time( time_t );
+
+ // Number of unimplemented instructions encountered and skipped
+ void clear_error_count() { error_count_ = 0; }
+ unsigned error_count() const { return error_count_; }
+ void count_error() { error_count_++; }
+
+ // Unmapped page should be filled with this
+ enum { halt_opcode = 0x22 };
+
+ enum { irq_inhibit_mask = 0x04 };
+
+ // Can read this many bytes past end of a page
+ enum { cpu_padding = 8 };
+
+private:
+ // noncopyable
+ Nes_Cpu( const Nes_Cpu& );
+ Nes_Cpu& operator = ( const Nes_Cpu& );
+
+
+// Implementation
+public:
+ Nes_Cpu() { cpu_state = &cpu_state_; }
+ enum { page_count = 0x10000 >> page_bits };
+
+ struct cpu_state_t {
+ byte const* code_map [page_count + 1];
+ time_t base;
+ int time;
+ };
+ cpu_state_t* cpu_state; // points to cpu_state_ or a local copy
+ cpu_state_t cpu_state_;
+ time_t irq_time_;
+ time_t end_time_;
+ unsigned error_count_;
+
+private:
+ void set_code_page( int, void const* );
+ inline void update_end_time( time_t end, time_t irq );
+};
+
+#define NES_CPU_PAGE( addr ) ((unsigned) (addr) >> Nes_Cpu::page_bits)
+
+#if BLARGG_NONPORTABLE
+ #define NES_CPU_OFFSET( addr ) (addr)
+#else
+ #define NES_CPU_OFFSET( addr ) ((addr) & (Nes_Cpu::page_size - 1))
+#endif
+
+inline BOOST::uint8_t const* Nes_Cpu::get_code( addr_t addr ) const
+{
+ return cpu_state_.code_map [NES_CPU_PAGE( addr )] + NES_CPU_OFFSET( addr );
+}
+
+inline void Nes_Cpu::update_end_time( time_t end, time_t irq )
+{
+ if ( end > irq && !(r.flags & irq_inhibit_mask) )
+ end = irq;
+
+ cpu_state->time += cpu_state->base - end;
+ cpu_state->base = end;
+}
+
+inline void Nes_Cpu::set_irq_time( time_t t )
+{
+ irq_time_ = t;
+ update_end_time( end_time_, t );
+}
+
+inline void Nes_Cpu::set_end_time( time_t t )
+{
+ end_time_ = t;
+ update_end_time( t, irq_time_ );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu_run.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu_run.h
new file mode 100644
index 00000000..0973b185
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Cpu_run.h
@@ -0,0 +1,1121 @@
+// NES 6502 CPU emulator run function
+
+#if 0
+/* Define these macros in the source file before #including this file.
+- Parameters might be expressions, so they are best evaluated only once,
+though they NEVER have side-effects, so multiple evaluation is OK.
+- Output parameters might be a multiple-assignment expression like "a=x",
+so they must NOT be parenthesized.
+- Except where noted, time() and related functions will NOT work
+correctly inside a macro. TIME() is always correct, and FLUSH_TIME() and
+CACHE_TIME() allow the time changing functions to work.
+- Macros "returning" void may use a {} statement block. */
+
+ // 0 <= addr <= 0xFFFF + page_size
+ // time functions can be used
+ int READ_MEM( addr_t );
+ void WRITE_MEM( addr_t, int data );
+ // 0 <= READ_MEM() <= 0xFF
+
+ // 0 <= addr <= 0x1FF
+ int READ_LOW( addr_t );
+ void WRITE_LOW( addr_t, int data );
+ // 0 <= READ_LOW() <= 0xFF
+
+ // Often-used instructions attempt these before using a normal memory access.
+ // Optional; defaults to READ_MEM() and WRITE_MEM()
+ bool CAN_READ_FAST( addr_t ); // if true, uses result of READ_FAST
+ void READ_FAST( addr_t, int& out ); // ALWAYS called BEFORE CAN_READ_FAST
+ bool CAN_WRITE_FAST( addr_t ); // if true, uses WRITE_FAST instead of WRITE_MEM
+ void WRITE_FAST( addr_t, int data );
+
+ // Used by instructions most often used to access the NES PPU (LDA abs and BIT abs).
+ // Optional; defaults to READ_MEM.
+ void READ_PPU( addr_t, int& out );
+ // 0 <= out <= 0xFF
+
+// The following can be used within macros:
+
+ // Current time
+ time_t TIME();
+
+ // Allows use of time functions
+ void FLUSH_TIME();
+
+ // Must be used before end of macro if FLUSH_TIME() was used earlier
+ void CACHE_TIME();
+
+// Configuration (optional; commented behavior if defined)
+
+ // Emulates dummy reads for indexed instructions
+ #define NES_CPU_DUMMY_READS 1
+
+ // Optimizes as if map_code( 0, 0x10000 + cpu_padding, FLAT_MEM ) is always in effect
+ #define FLAT_MEM my_mem_array
+
+ // Expanded just before beginning of code, to help debugger
+ #define CPU_BEGIN void my_run_cpu() {
+
+#endif
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+// Allows MWCW debugger to step through code properly
+#ifdef CPU_BEGIN
+ CPU_BEGIN
+#endif
+
+// Time
+#define TIME() (s_time + s.base)
+#define FLUSH_TIME() {s.time = s_time - time_offset;}
+#define CACHE_TIME() {s_time = s.time + time_offset;}
+
+// Defaults
+#ifndef CAN_WRITE_FAST
+ #define CAN_WRITE_FAST( addr ) 0
+ #define WRITE_FAST( addr, data )
+#endif
+
+#ifndef CAN_READ_FAST
+ #define CAN_READ_FAST( addr ) 0
+ #define READ_FAST( addr, out )
+#endif
+
+#ifndef READ_PPU
+ #define READ_PPU( addr, out )\
+ {\
+ FLUSH_TIME();\
+ out = READ_MEM( addr );\
+ CACHE_TIME();\
+ }
+#endif
+
+#define READ_STACK READ_LOW
+#define WRITE_STACK WRITE_LOW
+
+// Dummy reads
+#if NES_CPU_DUMMY_READS
+ // TODO: optimize time handling
+ #define DUMMY_READ( addr, idx ) \
+ if ( (addr & 0xFF) < idx )\
+ {\
+ int const time_offset = 1;\
+ FLUSH_TIME();\
+ READ_MEM( (addr - 0x100) );\
+ CACHE_TIME();\
+ }
+#else
+ #define DUMMY_READ( addr, idx )
+#endif
+
+// Code
+#ifdef FLAT_MEM
+ #define CODE_PAGE( addr ) (FLAT_MEM)
+ #define CODE_OFFSET( addr ) (addr)
+#else
+ #define CODE_PAGE( addr ) (s.code_map [NES_CPU_PAGE( addr )])
+ #define CODE_OFFSET( addr ) NES_CPU_OFFSET( addr )
+#endif
+#define READ_CODE( addr ) (CODE_PAGE( addr ) [CODE_OFFSET( addr )])
+
+// Stack
+#define SET_SP( v ) (sp = ((v) + 1) | 0x100)
+#define GET_SP() ((sp - 1) & 0xFF)
+#define SP( o ) ((sp + (o - (o>0)*0x100)) | 0x100)
+
+// Truncation
+#define BYTE( n ) ((BOOST::uint8_t ) (n)) /* (unsigned) n & 0xFF */
+#define SBYTE( n ) ((BOOST::int8_t ) (n)) /* (BYTE( n ) ^ 0x80) - 0x80 */
+#define WORD( n ) ((BOOST::uint16_t) (n)) /* (unsigned) n & 0xFFFF */
+
+// Flags with hex value for clarity when used as mask.
+// Stored in indicated variable during emulation.
+int const n80 = 0x80; // nz
+int const v40 = 0x40; // flags
+int const r20 = 0x20;
+int const b10 = 0x10;
+int const d08 = 0x08; // flags
+int const i04 = 0x04; // flags
+int const z02 = 0x02; // nz
+int const c01 = 0x01; // c
+
+#define IS_NEG (nz & 0x8080)
+
+#define GET_FLAGS( out ) \
+{\
+ out = flags & (v40 | d08 | i04);\
+ out += ((nz >> 8) | nz) & n80;\
+ out += c >> 8 & c01;\
+ if ( !BYTE( nz ) )\
+ out += z02;\
+}
+
+#define SET_FLAGS( in ) \
+{\
+ flags = in & (v40 | d08 | i04);\
+ c = nz = in << 8;\
+ nz += ~in & z02;\
+}
+
+{
+ int const time_offset = 0;
+
+ // Local state
+ Nes_Cpu::cpu_state_t s;
+ #ifdef FLAT_MEM
+ s.base = CPU.cpu_state_.base;
+ #else
+ s = CPU.cpu_state_;
+ #endif
+ CPU.cpu_state = &s;
+ int s_time = CPU.cpu_state_.time; // helps even on x86
+
+ // Registers
+ int pc = CPU.r.pc;
+ int a = CPU.r.a;
+ int x = CPU.r.x;
+ int y = CPU.r.y;
+ int sp;
+ SET_SP( CPU.r.sp );
+
+ // Flags
+ int flags;
+ int c; // carry set if (c & 0x100) != 0
+ int nz; // Z set if (nz & 0xFF) == 0, N set if (nz & 0x8080) != 0
+ {
+ int temp = CPU.r.flags;
+ SET_FLAGS( temp );
+ }
+
+loop:
+
+ // Check all values
+ check( (unsigned) sp - 0x100 < 0x100 );
+ check( (unsigned) pc < 0x10000 );
+ check( (unsigned) a < 0x100 );
+ check( (unsigned) x < 0x100 );
+ check( (unsigned) y < 0x100 );
+
+ // Read instruction
+ byte const* instr = CODE_PAGE( pc );
+ int opcode;
+
+ if ( CODE_OFFSET(~0) == ~0 )
+ {
+ opcode = instr [pc];
+ pc++;
+ instr += pc;
+ }
+ else
+ {
+ instr += CODE_OFFSET( pc );
+ opcode = *instr++;
+ pc++;
+ }
+
+ // local to function in case it helps optimizer
+ static byte const clock_table [256] =
+ {// 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0,6,2,8,3,3,5,5,3,2,2,2,4,4,6,6,// 0
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 1
+ 6,6,0,8,3,3,5,5,4,2,2,2,4,4,6,6,// 2
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 3
+ 6,6,2,8,3,3,5,5,3,2,2,2,3,4,6,6,// 4
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 5
+ 6,6,2,8,3,3,5,5,4,2,2,2,5,4,6,6,// 6
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// 7
+ 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// 8
+ 2,6,2,6,4,4,4,4,2,5,2,5,5,5,5,5,// 9
+ 2,6,2,6,3,3,3,3,2,2,2,2,4,4,4,4,// A
+ 2,5,2,5,4,4,4,4,2,4,2,4,4,4,4,4,// B
+ 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// C
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7,// D
+ 2,6,2,8,3,3,5,5,2,2,2,2,4,4,6,6,// E
+ 2,5,2,8,4,4,6,6,2,4,2,7,4,4,7,7 // F
+ }; // 0x00 was 7 and 0x22 was 2
+
+ // Update time
+ if ( s_time >= 0 )
+ goto out_of_time;
+
+ #ifdef CPU_INSTR_HOOK
+ { CPU_INSTR_HOOK( (pc-1), (&instr [-1]), a, x, y, GET_SP(), TIME() ); }
+ #endif
+
+ s_time += clock_table [opcode];
+
+ int data;
+ data = *instr;
+
+ switch ( opcode )
+ {
+
+// Macros
+
+#define GET_MSB() (instr [1])
+#define ADD_PAGE( out ) (pc++, out = data + 0x100 * GET_MSB())
+#define GET_ADDR() GET_LE16( instr )
+
+#define PAGE_PENALTY( lsb ) s_time += (lsb) >> 8;
+
+#define INC_DEC( reg, n ) reg = BYTE( nz = reg + n ); goto loop;
+
+#define IND_Y( cross, out ) {\
+ int temp = READ_LOW( data ) + y;\
+ out = temp + 0x100 * READ_LOW( BYTE( data + 1 ) );\
+ cross( temp );\
+ }
+
+#define IND_X( out ) {\
+ int temp = data + x;\
+ out = 0x100 * READ_LOW( BYTE( temp + 1 ) ) + READ_LOW( BYTE( temp ) );\
+ }
+
+#define ARITH_ADDR_MODES( op )\
+case op - 0x04: /* (ind,x) */\
+ IND_X( data )\
+ goto ptr##op;\
+case op + 0x0C: /* (ind),y */\
+ IND_Y( PAGE_PENALTY, data )\
+ goto ptr##op;\
+case op + 0x10: /* zp,X */\
+ data = BYTE( data + x );\
+case op + 0x00: /* zp */\
+ data = READ_LOW( data );\
+ goto imm##op;\
+case op + 0x14: /* abs,Y */\
+ data += y;\
+ goto ind##op;\
+case op + 0x18: /* abs,X */\
+ data += x;\
+ind##op:\
+ PAGE_PENALTY( data );\
+case op + 0x08: /* abs */\
+ ADD_PAGE( data );\
+ptr##op:\
+ FLUSH_TIME();\
+ data = READ_MEM( data );\
+ CACHE_TIME();\
+case op + 0x04: /* imm */\
+imm##op:
+
+// TODO: more efficient way to handle negative branch that wraps PC around
+#define BRANCH( cond )\
+{\
+ ++pc;\
+ if ( !(cond) ) goto loop;\
+ s_time++;\
+ int offset = SBYTE( data );\
+ s_time += (BYTE(pc) + offset) >> 8 & 1;\
+ pc = WORD( pc + offset );\
+ goto loop;\
+}
+
+// Often-Used
+
+ case 0xB5: // LDA zp,x
+ a = nz = READ_LOW( BYTE( data + x ) );
+ pc++;
+ goto loop;
+
+ case 0xA5: // LDA zp
+ a = nz = READ_LOW( data );
+ pc++;
+ goto loop;
+
+ case 0xD0: // BNE
+ BRANCH( BYTE( nz ) );
+
+ case 0x20: { // JSR
+ int temp = pc + 1;
+ pc = GET_ADDR();
+ WRITE_STACK( SP( -1 ), temp >> 8 );
+ sp = SP( -2 );
+ WRITE_STACK( sp, temp );
+ goto loop;
+ }
+
+ case 0x4C: // JMP abs
+ pc = GET_ADDR();
+ goto loop;
+
+ case 0xE8: // INX
+ INC_DEC( x, 1 )
+
+ case 0x10: // BPL
+ BRANCH( !IS_NEG )
+
+ ARITH_ADDR_MODES( 0xC5 ) // CMP
+ nz = a - data;
+ pc++;
+ c = ~nz;
+ nz &= 0xFF;
+ goto loop;
+
+ case 0x30: // BMI
+ BRANCH( IS_NEG )
+
+ case 0xF0: // BEQ
+ BRANCH( !BYTE( nz ) );
+
+ case 0x95: // STA zp,x
+ data = BYTE( data + x );
+ case 0x85: // STA zp
+ pc++;
+ WRITE_LOW( data, a );
+ goto loop;
+
+ case 0xC8: // INY
+ INC_DEC( y, 1 )
+
+ case 0xA8: // TAY
+ y = a;
+ nz = a;
+ goto loop;
+
+ case 0x98: // TYA
+ a = y;
+ nz = y;
+ goto loop;
+
+ case 0xAD:{// LDA abs
+ int addr = GET_ADDR();
+ pc += 2;
+ READ_PPU( addr, a = nz );
+ goto loop;
+ }
+
+ case 0x60: // RTS
+ pc = 1 + READ_STACK( sp );
+ pc += 0x100 * READ_STACK( SP( 1 ) );
+ sp = SP( 2 );
+ goto loop;
+
+ {
+ int addr;
+
+ case 0x8D: // STA abs
+ addr = GET_ADDR();
+ pc += 2;
+ if ( CAN_WRITE_FAST( addr ) )
+ {
+ WRITE_FAST( addr, a );
+ goto loop;
+ }
+ sta_ptr:
+ FLUSH_TIME();
+ WRITE_MEM( addr, a );
+ CACHE_TIME();
+ goto loop;
+
+ case 0x99: // STA abs,Y
+ addr = y + GET_ADDR();
+ pc += 2;
+ if ( CAN_WRITE_FAST( addr ) )
+ {
+ WRITE_FAST( addr, a );
+ goto loop;
+ }
+ goto sta_abs_x;
+
+ case 0x9D: // STA abs,X (slightly more common than STA abs)
+ addr = x + GET_ADDR();
+ pc += 2;
+ if ( CAN_WRITE_FAST( addr ) )
+ {
+ WRITE_FAST( addr, a );
+ goto loop;
+ }
+ DUMMY_READ( addr, x );
+ sta_abs_x:
+ FLUSH_TIME();
+ WRITE_MEM( addr, a );
+ CACHE_TIME();
+ goto loop;
+
+ case 0x91: // STA (ind),Y
+ #define NO_PAGE_PENALTY( lsb )
+ IND_Y( NO_PAGE_PENALTY, addr )
+ pc++;
+ DUMMY_READ( addr, y );
+ goto sta_ptr;
+
+ case 0x81: // STA (ind,X)
+ IND_X( addr )
+ pc++;
+ goto sta_ptr;
+
+ }
+
+ case 0xA9: // LDA #imm
+ pc++;
+ a = data;
+ nz = data;
+ goto loop;
+
+ // common read instructions
+ {
+ int addr;
+
+ case 0xA1: // LDA (ind,X)
+ IND_X( addr )
+ pc++;
+ goto a_nz_read_addr;
+
+ case 0xB1:// LDA (ind),Y
+ addr = READ_LOW( data ) + y;
+ PAGE_PENALTY( addr );
+ addr += 0x100 * READ_LOW( BYTE( data + 1 ) );
+ pc++;
+ READ_FAST( addr, a = nz );
+ if ( CAN_READ_FAST( addr ) )
+ goto loop;
+ DUMMY_READ( addr, y );
+ goto a_nz_read_addr;
+
+ case 0xB9: // LDA abs,Y
+ PAGE_PENALTY( data + y );
+ addr = GET_ADDR() + y;
+ pc += 2;
+ READ_FAST( addr, a = nz );
+ if ( CAN_READ_FAST( addr ) )
+ goto loop;
+ goto a_nz_read_addr;
+
+ case 0xBD: // LDA abs,X
+ PAGE_PENALTY( data + x );
+ addr = GET_ADDR() + x;
+ pc += 2;
+ READ_FAST( addr, a = nz );
+ if ( CAN_READ_FAST( addr ) )
+ goto loop;
+ DUMMY_READ( addr, x );
+ a_nz_read_addr:
+ FLUSH_TIME();
+ a = nz = READ_MEM( addr );
+ CACHE_TIME();
+ goto loop;
+
+ }
+
+// Branch
+
+ case 0x50: // BVC
+ BRANCH( !(flags & v40) )
+
+ case 0x70: // BVS
+ BRANCH( flags & v40 )
+
+ case 0xB0: // BCS
+ BRANCH( c & 0x100 )
+
+ case 0x90: // BCC
+ BRANCH( !(c & 0x100) )
+
+// Load/store
+
+ case 0x94: // STY zp,x
+ data = BYTE( data + x );
+ case 0x84: // STY zp
+ pc++;
+ WRITE_LOW( data, y );
+ goto loop;
+
+ case 0x96: // STX zp,y
+ data = BYTE( data + y );
+ case 0x86: // STX zp
+ pc++;
+ WRITE_LOW( data, x );
+ goto loop;
+
+ case 0xB6: // LDX zp,y
+ data = BYTE( data + y );
+ case 0xA6: // LDX zp
+ data = READ_LOW( data );
+ case 0xA2: // LDX #imm
+ pc++;
+ x = data;
+ nz = data;
+ goto loop;
+
+ case 0xB4: // LDY zp,x
+ data = BYTE( data + x );
+ case 0xA4: // LDY zp
+ data = READ_LOW( data );
+ case 0xA0: // LDY #imm
+ pc++;
+ y = data;
+ nz = data;
+ goto loop;
+
+ case 0xBC: // LDY abs,X
+ data += x;
+ PAGE_PENALTY( data );
+ case 0xAC:{// LDY abs
+ int addr = data + 0x100 * GET_MSB();
+ pc += 2;
+ FLUSH_TIME();
+ y = nz = READ_MEM( addr );
+ CACHE_TIME();
+ goto loop;
+ }
+
+ case 0xBE: // LDX abs,y
+ data += y;
+ PAGE_PENALTY( data );
+ case 0xAE:{// LDX abs
+ int addr = data + 0x100 * GET_MSB();
+ pc += 2;
+ FLUSH_TIME();
+ x = nz = READ_MEM( addr );
+ CACHE_TIME();
+ goto loop;
+ }
+
+ {
+ int temp;
+ case 0x8C: // STY abs
+ temp = y;
+ goto store_abs;
+
+ case 0x8E: // STX abs
+ temp = x;
+ store_abs:
+ int addr = GET_ADDR();
+ pc += 2;
+ if ( CAN_WRITE_FAST( addr ) )
+ {
+ WRITE_FAST( addr, temp );
+ goto loop;
+ }
+ FLUSH_TIME();
+ WRITE_MEM( addr, temp );
+ CACHE_TIME();
+ goto loop;
+ }
+
+// Compare
+
+ case 0xEC:{// CPX abs
+ int addr = GET_ADDR();
+ pc++;
+ FLUSH_TIME();
+ data = READ_MEM( addr );
+ CACHE_TIME();
+ goto cpx_data;
+ }
+
+ case 0xE4: // CPX zp
+ data = READ_LOW( data );
+ case 0xE0: // CPX #imm
+ cpx_data:
+ nz = x - data;
+ pc++;
+ c = ~nz;
+ nz &= 0xFF;
+ goto loop;
+
+ case 0xCC:{// CPY abs
+ int addr = GET_ADDR();
+ pc++;
+ FLUSH_TIME();
+ data = READ_MEM( addr );
+ CACHE_TIME();
+ goto cpy_data;
+ }
+
+ case 0xC4: // CPY zp
+ data = READ_LOW( data );
+ case 0xC0: // CPY #imm
+ cpy_data:
+ nz = y - data;
+ pc++;
+ c = ~nz;
+ nz &= 0xFF;
+ goto loop;
+
+// Logical
+
+ ARITH_ADDR_MODES( 0x25 ) // AND
+ nz = (a &= data);
+ pc++;
+ goto loop;
+
+ ARITH_ADDR_MODES( 0x45 ) // EOR
+ nz = (a ^= data);
+ pc++;
+ goto loop;
+
+ ARITH_ADDR_MODES( 0x05 ) // ORA
+ nz = (a |= data);
+ pc++;
+ goto loop;
+
+ case 0x2C:{// BIT abs
+ int addr = GET_ADDR();
+ pc += 2;
+ READ_PPU( addr, nz );
+ flags = (flags & ~v40) + (nz & v40);
+ if ( a & nz )
+ goto loop;
+ nz <<= 8; // result must be zero, even if N bit is set
+ goto loop;
+ }
+
+ case 0x24: // BIT zp
+ nz = READ_LOW( data );
+ pc++;
+ flags = (flags & ~v40) + (nz & v40);
+ if ( a & nz )
+ goto loop; // Z should be clear, and nz must be non-zero if nz & a is
+ nz <<= 8; // set Z flag without affecting N flag
+ goto loop;
+
+// Add/subtract
+
+ ARITH_ADDR_MODES( 0xE5 ) // SBC
+ case 0xEB: // unofficial equivalent
+ data ^= 0xFF;
+ goto adc_imm;
+
+ ARITH_ADDR_MODES( 0x65 ) // ADC
+ adc_imm: {
+ int carry = c >> 8 & 1;
+ int ov = (a ^ 0x80) + carry + SBYTE( data );
+ flags = (flags & ~v40) + (ov >> 2 & v40);
+ c = nz = a + data + carry;
+ pc++;
+ a = BYTE( nz );
+ goto loop;
+ }
+
+// Shift/rotate
+
+ case 0x4A: // LSR A
+ c = 0;
+ case 0x6A: // ROR A
+ nz = c >> 1 & 0x80;
+ c = a << 8;
+ nz += a >> 1;
+ a = nz;
+ goto loop;
+
+ case 0x0A: // ASL A
+ nz = a << 1;
+ c = nz;
+ a = BYTE( nz );
+ goto loop;
+
+ case 0x2A: { // ROL A
+ nz = a << 1;
+ int temp = c >> 8 & 1;
+ c = nz;
+ nz += temp;
+ a = BYTE( nz );
+ goto loop;
+ }
+
+ case 0x5E: // LSR abs,X
+ data += x;
+ case 0x4E: // LSR abs
+ c = 0;
+ case 0x6E: // ROR abs
+ ror_abs: {
+ ADD_PAGE( data );
+ FLUSH_TIME();
+ int temp = READ_MEM( data );
+ nz = (c >> 1 & 0x80) + (temp >> 1);
+ c = temp << 8;
+ goto rotate_common;
+ }
+
+ case 0x3E: // ROL abs,X
+ data += x;
+ goto rol_abs;
+
+ case 0x1E: // ASL abs,X
+ data += x;
+ case 0x0E: // ASL abs
+ c = 0;
+ case 0x2E: // ROL abs
+ rol_abs:
+ ADD_PAGE( data );
+ nz = c >> 8 & 1;
+ FLUSH_TIME();
+ nz += (c = READ_MEM( data ) << 1);
+ rotate_common:
+ pc++;
+ WRITE_MEM( data, BYTE( nz ) );
+ CACHE_TIME();
+ goto loop;
+
+ case 0x7E: // ROR abs,X
+ data += x;
+ goto ror_abs;
+
+ case 0x76: // ROR zp,x
+ data = BYTE( data + x );
+ goto ror_zp;
+
+ case 0x56: // LSR zp,x
+ data = BYTE( data + x );
+ case 0x46: // LSR zp
+ c = 0;
+ case 0x66: // ROR zp
+ ror_zp: {
+ int temp = READ_LOW( data );
+ nz = (c >> 1 & 0x80) + (temp >> 1);
+ c = temp << 8;
+ goto write_nz_zp;
+ }
+
+ case 0x36: // ROL zp,x
+ data = BYTE( data + x );
+ goto rol_zp;
+
+ case 0x16: // ASL zp,x
+ data = BYTE( data + x );
+ case 0x06: // ASL zp
+ c = 0;
+ case 0x26: // ROL zp
+ rol_zp:
+ nz = c >> 8 & 1;
+ nz += (c = READ_LOW( data ) << 1);
+ goto write_nz_zp;
+
+// Increment/decrement
+
+ case 0xCA: // DEX
+ INC_DEC( x, -1 )
+
+ case 0x88: // DEY
+ INC_DEC( y, -1 )
+
+ case 0xF6: // INC zp,x
+ data = BYTE( data + x );
+ case 0xE6: // INC zp
+ nz = 1;
+ goto add_nz_zp;
+
+ case 0xD6: // DEC zp,x
+ data = BYTE( data + x );
+ case 0xC6: // DEC zp
+ nz = -1;
+ add_nz_zp:
+ nz += READ_LOW( data );
+ write_nz_zp:
+ pc++;
+ WRITE_LOW( data, nz );
+ goto loop;
+
+ case 0xFE: // INC abs,x
+ data = x + GET_ADDR();
+ goto inc_ptr;
+
+ case 0xEE: // INC abs
+ data = GET_ADDR();
+ inc_ptr:
+ nz = 1;
+ goto inc_common;
+
+ case 0xDE: // DEC abs,x
+ data = x + GET_ADDR();
+ goto dec_ptr;
+
+ case 0xCE: // DEC abs
+ data = GET_ADDR();
+ dec_ptr:
+ nz = -1;
+ inc_common:
+ FLUSH_TIME();
+ pc += 2;
+ nz += READ_MEM( data );
+ WRITE_MEM( data, BYTE( nz ) );
+ CACHE_TIME();
+ goto loop;
+
+// Transfer
+
+ case 0xAA: // TAX
+ x = nz = a;
+ goto loop;
+
+ case 0x8A: // TXA
+ a = nz = x;
+ goto loop;
+
+ case 0x9A: // TXS
+ SET_SP( x ); // verified (no flag change)
+ goto loop;
+
+ case 0xBA: // TSX
+ x = nz = GET_SP();
+ goto loop;
+
+// Stack
+
+ case 0x48: // PHA
+ sp = SP( -1 );
+ WRITE_STACK( sp, a );
+ goto loop;
+
+ case 0x68: // PLA
+ a = nz = READ_STACK( sp );
+ sp = SP( 1 );
+ goto loop;
+
+ case 0x40:{// RTI
+ pc = READ_STACK( SP( 1 ) );
+ pc += READ_STACK( SP( 2 ) ) * 0x100;
+ int temp = READ_STACK( sp );
+ sp = SP( 3 );
+ data = flags;
+ SET_FLAGS( temp );
+ CPU.r.flags = flags; // update externally-visible I flag
+ int delta = s.base - CPU.irq_time_;
+ if ( delta <= 0 ) goto loop; // end_time < irq_time
+ if ( flags & i04 ) goto loop;
+ s_time += delta;
+ s.base = CPU.irq_time_;
+ goto loop;
+ }
+
+ case 0x28:{// PLP
+ int temp = READ_STACK( sp );
+ sp = SP( 1 );
+ int changed = flags ^ temp;
+ SET_FLAGS( temp );
+ if ( !(changed & i04) )
+ goto loop; // I flag didn't change
+ if ( flags & i04 )
+ goto handle_sei;
+ goto handle_cli;
+ }
+
+ case 0x08:{// PHP
+ int temp;
+ GET_FLAGS( temp );
+ sp = SP( -1 );
+ WRITE_STACK( sp, temp | (b10 | r20) );
+ goto loop;
+ }
+
+ case 0x6C:{// JMP (ind)
+ data = GET_ADDR();
+ byte const* page = CODE_PAGE( data );
+ pc = page [CODE_OFFSET( data )];
+ data = (data & 0xFF00) + ((data + 1) & 0xFF);
+ pc += page [CODE_OFFSET( data )] * 0x100;
+ goto loop;
+ }
+
+ case 0x00: // BRK
+ goto handle_brk;
+
+// Flags
+
+ case 0x38: // SEC
+ c = 0x100;
+ goto loop;
+
+ case 0x18: // CLC
+ c = 0;
+ goto loop;
+
+ case 0xB8: // CLV
+ flags &= ~v40;
+ goto loop;
+
+ case 0xD8: // CLD
+ flags &= ~d08;
+ goto loop;
+
+ case 0xF8: // SED
+ flags |= d08;
+ goto loop;
+
+ case 0x58: // CLI
+ if ( !(flags & i04) )
+ goto loop;
+ flags &= ~i04;
+ handle_cli: {
+ //dprintf( "CLI at %d\n", TIME );
+ CPU.r.flags = flags; // update externally-visible I flag
+ int delta = s.base - CPU.irq_time_;
+ if ( delta <= 0 )
+ {
+ if ( TIME() < CPU.irq_time_ )
+ goto loop;
+ goto delayed_cli;
+ }
+ s.base = CPU.irq_time_;
+ s_time += delta;
+ if ( s_time < 0 )
+ goto loop;
+
+ if ( delta >= s_time + 1 )
+ {
+ // delayed irq until after next instruction
+ s.base += s_time + 1;
+ s_time = -1;
+ goto loop;
+ }
+
+ // TODO: implement
+ delayed_cli:
+ dprintf( "Delayed CLI not emulated\n" );
+ goto loop;
+ }
+
+ case 0x78: // SEI
+ if ( flags & i04 )
+ goto loop;
+ flags |= i04;
+ handle_sei: {
+ CPU.r.flags = flags; // update externally-visible I flag
+ int delta = s.base - CPU.end_time_;
+ s.base = CPU.end_time_;
+ s_time += delta;
+ if ( s_time < 0 )
+ goto loop;
+
+ dprintf( "Delayed SEI not emulated\n" );
+ goto loop;
+ }
+
+// Unofficial
+
+ // SKW - skip word
+ case 0x1C: case 0x3C: case 0x5C: case 0x7C: case 0xDC: case 0xFC:
+ PAGE_PENALTY( data + x );
+ case 0x0C:
+ pc++;
+ // SKB - skip byte
+ case 0x74: case 0x04: case 0x14: case 0x34: case 0x44: case 0x54: case 0x64:
+ case 0x80: case 0x82: case 0x89: case 0xC2: case 0xD4: case 0xE2: case 0xF4:
+ pc++;
+ goto loop;
+
+ // NOP
+ case 0xEA: case 0x1A: case 0x3A: case 0x5A: case 0x7A: case 0xDA: case 0xFA:
+ goto loop;
+
+ case Nes_Cpu::halt_opcode: // HLT - halt processor
+ if ( pc-- > 0x10000 )
+ {
+ // handle wrap-around (assumes caller has put page of HLT at 0x10000)
+ pc = WORD( pc );
+ goto loop;
+ }
+ case 0x02: case 0x12: case 0x32: case 0x42: case 0x52:
+ case 0x62: case 0x72: case 0x92: case 0xB2: case 0xD2: case 0xF2:
+ goto stop;
+
+// Unimplemented
+
+ case 0xFF: // force 256-entry jump table for optimization purposes
+ c |= 1; // compiler doesn't know that this won't affect anything
+ default:
+ check( (unsigned) opcode < 0x100 );
+
+ #ifdef UNIMPL_INSTR
+ UNIMPL_INSTR();
+ #endif
+
+ // At least skip over proper number of bytes instruction uses
+ static unsigned char const illop_lens [8] = {
+ 0x40, 0x40, 0x40, 0x80, 0x40, 0x40, 0x80, 0xA0
+ };
+ int opcode = instr [-1];
+ int len = illop_lens [opcode >> 2 & 7] >> (opcode << 1 & 6) & 3;
+ if ( opcode == 0x9C )
+ len = 2;
+ pc += len;
+ CPU.error_count_++;
+
+ // Account for extra clock
+ if ( (opcode >> 4) == 0x0B )
+ {
+ if ( opcode == 0xB3 )
+ data = READ_LOW( data );
+ if ( opcode != 0xB7 )
+ PAGE_PENALTY( data + y );
+ }
+ goto loop;
+ }
+ assert( false ); // catch missing 'goto loop' or accidental 'break'
+
+ int result_;
+handle_brk:
+ pc++;
+ result_ = b10 | 4;
+
+#ifdef CPU_DONE
+interrupt:
+#endif
+ {
+ s_time += 7;
+
+ // Save PC and read vector
+ WRITE_STACK( SP( -1 ), pc >> 8 );
+ WRITE_STACK( SP( -2 ), pc );
+ pc = GET_LE16( &READ_CODE( 0xFFFA ) + (result_ & 4) );
+
+ // Save flags
+ int temp;
+ GET_FLAGS( temp );
+ temp |= r20 + (result_ & b10); // B flag set for BRK
+ sp = SP( -3 );
+ WRITE_STACK( sp, temp );
+
+ // Update I flag in externally-visible flags
+ CPU.r.flags = (flags |= i04);
+
+ // Update time
+ int delta = s.base - CPU.end_time_;
+ if ( delta >= 0 )
+ goto loop;
+ s_time += delta;
+ s.base = CPU.end_time_;
+ goto loop;
+ }
+
+out_of_time:
+ pc--;
+
+ // Optional action that triggers interrupt or changes irq/end time
+ #ifdef CPU_DONE
+ {
+ CPU_DONE( result_ );
+ if ( result_ >= 0 )
+ goto interrupt;
+ if ( s_time < 0 )
+ goto loop;
+ }
+ #endif
+stop:
+
+ // Flush cached state
+ CPU.r.pc = pc;
+ CPU.r.sp = GET_SP();
+ CPU.r.a = a;
+ CPU.r.x = x;
+ CPU.r.y = y;
+
+ int temp;
+ GET_FLAGS( temp );
+ CPU.r.flags = temp;
+
+ CPU.cpu_state_.base = s.base;
+ CPU.cpu_state_.time = s_time;
+ CPU.cpu_state = &CPU.cpu_state_;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.cpp
new file mode 100644
index 00000000..21602196
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.cpp
@@ -0,0 +1,280 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nes_Fds_Apu.h"
+
+/* Copyright (C) 2006 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const fract_range = 65536;
+
+void Nes_Fds_Apu::reset()
+{
+ memset( regs_, 0, sizeof regs_ );
+ memset( mod_wave, 0, sizeof mod_wave );
+
+ last_time = 0;
+ env_delay = 0;
+ sweep_delay = 0;
+ wave_pos = 0;
+ last_amp = 0;
+ wave_fract = fract_range;
+ mod_fract = fract_range;
+ mod_pos = 0;
+ mod_write_pos = 0;
+
+ static byte const initial_regs [0x0B] = {
+ 0x80, // disable envelope
+ 0, 0, 0xC0, // disable wave and lfo
+ 0x80, // disable sweep
+ 0, 0, 0x80, // disable modulation
+ 0, 0, 0xFF // LFO period // TODO: use 0xE8 as FDS ROM does?
+ };
+ for ( int i = 0; i < (int) sizeof initial_regs; i++ )
+ {
+ // two writes to set both gain and period for envelope registers
+ write_( io_addr + wave_size + i, 0 );
+ write_( io_addr + wave_size + i, initial_regs [i] );
+ }
+}
+
+void Nes_Fds_Apu::write_( unsigned addr, int data )
+{
+ unsigned reg = addr - io_addr;
+ if ( reg < io_size )
+ {
+ if ( reg < wave_size )
+ {
+ if ( regs (0x4089) & 0x80 )
+ regs_ [reg] = data & wave_sample_max;
+ }
+ else
+ {
+ regs_ [reg] = data;
+ switch ( addr )
+ {
+ case 0x4080:
+ if ( data & 0x80 )
+ env_gain = data & 0x3F;
+ else
+ env_speed = (data & 0x3F) + 1;
+ break;
+
+ case 0x4084:
+ if ( data & 0x80 )
+ sweep_gain = data & 0x3F;
+ else
+ sweep_speed = (data & 0x3F) + 1;
+ break;
+
+ case 0x4085:
+ mod_pos = mod_write_pos;
+ regs (0x4085) = data & 0x7F;
+ break;
+
+ case 0x4088:
+ if ( regs (0x4087) & 0x80 )
+ {
+ int pos = mod_write_pos;
+ data &= 0x07;
+ mod_wave [pos ] = data;
+ mod_wave [pos + 1] = data;
+ mod_write_pos = (pos + 2) & (wave_size - 1);
+ mod_pos = (mod_pos + 2) & (wave_size - 1);
+ }
+ break;
+ }
+ }
+ }
+}
+
+void Nes_Fds_Apu::set_tempo( double t )
+{
+ lfo_tempo = lfo_base_tempo;
+ if ( t != 1.0 )
+ {
+ lfo_tempo = int ((double) lfo_base_tempo / t + 0.5);
+ if ( lfo_tempo <= 0 )
+ lfo_tempo = 1;
+ }
+}
+
+void Nes_Fds_Apu::run_until( blip_time_t final_end_time )
+{
+ int const wave_freq = (regs (0x4083) & 0x0F) * 0x100 + regs (0x4082);
+ Blip_Buffer* const output_ = this->output_;
+ if ( wave_freq && output_ && !((regs (0x4089) | regs (0x4083)) & 0x80) )
+ {
+ output_->set_modified();
+
+ // master_volume
+ #define MVOL_ENTRY( percent ) (master_vol_max * percent + 50) / 100
+ static unsigned char const master_volumes [4] = {
+ MVOL_ENTRY( 100 ), MVOL_ENTRY( 67 ), MVOL_ENTRY( 50 ), MVOL_ENTRY( 40 )
+ };
+ int const master_volume = master_volumes [regs (0x4089) & 0x03];
+
+ // lfo_period
+ blip_time_t lfo_period = regs (0x408A) * lfo_tempo;
+ if ( regs (0x4083) & 0x40 )
+ lfo_period = 0;
+
+ // sweep setup
+ blip_time_t sweep_time = last_time + sweep_delay;
+ blip_time_t const sweep_period = lfo_period * sweep_speed;
+ if ( !sweep_period || regs (0x4084) & 0x80 )
+ sweep_time = final_end_time;
+
+ // envelope setup
+ blip_time_t env_time = last_time + env_delay;
+ blip_time_t const env_period = lfo_period * env_speed;
+ if ( !env_period || regs (0x4080) & 0x80 )
+ env_time = final_end_time;
+
+ // modulation
+ int mod_freq = 0;
+ if ( !(regs (0x4087) & 0x80) )
+ mod_freq = (regs (0x4087) & 0x0F) * 0x100 + regs (0x4086);
+
+ blip_time_t end_time = last_time;
+ do
+ {
+ // sweep
+ if ( sweep_time <= end_time )
+ {
+ sweep_time += sweep_period;
+ int mode = regs (0x4084) >> 5 & 2;
+ int new_sweep_gain = sweep_gain + mode - 1;
+ if ( (unsigned) new_sweep_gain <= (unsigned) 0x80 >> mode )
+ sweep_gain = new_sweep_gain;
+ else
+ regs (0x4084) |= 0x80; // optimization only
+ }
+
+ // envelope
+ if ( env_time <= end_time )
+ {
+ env_time += env_period;
+ int mode = regs (0x4080) >> 5 & 2;
+ int new_env_gain = env_gain + mode - 1;
+ if ( (unsigned) new_env_gain <= (unsigned) 0x80 >> mode )
+ env_gain = new_env_gain;
+ else
+ regs (0x4080) |= 0x80; // optimization only
+ }
+
+ // new end_time
+ blip_time_t const start_time = end_time;
+ end_time = final_end_time;
+ if ( end_time > env_time ) end_time = env_time;
+ if ( end_time > sweep_time ) end_time = sweep_time;
+
+ // frequency modulation
+ int freq = wave_freq;
+ if ( mod_freq )
+ {
+ // time of next modulation clock
+ blip_time_t mod_time = start_time + (mod_fract + mod_freq - 1) / mod_freq;
+ if ( end_time > mod_time )
+ end_time = mod_time;
+
+ // run modulator up to next clock and save old sweep_bias
+ int sweep_bias = regs (0x4085);
+ mod_fract -= (end_time - start_time) * mod_freq;
+ if ( mod_fract <= 0 )
+ {
+ mod_fract += fract_range;
+ check( (unsigned) mod_fract <= fract_range );
+
+ static short const mod_table [8] = { 0, +1, +2, +4, 0, -4, -2, -1 };
+ int mod = mod_wave [mod_pos];
+ mod_pos = (mod_pos + 1) & (wave_size - 1);
+ int new_sweep_bias = (sweep_bias + mod_table [mod]) & 0x7F;
+ if ( mod == 4 )
+ new_sweep_bias = 0;
+ regs (0x4085) = new_sweep_bias;
+ }
+
+ // apply frequency modulation
+ sweep_bias = (sweep_bias ^ 0x40) - 0x40;
+ int factor = sweep_bias * sweep_gain;
+ int extra = factor & 0x0F;
+ factor >>= 4;
+ if ( extra )
+ {
+ factor--;
+ if ( sweep_bias >= 0 )
+ factor += 3;
+ }
+ if ( factor > 193 ) factor -= 258;
+ if ( factor < -64 ) factor += 256;
+ freq += (freq * factor) >> 6;
+ if ( freq <= 0 )
+ continue;
+ }
+
+ // wave
+ int wave_fract = this->wave_fract;
+ blip_time_t delay = (wave_fract + freq - 1) / freq;
+ blip_time_t time = start_time + delay;
+
+ if ( time <= end_time )
+ {
+ // at least one wave clock within start_time...end_time
+
+ blip_time_t const min_delay = fract_range / freq;
+ int wave_pos = this->wave_pos;
+
+ int volume = env_gain;
+ if ( volume > vol_max )
+ volume = vol_max;
+ volume *= master_volume;
+
+ int const min_fract = min_delay * freq;
+
+ do
+ {
+ // clock wave
+ int amp = regs_ [wave_pos] * volume;
+ wave_pos = (wave_pos + 1) & (wave_size - 1);
+ int delta = amp - last_amp;
+ if ( delta )
+ {
+ last_amp = amp;
+ synth.offset_inline( time, delta, output_ );
+ }
+
+ wave_fract += fract_range - delay * freq;
+ check( unsigned (fract_range - wave_fract) < freq );
+
+ // delay until next clock
+ delay = min_delay;
+ if ( wave_fract > min_fract )
+ delay++;
+ check( delay && delay == (wave_fract + freq - 1) / freq );
+
+ time += delay;
+ }
+ while ( time <= end_time ); // TODO: using < breaks things, but <= is wrong
+
+ this->wave_pos = wave_pos;
+ }
+ this->wave_fract = wave_fract - (end_time - (time - delay)) * freq;
+ check( this->wave_fract > 0 );
+ }
+ while ( end_time < final_end_time );
+
+ env_delay = env_time - final_end_time; check( env_delay >= 0 );
+ sweep_delay = sweep_time - final_end_time; check( sweep_delay >= 0 );
+ }
+ last_time = final_end_time;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.h
new file mode 100644
index 00000000..0d4775c5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fds_Apu.h
@@ -0,0 +1,139 @@
+// NES FDS sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef NES_FDS_APU_H
+#define NES_FDS_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Nes_Fds_Apu {
+public:
+ // setup
+ void set_tempo( double );
+ enum { osc_count = 1 };
+ void set_output( Blip_Buffer* buf );
+ void volume( double );
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+ // emulation
+ void reset();
+ enum { io_addr = 0x4040 };
+ enum { io_size = 0x53 };
+ void write( blip_time_t time, unsigned addr, int data );
+ int read( blip_time_t time, unsigned addr );
+ void end_frame( blip_time_t );
+
+public:
+ Nes_Fds_Apu();
+ void write_( unsigned addr, int data );
+ BLARGG_DISABLE_NOTHROW
+
+ void set_output( int index, Blip_Buffer* center,
+ Blip_Buffer* left_ignored = NULL, Blip_Buffer* right_ignored = NULL );
+ BLARGG_DEPRECATED_TEXT( enum { start_addr = 0x4040 }; )
+ BLARGG_DEPRECATED_TEXT( enum { end_addr = 0x4092 }; )
+ BLARGG_DEPRECATED_TEXT( enum { reg_count = end_addr - start_addr + 1 }; )
+ void osc_output( int, Blip_Buffer* );
+private:
+ enum { wave_size = 0x40 };
+ enum { master_vol_max = 10 };
+ enum { vol_max = 0x20 };
+ enum { wave_sample_max = 0x3F };
+
+ unsigned char regs_ [io_size];// last written value to registers
+
+ enum { lfo_base_tempo = 8 };
+ int lfo_tempo; // normally 8; adjusted by set_tempo()
+
+ int env_delay;
+ int env_speed;
+ int env_gain;
+
+ int sweep_delay;
+ int sweep_speed;
+ int sweep_gain;
+
+ int wave_pos;
+ int last_amp;
+ blip_time_t wave_fract;
+
+ int mod_fract;
+ int mod_pos;
+ int mod_write_pos;
+ unsigned char mod_wave [wave_size];
+
+ // synthesis
+ blip_time_t last_time;
+ Blip_Buffer* output_;
+ Blip_Synth_Fast synth;
+
+ // allow access to registers by absolute address (i.e. 0x4080)
+ unsigned char& regs( unsigned addr ) { return regs_ [addr - io_addr]; }
+
+ void run_until( blip_time_t );
+};
+
+inline void Nes_Fds_Apu::volume( double v )
+{
+ synth.volume( 0.14 / master_vol_max / vol_max / wave_sample_max * v );
+}
+
+inline void Nes_Fds_Apu::set_output( Blip_Buffer* b )
+{
+ output_ = b;
+}
+
+inline void Nes_Fds_Apu::set_output( int i, Blip_Buffer* buf, Blip_Buffer*, Blip_Buffer* )
+{
+ assert( (unsigned) i < osc_count );
+ output_ = buf;
+}
+
+inline void Nes_Fds_Apu::end_frame( blip_time_t end_time )
+{
+ if ( end_time > last_time )
+ run_until( end_time );
+ last_time -= end_time;
+ assert( last_time >= 0 );
+}
+
+inline void Nes_Fds_Apu::write( blip_time_t time, unsigned addr, int data )
+{
+ run_until( time );
+ write_( addr, data );
+}
+
+inline int Nes_Fds_Apu::read( blip_time_t time, unsigned addr )
+{
+ run_until( time );
+
+ int result = 0xFF;
+ switch ( addr )
+ {
+ case 0x4090:
+ result = env_gain;
+ break;
+
+ case 0x4092:
+ result = sweep_gain;
+ break;
+
+ default:
+ unsigned i = addr - io_addr;
+ if ( i < wave_size )
+ result = regs_ [i];
+ }
+
+ return result | 0x40;
+}
+
+inline Nes_Fds_Apu::Nes_Fds_Apu()
+{
+ lfo_tempo = lfo_base_tempo;
+ set_output( NULL );
+ volume( 1.0 );
+ reset();
+}
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.cpp
index c058f6b1..27418b55 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.cpp
@@ -1,9 +1,7 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
#include "Nes_Fme7_Apu.h"
-#include <string.h>
-
/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
@@ -51,7 +49,6 @@ void Nes_Fme7_Apu::run_until( blip_time_t end_time )
Blip_Buffer* const osc_output = oscs [index].output;
if ( !osc_output )
continue;
- osc_output->set_modified();
// check for unsupported mode
#ifndef NDEBUG
@@ -78,11 +75,13 @@ void Nes_Fme7_Apu::run_until( blip_time_t end_time )
int amp = volume;
if ( !phases [index] )
amp = 0;
+
{
int delta = amp - oscs [index].last_amp;
if ( delta )
{
oscs [index].last_amp = amp;
+ osc_output->set_modified();
synth.offset( last_time, delta, osc_output );
}
}
@@ -91,6 +90,7 @@ void Nes_Fme7_Apu::run_until( blip_time_t end_time )
if ( time < end_time )
{
int delta = amp * 2 - volume;
+ osc_output->set_modified();
if ( volume )
{
do
@@ -109,7 +109,7 @@ void Nes_Fme7_Apu::run_until( blip_time_t end_time )
// maintain phase when silent
int count = (end_time - time + period - 1) / period;
phases [index] ^= count & 1;
- time += (blargg_long) count * period;
+ time += count * period;
}
}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.h
index eb60af03..6fee7c81 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nes_Fme7_Apu.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Fme7_Apu.h
@@ -1,6 +1,6 @@
// Sunsoft FME-7 sound emulator
-// Game_Music_Emu 0.5.2
+// Game_Music_Emu 0.6-pre
#ifndef NES_FME7_APU_H
#define NES_FME7_APU_H
@@ -22,9 +22,9 @@ public:
void reset();
void volume( double );
void treble_eq( blip_eq_t const& );
- void output( Blip_Buffer* );
+ void set_output( Blip_Buffer* );
enum { osc_count = 3 };
- void osc_output( int index, Blip_Buffer* );
+ void set_output( int index, Blip_Buffer* );
void end_frame( blip_time_t );
void save_state( fme7_apu_state_t* ) const;
void load_state( fme7_apu_state_t const& );
@@ -57,7 +57,7 @@ private:
blip_time_t last_time;
enum { amp_range = 192 }; // can be any value; this gives best error/quality tradeoff
- Blip_Synth<blip_good_quality,1> synth;
+ Blip_Synth_Norm synth;
void run_until( blip_time_t );
};
@@ -72,21 +72,21 @@ inline void Nes_Fme7_Apu::treble_eq( blip_eq_t const& eq )
synth.treble_eq( eq );
}
-inline void Nes_Fme7_Apu::osc_output( int i, Blip_Buffer* buf )
+inline void Nes_Fme7_Apu::set_output( int i, Blip_Buffer* buf )
{
assert( (unsigned) i < osc_count );
oscs [i].output = buf;
}
-inline void Nes_Fme7_Apu::output( Blip_Buffer* buf )
+inline void Nes_Fme7_Apu::set_output( Blip_Buffer* buf )
{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, buf );
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, buf );
}
inline Nes_Fme7_Apu::Nes_Fme7_Apu()
{
- output( NULL );
+ set_output( NULL );
volume( 1.0 );
reset();
}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Mmc5_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Mmc5_Apu.h
new file mode 100644
index 00000000..f55b8d82
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Mmc5_Apu.h
@@ -0,0 +1,70 @@
+// NES MMC5 sound chip emulator
+
+// Nes_Snd_Emu 0.2.0-pre
+#ifndef NES_MMC5_APU_H
+#define NES_MMC5_APU_H
+
+#include "blargg_common.h"
+#include "Nes_Apu.h"
+
+class Nes_Mmc5_Apu : public Nes_Apu {
+public:
+ enum { regs_addr = 0x5000 };
+ enum { regs_size = 0x16 };
+
+ enum { osc_count = 3 };
+ void write_register( blip_time_t, unsigned addr, int data );
+ void set_output( Blip_Buffer* );
+ void set_output( int index, Blip_Buffer* );
+
+ enum { exram_size = 1024 };
+ unsigned char exram [exram_size];
+
+ BLARGG_DEPRECATED_TEXT( enum { start_addr = 0x5000 }; )
+ BLARGG_DEPRECATED_TEXT( enum { end_addr = 0x5015 }; )
+};
+
+inline void Nes_Mmc5_Apu::set_output( int i, Blip_Buffer* b )
+{
+ // in: square 1, square 2, PCM
+ // out: square 1, square 2, skipped, skipped, PCM
+ if ( i > 1 )
+ i += 2;
+ Nes_Apu::set_output( i, b );
+}
+
+inline void Nes_Mmc5_Apu::set_output( Blip_Buffer* b )
+{
+ set_output( 0, b );
+ set_output( 1, b );
+ set_output( 2, b );
+}
+
+inline void Nes_Mmc5_Apu::write_register( blip_time_t time, unsigned addr, int data )
+{
+ switch ( addr )
+ {
+ case 0x5015: // channel enables
+ data &= 0x03; // enable the square waves only
+ // fall through
+ case 0x5000: // Square 1
+ case 0x5002:
+ case 0x5003:
+ case 0x5004: // Square 2
+ case 0x5006:
+ case 0x5007:
+ case 0x5011: // DAC
+ Nes_Apu::write_register( time, addr - 0x1000, data );
+ break;
+
+ case 0x5010: // some things write to this for some reason
+ break;
+
+#ifdef BLARGG_DEBUG_H
+ default:
+ dprintf( "Unmapped MMC5 APU write: $%04X <- $%02X\n", addr, data );
+#endif
+ }
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.cpp
index f3235b38..b2baa2d9 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.cpp
@@ -1,145 +1,152 @@
-// Nes_Snd_Emu 0.1.8. http://www.slack.net/~ant/
-
-#include "Nes_Namco_Apu.h"
-
-/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-Nes_Namco_Apu::Nes_Namco_Apu()
-{
- output( NULL );
- volume( 1.0 );
- reset();
-}
-
-void Nes_Namco_Apu::reset()
-{
- last_time = 0;
- addr_reg = 0;
-
- int i;
- for ( i = 0; i < reg_count; i++ )
- reg [i] = 0;
-
- for ( i = 0; i < osc_count; i++ )
- {
- Namco_Osc& osc = oscs [i];
- osc.delay = 0;
- osc.last_amp = 0;
- osc.wave_pos = 0;
- }
-}
-
-void Nes_Namco_Apu::output( Blip_Buffer* buf )
-{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, buf );
-}
-
-/*
-void Nes_Namco_Apu::reflect_state( Tagged_Data& data )
-{
- reflect_int16( data, BLARGG_4CHAR('A','D','D','R'), &addr_reg );
-
- static const char hex [17] = "0123456789ABCDEF";
- int i;
- for ( i = 0; i < reg_count; i++ )
- reflect_int16( data, 'RG\0\0' + hex [i >> 4] * 0x100 + hex [i & 15], &reg [i] );
-
- for ( i = 0; i < osc_count; i++ )
- {
- reflect_int32( data, BLARGG_4CHAR('D','L','Y','0') + i, &oscs [i].delay );
- reflect_int16( data, BLARGG_4CHAR('P','O','S','0') + i, &oscs [i].wave_pos );
- }
-}
-*/
-
-void Nes_Namco_Apu::end_frame( blip_time_t time )
-{
- if ( time > last_time )
- run_until( time );
-
- assert( last_time >= time );
- last_time -= time;
-}
-
-void Nes_Namco_Apu::run_until( blip_time_t nes_end_time )
-{
- int active_oscs = (reg [0x7F] >> 4 & 7) + 1;
- for ( int i = osc_count - active_oscs; i < osc_count; i++ )
- {
- Namco_Osc& osc = oscs [i];
- Blip_Buffer* output = osc.output;
- if ( !output )
- continue;
- output->set_modified();
-
- blip_resampled_time_t time =
- output->resampled_time( last_time ) + osc.delay;
- blip_resampled_time_t end_time = output->resampled_time( nes_end_time );
- osc.delay = 0;
- if ( time < end_time )
- {
- const BOOST::uint8_t* osc_reg = &reg [i * 8 + 0x40];
- if ( !(osc_reg [4] & 0xE0) )
- continue;
-
- int volume = osc_reg [7] & 15;
- if ( !volume )
- continue;
-
- blargg_long freq = (osc_reg [4] & 3) * 0x10000 + osc_reg [2] * 0x100L + osc_reg [0];
- if ( freq < 64 * active_oscs )
- continue; // prevent low frequencies from excessively delaying freq changes
- blip_resampled_time_t period =
- output->resampled_duration( 983040 ) / freq * active_oscs;
-
- int wave_size = 32 - (osc_reg [4] >> 2 & 7) * 4;
- if ( !wave_size )
- continue;
-
- int last_amp = osc.last_amp;
- int wave_pos = osc.wave_pos;
-
- do
- {
- // read wave sample
- int addr = wave_pos + osc_reg [6];
- int sample = reg [addr >> 1] >> (addr << 2 & 4);
- wave_pos++;
- sample = (sample & 15) * volume;
-
- // output impulse if amplitude changed
- int delta = sample - last_amp;
- if ( delta )
- {
- last_amp = sample;
- synth.offset_resampled( time, delta, output );
- }
-
- // next sample
- time += period;
- if ( wave_pos >= wave_size )
- wave_pos = 0;
- }
- while ( time < end_time );
-
- osc.wave_pos = wave_pos;
- osc.last_amp = last_amp;
- }
- osc.delay = time - end_time;
- }
-
- last_time = nes_end_time;
-}
-
+// Nes_Snd_Emu 0.2.0-pre. http://www.slack.net/~ant/
+
+#include "Nes_Namco_Apu.h"
+
+/* Copyright (C) 2003-2006 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Nes_Namco_Apu::Nes_Namco_Apu()
+{
+ set_output( NULL );
+ volume( 1.0 );
+ reset();
+}
+
+void Nes_Namco_Apu::reset()
+{
+ last_time = 0;
+ addr_reg = 0;
+
+ int i;
+ for ( i = 0; i < reg_count; i++ )
+ reg [i] = 0;
+
+ for ( i = 0; i < osc_count; i++ )
+ {
+ Namco_Osc& osc = oscs [i];
+ osc.delay = 0;
+ osc.last_amp = 0;
+ osc.wave_pos = 0;
+ }
+}
+
+void Nes_Namco_Apu::set_output( Blip_Buffer* buf )
+{
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, buf );
+}
+
+/*
+void Nes_Namco_Apu::reflect_state( Tagged_Data& data )
+{
+ reflect_int16( data, BLARGG_4CHAR('A','D','D','R'), &addr_reg );
+
+ static const char hex [17] = "0123456789ABCDEF";
+ int i;
+ for ( i = 0; i < reg_count; i++ )
+ reflect_int16( data, 'RG\0\0' + hex [i >> 4] * 0x100 + hex [i & 15], &reg [i] );
+
+ for ( i = 0; i < osc_count; i++ )
+ {
+ reflect_int32( data, BLARGG_4CHAR('D','L','Y','0') + i, &oscs [i].delay );
+ reflect_int16( data, BLARGG_4CHAR('P','O','S','0') + i, &oscs [i].wave_pos );
+ }
+}
+*/
+
+void Nes_Namco_Apu::end_frame( blip_time_t time )
+{
+ if ( time > last_time )
+ run_until( time );
+
+ assert( last_time >= time );
+ last_time -= time;
+}
+
+void Nes_Namco_Apu::run_until( blip_time_t nes_end_time )
+{
+ int active_oscs = (reg [0x7F] >> 4 & 7) + 1;
+ for ( int i = osc_count - active_oscs; i < osc_count; i++ )
+ {
+ Namco_Osc& osc = oscs [i];
+ Blip_Buffer* output = osc.output;
+ if ( !output )
+ continue;
+
+ blip_resampled_time_t time =
+ output->resampled_time( last_time ) + osc.delay;
+ blip_resampled_time_t end_time = output->resampled_time( nes_end_time );
+ osc.delay = 0;
+ if ( time < end_time )
+ {
+ const BOOST::uint8_t* osc_reg = &reg [i * 8 + 0x40];
+ if ( !(osc_reg [4] & 0xE0) )
+ continue;
+
+ int volume = osc_reg [7] & 15;
+ if ( !volume )
+ continue;
+
+ int freq = (osc_reg [4] & 3) * 0x10000 + osc_reg [2] * 0x100 + osc_reg [0];
+ if ( freq < 64 * active_oscs )
+ continue; // prevent low frequencies from excessively delaying freq changes
+
+ int const master_clock_divider = 12; // NES time derived via divider of master clock
+ int const n106_divider = 45; // N106 then divides master clock by this
+ int const max_freq = 0x3FFFF;
+ int const lowest_freq_period = (max_freq + 1) * n106_divider / master_clock_divider;
+ // divide by 8 to avoid overflow
+ blip_resampled_time_t period =
+ output->resampled_duration( lowest_freq_period / 8 ) / freq * 8 * active_oscs;
+
+ int wave_size = 32 - (osc_reg [4] >> 2 & 7) * 4;
+ if ( !wave_size )
+ continue;
+
+ int last_amp = osc.last_amp;
+ int wave_pos = osc.wave_pos;
+
+ output->set_modified();
+
+ do
+ {
+ // read wave sample
+ int addr = wave_pos + osc_reg [6];
+ int sample = reg [addr >> 1] >> (addr << 2 & 4);
+ wave_pos++;
+ sample = (sample & 15) * volume;
+
+ // output impulse if amplitude changed
+ int delta = sample - last_amp;
+ if ( delta )
+ {
+ last_amp = sample;
+ synth.offset_resampled( time, delta, output );
+ }
+
+ // next sample
+ time += period;
+ if ( wave_pos >= wave_size )
+ wave_pos = 0;
+ }
+ while ( time < end_time );
+
+ osc.wave_pos = wave_pos;
+ osc.last_amp = last_amp;
+ }
+ osc.delay = time - end_time;
+ }
+
+ last_time = nes_end_time;
+}
+
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.h
index db5fea4b..00e8dcbc 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Namco_Apu.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Namco_Apu.h
@@ -1,6 +1,6 @@
// Namco 106 sound chip emulator
-// Nes_Snd_Emu 0.1.8
+// Nes_Snd_Emu 0.2.0-pre
#ifndef NES_NAMCO_APU_H
#define NES_NAMCO_APU_H
@@ -14,9 +14,9 @@ public:
// See Nes_Apu.h for reference.
void volume( double );
void treble_eq( const blip_eq_t& );
- void output( Blip_Buffer* );
+ void set_output( Blip_Buffer* );
enum { osc_count = 8 };
- void osc_output( int index, Blip_Buffer* );
+ void set_output( int index, Blip_Buffer* );
void reset();
void end_frame( blip_time_t );
@@ -42,7 +42,7 @@ private:
Nes_Namco_Apu& operator = ( const Nes_Namco_Apu& );
struct Namco_Osc {
- blargg_long delay;
+ int delay;
Blip_Buffer* output;
short last_amp;
short wave_pos;
@@ -55,7 +55,7 @@ private:
enum { reg_count = 0x80 };
BOOST::uint8_t reg [reg_count];
- Blip_Synth<blip_good_quality,15> synth;
+ Blip_Synth_Norm synth;
BOOST::uint8_t& access();
void run_until( blip_time_t );
@@ -79,7 +79,7 @@ inline BOOST::uint8_t& Nes_Namco_Apu::access()
return reg [addr];
}
-inline void Nes_Namco_Apu::volume( double v ) { synth.volume( 0.10 / osc_count * v ); }
+inline void Nes_Namco_Apu::volume( double v ) { synth.volume( 0.10 / osc_count / 15 * v ); }
inline void Nes_Namco_Apu::treble_eq( const blip_eq_t& eq ) { synth.treble_eq( eq ); }
@@ -87,7 +87,7 @@ inline void Nes_Namco_Apu::write_addr( int v ) { addr_reg = v; }
inline int Nes_Namco_Apu::read_data() { return access(); }
-inline void Nes_Namco_Apu::osc_output( int i, Blip_Buffer* buf )
+inline void Nes_Namco_Apu::set_output( int i, Blip_Buffer* buf )
{
assert( (unsigned) i < osc_count );
oscs [i].output = buf;
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.cpp
index 1ad3f59c..906955fd 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.cpp
@@ -1,4 +1,4 @@
-// Nes_Snd_Emu 0.1.8. http://www.slack.net/~ant/
+// Nes_Snd_Emu 0.2.0-pre. http://www.slack.net/~ant/
#include "Nes_Apu.h"
@@ -26,12 +26,14 @@ void Nes_Osc::clock_length( int halt_mask )
void Nes_Envelope::clock_envelope()
{
int period = regs [0] & 15;
- if ( reg_written [3] ) {
+ if ( reg_written [3] )
+ {
reg_written [3] = false;
env_delay = period;
envelope = 15;
}
- else if ( --env_delay < 0 ) {
+ else if ( --env_delay < 0 )
+ {
env_delay = period;
if ( envelope | (regs [0] & 0x20) )
envelope = (envelope - 1) & 15;
@@ -72,14 +74,15 @@ void Nes_Square::clock_sweep( int negative_adjust )
}
}
- if ( reg_written [1] ) {
+ if ( reg_written [1] )
+ {
reg_written [1] = false;
sweep_delay = (sweep >> 4) & 7;
}
}
// TODO: clean up
-inline nes_time_t Nes_Square::maintain_phase( nes_time_t time, nes_time_t end_time,
+inline Nes_Square::nes_time_t Nes_Square::maintain_phase( nes_time_t time, nes_time_t end_time,
nes_time_t timer_period )
{
nes_time_t remain = end_time - time;
@@ -87,7 +90,7 @@ inline nes_time_t Nes_Square::maintain_phase( nes_time_t time, nes_time_t end_ti
{
int count = (remain + timer_period - 1) / timer_period;
phase = (phase + count) & (phase_range - 1);
- time += (blargg_long) count * timer_period;
+ time += count * timer_period;
}
return time;
}
@@ -103,8 +106,6 @@ void Nes_Square::run( nes_time_t time, nes_time_t end_time )
return;
}
- output->set_modified();
-
int offset = period >> (regs [1] & shift_mask);
if ( regs [1] & negate_flag )
offset = 0;
@@ -112,7 +113,9 @@ void Nes_Square::run( nes_time_t time, nes_time_t end_time )
const int volume = this->volume();
if ( volume == 0 || period < 8 || (period + offset) >= 0x800 )
{
- if ( last_amp ) {
+ if ( last_amp )
+ {
+ output->set_modified();
synth.offset( time, -last_amp, output );
last_amp = 0;
}
@@ -126,13 +129,15 @@ void Nes_Square::run( nes_time_t time, nes_time_t end_time )
int duty_select = (regs [0] >> 6) & 3;
int duty = 1 << duty_select; // 1, 2, 4, 2
int amp = 0;
- if ( duty_select == 3 ) {
+ if ( duty_select == 3 )
+ {
duty = 2; // negated 25%
amp = volume;
}
if ( phase < duty )
amp ^= volume;
+ output->set_modified();
{
int delta = update_amp( amp );
if ( delta )
@@ -147,9 +152,11 @@ void Nes_Square::run( nes_time_t time, nes_time_t end_time )
int delta = amp * 2 - volume;
int phase = this->phase;
- do {
+ do
+ {
phase = (phase + 1) & (phase_range - 1);
- if ( phase == 0 || phase == duty ) {
+ if ( phase == 0 || phase == duty )
+ {
delta = -delta;
synth.offset_inline( time, delta, output );
}
@@ -187,7 +194,7 @@ inline int Nes_Triangle::calc_amp() const
}
// TODO: clean up
-inline nes_time_t Nes_Triangle::maintain_phase( nes_time_t time, nes_time_t end_time,
+inline Nes_Square::nes_time_t Nes_Triangle::maintain_phase( nes_time_t time, nes_time_t end_time,
nes_time_t timer_period )
{
nes_time_t remain = end_time - time;
@@ -196,7 +203,7 @@ inline nes_time_t Nes_Triangle::maintain_phase( nes_time_t time, nes_time_t end_
int count = (remain + timer_period - 1) / timer_period;
phase = ((unsigned) phase + 1 - count) & (phase_range * 2 - 1);
phase++;
- time += (blargg_long) count * timer_period;
+ time += count * timer_period;
}
return time;
}
@@ -213,14 +220,15 @@ void Nes_Triangle::run( nes_time_t time, nes_time_t end_time )
return;
}
- output->set_modified();
-
// to do: track phase when period < 3
// to do: Output 7.5 on dac when period < 2? More accurate, but results in more clicks.
int delta = update_amp( calc_amp() );
if ( delta )
+ {
+ output->set_modified();
synth.offset( time, delta, output );
+ }
time += delay;
if ( length_counter == 0 || linear_counter == 0 || timer_period < 3 )
@@ -233,17 +241,22 @@ void Nes_Triangle::run( nes_time_t time, nes_time_t end_time )
int phase = this->phase;
int volume = 1;
- if ( phase > phase_range ) {
+ if ( phase > phase_range )
+ {
phase -= phase_range;
volume = -volume;
}
+ output->set_modified();
- do {
- if ( --phase == 0 ) {
+ do
+ {
+ if ( --phase == 0 )
+ {
phase = phase_range;
volume = -volume;
}
- else {
+ else
+ {
synth.offset_inline( time, volume, output );
}
@@ -284,7 +297,8 @@ void Nes_Dmc::recalc_irq()
if ( irq_enabled && length_counter )
irq = apu->last_dmc_time + delay +
((length_counter - 1) * 8 + bits_remain - 1) * nes_time_t (period) + 1;
- if ( irq != next_irq ) {
+ if ( irq != next_irq )
+ {
next_irq = irq;
apu->irq_changed();
}
@@ -332,18 +346,27 @@ inline void Nes_Dmc::reload_sample()
length_counter = regs [3] * 0x10 + 1;
}
-static byte const dac_table [128] =
+static int const dmc_table [128] =
{
- 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9,10,11,12,13,14,
- 15,15,16,17,18,19,20,20,21,22,23,24,24,25,26,27,
- 27,28,29,30,31,31,32,33,33,34,35,36,36,37,38,38,
- 39,40,41,41,42,43,43,44,45,45,46,47,47,48,48,49,
- 50,50,51,52,52,53,53,54,55,55,56,56,57,58,58,59,
- 59,60,60,61,61,62,63,63,64,64,65,65,66,66,67,67,
- 68,68,69,70,70,71,71,72,72,73,73,74,74,75,75,75,
- 76,76,77,77,78,78,79,79,80,80,81,81,82,82,82,83,
+ 0, 24, 48, 71, 94, 118, 141, 163, 186, 209, 231, 253, 275, 297, 319, 340,
+ 361, 383, 404, 425, 445, 466, 486, 507, 527, 547, 567, 587, 606, 626, 645, 664,
+ 683, 702, 721, 740, 758, 777, 795, 813, 832, 850, 867, 885, 903, 920, 938, 955,
+ 972, 989,1006,1023,1040,1056,1073,1089,1105,1122,1138,1154,1170,1185,1201,1217,
+1232,1248,1263,1278,1293,1308,1323,1338,1353,1368,1382,1397,1411,1425,1440,1454,
+1468,1482,1496,1510,1523,1537,1551,1564,1578,1591,1604,1618,1631,1644,1657,1670,
+1683,1695,1708,1721,1733,1746,1758,1771,1783,1795,1807,1819,1831,1843,1855,1867,
+1879,1890,1902,1914,1925,1937,1948,1959,1971,1982,1993,2004,2015,2026,2037,2048,
};
+inline int Nes_Dmc::update_amp_nonlinear( int in )
+{
+ if ( !nonlinear )
+ in = dmc_table [in];
+ int delta = in - last_amp;
+ last_amp = in;
+ return delta;
+}
+
void Nes_Dmc::write_register( int addr, int data )
{
if ( addr == 0 )
@@ -355,14 +378,7 @@ void Nes_Dmc::write_register( int addr, int data )
}
else if ( addr == 1 )
{
- int old_dac = dac;
dac = data & 0x7F;
-
- // adjust last_amp so that "pop" amplitude will be properly non-linear
- // with respect to change in dac
- int faked_nonlinear = dac - (dac_table [dac] - dac_table [old_dac]);
- if ( !nonlinear )
- last_amp = faked_nonlinear;
}
}
@@ -377,16 +393,18 @@ void Nes_Dmc::fill_buffer()
{
if ( !buf_full && length_counter )
{
- require( prg_reader ); // prg_reader must be set
- buf = prg_reader( prg_reader_data, 0x8000u + address );
+ require( apu->dmc_reader.f ); // dmc_reader must be set
+ buf = apu->dmc_reader.f( apu->dmc_reader.data, 0x8000u + address );
address = (address + 1) & 0x7FFF;
buf_full = true;
if ( --length_counter == 0 )
{
- if ( regs [0] & loop_flag ) {
+ if ( regs [0] & loop_flag )
+ {
reload_sample();
}
- else {
+ else
+ {
apu->osc_enables &= ~0x10;
irq_flag = irq_enabled;
next_irq = Nes_Apu::no_irq;
@@ -398,16 +416,15 @@ void Nes_Dmc::fill_buffer()
void Nes_Dmc::run( nes_time_t time, nes_time_t end_time )
{
- int delta = update_amp( dac );
+ int delta = update_amp_nonlinear( dac );
if ( !output )
{
silence = true;
}
- else
+ else if ( delta )
{
output->set_modified();
- if ( delta )
- synth.offset( time, delta, output );
+ synth.offset( time, delta, output );
}
time += delay;
@@ -426,6 +443,8 @@ void Nes_Dmc::run( nes_time_t time, nes_time_t end_time )
const int period = this->period;
int bits = this->bits;
int dac = this->dac;
+ if ( output )
+ output->set_modified();
do
{
@@ -433,9 +452,10 @@ void Nes_Dmc::run( nes_time_t time, nes_time_t end_time )
{
int step = (bits & 1) * 4 - 2;
bits >>= 1;
- if ( unsigned (dac + step) <= 0x7F ) {
+ if ( unsigned (dac + step) <= 0x7F )
+ {
dac += step;
- synth.offset_inline( time, step, output );
+ synth.offset_inline( time, update_amp_nonlinear( dac ), output );
}
}
@@ -444,10 +464,12 @@ void Nes_Dmc::run( nes_time_t time, nes_time_t end_time )
if ( --bits_remain == 0 )
{
bits_remain = 8;
- if ( !buf_full ) {
+ if ( !buf_full )
+ {
silence = true;
}
- else {
+ else
+ {
silence = false;
bits = buf;
buf_full = false;
@@ -460,7 +482,6 @@ void Nes_Dmc::run( nes_time_t time, nes_time_t end_time )
while ( time < end_time );
this->dac = dac;
- this->last_amp = dac;
this->bits = bits;
}
this->bits_remain = bits_remain;
@@ -487,14 +508,16 @@ void Nes_Noise::run( nes_time_t time, nes_time_t end_time )
return;
}
- output->set_modified();
const int volume = this->volume();
int amp = (noise & 1) ? volume : 0;
{
int delta = update_amp( amp );
if ( delta )
+ {
+ output->set_modified();
synth.offset( time, delta, output );
+ }
}
time += delay;
@@ -509,7 +532,8 @@ void Nes_Noise::run( nes_time_t time, nes_time_t end_time )
// approximate noise cycling while muted, by shuffling up noise register
// to do: precise muted noise cycling?
- if ( !(regs [2] & mode_flag) ) {
+ if ( !(regs [2] & mode_flag) )
+ {
int feedback = (noise << 13) ^ (noise << 14);
noise = (feedback & 0x4000) | (noise >> 1);
}
@@ -525,12 +549,15 @@ void Nes_Noise::run( nes_time_t time, nes_time_t end_time )
int noise = this->noise;
int delta = amp * 2 - volume;
const int tap = (regs [2] & mode_flag ? 8 : 13);
+ output->set_modified();
- do {
+ do
+ {
int feedback = (noise << tap) ^ (noise << 14);
time += period;
- if ( (noise + 1) & 2 ) {
+ if ( (noise + 1) & 2 )
+ {
// bits 0 and 1 of noise differ
delta = -delta;
synth.offset_resampled( rtime, delta, output );
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.h
index b675bfb4..f46cec8c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Oscs.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Oscs.h
@@ -1,6 +1,6 @@
// Private oscillators used by Nes_Apu
-// Nes_Snd_Emu 0.1.8
+// Nes_Snd_Emu 0.2.0-pre
#ifndef NES_OSCS_H
#define NES_OSCS_H
@@ -11,6 +11,8 @@ class Nes_Apu;
struct Nes_Osc
{
+ typedef int nes_time_t;
+
unsigned char regs [4];
bool reg_written [4];
Blip_Buffer* output;
@@ -56,7 +58,7 @@ struct Nes_Square : Nes_Envelope
int phase;
int sweep_delay;
- typedef Blip_Synth<blip_good_quality,1> Synth;
+ typedef Blip_Synth_Norm Synth;
Synth const& synth; // shared between squares
Nes_Square( Synth const* s ) : synth( *s ) { }
@@ -77,7 +79,7 @@ struct Nes_Triangle : Nes_Osc
enum { phase_range = 16 };
int phase;
int linear_counter;
- Blip_Synth<blip_med_quality,1> synth;
+ Blip_Synth_Fast synth;
int calc_amp() const;
void run( nes_time_t, nes_time_t );
@@ -95,7 +97,7 @@ struct Nes_Triangle : Nes_Osc
struct Nes_Noise : Nes_Envelope
{
int noise;
- Blip_Synth<blip_med_quality,1> synth;
+ Blip_Synth_Fast synth;
void run( nes_time_t, nes_time_t );
void reset() {
@@ -126,13 +128,11 @@ struct Nes_Dmc : Nes_Osc
bool pal_mode;
bool nonlinear;
- int (*prg_reader)( void*, nes_addr_t ); // needs to be initialized to prg read function
- void* prg_reader_data;
-
Nes_Apu* apu;
- Blip_Synth<blip_med_quality,1> synth;
+ Blip_Synth_Fast synth;
+ int update_amp_nonlinear( int dac_in );
void start();
void write_register( int, int );
void run( nes_time_t, nes_time_t );
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.cpp
index d178407c..0799225c 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.cpp
@@ -1,4 +1,4 @@
-// Nes_Snd_Emu 0.1.8. http://www.slack.net/~ant/
+// Nes_Snd_Emu 0.2.0-pre. http://www.slack.net/~ant/
#include "Nes_Vrc6_Apu.h"
@@ -15,11 +15,10 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
#include "blargg_source.h"
-Nes_Vrc6_Apu::Nes_Vrc6_Apu()
+void Nes_Vrc6_Apu::set_output( Blip_Buffer* buf )
{
- output( NULL );
- volume( 1.0 );
- reset();
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, buf );
}
void Nes_Vrc6_Apu::reset()
@@ -37,10 +36,11 @@ void Nes_Vrc6_Apu::reset()
}
}
-void Nes_Vrc6_Apu::output( Blip_Buffer* buf )
+Nes_Vrc6_Apu::Nes_Vrc6_Apu()
{
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, buf );
+ set_output( NULL );
+ volume( 1.0 );
+ reset();
}
void Nes_Vrc6_Apu::run_until( blip_time_t time )
@@ -107,7 +107,6 @@ void Nes_Vrc6_Apu::run_square( Vrc6_Osc& osc, blip_time_t end_time )
Blip_Buffer* output = osc.output;
if ( !output )
return;
- output->set_modified();
int volume = osc.regs [0] & 15;
if ( !(osc.regs [2] & 0x80) )
@@ -120,6 +119,7 @@ void Nes_Vrc6_Apu::run_square( Vrc6_Osc& osc, blip_time_t end_time )
if ( delta )
{
osc.last_amp += delta;
+ output->set_modified();
square_synth.offset( time, delta, output );
}
@@ -131,6 +131,7 @@ void Nes_Vrc6_Apu::run_square( Vrc6_Osc& osc, blip_time_t end_time )
if ( time < end_time )
{
int phase = osc.phase;
+ output->set_modified();
do
{
diff --git a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.h
index 18722233..123364d6 100644
--- a/plugins/gme/game-music-emu-0.5.5/gme/Nes_Vrc6_Apu.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc6_Apu.h
@@ -1,6 +1,6 @@
// Konami VRC6 sound chip emulator
-// Nes_Snd_Emu 0.1.8
+// Nes_Snd_Emu 0.2.0-pre
#ifndef NES_VRC6_APU_H
#define NES_VRC6_APU_H
@@ -15,9 +15,9 @@ public:
void reset();
void volume( double );
void treble_eq( blip_eq_t const& );
- void output( Blip_Buffer* );
+ void set_output( Blip_Buffer* );
enum { osc_count = 3 };
- void osc_output( int index, Blip_Buffer* );
+ void set_output( int index, Blip_Buffer* );
void end_frame( blip_time_t );
void save_state( vrc6_apu_state_t* ) const;
void load_state( vrc6_apu_state_t const& );
@@ -49,15 +49,15 @@ private:
int period() const
{
- return (regs [2] & 0x0F) * 0x100L + regs [1] + 1;
+ return (regs [2] & 0x0F) * 0x100 + regs [1] + 1;
}
};
Vrc6_Osc oscs [osc_count];
blip_time_t last_time;
- Blip_Synth<blip_med_quality,1> saw_synth;
- Blip_Synth<blip_good_quality,1> square_synth;
+ Blip_Synth_Fast saw_synth;
+ Blip_Synth_Norm square_synth;
void run_until( blip_time_t );
void run_square( Vrc6_Osc& osc, blip_time_t );
@@ -73,7 +73,7 @@ struct vrc6_apu_state_t
BOOST::uint8_t unused;
};
-inline void Nes_Vrc6_Apu::osc_output( int i, Blip_Buffer* buf )
+inline void Nes_Vrc6_Apu::set_output( int i, Blip_Buffer* buf )
{
assert( (unsigned) i < osc_count );
oscs [i].output = buf;
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.cpp
new file mode 100644
index 00000000..033061d6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.cpp
@@ -0,0 +1,206 @@
+#include "Nes_Vrc7_Apu.h"
+
+#include "ym2413.h"
+#include <string.h>
+
+#include "blargg_source.h"
+
+int const period = 36; // NES CPU clocks per FM clock
+
+Nes_Vrc7_Apu::Nes_Vrc7_Apu()
+{
+ opll = 0;
+}
+
+blargg_err_t Nes_Vrc7_Apu::init()
+{
+ CHECK_ALLOC( opll = ym2413_init( 3579545, 3579545 / 72, 1 ) );
+
+ set_output( 0 );
+ volume( 1.0 );
+ reset();
+ return 0;
+}
+
+Nes_Vrc7_Apu::~Nes_Vrc7_Apu()
+{
+ if ( opll )
+ ym2413_shutdown( opll );
+}
+
+void Nes_Vrc7_Apu::set_output( Blip_Buffer* buf )
+{
+ for ( int i = 0; i < osc_count; ++i )
+ oscs [i].output = buf;
+ output_changed();
+}
+
+void Nes_Vrc7_Apu::output_changed()
+{
+ mono.output = oscs [0].output;
+ for ( int i = osc_count; --i; )
+ {
+ if ( mono.output != oscs [i].output )
+ {
+ mono.output = 0;
+ break;
+ }
+ }
+
+ if ( mono.output )
+ {
+ for ( int i = osc_count; --i; )
+ {
+ mono.last_amp += oscs [i].last_amp;
+ oscs [i].last_amp = 0;
+ }
+ }
+}
+
+void Nes_Vrc7_Apu::reset()
+{
+ addr = 0;
+ next_time = 0;
+ mono.last_amp = 0;
+
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Vrc7_Osc& osc = oscs [i];
+ osc.last_amp = 0;
+ for ( int j = 0; j < 3; ++j )
+ osc.regs [j] = 0;
+ }
+
+ ym2413_reset_chip( opll );
+}
+
+void Nes_Vrc7_Apu::write_reg( int data )
+{
+ addr = data;
+}
+
+void Nes_Vrc7_Apu::write_data( blip_time_t time, int data )
+{
+ int type = (addr >> 4) - 1;
+ int chan = addr & 15;
+ if ( (unsigned) type < 3 && chan < osc_count )
+ oscs [chan].regs [type] = data;
+
+ if ( time > next_time )
+ run_until( time );
+ ym2413_write( opll, 0, addr );
+ ym2413_write( opll, 1, data );
+}
+
+void Nes_Vrc7_Apu::end_frame( blip_time_t time )
+{
+ if ( time > next_time )
+ run_until( time );
+
+ next_time -= time;
+ assert( next_time >= 0 );
+
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Blip_Buffer* output = oscs [i].output;
+ if ( output )
+ output->set_modified();
+ }
+}
+
+void Nes_Vrc7_Apu::save_snapshot( vrc7_snapshot_t* out ) const
+{
+ out->latch = addr;
+ out->delay = next_time;
+ for ( int i = osc_count; --i >= 0; )
+ {
+ for ( int j = 0; j < 3; ++j )
+ out->regs [i] [j] = oscs [i].regs [j];
+ }
+ memcpy( out->inst, ym2413_get_inst0( opll ), 8 );
+}
+
+void Nes_Vrc7_Apu::load_snapshot( vrc7_snapshot_t const& in )
+{
+ assert( offsetof (vrc7_snapshot_t,delay) == 28 - 1 );
+
+ reset();
+ next_time = in.delay;
+ write_reg( in.latch );
+ int i;
+ for ( i = 0; i < osc_count; ++i )
+ {
+ for ( int j = 0; j < 3; ++j )
+ oscs [i].regs [j] = in.regs [i] [j];
+ }
+
+ for ( i = 0; i < 8; ++i )
+ {
+ ym2413_write( opll, 0, i );
+ ym2413_write( opll, 1, in.inst [i] );
+ }
+
+ for ( i = 0; i < 3; ++i )
+ {
+ for ( int j = 0; j < 6; ++j )
+ {
+ ym2413_write( opll, 0, 0x10 + i * 0x10 + j );
+ ym2413_write( opll, 1, oscs [j].regs [i] );
+ }
+ }
+}
+
+void Nes_Vrc7_Apu::run_until( blip_time_t end_time )
+{
+ require( end_time > next_time );
+
+ blip_time_t time = next_time;
+ void* opll = this->opll; // cache
+ Blip_Buffer* const mono_output = mono.output;
+ if ( mono_output )
+ {
+ // optimal case
+ do
+ {
+ ym2413_advance_lfo( opll );
+ int amp = 0;
+ for ( int i = 0; i < osc_count; i++ )
+ amp += ym2413_calcch( opll, i );
+ ym2413_advance( opll );
+ int delta = amp - mono.last_amp;
+ if ( delta )
+ {
+ mono.last_amp = amp;
+ synth.offset_inline( time, delta, mono_output );
+ }
+ time += period;
+ }
+ while ( time < end_time );
+ }
+ else
+ {
+ mono.last_amp = 0;
+ do
+ {
+ ym2413_advance_lfo( opll );
+ for ( int i = 0; i < osc_count; ++i )
+ {
+ Vrc7_Osc& osc = oscs [i];
+ if ( osc.output )
+ {
+ int amp = ym2413_calcch( opll, i );
+ int delta = amp - osc.last_amp;
+ if ( delta )
+ {
+ osc.last_amp = amp;
+ synth.offset( time, delta, osc.output );
+ }
+ }
+ }
+ ym2413_advance( opll );
+ time += period;
+ }
+ while ( time < end_time );
+ }
+ next_time = time;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h
new file mode 100644
index 00000000..60ea1631
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nes_Vrc7_Apu.h
@@ -0,0 +1,80 @@
+// Konami VRC7 sound chip emulator
+
+#ifndef NES_VRC7_APU_H
+#define NES_VRC7_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+struct vrc7_snapshot_t;
+
+class Nes_Vrc7_Apu {
+public:
+ blargg_err_t init();
+
+ // See Nes_Apu.h for reference
+ void reset();
+ void volume( double );
+ void treble_eq( blip_eq_t const& );
+ void set_output( Blip_Buffer* );
+ enum { osc_count = 6 };
+ void set_output( int index, Blip_Buffer* );
+ void end_frame( blip_time_t );
+ void save_snapshot( vrc7_snapshot_t* ) const;
+ void load_snapshot( vrc7_snapshot_t const& );
+
+ void write_reg( int reg );
+ void write_data( blip_time_t, int data );
+
+public:
+ Nes_Vrc7_Apu();
+ ~Nes_Vrc7_Apu();
+ BLARGG_DISABLE_NOTHROW
+private:
+ // noncopyable
+ Nes_Vrc7_Apu( const Nes_Vrc7_Apu& );
+ Nes_Vrc7_Apu& operator = ( const Nes_Vrc7_Apu& );
+
+ struct Vrc7_Osc
+ {
+ BOOST::uint8_t regs [3];
+ Blip_Buffer* output;
+ int last_amp;
+ };
+
+ Vrc7_Osc oscs [osc_count];
+ void* opll;
+ int addr;
+ blip_time_t next_time;
+ struct {
+ Blip_Buffer* output;
+ int last_amp;
+ } mono;
+
+ Blip_Synth_Fast synth;
+
+ void run_until( blip_time_t );
+ void output_changed();
+};
+
+struct vrc7_snapshot_t
+{
+ BOOST::uint8_t latch;
+ BOOST::uint8_t inst [8];
+ BOOST::uint8_t regs [6] [3];
+ BOOST::uint8_t delay;
+};
+
+inline void Nes_Vrc7_Apu::set_output( int i, Blip_Buffer* buf )
+{
+ assert( (unsigned) i < osc_count );
+ oscs [i].output = buf;
+ output_changed();
+}
+
+// DB2LIN_AMP_BITS == 11, * 2
+inline void Nes_Vrc7_Apu::volume( double v ) { synth.volume( 1.0 / 3 / 4096 * v ); }
+
+inline void Nes_Vrc7_Apu::treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.cpp
new file mode 100644
index 00000000..f0822250
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.cpp
@@ -0,0 +1,302 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nsf_Core.h"
+
+#include "blargg_endian.h"
+
+#if !NSF_EMU_APU_ONLY
+ #include "Nes_Namco_Apu.h"
+ #include "Nes_Vrc6_Apu.h"
+ #include "Nes_Fme7_Apu.h"
+ #include "Nes_Fds_Apu.h"
+ #include "Nes_Mmc5_Apu.h"
+ #include "Nes_Vrc7_Apu.h"
+#endif
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Nsf_Core::Nsf_Core()
+{
+ fds = NULL;
+ fme7 = NULL;
+ mmc5 = NULL;
+ namco = NULL;
+ vrc6 = NULL;
+ vrc7 = NULL;
+}
+
+Nsf_Core::~Nsf_Core()
+{
+ unload();
+}
+
+void Nsf_Core::unload()
+{
+#if !NSF_EMU_APU_ONLY
+ delete fds;
+ fds = NULL;
+
+ delete fme7;
+ fme7 = NULL;
+
+ delete namco;
+ namco = NULL;
+
+ delete mmc5;
+ mmc5 = NULL;
+
+ delete vrc6;
+ vrc6 = NULL;
+
+ delete vrc7;
+ vrc7 = NULL;
+#endif
+
+ Nsf_Impl::unload();
+}
+
+void Nsf_Core::set_tempo( double t )
+{
+ set_play_period( (int) (header().play_period() / t) );
+ nes_apu()->set_tempo( t );
+#if !NSF_EMU_APU_ONLY
+ if ( fds )
+ fds->set_tempo( t );
+#endif
+}
+
+blargg_err_t Nsf_Core::post_load()
+{
+ int chip_flags = header().chip_flags;
+
+ #if !NSF_EMU_APU_ONLY
+ if ( chip_flags & header_t::fds_mask )
+ CHECK_ALLOC( fds = BLARGG_NEW Nes_Fds_Apu );
+
+ if ( chip_flags & header_t::fme7_mask )
+ CHECK_ALLOC( fme7 = BLARGG_NEW Nes_Fme7_Apu );
+
+ if ( chip_flags & header_t::mmc5_mask )
+ CHECK_ALLOC( mmc5 = BLARGG_NEW Nes_Mmc5_Apu );
+
+ if ( chip_flags & header_t::namco_mask )
+ CHECK_ALLOC( namco = BLARGG_NEW Nes_Namco_Apu );
+
+ if ( chip_flags & header_t::vrc6_mask )
+ CHECK_ALLOC( vrc6 = BLARGG_NEW Nes_Vrc6_Apu );
+
+ if ( chip_flags & header_t::vrc7_mask )
+ {
+ #if NSF_EMU_NO_VRC7
+ chip_flags = ~chips_mask; // give warning rather than error
+ #else
+ CHECK_ALLOC( vrc7 = BLARGG_NEW Nes_Vrc7_Apu );
+ RETURN_ERR( vrc7->init() );
+ #endif
+ }
+ #endif
+
+ set_tempo( 1.0 );
+
+ if ( chip_flags & ~chips_mask )
+ set_warning( "Uses unsupported audio expansion hardware" );
+
+ return Nsf_Impl::post_load();
+}
+
+int Nsf_Core::cpu_read( addr_t addr )
+{
+ #if !NSF_EMU_APU_ONLY
+ {
+ if ( addr == Nes_Namco_Apu::data_reg_addr && namco )
+ return namco->read_data();
+
+ if ( (unsigned) (addr - Nes_Fds_Apu::io_addr) < Nes_Fds_Apu::io_size && fds )
+ return fds->read( time(), addr );
+
+ int i = addr - 0x5C00;
+ if ( (unsigned) i < mmc5->exram_size && mmc5 )
+ return mmc5->exram [i];
+
+ int m = addr - 0x5205;
+ if ( (unsigned) m < 2 && mmc5 )
+ return (mmc5_mul [0] * mmc5_mul [1]) >> (m * 8) & 0xFF;
+ }
+ #endif
+
+ return Nsf_Impl::cpu_read( addr );
+}
+
+int Nsf_Core::unmapped_read( addr_t addr )
+{
+ switch ( addr )
+ {
+ case 0x2002:
+ case 0x4016:
+ case 0x4017:
+ return addr >> 8;
+ }
+
+ return Nsf_Impl::unmapped_read( addr );
+}
+
+void Nsf_Core::cpu_write( addr_t addr, int data )
+{
+ #if !NSF_EMU_APU_ONLY
+ {
+ if ( (unsigned) (addr - fds->io_addr) < fds->io_size && fds )
+ {
+ fds->write( time(), addr, data );
+ return;
+ }
+
+ if ( namco )
+ {
+ if ( addr == namco->addr_reg_addr )
+ {
+ namco->write_addr( data );
+ return;
+ }
+
+ if ( addr == namco->data_reg_addr )
+ {
+ namco->write_data( time(), data );
+ return;
+ }
+ }
+
+ if ( vrc6 )
+ {
+ int reg = addr & (vrc6->addr_step - 1);
+ int osc = (unsigned) (addr - vrc6->base_addr) / vrc6->addr_step;
+ if ( (unsigned) osc < vrc6->osc_count && (unsigned) reg < vrc6->reg_count )
+ {
+ vrc6->write_osc( time(), osc, reg, data );
+ return;
+ }
+ }
+
+ if ( addr >= fme7->latch_addr && fme7 )
+ {
+ switch ( addr & fme7->addr_mask )
+ {
+ case Nes_Fme7_Apu::latch_addr:
+ fme7->write_latch( data );
+ return;
+
+ case Nes_Fme7_Apu::data_addr:
+ fme7->write_data( time(), data );
+ return;
+ }
+ }
+
+ if ( mmc5 )
+ {
+ if ( (unsigned) (addr - mmc5->regs_addr) < mmc5->regs_size )
+ {
+ mmc5->write_register( time(), addr, data );
+ return;
+ }
+
+ int m = addr - 0x5205;
+ if ( (unsigned) m < 2 )
+ {
+ mmc5_mul [m] = data;
+ return;
+ }
+
+ int i = addr - 0x5C00;
+ if ( (unsigned) i < mmc5->exram_size )
+ {
+ mmc5->exram [i] = data;
+ return;
+ }
+ }
+
+ if ( vrc7 )
+ {
+ if ( addr == 0x9010 )
+ {
+ vrc7->write_reg( data );
+ return;
+ }
+
+ if ( (unsigned) (addr - 0x9028) <= 0x08 )
+ {
+ vrc7->write_data( time(), data );
+ return;
+ }
+ }
+ }
+ #endif
+
+ return Nsf_Impl::cpu_write( addr, data );
+}
+
+void Nsf_Core::unmapped_write( addr_t addr, int data )
+{
+ switch ( addr )
+ {
+ case 0x8000: // some write to $8000 and $8001 repeatedly
+ case 0x8001:
+ case 0x4800: // probably namco sound mistakenly turned on in MCK
+ case 0xF800:
+ case 0xFFF8: // memory mapper?
+ return;
+ }
+
+ if ( mmc5 && addr == 0x5115 ) return;
+
+ // FDS memory
+ if ( fds && (unsigned) (addr - 0x8000) < 0x6000 ) return;
+
+ Nsf_Impl::unmapped_write( addr, data );
+}
+
+blargg_err_t Nsf_Core::start_track( int track )
+{
+ #if !NSF_EMU_APU_ONLY
+ if ( mmc5 )
+ {
+ mmc5_mul [0] = 0;
+ mmc5_mul [1] = 0;
+ memset( mmc5->exram, 0, mmc5->exram_size );
+ }
+ #endif
+
+ #if !NSF_EMU_APU_ONLY
+ if ( fds ) fds ->reset();
+ if ( fme7 ) fme7 ->reset();
+ if ( mmc5 ) mmc5 ->reset();
+ if ( namco ) namco->reset();
+ if ( vrc6 ) vrc6 ->reset();
+ if ( vrc7 ) vrc7 ->reset();
+ #endif
+
+ return Nsf_Impl::start_track( track );
+}
+
+void Nsf_Core::end_frame( time_t end )
+{
+ Nsf_Impl::end_frame( end );
+
+ #if !NSF_EMU_APU_ONLY
+ if ( fds ) fds ->end_frame( end );
+ if ( fme7 ) fme7 ->end_frame( end );
+ if ( mmc5 ) mmc5 ->end_frame( end );
+ if ( namco ) namco->end_frame( end );
+ if ( vrc6 ) vrc6 ->end_frame( end );
+ if ( vrc7 ) vrc7 ->end_frame( end );
+ #endif
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.h
new file mode 100644
index 00000000..957efda7
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Core.h
@@ -0,0 +1,68 @@
+// Loads NSF file and emulates CPU and sound chips
+
+// Game_Music_Emu 0.6-pre
+#ifndef NSF_CORE_H
+#define NSF_CORE_H
+
+#include "Nsf_Impl.h"
+
+class Nes_Namco_Apu;
+class Nes_Vrc6_Apu;
+class Nes_Fme7_Apu;
+class Nes_Mmc5_Apu;
+class Nes_Vrc7_Apu;
+class Nes_Fds_Apu;
+
+class Nsf_Core : public Nsf_Impl {
+public:
+
+ // Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
+ // Loading a file resets tempo to 1.0.
+ void set_tempo( double );
+
+ // Pointer to sound chip, or NULL if not used by current file.
+ // Must be assigned to a Blip_Buffer to get any sound.
+ Nes_Fds_Apu * fds_apu () { return fds; }
+ Nes_Fme7_Apu * fme7_apu () { return fme7; }
+ Nes_Mmc5_Apu * mmc5_apu () { return mmc5; }
+ Nes_Namco_Apu* namco_apu() { return namco; }
+ Nes_Vrc6_Apu * vrc6_apu () { return vrc6; }
+ Nes_Vrc7_Apu * vrc7_apu () { return vrc7; }
+
+ // Mask for which chips are supported
+ #if NSF_EMU_APU_ONLY
+ enum { chips_mask = 0 };
+ #else
+ enum { chips_mask = header_t::all_mask };
+ #endif
+
+protected:
+ virtual int unmapped_read( addr_t );
+ virtual void unmapped_write( addr_t, int data );
+
+
+// Implementation
+public:
+ Nsf_Core();
+ ~Nsf_Core();
+ virtual void unload();
+ virtual blargg_err_t start_track( int );
+ virtual void end_frame( time_t );
+
+protected:
+ virtual blargg_err_t post_load();
+ virtual int cpu_read( addr_t );
+ virtual void cpu_write( addr_t, int );
+
+private:
+ byte mmc5_mul [2];
+
+ Nes_Fds_Apu* fds;
+ Nes_Fme7_Apu* fme7;
+ Nes_Mmc5_Apu* mmc5;
+ Nes_Namco_Apu* namco;
+ Nes_Vrc6_Apu* vrc6;
+ Nes_Vrc7_Apu* vrc7;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Cpu.cpp
new file mode 100644
index 00000000..296c2f1c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Cpu.cpp
@@ -0,0 +1,116 @@
+// Normal CPU for NSF emulator
+
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nsf_Impl.h"
+
+#include "blargg_endian.h"
+
+#ifdef BLARGG_DEBUG_H
+ //#define CPU_LOG_START 1000000
+ //#include "nes_cpu_log.h"
+ #undef LOG_MEM
+#endif
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifndef LOG_MEM
+ #define LOG_MEM( addr, str, data ) data
+#endif
+
+int Nsf_Impl::read_mem( addr_t addr )
+{
+ int result = low_ram [addr & (low_ram_size-1)]; // also handles wrap-around
+ if ( addr & 0xE000 )
+ {
+ result = *cpu.get_code( addr );
+ if ( addr < sram_addr )
+ {
+ if ( addr == apu.status_addr )
+ result = apu.read_status( time() );
+ else
+ result = cpu_read( addr );
+ }
+ }
+ return LOG_MEM( addr, ">", result );
+}
+
+void Nsf_Impl::write_mem( addr_t addr, int data )
+{
+ (void) LOG_MEM( addr, "<", data );
+
+ int offset = addr - sram_addr;
+ if ( (unsigned) offset < sram_size )
+ {
+ sram() [offset] = data;
+ }
+ else
+ {
+ // after sram because CPU handles most low_ram accesses internally already
+ int temp = addr & (low_ram_size-1); // also handles wrap-around
+ if ( !(addr & 0xE000) )
+ {
+ low_ram [temp] = data;
+ }
+ else
+ {
+ int bank = addr - banks_addr;
+ if ( (unsigned) bank < bank_count )
+ {
+ write_bank( bank, data );
+ }
+ else if ( (unsigned) (addr - apu.io_addr) < apu.io_size )
+ {
+ apu.write_register( time(), addr, data );
+ }
+ else
+ {
+ #if !NSF_EMU_APU_ONLY
+ // 0x8000-0xDFFF is writable
+ int i = addr - 0x8000;
+ if ( (unsigned) i < fdsram_size && fds_enabled() )
+ fdsram() [i] = data;
+ else
+ #endif
+ cpu_write( addr, data );
+ }
+ }
+ }
+}
+
+#define READ_LOW( addr ) (LOG_MEM( addr, ">", low_ram [addr] ))
+#define WRITE_LOW( addr, data ) (LOG_MEM( addr, "<", low_ram [addr] = data ))
+
+#define CAN_WRITE_FAST( addr ) (addr < low_ram_size)
+#define WRITE_FAST WRITE_LOW
+
+// addr < 0x2000 || addr >= 0x8000
+#define CAN_READ_FAST( addr ) ((addr ^ 0x8000) < 0xA000)
+#define READ_FAST( addr, out ) (LOG_MEM( addr, ">", out = READ_CODE( addr ) ))
+
+#define READ_MEM( addr ) read_mem( addr )
+#define WRITE_MEM( addr, data ) write_mem( addr, data )
+
+#define CPU cpu
+
+#define CPU_BEGIN \
+bool Nsf_Impl::run_cpu_until( time_t end )\
+{\
+ cpu.set_end_time( end );\
+ if ( *cpu.get_code( cpu.r.pc ) != cpu.halt_opcode )\
+ {
+ #include "Nes_Cpu_run.h"
+ }
+ return cpu.time_past_end() < 0;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.cpp
new file mode 100644
index 00000000..0c854438
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.cpp
@@ -0,0 +1,314 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nsf_Emu.h"
+
+#if !NSF_EMU_APU_ONLY
+ #include "Nes_Namco_Apu.h"
+ #include "Nes_Vrc6_Apu.h"
+ #include "Nes_Fme7_Apu.h"
+ #include "Nes_Fds_Apu.h"
+ #include "Nes_Mmc5_Apu.h"
+ #include "Nes_Vrc7_Apu.h"
+#endif
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Nsf_Emu::equalizer_t const Nsf_Emu::nes_eq = { -1.0, 80 };
+Nsf_Emu::equalizer_t const Nsf_Emu::famicom_eq = { -15.0, 80 };
+
+Nsf_Emu::Nsf_Emu()
+{
+ set_type( gme_nsf_type );
+ set_silence_lookahead( 6 );
+ set_gain( 1.4 );
+ set_equalizer( nes_eq );
+}
+
+Nsf_Emu::~Nsf_Emu()
+{
+ unload();
+}
+
+void Nsf_Emu::unload()
+{
+ core_.unload();
+ Music_Emu::unload();
+}
+
+// Track info
+
+static void copy_nsf_fields( Nsf_Emu::header_t const& h, track_info_t* out )
+{
+ GME_COPY_FIELD( h, out, game );
+ GME_COPY_FIELD( h, out, author );
+ GME_COPY_FIELD( h, out, copyright );
+ if ( h.chip_flags )
+ Music_Emu::copy_field_( out->system, "Famicom" );
+}
+
+blargg_err_t Nsf_Emu::track_info_( track_info_t* out, int ) const
+{
+ copy_nsf_fields( header(), out );
+ return blargg_ok;
+}
+
+static blargg_err_t check_nsf_header( Nsf_Emu::header_t const& h )
+{
+ if ( !h.valid_tag() )
+ return blargg_err_file_type;
+ return blargg_ok;
+}
+
+struct Nsf_File : Gme_Info_
+{
+ Nsf_Emu::header_t h;
+
+ Nsf_File() { set_type( gme_nsf_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ blargg_err_t err = in.read( &h, h.size );
+ if ( err )
+ return (blargg_is_err_type( err, blargg_err_file_eof ) ? blargg_err_file_type : err);
+
+ if ( h.vers != 1 )
+ set_warning( "Unknown file version" );
+
+ int unsupported_chips = ~Nsf_Core::chips_mask;
+ #if NSF_EMU_NO_VRC7
+ unsupported_chips |= Nsf_Emu::header_t::vrc7_mask;
+ #endif
+ if ( h.chip_flags & unsupported_chips )
+ set_warning( "Uses unsupported audio expansion hardware" );
+
+ set_track_count( h.track_count );
+ return check_nsf_header( h );
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_nsf_fields( h, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_nsf_emu () { return BLARGG_NEW Nsf_Emu ; }
+static Music_Emu* new_nsf_file() { return BLARGG_NEW Nsf_File; }
+
+gme_type_t_ const gme_nsf_type [1] = {{ "Nintendo NES", 0, &new_nsf_emu, &new_nsf_file, "NSF", 1 }};
+
+// Setup
+
+void Nsf_Emu::set_tempo_( double t )
+{
+ core_.set_tempo( t );
+}
+
+void Nsf_Emu::append_voices( const char* const names [], int const types [], int count )
+{
+ assert( voice_count_ + count < max_voices );
+ for ( int i = 0; i < count; i++ )
+ {
+ voice_names_ [voice_count_ + i] = names [i];
+ voice_types_ [voice_count_ + i] = types [i];
+ }
+ voice_count_ += count;
+ set_voice_count( voice_count_ );
+ set_voice_types( voice_types_ );
+}
+
+blargg_err_t Nsf_Emu::init_sound()
+{
+ voice_count_ = 0;
+ set_voice_names( voice_names_ );
+
+ {
+ int const count = Nes_Apu::osc_count;
+ static const char* const names [Nes_Apu::osc_count] = {
+ "Square 1", "Square 2", "Triangle", "Noise", "DMC"
+ };
+ static int const types [count] = {
+ wave_type+1, wave_type+2, mixed_type+1, noise_type+0, mixed_type+1
+ };
+ append_voices( names, types, count );
+ }
+
+ // Make adjusted_gain * 0.75 = 1.0 so usual APU and one sound chip uses 1.0
+ double adjusted_gain = 1.0 / 0.75 * gain();
+
+#if !NSF_EMU_APU_ONLY
+ // TODO: order of chips here must match that in set_voice()
+
+ if ( core_.vrc6_apu() )
+ {
+ int const count = Nes_Vrc6_Apu::osc_count;
+ static const char* const names [count] = {
+ "Square 3", "Square 4", "Saw Wave"
+ };
+ static int const types [count] = {
+ wave_type+3, wave_type+4, wave_type+5,
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.fme7_apu() )
+ {
+ int const count = Nes_Fme7_Apu::osc_count;
+ static const char* const names [count] = {
+ "Square 3", "Square 4", "Square 5"
+ };
+ static int const types [count] = {
+ wave_type+3, wave_type+4, wave_type+5,
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.mmc5_apu() )
+ {
+ int const count = Nes_Mmc5_Apu::osc_count;
+ static const char* const names [count] = {
+ "Square 3", "Square 4", "PCM"
+ };
+ static int const types [count] = {
+ wave_type+3, wave_type+4, mixed_type+2
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.fds_apu() )
+ {
+ int const count = Nes_Fds_Apu::osc_count;
+ static const char* const names [count] = {
+ "FM"
+ };
+ static int const types [count] = {
+ wave_type+0
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.namco_apu() )
+ {
+ int const count = Nes_Namco_Apu::osc_count;
+ static const char* const names [count] = {
+ "Wave 1", "Wave 2", "Wave 3", "Wave 4",
+ "Wave 5", "Wave 6", "Wave 7", "Wave 8"
+ };
+ static int const types [count] = {
+ wave_type+3, wave_type+4, wave_type+5, wave_type+ 6,
+ wave_type+7, wave_type+8, wave_type+9, wave_type+10,
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.vrc7_apu() )
+ {
+ int const count = Nes_Vrc7_Apu::osc_count;
+ static const char* const names [count] = {
+ "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6"
+ };
+ static int const types [count] = {
+ wave_type+3, wave_type+4, wave_type+5, wave_type+6,
+ wave_type+7, wave_type+8
+ };
+ append_voices( names, types, count );
+ adjusted_gain *= 0.75;
+ }
+
+ if ( core_.vrc7_apu() ) core_.vrc7_apu() ->volume( adjusted_gain );
+ if ( core_.namco_apu() ) core_.namco_apu()->volume( adjusted_gain );
+ if ( core_.vrc6_apu() ) core_.vrc6_apu() ->volume( adjusted_gain );
+ if ( core_.fme7_apu() ) core_.fme7_apu() ->volume( adjusted_gain );
+ if ( core_.mmc5_apu() ) core_.mmc5_apu() ->volume( adjusted_gain );
+ if ( core_.fds_apu() ) core_.fds_apu() ->volume( adjusted_gain );
+#endif
+
+ if ( adjusted_gain > gain() )
+ adjusted_gain = gain(); // only occurs if no other sound chips
+
+ core_.nes_apu()->volume( adjusted_gain );
+
+ return blargg_ok;
+}
+
+blargg_err_t Nsf_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( core_.load( in ) );
+ set_track_count( header().track_count );
+ RETURN_ERR( check_nsf_header( header() ) );
+ set_warning( core_.warning() );
+ RETURN_ERR( init_sound() );
+ set_tempo( tempo() );
+ return setup_buffer( (int) (header().clock_rate() + 0.5) );
+}
+
+void Nsf_Emu::update_eq( blip_eq_t const& eq )
+{
+ core_.nes_apu()->treble_eq( eq );
+
+ #if !NSF_EMU_APU_ONLY
+ {
+ if ( core_.namco_apu() ) core_.namco_apu()->treble_eq( eq );
+ if ( core_.vrc6_apu() ) core_.vrc6_apu() ->treble_eq( eq );
+ if ( core_.fme7_apu() ) core_.fme7_apu() ->treble_eq( eq );
+ if ( core_.mmc5_apu() ) core_.mmc5_apu() ->treble_eq( eq );
+ if ( core_.fds_apu() ) core_.fds_apu() ->treble_eq( eq );
+ if ( core_.vrc7_apu() ) core_.vrc7_apu() ->treble_eq( eq );
+ }
+ #endif
+}
+
+void Nsf_Emu::set_voice( int i, Blip_Buffer* buf, Blip_Buffer*, Blip_Buffer* )
+{
+ #define HANDLE_CHIP( chip ) \
+ if ( chip && (i -= chip->osc_count) < 0 )\
+ {\
+ chip->set_output( i + chip->osc_count, buf );\
+ return;\
+ }\
+
+ HANDLE_CHIP( core_.nes_apu() );
+
+ #if !NSF_EMU_APU_ONLY
+ {
+ // TODO: order of chips here must match that in init_sound()
+ HANDLE_CHIP( core_.vrc6_apu() );
+ HANDLE_CHIP( core_.fme7_apu() );
+ HANDLE_CHIP( core_.mmc5_apu() );
+ HANDLE_CHIP( core_.fds_apu() );
+ HANDLE_CHIP( core_.namco_apu() );
+ HANDLE_CHIP( core_.vrc7_apu() );
+ }
+ #endif
+}
+
+blargg_err_t Nsf_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+ return core_.start_track( track );
+}
+
+blargg_err_t Nsf_Emu::run_clocks( blip_time_t& duration, int )
+{
+ core_.end_frame( duration );
+ const char* w = core_.warning();
+ if ( w )
+ set_warning( w );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.h
new file mode 100644
index 00000000..0e7e654c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Emu.h
@@ -0,0 +1,51 @@
+// Nintendo NES/Famicom NSF music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef NSF_EMU_H
+#define NSF_EMU_H
+
+#include "Classic_Emu.h"
+#include "Nsf_Core.h"
+
+class Nsf_Emu : public Classic_Emu {
+public:
+ // Equalizer profiles for US NES and Japanese Famicom
+ static equalizer_t const nes_eq;
+ static equalizer_t const famicom_eq;
+
+ // NSF file header (see Nsf_Impl.h)
+ typedef Nsf_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core_.header(); }
+
+ static gme_type_t static_type() { return gme_nsf_type; }
+
+ Nsf_Core& core() { return core_; }
+
+public:
+ Nsf_Emu();
+ ~Nsf_Emu();
+ virtual void unload();
+
+protected:
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+
+private:
+ enum { max_voices = 32 };
+ const char* voice_names_ [32];
+ int voice_types_ [32];
+ int voice_count_;
+ Nsf_Core core_;
+
+ blargg_err_t init_sound();
+ void append_voices( const char* const names [], int const types [], int count );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.cpp
new file mode 100644
index 00000000..53b3a416
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.cpp
@@ -0,0 +1,327 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nsf_Impl.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// number of frames until play interrupts init
+int const initial_play_delay = 7; // KikiKaikai needed this to work
+int const bank_size = 0x1000;
+int const rom_addr = 0x8000;
+
+int Nsf_Impl::read_code( addr_t addr ) const
+{
+ return *cpu.get_code( addr );
+}
+
+int Nsf_Impl::pcm_read( void* self, int addr )
+{
+ return STATIC_CAST(Nsf_Impl*,self)->read_code( addr );
+}
+
+Nsf_Impl::Nsf_Impl() : rom( bank_size )
+{
+ apu.dmc_reader( pcm_read, this );
+ assert( offsetof (header_t,unused [4]) == header_t::size );
+}
+
+void Nsf_Impl::unload()
+{
+ rom.clear();
+ high_ram.clear();
+ Gme_Loader::unload();
+}
+
+Nsf_Impl::~Nsf_Impl() { unload(); }
+
+bool nsf_header_t::valid_tag() const
+{
+ return 0 == memcmp( tag, "NESM\x1A", 5 );
+}
+
+double nsf_header_t::clock_rate() const
+{
+ return pal_only() ? 1662607.125 : 1789772.727272727;
+}
+
+int nsf_header_t::play_period() const
+{
+ // NTSC
+ int clocks = 29780;
+ int value = 0x411A;
+ byte const* rate_ptr = ntsc_speed;
+
+ // PAL
+ if ( pal_only() )
+ {
+ clocks = 33247;
+ value = 0x4E20;
+ rate_ptr = pal_speed;
+ }
+
+ // Default rate
+ int rate = get_le16( rate_ptr );
+ if ( rate == 0 )
+ rate = value;
+
+ // Custom rate
+ if ( rate != value )
+ clocks = (int) (rate * clock_rate() * (1.0/1000000.0));
+
+ return clocks;
+}
+
+// Gets address, given pointer to it in file header. If zero, returns rom_addr.
+Nsf_Impl::addr_t Nsf_Impl::get_addr( byte const in [] )
+{
+ addr_t addr = get_le16( in );
+ if ( addr == 0 )
+ addr = rom_addr;
+ return addr;
+}
+
+blargg_err_t Nsf_Impl::load_( Data_Reader& in )
+{
+ // pad ROM data with 0
+ RETURN_ERR( rom.load( in, header_.size, &header_, 0 ) );
+
+ if ( !header_.valid_tag() )
+ return blargg_err_file_type;
+
+ RETURN_ERR( high_ram.resize( (fds_enabled() ? fdsram_offset + fdsram_size : fdsram_offset) ) );
+
+ addr_t load_addr = get_addr( header_.load_addr );
+ if ( load_addr < (fds_enabled() ? sram_addr : rom_addr) )
+ set_warning( "Load address is too low" );
+
+ rom.set_addr( load_addr % bank_size );
+
+ if ( header_.vers != 1 )
+ set_warning( "Unknown file version" );
+
+ set_play_period( header_.play_period() );
+
+ return blargg_ok;
+}
+
+void Nsf_Impl::write_bank( int bank, int data )
+{
+ // Find bank in ROM
+ int offset = rom.mask_addr( data * bank_size );
+ if ( offset >= rom.size() )
+ special_event( "invalid bank" );
+ void const* rom_data = rom.at_addr( offset );
+
+ #if !NSF_EMU_APU_ONLY
+ if ( bank < bank_count - fds_banks && fds_enabled() )
+ {
+ // TODO: FDS bank switching is kind of hacky, might need to
+ // treat ROM as RAM so changes won't get lost when switching.
+ byte* out = sram();
+ if ( bank >= fds_banks )
+ {
+ out = fdsram();
+ bank -= fds_banks;
+ }
+ memcpy( &out [bank * bank_size], rom_data, bank_size );
+ return;
+ }
+ #endif
+
+ if ( bank >= fds_banks )
+ cpu.map_code( (bank + 6) * bank_size, bank_size, rom_data );
+}
+
+void Nsf_Impl::map_memory()
+{
+ // Map standard things
+ cpu.reset( unmapped_code() );
+ cpu.map_code( 0, 0x2000, low_ram, low_ram_size ); // mirrored four times
+ cpu.map_code( sram_addr, sram_size, sram() );
+
+ // Determine initial banks
+ byte banks [bank_count];
+ static byte const zero_banks [sizeof header_.banks] = { 0 };
+ if ( memcmp( header_.banks, zero_banks, sizeof zero_banks ) )
+ {
+ banks [0] = header_.banks [6];
+ banks [1] = header_.banks [7];
+ memcpy( banks + fds_banks, header_.banks, sizeof header_.banks );
+ }
+ else
+ {
+ // No initial banks, so assign them based on load_addr
+ int first_bank = (get_addr( header_.load_addr ) - sram_addr) / bank_size;
+ unsigned total_banks = rom.size() / bank_size;
+ for ( int i = bank_count; --i >= 0; )
+ {
+ int bank = i - first_bank;
+ if ( (unsigned) bank >= total_banks )
+ bank = 0;
+ banks [i] = bank;
+ }
+ }
+
+ // Map banks
+ for ( int i = (fds_enabled() ? 0 : fds_banks); i < bank_count; ++i )
+ write_bank( i, banks [i] );
+
+ // Map FDS RAM
+ if ( fds_enabled() )
+ cpu.map_code( rom_addr, fdsram_size, fdsram() );
+}
+
+inline void Nsf_Impl::push_byte( int b )
+{
+ low_ram [0x100 + cpu.r.sp--] = b;
+}
+
+// Jumps to routine, given pointer to address in file header. Pushes idle_addr
+// as return address, NOT old PC.
+void Nsf_Impl::jsr_then_stop( byte const addr [] )
+{
+ cpu.r.pc = get_addr( addr );
+ push_byte( (idle_addr - 1) >> 8 );
+ push_byte( (idle_addr - 1) );
+}
+
+blargg_err_t Nsf_Impl::start_track( int track )
+{
+ int speed_flags = 0;
+ #if NSF_EMU_EXTRA_FLAGS
+ speed_flags = header().speed_flags;
+ #endif
+
+ apu.reset( header().pal_only(), (speed_flags & 0x20) ? 0x3F : 0 );
+ apu.write_register( 0, 0x4015, 0x0F );
+ apu.write_register( 0, 0x4017, (speed_flags & 0x10) ? 0x80 : 0 );
+
+ // Clear memory
+ memset( unmapped_code(), Nes_Cpu::halt_opcode, unmapped_size );
+ memset( low_ram, 0, low_ram_size );
+ memset( sram(), 0, sram_size );
+
+ map_memory();
+
+ // Arrange time of first call to play routine
+ play_extra = 0;
+ next_play = play_period;
+
+ play_delay = initial_play_delay;
+ saved_state.pc = idle_addr;
+
+ // Setup for call to init routine
+ cpu.r.a = track;
+ cpu.r.x = header_.pal_only();
+ cpu.r.sp = 0xFF;
+ jsr_then_stop( header_.init_addr );
+ if ( cpu.r.pc < get_addr( header_.load_addr ) )
+ set_warning( "Init address < load address" );
+
+ return blargg_ok;
+}
+
+void Nsf_Impl::unmapped_write( addr_t addr, int data )
+{
+ dprintf( "Unmapped write $%04X <- %02X\n", (int) addr, data );
+}
+
+int Nsf_Impl::unmapped_read( addr_t addr )
+{
+ dprintf( "Unmapped read $%04X\n", (int) addr );
+ return addr >> 8;
+}
+
+void Nsf_Impl::special_event( const char str [] )
+{
+ dprintf( "%s\n", str );
+}
+
+void Nsf_Impl::run_once( time_t end )
+{
+ // Emulate until next play call if possible
+ if ( run_cpu_until( min( next_play, end ) ) )
+ {
+ // Halt instruction encountered
+
+ if ( cpu.r.pc != idle_addr )
+ {
+ special_event( "illegal instruction" );
+ cpu.count_error();
+ cpu.set_time( cpu.end_time() );
+ return;
+ }
+
+ // Init/play routine returned
+ play_delay = 1; // play can now be called regularly
+
+ if ( saved_state.pc == idle_addr )
+ {
+ // nothing to run
+ time_t t = cpu.end_time();
+ if ( cpu.time() < t )
+ cpu.set_time( t );
+ }
+ else
+ {
+ // continue init routine that was interrupted by play routine
+ cpu.r = saved_state;
+ saved_state.pc = idle_addr;
+ }
+ }
+
+ if ( time() >= next_play )
+ {
+ // Calculate time of next call to play routine
+ play_extra ^= 1; // extra clock every other call
+ next_play += play_period + play_extra;
+
+ // Call routine if ready
+ if ( play_delay && !--play_delay )
+ {
+ // Save state if init routine is still running
+ if ( cpu.r.pc != idle_addr )
+ {
+ check( saved_state.pc == idle_addr );
+ saved_state = cpu.r;
+ special_event( "play called during init" );
+ }
+
+ jsr_then_stop( header_.play_addr );
+ }
+ }
+}
+
+void Nsf_Impl::run_until( time_t end )
+{
+ while ( time() < end )
+ run_once( end );
+}
+
+void Nsf_Impl::end_frame( time_t end )
+{
+ if ( time() < end )
+ run_until( end );
+ cpu.adjust_time( -end );
+
+ // Localize to new time frame
+ next_play -= end;
+ check( next_play >= 0 );
+ if ( next_play < 0 )
+ next_play = 0;
+
+ apu.end_frame( end );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.h b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.h
new file mode 100644
index 00000000..d7c5ad4f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsf_Impl.h
@@ -0,0 +1,189 @@
+// Loads NSF file and emulates CPU and RAM, no sound chips
+
+// Game_Music_Emu 0.6-pre
+#ifndef NSF_IMPL_H
+#define NSF_IMPL_H
+
+#include "Gme_Loader.h"
+#include "Nes_Cpu.h"
+#include "Rom_Data.h"
+#include "Nes_Apu.h"
+
+// NSF file header
+struct nsf_header_t
+{
+ typedef unsigned char byte;
+ enum { size = 0x80 };
+
+ char tag [ 5];
+ byte vers;
+ byte track_count;
+ byte first_track;
+ byte load_addr [ 2];
+ byte init_addr [ 2];
+ byte play_addr [ 2];
+ char game [32]; // NOT null-terminated if 32 chars in length
+ char author [32];
+ char copyright [32];
+ byte ntsc_speed [ 2];
+ byte banks [ 8];
+ byte pal_speed [ 2];
+ byte speed_flags;
+ byte chip_flags;
+ byte unused [ 4];
+
+ // Sound chip masks
+ enum {
+ vrc6_mask = 1 << 0,
+ vrc7_mask = 1 << 1,
+ fds_mask = 1 << 2,
+ mmc5_mask = 1 << 3,
+ namco_mask = 1 << 4,
+ fme7_mask = 1 << 5,
+ all_mask = (1 << 6) - 1
+ };
+
+ // True if header has proper NSF file signature
+ bool valid_tag() const;
+
+ // True if file supports only PAL speed
+ bool pal_only() const { return (speed_flags & 3) == 1; }
+
+ // Clocks per second
+ double clock_rate() const;
+
+ // Clocks between calls to play routine
+ int play_period() const;
+};
+
+/* Loads NSF file into memory, then emulates CPU, RAM, and ROM.
+Non-memory accesses are routed through cpu_read() and cpu_write(). */
+class Nsf_Impl : public Gme_Loader {
+public:
+
+ // Sound chip
+ Nes_Apu* nes_apu() { return &apu; }
+
+ // Starts track, where 0 is the first
+ virtual blargg_err_t start_track( int );
+
+ // Emulates to at least time t, then begins new time frame at
+ // time t. Might emulate a few clocks extra, so after returning,
+ // time() may not be zero.
+ typedef int time_t; // clock count
+ virtual void end_frame( time_t n );
+
+// Finer control
+
+ // Header for currently loaded file
+ typedef nsf_header_t header_t;
+ header_t const& header() const { return header_; }
+
+ // Sets clocks between calls to play routine to p + 1/2 clock
+ void set_play_period( int p ) { play_period = p; }
+
+ // Time play routine will next be called
+ time_t play_time() const { return next_play; }
+
+ // Emulates to at least time t. Might emulate a few clocks extra.
+ virtual void run_until( time_t t );
+
+ // Time emulated to
+ time_t time() const { return cpu.time(); }
+
+protected:
+// Nsf_Core use
+
+ typedef int addr_t;
+
+ // Called for unmapped accesses. Default just prints info if debugging.
+ virtual void unmapped_write( addr_t, int data );
+ virtual int unmapped_read( addr_t );
+
+ // Override in derived class
+ // Bank writes and RAM at 0-$7FF and $6000-$7FFF are handled internally
+ virtual int cpu_read( addr_t a ) { return unmapped_read( a ); }
+ virtual void cpu_write( addr_t a, int data ){ unmapped_write( a, data ); }
+
+ // Reads byte as CPU would when executing code. Only works for RAM/ROM,
+ // NOT I/O like sound chips.
+ int read_code( addr_t addr ) const;
+
+// Debugger services
+
+ enum { mem_size = 0x10000 };
+
+ // CPU sits here when waiting for next call to play routine
+ enum { idle_addr = 0x5FF6 };
+
+ Nes_Cpu cpu;
+
+ // Runs CPU to at least time t and returns false, or returns true
+ // if it encounters illegal instruction (halt).
+ virtual bool run_cpu_until( time_t t );
+
+ // CPU calls through to these to access memory (except instructions)
+ int read_mem( addr_t );
+ void write_mem( addr_t, int );
+
+ // Address of play routine
+ addr_t play_addr() const { return get_addr( header_.play_addr ); }
+
+ // Same as run_until, except emulation stops for any event (routine returned,
+ // play routine called, illegal instruction).
+ void run_once( time_t );
+
+ // Make a note of event
+ virtual void special_event( const char str [] );
+
+
+// Implementation
+public:
+ Nsf_Impl();
+ ~Nsf_Impl();
+
+protected:
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual void unload();
+
+private:
+ enum { low_ram_size = 0x800 };
+ enum { fdsram_size = 0x6000 };
+ enum { sram_size = 0x2000 };
+ enum { unmapped_size= Nes_Cpu::page_size + 8 };
+ enum { fds_banks = 2 };
+ enum { bank_count = fds_banks + 8 };
+ enum { banks_addr = idle_addr };
+ enum { sram_addr = 0x6000 };
+
+ blargg_vector<byte> high_ram;
+ Rom_Data rom;
+
+ // Play routine timing
+ time_t next_play;
+ time_t play_period;
+ int play_extra;
+ int play_delay;
+ Nes_Cpu::registers_t saved_state; // of interrupted init routine
+
+ // Large objects after others
+ header_t header_;
+ Nes_Apu apu;
+ byte low_ram [low_ram_size];
+
+ // Larger RAM areas allocated separately
+ enum { fdsram_offset = sram_size + unmapped_size };
+ byte* sram() { return high_ram.begin(); }
+ byte* unmapped_code() { return &high_ram [sram_size]; }
+ byte* fdsram() { return &high_ram [fdsram_offset]; }
+ int fds_enabled() const { return header_.chip_flags & header_t::fds_mask; }
+
+ void map_memory();
+ void write_bank( int index, int data );
+ void jsr_then_stop( byte const addr [] );
+ void push_byte( int );
+ static addr_t get_addr( byte const [] );
+ static int pcm_read( void*, int );
+};
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.cpp
index 0a785e60..0aee0c67 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.cpp
@@ -1,330 +1,321 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Nsfe_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-#include <ctype.h>
-
-/* Copyright (C) 2005-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-Nsfe_Info::Nsfe_Info() { playlist_disabled = false; }
-
-Nsfe_Info::~Nsfe_Info() { }
-
-inline void Nsfe_Info::unload()
-{
- track_name_data.clear();
- track_names.clear();
- playlist.clear();
- track_times.clear();
-}
-
-// TODO: if no playlist, treat as if there is a playlist that is just 1,2,3,4,5... ?
-void Nsfe_Info::disable_playlist( bool b )
-{
- playlist_disabled = b;
- info.track_count = playlist.size();
- if ( !info.track_count || playlist_disabled )
- info.track_count = actual_track_count_;
-}
-
-int Nsfe_Info::remap_track( int track ) const
-{
- if ( !playlist_disabled && (unsigned) track < playlist.size() )
- track = playlist [track];
- return track;
-}
-
-// Read multiple strings and separate into individual strings
-static blargg_err_t read_strs( Data_Reader& in, long size, blargg_vector<char>& chars,
- blargg_vector<const char*>& strs )
-{
- RETURN_ERR( chars.resize( size + 1 ) );
- chars [size] = 0; // in case last string doesn't have terminator
- RETURN_ERR( in.read( &chars [0], size ) );
-
- RETURN_ERR( strs.resize( 128 ) );
- int count = 0;
- for ( int i = 0; i < size; i++ )
- {
- if ( (int) strs.size() <= count )
- RETURN_ERR( strs.resize( count * 2 ) );
- strs [count++] = &chars [i];
- while ( i < size && chars [i] )
- i++;
- }
-
- return strs.resize( count );
-}
-
-// Copy in to out, where out has out_max characters allocated. Truncate to
-// out_max - 1 characters.
-static void copy_str( const char* in, char* out, int out_max )
-{
- out [out_max - 1] = 0;
- strncpy( out, in, out_max - 1 );
-}
-
-struct nsfe_info_t
-{
- byte load_addr [2];
- byte init_addr [2];
- byte play_addr [2];
- byte speed_flags;
- byte chip_flags;
- byte track_count;
- byte first_track;
- byte unused [6];
-};
-
-blargg_err_t Nsfe_Info::load( Data_Reader& in, Nsf_Emu* nsf_emu )
-{
- int const nsfe_info_size = 16;
- assert( offsetof (nsfe_info_t,unused [6]) == nsfe_info_size );
-
- // check header
- byte signature [4];
- blargg_err_t err = in.read( signature, sizeof signature );
- if ( err )
- return (err == in.eof_error ? gme_wrong_file_type : err);
- if ( memcmp( signature, "NSFE", 4 ) )
- return gme_wrong_file_type;
-
- // free previous info
- track_name_data.clear();
- track_names.clear();
- playlist.clear();
- track_times.clear();
-
- // default nsf header
- static const Nsf_Emu::header_t base_header =
- {
- {'N','E','S','M','\x1A'},// tag
- 1, // version
- 1, 1, // track count, first track
- {0,0},{0,0},{0,0}, // addresses
- "","","", // strings
- {0x1A, 0x41}, // NTSC rate
- {0,0,0,0,0,0,0,0}, // banks
- {0x20, 0x4E}, // PAL rate
- 0, 0, // flags
- {0,0,0,0} // unused
- };
- Nsf_Emu::header_t& header = info;
- header = base_header;
-
- // parse tags
- int phase = 0;
- while ( phase != 3 )
- {
- // read size and tag
- byte block_header [2] [4];
- RETURN_ERR( in.read( block_header, sizeof block_header ) );
- blargg_long size = get_le32( block_header [0] );
- blargg_long tag = get_le32( block_header [1] );
-
- //dprintf( "tag: %c%c%c%c\n", char(tag), char(tag>>8), char(tag>>16), char(tag>>24) );
-
- switch ( tag )
- {
- case BLARGG_4CHAR('O','F','N','I'): {
- check( phase == 0 );
- if ( size < 8 )
- return "Corrupt file";
-
- nsfe_info_t finfo;
- finfo.track_count = 1;
- finfo.first_track = 0;
-
- RETURN_ERR( in.read( &finfo, min( size, (blargg_long) nsfe_info_size ) ) );
- if ( size > nsfe_info_size )
- RETURN_ERR( in.skip( size - nsfe_info_size ) );
- phase = 1;
- info.speed_flags = finfo.speed_flags;
- info.chip_flags = finfo.chip_flags;
- info.track_count = finfo.track_count;
- this->actual_track_count_ = finfo.track_count;
- info.first_track = finfo.first_track;
- memcpy( info.load_addr, finfo.load_addr, 2 * 3 );
- break;
- }
-
- case BLARGG_4CHAR('K','N','A','B'):
- if ( size > (int) sizeof info.banks )
- return "Corrupt file";
- RETURN_ERR( in.read( info.banks, size ) );
- break;
-
- case BLARGG_4CHAR('h','t','u','a'): {
- blargg_vector<char> chars;
- blargg_vector<const char*> strs;
- RETURN_ERR( read_strs( in, size, chars, strs ) );
- int n = strs.size();
-
- if ( n > 3 )
- copy_str( strs [3], info.dumper, sizeof info.dumper );
-
- if ( n > 2 )
- copy_str( strs [2], info.copyright, sizeof info.copyright );
-
- if ( n > 1 )
- copy_str( strs [1], info.author, sizeof info.author );
-
- if ( n > 0 )
- copy_str( strs [0], info.game, sizeof info.game );
-
- break;
- }
-
- case BLARGG_4CHAR('e','m','i','t'):
- RETURN_ERR( track_times.resize( size / 4 ) );
- RETURN_ERR( in.read( track_times.begin(), track_times.size() * 4 ) );
- break;
-
- case BLARGG_4CHAR('l','b','l','t'):
- RETURN_ERR( read_strs( in, size, track_name_data, track_names ) );
- break;
-
- case BLARGG_4CHAR('t','s','l','p'):
- RETURN_ERR( playlist.resize( size ) );
- RETURN_ERR( in.read( &playlist [0], size ) );
- break;
-
- case BLARGG_4CHAR('A','T','A','D'): {
- check( phase == 1 );
- phase = 2;
- if ( !nsf_emu )
- {
- RETURN_ERR( in.skip( size ) );
- }
- else
- {
- Subset_Reader sub( &in, size ); // limit emu to nsf data
- Remaining_Reader rem( &header, Nsf_Emu::header_size, &sub );
- RETURN_ERR( nsf_emu->load( rem ) );
- check( rem.remain() == 0 );
- }
- break;
- }
-
- case BLARGG_4CHAR('D','N','E','N'):
- check( phase == 2 );
- phase = 3;
- break;
-
- default:
- // tags that can be skipped start with a lowercase character
- check( islower( (tag >> 24) & 0xFF ) );
- RETURN_ERR( in.skip( size ) );
- break;
- }
- }
-
- return 0;
-}
-
-blargg_err_t Nsfe_Info::track_info_( track_info_t* out, int track ) const
-{
- int remapped = remap_track( track );
- if ( (unsigned) remapped < track_times.size() )
- {
- long length = (BOOST::int32_t) get_le32( track_times [remapped] );
- if ( length > 0 )
- out->length = length;
- }
- if ( (unsigned) remapped < track_names.size() )
- Gme_File::copy_field_( out->song, track_names [remapped] );
-
- GME_COPY_FIELD( info, out, game );
- GME_COPY_FIELD( info, out, author );
- GME_COPY_FIELD( info, out, copyright );
- GME_COPY_FIELD( info, out, dumper );
- return 0;
-}
-
-Nsfe_Emu::Nsfe_Emu()
-{
- loading = false;
- set_type( gme_nsfe_type );
-}
-
-Nsfe_Emu::~Nsfe_Emu() { }
-
-void Nsfe_Emu::unload()
-{
- if ( !loading )
- info.unload(); // TODO: extremely hacky!
- Nsf_Emu::unload();
-}
-
-blargg_err_t Nsfe_Emu::track_info_( track_info_t* out, int track ) const
-{
- return info.track_info_( out, track );
-}
-
-struct Nsfe_File : Gme_Info_
-{
- Nsfe_Info info;
-
- Nsfe_File() { set_type( gme_nsfe_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- RETURN_ERR( info.load( in, 0 ) );
- info.disable_playlist( false );
- set_track_count( info.info.track_count );
- return 0;
- }
-
- blargg_err_t track_info_( track_info_t* out, int track ) const
- {
- return info.track_info_( out, track );
- }
-};
-
-static Music_Emu* new_nsfe_emu () { return BLARGG_NEW Nsfe_Emu ; }
-static Music_Emu* new_nsfe_file() { return BLARGG_NEW Nsfe_File; }
-
-gme_type_t_ const gme_nsfe_type [1] = { "Nintendo NES", 0, &new_nsfe_emu, &new_nsfe_file, "NSFE", 1 };
-
-blargg_err_t Nsfe_Emu::load_( Data_Reader& in )
-{
- if ( loading )
- return Nsf_Emu::load_( in );
-
- // TODO: this hacky recursion-avoidance could have subtle problems
- loading = true;
- blargg_err_t err = info.load( in, this );
- loading = false;
- disable_playlist( false );
- return err;
-}
-
-void Nsfe_Emu::disable_playlist( bool b )
-{
- info.disable_playlist( b );
- set_track_count( info.info.track_count );
-}
-
-void Nsfe_Emu::clear_playlist_()
-{
- disable_playlist();
- Nsf_Emu::clear_playlist_();
-}
-
-blargg_err_t Nsfe_Emu::start_track_( int track )
-{
- return Nsf_Emu::start_track_( info.remap_track( track ) );
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Nsfe_Emu.h"
+
+#include "blargg_endian.h"
+#include <ctype.h>
+
+/* Copyright (C) 2005-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Nsfe_Info::Nsfe_Info() { playlist_disabled = false; }
+
+Nsfe_Info::~Nsfe_Info() { }
+
+inline void Nsfe_Info::unload()
+{
+ track_name_data.clear();
+ track_names.clear();
+ playlist.clear();
+ track_times.clear();
+}
+
+// TODO: if no playlist, treat as if there is a playlist that is just 1,2,3,4,5... ?
+void Nsfe_Info::disable_playlist( bool b )
+{
+ playlist_disabled = b;
+ info.track_count = playlist.size();
+ if ( !info.track_count || playlist_disabled )
+ info.track_count = actual_track_count_;
+}
+
+int Nsfe_Info::remap_track( int track ) const
+{
+ if ( !playlist_disabled && (unsigned) track < playlist.size() )
+ track = playlist [track];
+ return track;
+}
+
+// Read multiple strings and separate into individual strings
+static blargg_err_t read_strs( Data_Reader& in, int size, blargg_vector<char>& chars,
+ blargg_vector<const char*>& strs )
+{
+ RETURN_ERR( chars.resize( size + 1 ) );
+ chars [size] = 0; // in case last string doesn't have terminator
+ RETURN_ERR( in.read( &chars [0], size ) );
+
+ RETURN_ERR( strs.resize( 128 ) );
+ int count = 0;
+ for ( int i = 0; i < size; i++ )
+ {
+ if ( (int) strs.size() <= count )
+ RETURN_ERR( strs.resize( count * 2 ) );
+ strs [count++] = &chars [i];
+ while ( i < size && chars [i] )
+ i++;
+ }
+
+ return strs.resize( count );
+}
+
+// Copy in to out, where out has out_max characters allocated. Truncate to
+// out_max - 1 characters.
+static void copy_str( const char in [], char out [], int out_max )
+{
+ out [out_max - 1] = 0;
+ strncpy( out, in, out_max - 1 );
+}
+
+struct nsfe_info_t
+{
+ byte load_addr [2];
+ byte init_addr [2];
+ byte play_addr [2];
+ byte speed_flags;
+ byte chip_flags;
+ byte track_count;
+ byte first_track;
+ byte unused [6];
+};
+
+blargg_err_t Nsfe_Info::load( Data_Reader& in, Nsfe_Emu* nsf_emu )
+{
+ int const nsfe_info_size = 16;
+ assert( offsetof (nsfe_info_t,unused [6]) == nsfe_info_size );
+
+ // check header
+ byte signature [4];
+ blargg_err_t err = in.read( signature, sizeof signature );
+ if ( err )
+ return (blargg_is_err_type( err, blargg_err_file_eof ) ? blargg_err_file_type : err);
+ if ( memcmp( signature, "NSFE", 4 ) )
+ return blargg_err_file_type;
+
+ // free previous info
+ track_name_data.clear();
+ track_names.clear();
+ playlist.clear();
+ track_times.clear();
+
+ // default nsf header
+ static const Nsf_Emu::header_t base_header =
+ {
+ {'N','E','S','M','\x1A'},// tag
+ 1, // version
+ 1, 1, // track count, first track
+ {0,0},{0,0},{0,0}, // addresses
+ "","","", // strings
+ {0x1A, 0x41}, // NTSC rate
+ {0,0,0,0,0,0,0,0}, // banks
+ {0x20, 0x4E}, // PAL rate
+ 0, 0, // flags
+ {0,0,0,0} // unused
+ };
+ Nsf_Emu::header_t& header = info;
+ header = base_header;
+
+ // parse tags
+ int phase = 0;
+ while ( phase != 3 )
+ {
+ // read size and tag
+ byte block_header [2] [4];
+ RETURN_ERR( in.read( block_header, sizeof block_header ) );
+ int size = get_le32( block_header [0] );
+ int tag = get_le32( block_header [1] );
+
+ //dprintf( "tag: %c%c%c%c\n", char(tag), char(tag>>8), char(tag>>16), char(tag>>24) );
+
+ switch ( tag )
+ {
+ case BLARGG_4CHAR('O','F','N','I'): {
+ check( phase == 0 );
+ if ( size < 8 )
+ return blargg_err_file_corrupt;
+
+ nsfe_info_t finfo;
+ finfo.track_count = 1;
+ finfo.first_track = 0;
+
+ RETURN_ERR( in.read( &finfo, min( size, (int) nsfe_info_size ) ) );
+ if ( size > nsfe_info_size )
+ RETURN_ERR( in.skip( size - nsfe_info_size ) );
+ phase = 1;
+ info.speed_flags = finfo.speed_flags;
+ info.chip_flags = finfo.chip_flags;
+ info.track_count = finfo.track_count;
+ this->actual_track_count_ = finfo.track_count;
+ info.first_track = finfo.first_track;
+ memcpy( info.load_addr, finfo.load_addr, 2 * 3 );
+ break;
+ }
+
+ case BLARGG_4CHAR('K','N','A','B'):
+ if ( size > (int) sizeof info.banks )
+ return blargg_err_file_corrupt;
+ RETURN_ERR( in.read( info.banks, size ) );
+ break;
+
+ case BLARGG_4CHAR('h','t','u','a'): {
+ blargg_vector<char> chars;
+ blargg_vector<const char*> strs;
+ RETURN_ERR( read_strs( in, size, chars, strs ) );
+ int n = strs.size();
+
+ if ( n > 3 )
+ copy_str( strs [3], info.dumper, sizeof info.dumper );
+
+ if ( n > 2 )
+ copy_str( strs [2], info.copyright, sizeof info.copyright );
+
+ if ( n > 1 )
+ copy_str( strs [1], info.author, sizeof info.author );
+
+ if ( n > 0 )
+ copy_str( strs [0], info.game, sizeof info.game );
+
+ break;
+ }
+
+ case BLARGG_4CHAR('e','m','i','t'):
+ RETURN_ERR( track_times.resize( size / 4 ) );
+ RETURN_ERR( in.read( track_times.begin(), track_times.size() * 4 ) );
+ break;
+
+ case BLARGG_4CHAR('l','b','l','t'):
+ RETURN_ERR( read_strs( in, size, track_name_data, track_names ) );
+ break;
+
+ case BLARGG_4CHAR('t','s','l','p'):
+ RETURN_ERR( playlist.resize( size ) );
+ RETURN_ERR( in.read( &playlist [0], size ) );
+ break;
+
+ case BLARGG_4CHAR('A','T','A','D'): {
+ check( phase == 1 );
+ phase = 2;
+ if ( !nsf_emu )
+ {
+ RETURN_ERR( in.skip( size ) );
+ }
+ else
+ {
+ Subset_Reader sub( &in, size ); // limit emu to nsf data
+ Remaining_Reader rem( &header, header.size, &sub );
+ RETURN_ERR( nsf_emu->Nsf_Emu::load_( rem ) );
+ check( rem.remain() == 0 );
+ }
+ break;
+ }
+
+ case BLARGG_4CHAR('D','N','E','N'):
+ check( phase == 2 );
+ phase = 3;
+ break;
+
+ default:
+ // tags that can be skipped start with a lowercase character
+ check( islower( (tag >> 24) & 0xFF ) );
+ RETURN_ERR( in.skip( size ) );
+ break;
+ }
+ }
+
+ return blargg_ok;
+}
+
+blargg_err_t Nsfe_Info::track_info_( track_info_t* out, int track ) const
+{
+ int remapped = remap_track( track );
+ if ( (unsigned) remapped < track_times.size() )
+ {
+ int length = (BOOST::int32_t) get_le32( track_times [remapped] );
+ if ( length > 0 )
+ out->length = length;
+ }
+ if ( (unsigned) remapped < track_names.size() )
+ Gme_File::copy_field_( out->song, track_names [remapped] );
+
+ GME_COPY_FIELD( info, out, game );
+ GME_COPY_FIELD( info, out, author );
+ GME_COPY_FIELD( info, out, copyright );
+ GME_COPY_FIELD( info, out, dumper );
+ return blargg_ok;
+}
+
+Nsfe_Emu::Nsfe_Emu()
+{
+ set_type( gme_nsfe_type );
+}
+
+Nsfe_Emu::~Nsfe_Emu() { }
+
+void Nsfe_Emu::unload()
+{
+ info.unload();
+ Nsf_Emu::unload();
+}
+
+blargg_err_t Nsfe_Emu::track_info_( track_info_t* out, int track ) const
+{
+ return info.track_info_( out, track );
+}
+
+struct Nsfe_File : Gme_Info_
+{
+ Nsfe_Info info;
+
+ Nsfe_File() { set_type( gme_nsfe_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ RETURN_ERR( info.load( in, 0 ) );
+ info.disable_playlist( false );
+ set_track_count( info.info.track_count );
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int track ) const
+ {
+ return info.track_info_( out, track );
+ }
+};
+
+static Music_Emu* new_nsfe_emu () { return BLARGG_NEW Nsfe_Emu ; }
+static Music_Emu* new_nsfe_file() { return BLARGG_NEW Nsfe_File; }
+
+gme_type_t_ const gme_nsfe_type [1] = {{ "Nintendo NES", 0, &new_nsfe_emu, &new_nsfe_file, "NSFE", 1 }};
+
+blargg_err_t Nsfe_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( info.load( in, this ) );
+ disable_playlist_( false );
+ return blargg_ok;
+}
+
+void Nsfe_Emu::disable_playlist_( bool b )
+{
+ info.disable_playlist( b );
+ set_track_count( info.info.track_count );
+}
+
+void Nsfe_Emu::clear_playlist_()
+{
+ disable_playlist_( true );
+ Nsf_Emu::clear_playlist_();
+}
+
+blargg_err_t Nsfe_Emu::start_track_( int track )
+{
+ return Nsf_Emu::start_track_( info.remap_track( track ) );
+}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.h
index 561c3be0..3edf3bd1 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Nsfe_Emu.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Nsfe_Emu.h
@@ -1,16 +1,17 @@
// Nintendo NES/Famicom NSFE music file emulator
-// Game_Music_Emu 0.5.2
+// Game_Music_Emu 0.6-pre
#ifndef NSFE_EMU_H
#define NSFE_EMU_H
#include "blargg_common.h"
#include "Nsf_Emu.h"
+class Nsfe_Emu;
// Allows reading info from NSFE file without creating emulator
class Nsfe_Info {
public:
- blargg_err_t load( Data_Reader&, Nsf_Emu* );
+ blargg_err_t load( Data_Reader&, Nsfe_Emu* );
struct info_t : Nsf_Emu::header_t
{
@@ -28,8 +29,11 @@ public:
void unload();
+// Implementation
+public:
Nsfe_Info();
~Nsfe_Info();
+ BLARGG_DISABLE_NOTHROW
private:
blargg_vector<char> track_name_data;
blargg_vector<const char*> track_names;
@@ -43,26 +47,26 @@ class Nsfe_Emu : public Nsf_Emu {
public:
static gme_type_t static_type() { return gme_nsfe_type; }
-public:
- // deprecated
struct header_t { char tag [4]; };
- Music_Emu::load;
- blargg_err_t load( header_t const& h, Data_Reader& in ) // use Remaining_Reader
- { return load_remaining_( &h, sizeof h, in ); }
- void disable_playlist( bool = true ); // use clear_playlist()
+
+// Implementation
public:
Nsfe_Emu();
~Nsfe_Emu();
+ virtual void unload();
+
protected:
- blargg_err_t load_( Data_Reader& );
- blargg_err_t track_info_( track_info_t*, int track ) const;
- blargg_err_t start_track_( int );
- void unload();
- void clear_playlist_();
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t start_track_( int );
+ virtual void clear_playlist_();
+
private:
Nsfe_Info info;
- bool loading;
+
+ void disable_playlist_( bool b );
+ friend class Nsfe_Info;
};
#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.cpp
new file mode 100644
index 00000000..33f5bd46
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.cpp
@@ -0,0 +1,270 @@
+#include "Opl_Apu.h"
+
+#include "blargg_source.h"
+
+#include "ym2413.h"
+#include "fmopl.h"
+
+Opl_Apu::Opl_Apu() { opl = 0; opl_memory = 0; }
+
+blargg_err_t Opl_Apu::init( long clock, long rate, blip_time_t period, type_t type )
+{
+ type_ = type;
+ clock_ = clock;
+ rate_ = rate;
+ period_ = period;
+ set_output( 0, 0 );
+ volume( 1.0 );
+ switch (type)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ opl = ym2413_init( clock, rate, 0 );
+ break;
+
+ case type_vrc7:
+ opl = ym2413_init( clock, rate, 1 );
+ break;
+
+ case type_opl:
+ opl = ym3526_init( clock, rate );
+ break;
+
+ case type_msxaudio:
+ //logfile = fopen("c:\\temp\\msxaudio.log", "wb");
+ opl = y8950_init( clock, rate );
+ opl_memory = malloc( 32768 );
+ y8950_set_delta_t_memory( opl, opl_memory, 32768 );
+ break;
+
+ case type_opl2:
+ opl = ym3812_init( clock, rate );
+ break;
+ }
+ reset();
+ return 0;
+}
+
+Opl_Apu::~Opl_Apu()
+{
+ if (opl)
+ {
+ switch (type_)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ case type_vrc7:
+ ym2413_shutdown( opl );
+ break;
+
+ case type_opl:
+ ym3526_shutdown( opl );
+ break;
+
+ case type_msxaudio:
+ y8950_shutdown( opl );
+ free( opl_memory );
+ //fclose( logfile );
+ break;
+
+ case type_opl2:
+ ym3812_shutdown( opl );
+ break;
+ }
+ }
+}
+
+void Opl_Apu::reset()
+{
+ addr = 0;
+ next_time = 0;
+ last_amp = 0;
+
+ switch (type_)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ case type_vrc7:
+ ym2413_reset_chip( opl );
+ break;
+
+ case type_opl:
+ ym3526_reset_chip( opl );
+ break;
+
+ case type_msxaudio:
+ y8950_reset_chip( opl );
+ break;
+
+ case type_opl2:
+ ym3812_reset_chip( opl );
+ break;
+ }
+}
+
+void Opl_Apu::write_data( blip_time_t time, int data )
+{
+ run_until( time );
+ switch (type_)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ case type_vrc7:
+ ym2413_write( opl, 0, addr );
+ ym2413_write( opl, 1, data );
+ break;
+
+ case type_opl:
+ ym3526_write( opl, 0, addr );
+ ym3526_write( opl, 1, data );
+ break;
+
+ case type_msxaudio:
+ /*if ( addr >= 7 && addr <= 7 + 11 )
+ {
+ unsigned char temp [2] = { addr - 7, data };
+ fwrite( &temp, 1, 2, logfile );
+ }*/
+ y8950_write( opl, 0, addr );
+ y8950_write( opl, 1, data );
+ break;
+
+ case type_opl2:
+ ym3812_write( opl, 0, addr );
+ ym3812_write( opl, 1, data );
+ break;
+ }
+}
+
+int Opl_Apu::read( blip_time_t time, int port )
+{
+ run_until( time );
+ switch (type_)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ case type_vrc7:
+ return ym2413_read( opl, port );
+
+ case type_opl:
+ return ym3526_read( opl, port );
+
+ case type_msxaudio:
+ {
+ int ret = y8950_read( opl, port );
+ /*unsigned char temp [2] = { port + 0x80, ret };
+ fwrite( &temp, 1, 2, logfile );*/
+ return ret;
+ }
+
+ case type_opl2:
+ return ym3812_read( opl, port );
+ }
+
+ return 0;
+}
+
+void Opl_Apu::end_frame( blip_time_t time )
+{
+ run_until( time );
+ next_time -= time;
+
+ if ( output_ )
+ output_->set_modified();
+}
+
+void Opl_Apu::run_until( blip_time_t end_time )
+{
+ if ( end_time > next_time )
+ {
+ blip_time_t time_delta = end_time - next_time;
+ blip_time_t time = next_time;
+ unsigned count = time_delta / period_ + 1;
+ switch (type_)
+ {
+ case type_opll:
+ case type_msxmusic:
+ case type_smsfmunit:
+ case type_vrc7:
+ {
+ SAMP bufMO[ 1024 ];
+ SAMP bufRO[ 1024 ];
+ SAMP * buffers[2] = { bufMO, bufRO };
+
+ while ( count > 0 )
+ {
+ unsigned todo = count;
+ if ( todo > 1024 ) todo = 1024;
+ ym2413_update_one( opl, buffers, todo );
+
+ if ( output_ )
+ {
+ int last_amp = this->last_amp;
+ for ( unsigned i = 0; i < todo; i++ )
+ {
+ int amp = bufMO [i] + bufRO [i];
+ int delta = amp - last_amp;
+ if ( delta )
+ {
+ last_amp = amp;
+ synth.offset_inline( time, delta, output_ );
+ }
+ time += period_;
+ }
+ this->last_amp = last_amp;
+ }
+ else time += period_ * todo;
+
+ count -= todo;
+ }
+ }
+ break;
+
+ case type_opl:
+ case type_msxaudio:
+ case type_opl2:
+ {
+ OPLSAMPLE buffer[ 1024 ];
+
+ while ( count > 0 )
+ {
+ unsigned todo = count;
+ if ( todo > 1024 ) todo = 1024;
+ switch (type_)
+ {
+ case type_opl: ym3526_update_one( opl, buffer, todo ); break;
+ case type_msxaudio: y8950_update_one( opl, buffer, todo ); break;
+ case type_opl2: ym3812_update_one( opl, buffer, todo ); break;
+ }
+
+ if ( output_ )
+ {
+ int last_amp = this->last_amp;
+ for ( unsigned i = 0; i < todo; i++ )
+ {
+ int amp = buffer [i];
+ int delta = amp - last_amp;
+ if ( delta )
+ {
+ last_amp = amp;
+ synth.offset_inline( time, delta, output_ );
+ }
+ time += period_;
+ }
+ this->last_amp = last_amp;
+ }
+ else time += period_ * todo;
+
+ count -= todo;
+ }
+ }
+ break;
+ }
+ next_time = time;
+ }
+} \ No newline at end of file
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.h
new file mode 100644
index 00000000..86d73d74
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Opl_Apu.h
@@ -0,0 +1,63 @@
+#ifndef OPL_APU_H
+#define OPL_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+#include <stdio.h>
+
+class Opl_Apu {
+public:
+ Opl_Apu();
+ ~Opl_Apu();
+
+ enum type_t { type_opll = 0x10, type_msxmusic = 0x11, type_smsfmunit = 0x12,
+ type_vrc7 = 0x13, type_opl = 0x20, type_msxaudio = 0x21, type_opl2 = 0x22 };
+ blargg_err_t init( long clock, long rate, blip_time_t period, type_t );
+
+ void reset();
+ void volume( double v ) { synth.volume( 1.0 / (4096 * 6) * v ); }
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+ enum { osc_count = 1 };
+ void osc_output( int index, Blip_Buffer* );
+ void set_output( int i, Blip_Buffer* buf, Blip_Buffer* = NULL, Blip_Buffer* = NULL ) { osc_output( 0, buf ); }
+ void end_frame( blip_time_t );
+
+ void write_addr( int data ) { addr = data; }
+ void write_data( blip_time_t, int data );
+
+ int read( blip_time_t, int port );
+
+ static bool supported() { return true; }
+
+private:
+ // noncopyable
+ Opl_Apu( const Opl_Apu& );
+ Opl_Apu& operator = ( const Opl_Apu& );
+
+ Blip_Buffer* output_;
+ type_t type_;
+ void* opl;
+ void* opl_memory;
+ //FILE* logfile;
+ unsigned char regs[ 0x100 ];
+ blip_time_t next_time;
+ int last_amp;
+ int addr;
+
+ long clock_;
+ long rate_;
+ blip_time_t period_;
+
+ Blip_Synth_Fast synth;
+
+ void run_until( blip_time_t );
+};
+
+inline void Opl_Apu::osc_output( int i, Blip_Buffer* buf )
+{
+ assert( (unsigned) i < osc_count );
+ output_ = buf;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Resampler.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.cpp
new file mode 100644
index 00000000..96bb73e9
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.cpp
@@ -0,0 +1,79 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Resampler.h"
+
+/* Copyright (C) 2004-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Resampler::Resampler()
+{
+ write_pos = 0;
+ rate_ = 0;
+}
+
+Resampler::~Resampler() { }
+
+void Resampler::clear()
+{
+ write_pos = 0;
+ clear_();
+}
+
+inline int Resampler::resample_wrapper( sample_t out [], int* out_size,
+ sample_t const in [], int in_size )
+{
+ assert( rate() );
+
+ sample_t* out_ = out;
+ int result = resample_( &out_, out + *out_size, in, in_size ) - in;
+ assert( out_ <= out + *out_size );
+ assert( result <= in_size );
+
+ *out_size = out_ - out;
+ return result;
+}
+
+int Resampler::resample( sample_t out [], int out_size, sample_t const in [], int* in_size )
+{
+ *in_size = resample_wrapper( out, &out_size, in, *in_size );
+ return out_size;
+}
+
+
+//// Buffering
+
+blargg_err_t Resampler::resize_buffer( int new_size )
+{
+ RETURN_ERR( buf.resize( new_size ) );
+ clear();
+ return blargg_ok;
+}
+
+int Resampler::skip_input( int count )
+{
+ write_pos -= count;
+ if ( write_pos < 0 ) // occurs when downsampling
+ {
+ count += write_pos;
+ write_pos = 0;
+ }
+ memmove( buf.begin(), &buf [count], write_pos * sizeof buf [0] );
+ return count;
+}
+
+int Resampler::read( sample_t out [], int out_size )
+{
+ if ( out_size )
+ skip_input( resample_wrapper( out, &out_size, buf.begin(), write_pos ) );
+ return out_size;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h
new file mode 100644
index 00000000..c8f96f72
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Resampler.h
@@ -0,0 +1,110 @@
+// Common interface for resamplers
+
+// Game_Music_Emu 0.6-pre
+#ifndef RESAMPLER_H
+#define RESAMPLER_H
+
+#include "blargg_common.h"
+
+class Resampler {
+public:
+
+ virtual ~Resampler();
+
+ // Sets input/output resampling ratio
+ blargg_err_t set_rate( double );
+
+ // Current input/output ratio
+ double rate() const { return rate_; }
+
+ // Samples are 16-bit signed
+ typedef short sample_t;
+
+// One of two different buffering schemes can be used, as decided by the caller:
+
+// External buffering (caller provides input buffer)
+
+ // Resamples in to at most n out samples and returns number of samples actually
+ // written. Sets *in_size to number of input samples that aren't needed anymore
+ // and should be removed from input.
+ int resample( sample_t out [], int n, sample_t const in [], int* in_size );
+
+// Internal buffering (resampler manages buffer)
+
+ // Resizes input buffer to n samples, then clears it
+ blargg_err_t resize_buffer( int n );
+
+ // Clears input buffer
+ void clear();
+
+ // Writes at most n samples to input buffer and returns number actually written.
+ // Result will be less than n if there isn't enough free space in buffer.
+ int write( sample_t const in [], int n );
+
+ // Number of input samples in buffer
+ int written() const { return write_pos; }
+
+ // Removes first n input samples from buffer, fewer if there aren't that many.
+ // Returns number of samples actually removed.
+ int skip_input( int n );
+
+ // Resamples input to at most n output samples. Returns number of samples
+ // actually written to out. Result will be less than n if there aren't
+ // enough input samples in buffer.
+ int read( sample_t out [], int n );
+
+// Direct writing to input buffer, instead of using write( in, n ) above
+
+ // Pointer to place to write input samples
+ sample_t* buffer() { return &buf [write_pos]; }
+
+ // Number of samples that can be written to buffer()
+ int buffer_free() const { return buf.size() - write_pos; }
+
+ // Notifies resampler that n input samples have been written to buffer().
+ // N must not be greater than buffer_free().
+ void write( int n );
+
+// Derived interface
+protected:
+ virtual blargg_err_t set_rate_( double rate ) BLARGG_PURE( ; )
+
+ virtual void clear_() { }
+
+ // Resample as many available in samples as will fit within out_size and
+ // return pointer past last input sample read and set *out just past
+ // the last output sample.
+ virtual sample_t const* resample_( sample_t** out, sample_t const* out_end,
+ sample_t const in [], int in_size ) BLARGG_PURE( { return in; } )
+
+// Implementation
+public:
+ Resampler();
+
+private:
+ blargg_vector<sample_t> buf;
+ int write_pos;
+ double rate_;
+
+ int resample_wrapper( sample_t out [], int* out_size,
+ sample_t const in [], int in_size );
+};
+
+inline void Resampler::write( int count )
+{
+ write_pos += count;
+ assert( (unsigned) write_pos <= buf.size() );
+}
+
+inline blargg_err_t Resampler::set_rate_( double r )
+{
+ rate_ = r;
+ return blargg_ok;
+}
+
+inline blargg_err_t Resampler::set_rate( double r )
+{
+ return set_rate_( r );
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.cpp
new file mode 100644
index 00000000..55d53d33
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.cpp
@@ -0,0 +1,99 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Rom_Data.h"
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void Rom_Data::clear()
+{
+ file_size_ = 0;
+ rom_addr = 0;
+ mask = 0;
+ rom.clear();
+}
+
+Rom_Data::Rom_Data( int page_size ) :
+ pad_size( page_size + pad_extra )
+{
+ // page_size should be power of 2
+ check( (page_size & (page_size - 1)) == 0 );
+
+ clear();
+}
+
+Rom_Data::~Rom_Data()
+{ }
+
+// Reads file into array, placing file_offset bytes of padding before the beginning, and pad_size after the end
+blargg_err_t Rom_Data::load_( Data_Reader& in, int header_size, int file_offset )
+{
+ clear();
+ file_size_ = in.remain();
+ if ( file_size_ <= header_size ) // <= because there must be data after header
+ return blargg_err_file_type;
+
+ RETURN_ERR( rom.resize( file_offset + file_size_ + pad_size ) );
+
+ return in.read( rom.begin() + file_offset, file_size_ );
+}
+
+blargg_err_t Rom_Data::load( Data_Reader& in, int header_size,
+ void* header_out, int fill )
+{
+ int file_offset = pad_size - header_size;
+ blargg_err_t err = load_( in, header_size, file_offset );
+ if ( err )
+ {
+ clear();
+ return err;
+ }
+
+ file_size_ -= header_size;
+ memcpy( header_out, &rom [file_offset], header_size );
+
+ memset( rom.begin() , fill, pad_size );
+ memset( rom.end() - pad_size, fill, pad_size );
+
+ return blargg_ok;
+}
+
+void Rom_Data::set_addr( int addr )
+{
+ int const page_size = pad_size - pad_extra;
+
+ // Minimum size that contains all bytes and is a multiple of page_size
+ int const size = (addr + file_size_ + page_size - 1) / page_size * page_size;
+
+ // Find lowest power of 2 that is >= size
+ int power2 = 1;
+ while ( power2 < size )
+ power2 *= 2;
+
+ mask = power2 - 1;
+
+ // Address of first byte of ROM (possibly negative)
+ rom_addr = addr - page_size - pad_extra;
+
+ if ( rom.resize( size - rom_addr + pad_extra ) ) { } // OK if shrink fails
+}
+
+byte* Rom_Data::at_addr( int addr )
+{
+ int offset = mask_addr( addr ) - rom_addr;
+
+ if ( (unsigned) offset > (unsigned) (rom.size() - pad_size) )
+ offset = 0; // unmapped
+
+ return &rom [offset];
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.h b/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.h
new file mode 100644
index 00000000..e1c2ef32
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Rom_Data.h
@@ -0,0 +1,94 @@
+// Manages ROM data loaded from file in an efficient manner
+
+// Game_Music_Emu 0.6-pre
+#ifndef ROM_DATA_H
+#define ROM_DATA_H
+
+#include "blargg_common.h"
+#include "Data_Reader.h"
+
+/* Loads a ROM file into memory and allows access to it in page-sized chunks.
+
+* ROM file consists of header followed by ROM data. Instead of storing the entire
+ROM contents, the file only stores the occupied portion, with the bytes before and
+after that cleared to some value. The size and format of the header is up to the
+caller, as is the starting address of the ROM data following it. File loading is
+performed with a single read, rather than two or more that might otherwise be
+required.
+
+* Once ROM data is loaded and its address specified, a pointer to any "page" can
+be obtained. ROM data is mirrored using smallest power of 2 that contains it.
+Addresses not aligned to pages can also be used, but this might cause unexpected
+results.
+
+Example with file data of size 0x0C put at address 0x0F, with page size of 8:
+
+---------------0123456789AB--------------------0123456789AB---------...
+^ ^ ^ ^ ^ ^ ^ ^ ^
+0 0x08 0x10 0x18 0x20 0x28 0x30 0x38 0x40
+
+at_addr(0x00) = pointer to 8 bytes of fill.
+at_addr(0x08) = pointer to 7 bytes of fill, followed by first byte of file.
+at_addr(0x10) = pointer to next 8 bytes of file.
+at_addr(0x18) = pointer to last 3 bytes of file, followed by 5 bytes of fill.
+at_addr(0x20) = pointer to 8 bytes of fill.
+at_addr(0x28) = pointer to 7 bytes of fill, followed by first byte of file.
+etc. */
+
+class Rom_Data {
+ enum { pad_extra = 8 };
+public:
+ typedef unsigned char byte;
+
+ // Page_size should be a power of 2
+ Rom_Data( int page_size );
+
+ // Loads file into memory, then copies header to *header_out and fills
+ // unmapped bank and file data padding with fill. Returns blargg_err_file_type
+ // if in.remain() <= header_size.
+ blargg_err_t load( Data_Reader& in, int header_size, void* header_out, int fill );
+
+ // Below, "file data" refers to data AFTER the header
+
+ // Size of file data
+ int file_size() const { return file_size_; }
+
+ // Pointer to beginning of file data
+ byte * begin() { return rom.begin() + pad_size; }
+ byte const* begin() const { return rom.begin() + pad_size; }
+
+ // Pointer to unmapped page cleared with fill value
+ byte* unmapped() { return rom.begin(); }
+
+ // Sets address that file data will start at. Must be set before using following
+ // functions, and cannot be set more than once.
+ void set_addr( int addr );
+
+ // Address of first empty page (file size + addr rounded up to multiple of page_size)
+ int size() const { return rom.size() - pad_extra + rom_addr; }
+
+ // Masks address to nearest power of two greater than size()
+ int mask_addr( int addr ) const { return addr & mask; }
+
+ // Pointer to page beginning at addr, or unmapped() if outside data.
+ // Mirrored using mask_addr().
+ byte* at_addr( int addr );
+
+ // Frees memory
+ void clear();
+
+// Implementation
+public:
+ ~Rom_Data();
+
+protected:
+ blargg_vector<byte> rom;
+ int mask;
+ int rom_addr;
+ int const pad_size;
+ int file_size_;
+
+ blargg_err_t load_( Data_Reader& in, int header_size, int file_offset );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/SPC_Filter.cpp b/plugins/gme/game-music-emu-0.6pre/gme/SPC_Filter.cpp
new file mode 100644
index 00000000..4e5d8f60
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/SPC_Filter.cpp
@@ -0,0 +1,81 @@
+// snes_spc 0.9.0. http://www.slack.net/~ant/
+
+#include "Spc_Filter.h"
+
+/* Copyright (C) 2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); }
+
+SPC_Filter::SPC_Filter()
+{
+ enabled = true;
+ gain = gain_unit;
+ bass = bass_norm;
+ clear();
+}
+
+void SPC_Filter::run( short io [], int count )
+{
+ require( (count & 1) == 0 ); // must be even
+
+ int const gain = this->gain;
+ if ( enabled )
+ {
+ int const bass = this->bass;
+ chan_t* c = &ch [2];
+ do
+ {
+ // cache in registers
+ int sum = (--c)->sum;
+ int pp1 = c->pp1;
+ int p1 = c->p1;
+
+ for ( int i = 0; i < count; i += 2 )
+ {
+ // Low-pass filter (two point FIR with coeffs 0.25, 0.75)
+ int f = io [i] + p1;
+ p1 = io [i] * 3;
+
+ // High-pass filter ("leaky integrator")
+ int delta = f - pp1;
+ pp1 = f;
+ int s = sum >> (gain_bits + 2);
+ sum += (delta * gain) - (sum >> bass);
+
+ // Clamp to 16 bits
+ if ( (short) s != s )
+ s = (s >> 31) ^ 0x7FFF;
+
+ io [i] = (short) s;
+ }
+
+ c->p1 = p1;
+ c->pp1 = pp1;
+ c->sum = sum;
+ ++io;
+ }
+ while ( c != ch );
+ }
+ else if ( gain != gain_unit )
+ {
+ short* const end = io + count;
+ while ( io < end )
+ {
+ int s = (*io * gain) >> gain_bits;
+ if ( (short) s != s )
+ s = (s >> 31) ^ 0x7FFF;
+ *io++ = (short) s;
+ }
+ }
+}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.cpp
index 23fa9072..23633dc4 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Apu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.cpp
@@ -1,10 +1,8 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
#include "Sap_Apu.h"
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This
@@ -19,9 +17,9 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
int const max_frequency = 12000; // pure waves above this frequency are silenced
-static void gen_poly( blargg_ulong mask, int count, byte* out )
+static void gen_poly( unsigned mask, int count, byte out [] )
{
- blargg_ulong n = 1;
+ unsigned n = 1;
do
{
int bits = 0;
@@ -30,7 +28,7 @@ static void gen_poly( blargg_ulong mask, int count, byte* out )
{
// implemented using "Galios configuration"
bits |= (n & 1) << b;
- n = (n >> 1) ^ (mask & -(n & 1));
+ n = (n >> 1) ^ (mask * (n & 1));
}
while ( b++ < 7 );
*out++ = bits;
@@ -40,16 +38,16 @@ static void gen_poly( blargg_ulong mask, int count, byte* out )
// poly5
int const poly5_len = (1 << 5) - 1;
-blargg_ulong const poly5_mask = (1UL << poly5_len) - 1;
-blargg_ulong const poly5 = 0x167C6EA1;
+unsigned const poly5_mask = (1U << poly5_len) - 1;
+unsigned const poly5 = 0x167C6EA1;
-inline blargg_ulong run_poly5( blargg_ulong in, int shift )
+inline unsigned run_poly5( unsigned in, int shift )
{
return (in << shift & poly5_mask) | (in >> (poly5_len - shift));
}
#define POLY_MASK( width, tap1, tap2 ) \
- ((1UL << (width - 1 - tap1)) | (1UL << (width - 1 - tap2)))
+ ((1U << (width - 1 - tap1)) | (1U << (width - 1 - tap2)))
Sap_Apu_Impl::Sap_Apu_Impl()
{
@@ -61,20 +59,25 @@ Sap_Apu_Impl::Sap_Apu_Impl()
{
byte poly5 [4];
gen_poly( POLY_MASK( 5, 2, 0 ), sizeof poly5, poly5 );
- blargg_ulong n = poly5 [3] * 0x1000000L + poly5 [2] * 0x10000L +
- poly5 [1] * 0x100L + poly5 [0];
- blargg_ulong rev = n & 1;
+ unsigned n = poly5 [3] * 0x1000000 + poly5 [2] * 0x10000 +
+ poly5 [1] * 0x100 + poly5 [0];
+ unsigned rev = n & 1;
for ( int i = 1; i < poly5_len; i++ )
rev |= (n >> i & 1) << (poly5_len - i);
dprintf( "poly5: 0x%08lX\n", rev );
}
}
+void Sap_Apu::set_output( Blip_Buffer* b )
+{
+ for ( int i = 0; i < osc_count; ++i )
+ set_output( i, b );
+}
+
Sap_Apu::Sap_Apu()
{
- impl = 0;
- for ( int i = 0; i < osc_count; i++ )
- osc_output( i, 0 );
+ impl = NULL;
+ set_output( NULL );
}
void Sap_Apu::reset( Sap_Apu_Impl* new_impl )
@@ -102,14 +105,14 @@ inline void Sap_Apu::calc_periods()
osc_t* const osc = &oscs [i];
int const osc_reload = osc->regs [0]; // cache
- blargg_long period = (osc_reload + 1) * divider;
+ int period = (osc_reload + 1) * divider;
static byte const fast_bits [osc_count] = { 1 << 6, 1 << 4, 1 << 5, 1 << 3 };
if ( this->control & fast_bits [i] )
{
period = osc_reload + 4;
if ( i & 1 )
{
- period = osc_reload * 0x100L + osc [-1].regs [0] + 7;
+ period = osc_reload * 0x100 + osc [-1].regs [0] + 7;
if ( !(this->control & fast_bits [i - 1]) )
period = (period - 6) * divider;
@@ -146,8 +149,6 @@ void Sap_Apu::run_until( blip_time_t end_time )
Blip_Buffer* output = osc->output;
if ( output )
{
- output->set_modified();
-
int const osc_control = osc->regs [1]; // cache
int volume = (osc_control & 0x0F) * 2;
if ( !volume || osc_control & 0x10 || // silent, DAC mode, or inaudible frequency
@@ -160,6 +161,7 @@ void Sap_Apu::run_until( blip_time_t end_time )
if ( delta )
{
osc->last_amp = volume;
+ output->set_modified();
impl->synth.offset( last_time, delta, output );
}
@@ -208,7 +210,7 @@ void Sap_Apu::run_until( blip_time_t end_time )
poly_inc -= poly_len; // allows more optimized inner loop below
// square/poly5 wave
- blargg_ulong wave = poly5;
+ unsigned wave = poly5;
check( poly5 & 1 ); // low bit is set for pure wave
int poly5_inc = 0;
if ( !(osc_control & 0x80) )
@@ -217,6 +219,8 @@ void Sap_Apu::run_until( blip_time_t end_time )
poly5_inc = period % poly5_len;
}
+ output->set_modified();
+
// Run wave and high pass interleved with each catching up to the other.
// Disabled high pass has no performance effect since inner wave loop
// makes no compromise for high pass, and only runs once in that case.
@@ -247,7 +251,7 @@ void Sap_Apu::run_until( blip_time_t end_time )
{
if ( wave & 1 )
{
- int amp = volume & -(poly [poly_pos >> 3] >> (poly_pos & 7) & 1);
+ int amp = volume * (poly [poly_pos >> 3] >> (poly_pos & 7) & 1);
if ( (poly_pos += poly_inc) < 0 )
poly_pos += poly_len;
int delta = amp - osc_last_amp;
@@ -281,7 +285,7 @@ void Sap_Apu::run_until( blip_time_t end_time )
blip_time_t remain = end_time - time;
if ( remain > 0 )
{
- blargg_long count = (remain + period - 1) / period;
+ int count = (remain + period - 1) / period;
osc->phase ^= count;
time += count * period;
}
@@ -296,11 +300,11 @@ void Sap_Apu::run_until( blip_time_t end_time )
polym_pos += duration; // will get %'d on next call
}
-void Sap_Apu::write_data( blip_time_t time, unsigned addr, int data )
+void Sap_Apu::write_data( blip_time_t time, int addr, int data )
{
run_until( time );
- int i = (addr ^ 0xD200) >> 1;
- if ( i < osc_count )
+ int i = (addr - 0xD200) >> 1;
+ if ( (unsigned) i < osc_count )
{
oscs [i].regs [addr & 1] = data;
}
@@ -331,4 +335,5 @@ void Sap_Apu::end_frame( blip_time_t end_time )
run_until( end_time );
last_time -= end_time;
+ assert( last_time >= 0 );
}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.h
new file mode 100644
index 00000000..f7099373
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Apu.h
@@ -0,0 +1,103 @@
+// Atari POKEY sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef SAP_APU_H
+#define SAP_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+class Sap_Apu_Impl;
+
+class Sap_Apu {
+public:
+// Basics
+
+ // Sets buffer to generate sound into, or 0 to mute
+ void set_output( Blip_Buffer* );
+
+ // Emulates to time t, then writes data to addr
+ void write_data( blip_time_t t, int addr, int data );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Same as set_output(), but for a particular channel
+ enum { osc_count = 4 };
+ void set_output( int index, Blip_Buffer* );
+
+ // Resets sound chip and sets Sap_Apu_Impl
+ void reset( Sap_Apu_Impl* impl );
+
+ // Registers are at io_addr to io_addr+io_size-1
+ enum { io_addr = 0xD200 };
+ enum { io_size = 0x0A };
+
+private:
+ // noncopyable
+ Sap_Apu( const Sap_Apu& );
+ Sap_Apu& operator = ( const Sap_Apu& );
+
+// Implementation
+public:
+ Sap_Apu();
+
+private:
+ struct osc_t
+ {
+ unsigned char regs [2];
+ unsigned char phase;
+ unsigned char invert;
+ int last_amp;
+ blip_time_t delay;
+ blip_time_t period; // always recalculated before use; here for convenience
+ Blip_Buffer* output;
+ };
+ osc_t oscs [osc_count];
+ Sap_Apu_Impl* impl;
+ blip_time_t last_time;
+ int poly5_pos;
+ int poly4_pos;
+ int polym_pos;
+ int control;
+
+ void calc_periods();
+ void run_until( blip_time_t );
+
+ enum { poly4_len = (1 << 4) - 1 };
+ enum { poly9_len = (1 << 9) - 1 };
+ enum { poly17_len = (1 << 17) - 1 };
+ friend class Sap_Apu_Impl;
+};
+
+// Common tables and Blip_Synth that can be shared among multiple Sap_Apu objects
+class Sap_Apu_Impl {
+public:
+ // Set treble with synth.treble_eq()
+ Blip_Synth_Norm synth;
+
+ // Sets overall volume, where 1.0is normal
+ void volume( double d ) { synth.volume( 1.0 / Sap_Apu::osc_count / 30 * d ); }
+
+
+// Implementation
+public:
+ Sap_Apu_Impl();
+
+private:
+ BOOST::uint8_t poly4 [Sap_Apu::poly4_len /8 + 1];
+ BOOST::uint8_t poly9 [Sap_Apu::poly9_len /8 + 1];
+ BOOST::uint8_t poly17 [Sap_Apu::poly17_len/8 + 1];
+ friend class Sap_Apu;
+};
+
+inline void Sap_Apu::set_output( int i, Blip_Buffer* b )
+{
+ assert( (unsigned) i < osc_count );
+ oscs [i].output = b;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.cpp
new file mode 100644
index 00000000..fa132458
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.cpp
@@ -0,0 +1,192 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sap_Core.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const idle_addr = 0xD2D2;
+
+Sap_Core::Sap_Core()
+{
+ set_tempo( 1 );
+}
+
+void Sap_Core::push( int b )
+{
+ mem.ram [0x100 + cpu.r.sp--] = (byte) b;
+}
+
+void Sap_Core::jsr_then_stop( addr_t addr )
+{
+ cpu.r.pc = addr;
+
+ // Some rips pop three bytes off stack before RTS.
+ push( (idle_addr - 1) >> 8 );
+ push( idle_addr - 1 );
+
+ // 3 bytes so that RTI or RTS will jump to idle_addr.
+ // RTI will use the first two bytes as the address, 0xD2D2.
+ // RTS will use the last two bytes, 0xD2D1, which it internally increments.
+ push( (idle_addr - 1) >> 8 );
+ push( (idle_addr - 1) >> 8 );
+ push( idle_addr - 1 );
+}
+
+// Runs routine and allows it up to one second to return
+void Sap_Core::run_routine( addr_t addr )
+{
+ jsr_then_stop( addr );
+ run_cpu( lines_per_frame * base_scanline_period * 60 );
+ check( cpu.r.pc == idle_addr );
+ check( cpu.r.sp >= 0xFF - 6 );
+}
+
+inline void Sap_Core::call_init( int track )
+{
+ cpu.r.a = track;
+
+ switch ( info.type )
+ {
+ case 'B':
+ run_routine( info.init_addr );
+ break;
+
+ case 'C':
+ cpu.r.a = 0x70;
+ cpu.r.x = info.music_addr&0xFF;
+ cpu.r.y = info.music_addr >> 8;
+ run_routine( info.play_addr + 3 );
+ cpu.r.a = 0;
+ cpu.r.x = track;
+ run_routine( info.play_addr + 3 );
+ break;
+
+ case 'D':
+ check( info.fastplay == lines_per_frame );
+ jsr_then_stop( info.init_addr );
+ break;
+ }
+}
+
+void Sap_Core::setup_ram()
+{
+ memset( &mem, 0, sizeof mem );
+
+ ram() [idle_addr] = cpu.halt_opcode;
+
+ addr_t const irq_addr = idle_addr - 1;
+ ram() [irq_addr] = cpu.halt_opcode;
+ ram() [0xFFFE] = (byte) irq_addr;
+ ram() [0xFFFF] = irq_addr >> 8;
+}
+
+blargg_err_t Sap_Core::start_track( int track, info_t const& new_info )
+{
+ info = new_info;
+
+ check( ram() [idle_addr] == cpu.halt_opcode );
+
+ apu_ .reset( &apu_impl_ );
+ apu2_.reset( &apu_impl_ );
+
+ cpu.reset( ram() );
+
+ frame_start = 0;
+ next_play = play_period() * 4;
+ saved_state.pc = idle_addr;
+
+ time_mask = 0; // disables sound during init
+ call_init( track );
+ time_mask = ~0;
+
+ return blargg_ok;
+}
+
+blargg_err_t Sap_Core::run_until( time_t end )
+{
+ while ( cpu.time() < end )
+ {
+ time_t next = min( next_play, end );
+ if ( (run_cpu( next ) && cpu.r.pc != idle_addr) || cpu.error_count() )
+ // TODO: better error
+ return BLARGG_ERR( BLARGG_ERR_GENERIC, "Emulation error (illegal instruction)" );
+
+ if ( cpu.r.pc == idle_addr )
+ {
+ if ( saved_state.pc == idle_addr )
+ {
+ // no code to run until next play call
+ cpu.set_time( next );
+ }
+ else
+ {
+ // play had interrupted non-returning init, so restore registers
+ // init routine was running
+ check( cpu.r.sp == saved_state.sp - 3 );
+ cpu.r = saved_state;
+ saved_state.pc = idle_addr;
+ }
+ }
+
+ if ( cpu.time() >= next_play )
+ {
+ next_play += play_period();
+
+ if ( cpu.r.pc == idle_addr || info.type == 'D' )
+ {
+ // Save state if init routine is still running
+ if ( cpu.r.pc != idle_addr )
+ {
+ check( info.type == 'D' );
+ check( saved_state.pc == idle_addr );
+ saved_state = cpu.r;
+ }
+
+ addr_t addr = info.play_addr;
+ if ( info.type == 'C' )
+ addr += 6;
+ jsr_then_stop( addr );
+ }
+ else
+ {
+ dprintf( "init/play hadn't returned before next play call\n" );
+ }
+ }
+ }
+ return blargg_ok;
+}
+
+blargg_err_t Sap_Core::end_frame( time_t end )
+{
+ RETURN_ERR( run_until( end ) );
+
+ cpu.adjust_time( -end );
+
+ time_t frame_time = lines_per_frame * scanline_period;
+ while ( frame_start < end )
+ frame_start += frame_time;
+ frame_start -= end + frame_time;
+
+ if ( (next_play -= end) < 0 )
+ {
+ next_play = 0;
+ check( false );
+ }
+
+ apu_.end_frame( end );
+ if ( info.stereo )
+ apu2_.end_frame( end );
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h
new file mode 100644
index 00000000..89ce0a95
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Core.h
@@ -0,0 +1,91 @@
+// Atari XL/XE SAP core CPU and RAM emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef SAP_CORE_H
+#define SAP_CORE_H
+
+#include "Sap_Apu.h"
+#include "Nes_Cpu.h"
+
+class Sap_Core {
+public:
+
+ // Sound chips and common state
+ Sap_Apu& apu() { return apu_; }
+ Sap_Apu& apu2() { return apu2_; }
+ Sap_Apu_Impl& apu_impl() { return apu_impl_; }
+
+ // Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
+ void set_tempo( double );
+
+ // Clears RAM and sets up default vectors, etc.
+ void setup_ram();
+
+ // 64K RAM to load file data blocks into
+ BOOST::uint8_t* ram() { return mem.ram; }
+
+ // Calls init routine and configures playback. RAM must have been
+ // set up already.
+ struct info_t {
+ int init_addr;
+ int play_addr;
+ int music_addr;
+ int type;
+ int fastplay;
+ bool stereo;
+ };
+ blargg_err_t start_track( int track, info_t const& );
+
+ // Ends time frame at time t, then begins new at time 0
+ typedef Nes_Cpu::time_t time_t; // Clock count
+ blargg_err_t end_frame( time_t t );
+
+
+// Implementation
+public:
+ Sap_Core();
+
+private:
+ enum { base_scanline_period = 114 };
+ enum { lines_per_frame = 312 };
+ typedef Nes_Cpu::addr_t addr_t;
+
+ time_t scanline_period;
+ time_t next_play;
+ time_t time_mask;
+ time_t frame_start;
+ Nes_Cpu cpu;
+ Nes_Cpu::registers_t saved_state;
+ info_t info;
+ Sap_Apu apu_;
+ Sap_Apu apu2_;
+
+ // large items
+ struct {
+ BOOST::uint8_t padding1 [ 0x100];
+ BOOST::uint8_t ram [0x10000];
+ BOOST::uint8_t padding2 [ 0x100];
+ } mem; // TODO: put on freestore
+ Sap_Apu_Impl apu_impl_;
+
+ void push( int b );
+ void jsr_then_stop( addr_t );
+ void run_routine( addr_t );
+ void call_init( int track );
+ bool run_cpu( time_t end );
+ int play_addr();
+ int read_d40b();
+ int read_mem( addr_t );
+ void write_D2xx( int d2xx, int data );
+
+ time_t time() const { return cpu.time() & time_mask; }
+ blargg_err_t run_until( time_t t );
+ time_t play_period() const { return info.fastplay * scanline_period; }
+};
+
+inline void Sap_Core::set_tempo( double t )
+{
+ scanline_period = (int) (base_scanline_period / t + 0.5);
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Cpu.cpp
new file mode 100644
index 00000000..2f1e5dcc
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Cpu.cpp
@@ -0,0 +1,96 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sap_Core.h"
+
+#include "blargg_endian.h"
+
+//#define CPU_LOG_MAX 100000
+//#include "nes_cpu_log.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// functions defined in same file as CPU emulator to help compiler's optimizer
+
+int Sap_Core::read_d40b()
+{
+ //dprintf( "D40B read\n" );
+ check( cpu.time() >= frame_start );
+ return ((unsigned) (cpu.time() - frame_start) / scanline_period % lines_per_frame) / 2;
+}
+
+void Sap_Core::write_D2xx( int d2xx, int data )
+{
+ addr_t const base = 0xD200;
+
+ if ( d2xx < apu_.io_size )
+ {
+ apu_.write_data( time(), d2xx + base, data );
+ return;
+ }
+
+ if ( (unsigned) (d2xx - 0x10) < apu2_.io_size && info.stereo )
+ {
+ apu2_.write_data( time(), d2xx + (base - 0x10), data );
+ return;
+ }
+
+ if ( d2xx == 0xD40A - base )
+ {
+ dprintf( "D40A write\n" );
+ time_t t = cpu.time();
+ time_t into_line = (t - frame_start) % scanline_period;
+ cpu.set_end_time( t - into_line + scanline_period );
+ return;
+ }
+
+ if ( (d2xx & ~0x0010) != 0x0F || data != 0x03 )
+ dprintf( "Unmapped write $%04X <- $%02X\n", d2xx + base, data );
+}
+
+inline int Sap_Core::read_mem( addr_t addr )
+{
+ int result = mem.ram [addr];
+ if ( addr == 0xD40B )
+ result = read_d40b();
+ else if ( (addr & 0xF900) == 0xD000 )
+ dprintf( "Unmapped read $%04X\n", addr );
+ return result;
+}
+
+
+#define READ_LOW( addr ) (ram [addr])
+#define WRITE_LOW( addr, data ) (ram [addr] = data)
+
+#define READ_MEM( addr ) read_mem( addr )
+#define WRITE_MEM( addr, data ) \
+{\
+ ram [addr] = data;\
+ int d2xx = addr - 0xD200;\
+ if ( (unsigned) d2xx < 0x100 )\
+ write_D2xx( d2xx, data );\
+}
+
+#define CPU cpu
+#define FLAT_MEM ram
+
+#define CPU_BEGIN \
+bool Sap_Core::run_cpu( time_t end )\
+{\
+ CPU.set_end_time( end );\
+ byte* const ram = this->mem.ram; /* cache */
+
+ #include "Nes_Cpu_run.h"
+
+ return cpu.time_past_end() < 0;
+}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.cpp
index 8314fd6e..ba2a164c 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Sap_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.cpp
@@ -1,442 +1,385 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Sap_Emu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-long const base_scanline_period = 114;
-
-Sap_Emu::Sap_Emu()
-{
- set_type( gme_sap_type );
-
- static const char* const names [Sap_Apu::osc_count * 2] = {
- "Wave 1", "Wave 2", "Wave 3", "Wave 4",
- "Wave 5", "Wave 6", "Wave 7", "Wave 8",
- };
- set_voice_names( names );
-
- static int const types [Sap_Apu::osc_count * 2] = {
- wave_type | 1, wave_type | 2, wave_type | 3, wave_type | 0,
- wave_type | 5, wave_type | 6, wave_type | 7, wave_type | 4,
- };
- set_voice_types( types );
- set_silence_lookahead( 6 );
-}
-
-Sap_Emu::~Sap_Emu() { }
-
-// Track info
-
-// Returns 16 or greater if not hex
-inline int from_hex_char( int h )
-{
- h -= 0x30;
- if ( (unsigned) h > 9 )
- h = ((h - 0x11) & 0xDF) + 10;
- return h;
-}
-
-static long from_hex( byte const* in )
-{
- unsigned result = 0;
- for ( int n = 4; n--; )
- {
- int h = from_hex_char( *in++ );
- if ( h > 15 )
- return -1;
- result = result * 0x10 + h;
- }
- return result;
-}
-
-static int from_dec( byte const* in, byte const* end )
-{
- if ( in >= end )
- return -1;
-
- int n = 0;
- while ( in < end )
- {
- int dig = *in++ - '0';
- if ( (unsigned) dig > 9 )
- return -1;
- n = n * 10 + dig;
- }
- return n;
-}
-
-static void parse_string( byte const* in, byte const* end, int len, char* out )
-{
- byte const* start = in;
- if ( *in++ == '\"' )
- {
- start++;
- while ( in < end && *in != '\"' )
- in++;
- }
- else
- {
- in = end;
- }
- len = min( len - 1, int (in - start) );
- out [len] = 0;
- memcpy( out, start, len );
-}
-
-static blargg_err_t parse_info( byte const* in, long size, Sap_Emu::info_t* out )
-{
- out->track_count = 1;
- out->author [0] = 0;
- out->name [0] = 0;
- out->copyright [0] = 0;
-
- if ( size < 16 || memcmp( in, "SAP\x0D\x0A", 5 ) )
- return gme_wrong_file_type;
-
- byte const* file_end = in + size - 5;
- in += 5;
- while ( in < file_end && (in [0] != 0xFF || in [1] != 0xFF) )
- {
- byte const* line_end = in;
- while ( line_end < file_end && *line_end != 0x0D )
- line_end++;
-
- char const* tag = (char const*) in;
- while ( in < line_end && *in > ' ' )
- in++;
- int tag_len = (char const*) in - tag;
-
- while ( in < line_end && *in <= ' ' ) in++;
-
- if ( tag_len <= 0 )
- {
- // skip line
- }
- else if ( !strncmp( "INIT", tag, tag_len ) )
- {
- out->init_addr = from_hex( in );
- if ( (unsigned long) out->init_addr > 0xFFFF )
- return "Invalid init address";
- }
- else if ( !strncmp( "PLAYER", tag, tag_len ) )
- {
- out->play_addr = from_hex( in );
- if ( (unsigned long) out->play_addr > 0xFFFF )
- return "Invalid play address";
- }
- else if ( !strncmp( "MUSIC", tag, tag_len ) )
- {
- out->music_addr = from_hex( in );
- if ( (unsigned long) out->music_addr > 0xFFFF )
- return "Invalid music address";
- }
- else if ( !strncmp( "SONGS", tag, tag_len ) )
- {
- out->track_count = from_dec( in, line_end );
- if ( out->track_count <= 0 )
- return "Invalid track count";
- }
- else if ( !strncmp( "TYPE", tag, tag_len ) )
- {
- switch ( out->type = *in )
- {
- case 'C':
- case 'B':
- break;
-
- case 'D':
- return "Digimusic not supported";
-
- default:
- return "Unsupported player type";
- }
- }
- else if ( !strncmp( "STEREO", tag, tag_len ) )
- {
- out->stereo = true;
- }
- else if ( !strncmp( "FASTPLAY", tag, tag_len ) )
- {
- out->fastplay = from_dec( in, line_end );
- if ( out->fastplay <= 0 )
- return "Invalid fastplay value";
- }
- else if ( !strncmp( "AUTHOR", tag, tag_len ) )
- {
- parse_string( in, line_end, sizeof out->author, out->author );
- }
- else if ( !strncmp( "NAME", tag, tag_len ) )
- {
- parse_string( in, line_end, sizeof out->name, out->name );
- }
- else if ( !strncmp( "DATE", tag, tag_len ) )
- {
- parse_string( in, line_end, sizeof out->copyright, out->copyright );
- }
-
- in = line_end + 2;
- }
-
- if ( in [0] != 0xFF || in [1] != 0xFF )
- return "ROM data missing";
- out->rom_data = in + 2;
-
- return 0;
-}
-
-static void copy_sap_fields( Sap_Emu::info_t const& in, track_info_t* out )
-{
- Gme_File::copy_field_( out->game, in.name );
- Gme_File::copy_field_( out->author, in.author );
- Gme_File::copy_field_( out->copyright, in.copyright );
-}
-
-blargg_err_t Sap_Emu::track_info_( track_info_t* out, int ) const
-{
- copy_sap_fields( info, out );
- return 0;
-}
-
-struct Sap_File : Gme_Info_
-{
- Sap_Emu::info_t info;
-
- Sap_File() { set_type( gme_sap_type ); }
-
- blargg_err_t load_mem_( byte const* begin, long size )
- {
- RETURN_ERR( parse_info( begin, size, &info ) );
- set_track_count( info.track_count );
- return 0;
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- copy_sap_fields( info, out );
- return 0;
- }
-};
-
-static Music_Emu* new_sap_emu () { return BLARGG_NEW Sap_Emu ; }
-static Music_Emu* new_sap_file() { return BLARGG_NEW Sap_File; }
-
-gme_type_t_ const gme_sap_type [1] = { "Atari XL", 0, &new_sap_emu, &new_sap_file, "SAP", 1 };
-
-// Setup
-
-blargg_err_t Sap_Emu::load_mem_( byte const* in, long size )
-{
- file_end = in + size;
-
- info.warning = 0;
- info.type = 'B';
- info.stereo = false;
- info.init_addr = -1;
- info.play_addr = -1;
- info.music_addr = -1;
- info.fastplay = 312;
- RETURN_ERR( parse_info( in, size, &info ) );
-
- set_warning( info.warning );
- set_track_count( info.track_count );
- set_voice_count( Sap_Apu::osc_count << info.stereo );
- apu_impl.volume( gain() );
-
- return setup_buffer( 1773447 );
-}
-
-void Sap_Emu::update_eq( blip_eq_t const& eq )
-{
- apu_impl.synth.treble_eq( eq );
-}
-
-void Sap_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
-{
- int i2 = i - Sap_Apu::osc_count;
- if ( i2 >= 0 )
- apu2.osc_output( i2, right );
- else
- apu.osc_output( i, (info.stereo ? left : center) );
-}
-
-// Emulation
-
-void Sap_Emu::set_tempo_( double t )
-{
- scanline_period = sap_time_t (base_scanline_period / t);
-}
-
-inline sap_time_t Sap_Emu::play_period() const { return info.fastplay * scanline_period; }
-
-void Sap_Emu::cpu_jsr( sap_addr_t addr )
-{
- check( r.sp >= 0xFE ); // catch anything trying to leave data on stack
- r.pc = addr;
- int high_byte = (idle_addr - 1) >> 8;
- if ( r.sp == 0xFE && mem.ram [0x1FF] == high_byte )
- r.sp = 0xFF; // pop extra byte off
- mem.ram [0x100 + r.sp--] = high_byte; // some routines use RTI to return
- mem.ram [0x100 + r.sp--] = high_byte;
- mem.ram [0x100 + r.sp--] = (idle_addr - 1) & 0xFF;
-}
-
-void Sap_Emu::run_routine( sap_addr_t addr )
-{
- cpu_jsr( addr );
- cpu::run( 312 * base_scanline_period * 60 );
- check( r.pc == idle_addr );
-}
-
-inline void Sap_Emu::call_init( int track )
-{
- switch ( info.type )
- {
- case 'B':
- r.a = track;
- run_routine( info.init_addr );
- break;
-
- case 'C':
- r.a = 0x70;
- r.x = info.music_addr&0xFF;
- r.y = info.music_addr >> 8;
- run_routine( info.play_addr + 3 );
- r.a = 0;
- r.x = track;
- run_routine( info.play_addr + 3 );
- break;
- }
-}
-
-blargg_err_t Sap_Emu::start_track_( int track )
-{
- RETURN_ERR( Classic_Emu::start_track_( track ) );
-
- memset( &mem, 0, sizeof mem );
-
- byte const* in = info.rom_data;
- while ( file_end - in >= 5 )
- {
- unsigned start = get_le16( in );
- unsigned end = get_le16( in + 2 );
- //dprintf( "Block $%04X-$%04X\n", start, end );
- in += 4;
- if ( end < start )
- {
- set_warning( "Invalid file data block" );
- break;
- }
- long len = end - start + 1;
- if ( len > file_end - in )
- {
- set_warning( "Invalid file data block" );
- break;
- }
-
- memcpy( mem.ram + start, in, len );
- in += len;
- if ( file_end - in >= 2 && in [0] == 0xFF && in [1] == 0xFF )
- in += 2;
- }
-
- apu.reset( &apu_impl );
- apu2.reset( &apu_impl );
- cpu::reset( mem.ram );
- time_mask = 0; // disables sound during init
- call_init( track );
- time_mask = -1;
-
- next_play = play_period();
-
- return 0;
-}
-
-// Emulation
-
-// see sap_cpu_io.h for read/write functions
-
-void Sap_Emu::cpu_write_( sap_addr_t addr, int data )
-{
- if ( (addr ^ Sap_Apu::start_addr) <= (Sap_Apu::end_addr - Sap_Apu::start_addr) )
- {
- GME_APU_HOOK( this, addr - Sap_Apu::start_addr, data );
- apu.write_data( time() & time_mask, addr, data );
- return;
- }
-
- if ( (addr ^ (Sap_Apu::start_addr + 0x10)) <= (Sap_Apu::end_addr - Sap_Apu::start_addr) &&
- info.stereo )
- {
- GME_APU_HOOK( this, addr - 0x10 - Sap_Apu::start_addr + 10, data );
- apu2.write_data( time() & time_mask, addr ^ 0x10, data );
- return;
- }
-
- if ( (addr & ~0x0010) != 0xD20F || data != 0x03 )
- dprintf( "Unmapped write $%04X <- $%02X\n", addr, data );
-}
-
-inline void Sap_Emu::call_play()
-{
- switch ( info.type )
- {
- case 'B':
- cpu_jsr( info.play_addr );
- break;
-
- case 'C':
- cpu_jsr( info.play_addr + 6 );
- break;
- }
-}
-
-blargg_err_t Sap_Emu::run_clocks( blip_time_t& duration, int )
-{
- set_time( 0 );
- while ( time() < duration )
- {
- if ( cpu::run( duration ) || r.pc > idle_addr )
- return "Emulation error (illegal instruction)";
-
- if ( r.pc == idle_addr )
- {
- if ( next_play <= duration )
- {
- set_time( next_play );
- next_play += play_period();
- call_play();
- GME_FRAME_HOOK( this );
- }
- else
- {
- set_time( duration );
- }
- }
- }
-
- duration = time();
- next_play -= duration;
- check( next_play >= 0 );
- if ( next_play < 0 )
- next_play = 0;
- apu.end_frame( duration );
- if ( info.stereo )
- apu2.end_frame( duration );
-
- return 0;
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sap_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+Sap_Emu::Sap_Emu()
+{
+ set_type( gme_sap_type );
+ set_silence_lookahead( 6 );
+}
+
+Sap_Emu::~Sap_Emu() { }
+
+// Track info
+
+// Returns 16 or greater if not hex. Handles uppercase and lowercase.
+// Thoroughly tested and rejects ALL non-hex characters.
+inline int from_hex_char( int h )
+{
+ h -= 0x30;
+ if ( (unsigned) h > 9 )
+ h = ((h - 0x11) & 0xDF) + 10;
+ return h;
+}
+
+static int from_hex( byte const in [] )
+{
+ int result = 0;
+ for ( int n = 4; n--; )
+ {
+ int h = from_hex_char( *in++ );
+ if ( h > 15 )
+ return -1;
+ result = result * 0x10 + h;
+ }
+ return result;
+}
+
+static int parse_int( byte const* io [], byte const* end )
+{
+ byte const* in = *io;
+ int n = 0;
+ while ( in < end )
+ {
+ int dig = *in - '0';
+ if ( (unsigned) dig > 9 )
+ break;
+ ++in;
+ n = n * 10 + dig;
+ }
+ if ( in == *io )
+ n = -1; // no numeric characters
+ *io = in;
+ return n;
+}
+
+static int from_dec( byte const in [], byte const* end )
+{
+ int n = parse_int( &in, end );
+ if ( in < end )
+ n = -1;
+ return n;
+}
+
+static void parse_string( byte const in [], byte const* end, int len, char out [] )
+{
+ byte const* start = in;
+ if ( *in++ == '\"' )
+ {
+ start++;
+ while ( in < end && *in != '\"' )
+ in++;
+ }
+ else
+ {
+ in = end;
+ }
+ len = min( len - 1, int (in - start) );
+ out [len] = 0;
+ memcpy( out, start, len );
+}
+
+static int parse_time( byte const in [], byte const* end )
+{
+ int minutes = parse_int( &in, end );
+ if ( minutes < 0 || *in != ':' )
+ return 0;
+
+ ++in;
+ int seconds = parse_int( &in, end );
+ if ( seconds < 0 )
+ return 0;
+
+ int time = minutes * 60000 + seconds * 1000;
+ if ( *in == '.' )
+ {
+ byte const* start = ++in;
+ int msec = parse_int( &in, end );
+ if ( msec >= 0 )
+ {
+ // allow 1-3 digits
+ for ( int n = in - start; n < 3; n++ )
+ msec *= 10;
+ time += msec;
+ }
+ }
+
+ while ( in < end && *in <= ' ' )
+ ++in;
+
+ if ( end - in >= 4 && !memcmp( in, "LOOP", 4 ) )
+ time = -time;
+
+ return time;
+}
+
+static blargg_err_t parse_info( byte const in [], int size, Sap_Emu::info_t* out )
+{
+ out->track_count = 1;
+ out->author [0] = 0;
+ out->name [0] = 0;
+ out->copyright [0] = 0;
+
+ for ( int i = 0; i < Sap_Emu::max_tracks; i++ )
+ out->track_times [i] = 0;
+
+ if ( size < 16 || memcmp( in, "SAP\x0D\x0A", 5 ) )
+ return blargg_err_file_type;
+
+ int time_count = 0;
+ byte const* file_end = in + size - 5;
+ in += 5;
+ while ( in < file_end && (in [0] != 0xFF || in [1] != 0xFF) )
+ {
+ byte const* line_end = in;
+ while ( line_end < file_end && *line_end != 0x0D )
+ line_end++;
+
+ char const* tag = (char const*) in;
+ while ( in < line_end && *in > ' ' )
+ in++;
+ int tag_len = (char const*) in - tag;
+
+ while ( in < line_end && *in <= ' ' ) in++;
+
+ if ( tag_len <= 0 )
+ {
+ // skip line
+ }
+ else if ( !strncmp( "TIME", tag, tag_len ) && time_count < Sap_Emu::max_tracks )
+ {
+ out->track_times [time_count++] = parse_time( in, line_end );
+ }
+ else if ( !strncmp( "INIT", tag, tag_len ) )
+ {
+ out->init_addr = from_hex( in );
+ if ( (unsigned) out->init_addr >= 0x10000 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "init address" );
+ }
+ else if ( !strncmp( "PLAYER", tag, tag_len ) )
+ {
+ out->play_addr = from_hex( in );
+ if ( (unsigned) out->play_addr >= 0x10000 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "play address" );
+ }
+ else if ( !strncmp( "MUSIC", tag, tag_len ) )
+ {
+ out->music_addr = from_hex( in );
+ if ( (unsigned) out->music_addr >= 0x10000 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "music address" );
+ }
+ else if ( !strncmp( "SONGS", tag, tag_len ) )
+ {
+ out->track_count = from_dec( in, line_end );
+ if ( out->track_count <= 0 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "track count" );
+ }
+ else if ( !strncmp( "TYPE", tag, tag_len ) )
+ {
+ switch ( out->type = *in )
+ {
+ case 'S':
+ out->type = 'C';
+ case 'B':
+ case 'C':
+ case 'D':
+ break;
+
+ default:
+ return BLARGG_ERR( BLARGG_ERR_FILE_FEATURE, "player type" );
+ }
+ }
+ else if ( !strncmp( "STEREO", tag, tag_len ) )
+ {
+ out->stereo = true;
+ }
+ else if ( !strncmp( "FASTPLAY", tag, tag_len ) )
+ {
+ out->fastplay = from_dec( in, line_end );
+ if ( out->fastplay <= 0 )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "fastplay value" );
+ }
+ else if ( !strncmp( "AUTHOR", tag, tag_len ) )
+ {
+ parse_string( in, line_end, sizeof out->author, out->author );
+ }
+ else if ( !strncmp( "NAME", tag, tag_len ) )
+ {
+ parse_string( in, line_end, sizeof out->name, out->name );
+ }
+ else if ( !strncmp( "DATE", tag, tag_len ) )
+ {
+ parse_string( in, line_end, sizeof out->copyright, out->copyright );
+ }
+
+ in = line_end + 2;
+ }
+
+ if ( in [0] != 0xFF || in [1] != 0xFF )
+ return BLARGG_ERR( BLARGG_ERR_FILE_CORRUPT, "ROM data missing" );
+ out->rom_data = in + 2;
+
+ return blargg_ok;
+}
+
+static void copy_sap_fields( Sap_Emu::info_t const& in, track_info_t* out )
+{
+ Gme_File::copy_field_( out->game, in.name );
+ Gme_File::copy_field_( out->author, in.author );
+ Gme_File::copy_field_( out->copyright, in.copyright );
+}
+
+blargg_err_t Sap_Emu::track_info_( track_info_t* out, int track ) const
+{
+ copy_sap_fields( info_, out );
+
+ if ( track < max_tracks )
+ {
+ int time = info_.track_times [track];
+ if ( time )
+ {
+ if ( time > 0 )
+ {
+ out->loop_length = 0;
+ }
+ else
+ {
+ time = -time;
+ out->loop_length = time;
+ }
+ out->length = time;
+ }
+ }
+ return blargg_ok;
+}
+
+struct Sap_File : Gme_Info_
+{
+ Sap_Emu::info_t info;
+
+ Sap_File() { set_type( gme_sap_type ); }
+
+ blargg_err_t load_mem_( byte const begin [], int size )
+ {
+ RETURN_ERR( parse_info( begin, size, &info ) );
+ set_track_count( info.track_count );
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_sap_fields( info, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_sap_emu () { return BLARGG_NEW Sap_Emu ; }
+static Music_Emu* new_sap_file() { return BLARGG_NEW Sap_File; }
+
+gme_type_t_ const gme_sap_type [1] = {{ "Atari XL", 0, &new_sap_emu, &new_sap_file, "SAP", 1 }};
+
+// Setup
+
+blargg_err_t Sap_Emu::load_mem_( byte const in [], int size )
+{
+ file_end = in + size;
+
+ info_.warning = NULL;
+ info_.type = 'B';
+ info_.stereo = false;
+ info_.init_addr = -1;
+ info_.play_addr = -1;
+ info_.music_addr = -1;
+ info_.fastplay = 312;
+ RETURN_ERR( parse_info( in, size, &info_ ) );
+
+ set_warning( info_.warning );
+ set_track_count( info_.track_count );
+ set_voice_count( Sap_Apu::osc_count << info_.stereo );
+ core.apu_impl().volume( gain() );
+
+ static const char* const names [Sap_Apu::osc_count * 2] = {
+ "Wave 1", "Wave 2", "Wave 3", "Wave 4",
+ "Wave 5", "Wave 6", "Wave 7", "Wave 8",
+ };
+ set_voice_names( names );
+
+ static int const types [Sap_Apu::osc_count * 2] = {
+ wave_type+1, wave_type+2, wave_type+3, wave_type+0,
+ wave_type+5, wave_type+6, wave_type+7, wave_type+4,
+ };
+ set_voice_types( types );
+
+ return setup_buffer( 1773447 );
+}
+
+void Sap_Emu::update_eq( blip_eq_t const& eq )
+{
+ core.apu_impl().synth.treble_eq( eq );
+}
+
+void Sap_Emu::set_voice( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ int i2 = i - Sap_Apu::osc_count;
+ if ( i2 >= 0 )
+ core.apu2().set_output( i2, right );
+ else
+ core.apu().set_output( i, (info_.stereo ? left : center) );
+}
+
+// Emulation
+
+void Sap_Emu::set_tempo_( double t )
+{
+ core.set_tempo( t );
+}
+
+blargg_err_t Sap_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+
+ core.setup_ram();
+
+ // Copy file data to RAM
+ byte const* in = info_.rom_data;
+ while ( file_end - in >= 5 )
+ {
+ int start = get_le16( in );
+ int end = get_le16( in + 2 );
+ //dprintf( "Block $%04X-$%04X\n", start, end );
+ in += 4;
+ int len = end - start + 1;
+ if ( (unsigned) len > (unsigned) (file_end - in) )
+ {
+ set_warning( "Invalid file data block" );
+ break;
+ }
+
+ memcpy( core.ram() + start, in, len );
+ in += len;
+ if ( file_end - in >= 2 && in [0] == 0xFF && in [1] == 0xFF )
+ in += 2;
+ }
+
+ return core.start_track( track, info_ );
+}
+
+blargg_err_t Sap_Emu::run_clocks( blip_time_t& duration, int )
+{
+ return core.end_frame( duration );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.h
new file mode 100644
index 00000000..198c27a1
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sap_Emu.h
@@ -0,0 +1,51 @@
+// Atari XL/XE SAP music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef SAP_EMU_H
+#define SAP_EMU_H
+
+#include "Classic_Emu.h"
+#include "Sap_Apu.h"
+#include "Sap_Core.h"
+
+class Sap_Emu : public Classic_Emu {
+public:
+ enum { max_tracks = 32 }; // TODO: no fixed limit
+
+ // SAP file info (see Sap_Core.h for more)
+ struct info_t : Sap_Core::info_t {
+ byte const* rom_data;
+ const char* warning;
+ int track_count;
+ int track_times [max_tracks];
+ char author [256];
+ char name [256];
+ char copyright [ 32];
+ };
+
+ // Info for currently loaded file
+ info_t const& info() const { return info_; }
+
+ static gme_type_t static_type() { return gme_sap_type; }
+
+// Implementation
+public:
+ Sap_Emu();
+ ~Sap_Emu();
+
+protected:
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_mem_( byte const [], int );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+
+private:
+ info_t info_;
+ byte const* file_end;
+ Sap_Core core;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.cpp
new file mode 100644
index 00000000..ff24b576
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.cpp
@@ -0,0 +1,108 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sgc_Core.h"
+
+/* Copyright (C) 2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void Sgc_Core::set_tempo( double t )
+{
+ set_play_period( clock_rate() / (header().rate ? 50 : 60) / t );
+}
+
+blargg_err_t Sgc_Core::load_( Data_Reader& dr )
+{
+ RETURN_ERR( Sgc_Impl::load_( dr ) );
+
+ if ( sega_mapping() && fm_apu_.supported() )
+ RETURN_ERR( fm_apu_.init( clock_rate(), clock_rate() / 72 ) );
+
+ set_tempo( 1.0 );
+ return blargg_ok;
+}
+
+blargg_err_t Sgc_Core::start_track( int t )
+{
+ if ( sega_mapping() )
+ {
+ apu_.reset();
+ fm_apu_.reset();
+ fm_accessed = false;
+ }
+ else
+ {
+ apu_.reset( 0x0003, 15 );
+ }
+
+ return Sgc_Impl::start_track( t );
+}
+
+blargg_err_t Sgc_Core::end_frame( time_t t )
+{
+ RETURN_ERR( Sgc_Impl::end_frame( t ) );
+ apu_.end_frame( t );
+ if ( sega_mapping() && fm_accessed )
+ {
+ if ( fm_apu_.supported() )
+ fm_apu_.end_frame( t );
+ else
+ set_warning( "FM sound not supported" );
+ }
+
+ return blargg_ok;
+}
+
+Sgc_Core::Sgc_Core()
+{ }
+
+Sgc_Core::~Sgc_Core()
+{ }
+
+void Sgc_Core::cpu_out( time_t time, addr_t addr, int data )
+{
+ int port = addr & 0xFF;
+
+ if ( sega_mapping() )
+ {
+ switch ( port )
+ {
+ case 0x06:
+ apu_.write_ggstereo( time, data );
+ return;
+
+ case 0x7E:
+ case 0x7F:
+ apu_.write_data( time, data ); dprintf( "$7E<-%02X\n", data );
+ return;
+
+ case 0xF0:
+ fm_accessed = true;
+ if ( fm_apu_.supported() )
+ fm_apu_.write_addr( data );//, dprintf( "$F0<-%02X\n", data );
+ return;
+
+ case 0xF1:
+ fm_accessed = true;
+ if ( fm_apu_.supported() )
+ fm_apu_.write_data( time, data );//, dprintf( "$F1<-%02X\n", data );
+ return;
+ }
+ }
+ else if ( port >= 0xE0 )
+ {
+ apu_.write_data( time, data );
+ return;
+ }
+
+ Sgc_Impl::cpu_out( time, addr, data );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.h
new file mode 100644
index 00000000..ef59194c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Core.h
@@ -0,0 +1,44 @@
+// Sega/Game Gear/Coleco SGC music file emulator core
+
+// Game_Music_Emu 0.6-pre
+#ifndef SGC_CORE_H
+#define SGC_CORE_H
+
+#include "Sgc_Impl.h"
+#include "Sms_Fm_Apu.h"
+#include "Sms_Apu.h"
+
+class Sgc_Core : public Sgc_Impl {
+public:
+
+ // Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
+ // Resets to 1.0 when loading file.
+ void set_tempo( double );
+
+ // Starts track, where 0 is the first.
+ blargg_err_t start_track( int );
+
+ // Ends time frame at time t
+ blargg_err_t end_frame( time_t t );
+
+ // SN76489 sound chip
+ Sms_Apu& apu() { return apu_; }
+ Sms_Fm_Apu& fm_apu() { return fm_apu_; }
+
+protected:
+ // Overrides
+ virtual void cpu_out( time_t, addr_t, int data );
+ virtual blargg_err_t load_( Data_Reader& );
+
+// Implementation
+public:
+ Sgc_Core();
+ ~Sgc_Core();
+
+private:
+ bool fm_accessed;
+ Sms_Apu apu_;
+ Sms_Fm_Apu fm_apu_;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Cpu.cpp
new file mode 100644
index 00000000..4f7d5816
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Cpu.cpp
@@ -0,0 +1,36 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sgc_Impl.h"
+
+#include "blargg_endian.h"
+//#include "z80_cpu_log.h"
+
+/* Copyright (C) 2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define OUT_PORT( addr, data ) cpu_out( TIME(), addr, data )
+#define IN_PORT( addr ) cpu_in( addr )
+#define WRITE_MEM( addr, data ) cpu_write( addr, data )
+#define IDLE_ADDR idle_addr
+#define CPU cpu
+#define RST_BASE vectors_addr
+
+#define CPU_BEGIN \
+bool Sgc_Impl::run_cpu( time_t end_time )\
+{\
+ cpu.set_end_time( end_time );
+
+ #include "Z80_Cpu_run.h"
+
+ return warning;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.cpp
new file mode 100644
index 00000000..0b7ff4d3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.cpp
@@ -0,0 +1,136 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sgc_Emu.h"
+
+/* Copyright (C) 2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const osc_count = Sms_Apu::osc_count + Sms_Fm_Apu::osc_count;
+
+Sgc_Emu::Sgc_Emu()
+{
+ set_type( gme_sgc_type );
+ set_silence_lookahead( 6 );
+ set_gain( 1.2 );
+}
+
+Sgc_Emu::~Sgc_Emu() { }
+
+void Sgc_Emu::unload()
+{
+ core_.unload();
+ Music_Emu::unload();
+}
+
+// Track info
+
+static void copy_sgc_fields( Sgc_Emu::header_t const& h, track_info_t* out )
+{
+ GME_COPY_FIELD( h, out, game );
+ GME_COPY_FIELD( h, out, author );
+ GME_COPY_FIELD( h, out, copyright );
+}
+
+blargg_err_t Sgc_Emu::track_info_( track_info_t* out, int ) const
+{
+ copy_sgc_fields( header(), out );
+ return blargg_ok;
+}
+
+struct Sgc_File : Gme_Info_
+{
+ Sgc_Emu::header_t h;
+
+ Sgc_File() { set_type( gme_sgc_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ blargg_err_t err = in.read( &h, h.size );
+ if ( err )
+ return (blargg_is_err_type( err, blargg_err_file_eof ) ? blargg_err_file_type : err);
+
+ set_track_count( h.song_count );
+ if ( !h.valid_tag() )
+ return blargg_err_file_type;
+
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ copy_sgc_fields( h, out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_sgc_emu () { return BLARGG_NEW Sgc_Emu ; }
+static Music_Emu* new_sgc_file() { return BLARGG_NEW Sgc_File; }
+
+gme_type_t_ const gme_sgc_type [1] = {{ "Z80 PSG", 0, &new_sgc_emu, &new_sgc_file, "SGC", 1 }};
+
+// Setup
+
+blargg_err_t Sgc_Emu::load_( Data_Reader& in )
+{
+ RETURN_ERR( core_.load( in ) );
+ set_warning( core_.warning() );
+ set_track_count( header().song_count );
+ set_voice_count( core_.sega_mapping() ? osc_count : core_.apu().osc_count );
+
+ core_.apu ().volume( gain() );
+ core_.fm_apu().volume( gain() );
+
+ static const char* const names [osc_count + 1] = {
+ "Square 1", "Square 2", "Square 3", "Noise", "FM"
+ };
+ set_voice_names( names );
+
+ static int const types [osc_count + 1] = {
+ wave_type+1, wave_type+2, wave_type+3, mixed_type+1, mixed_type+2
+ };
+ set_voice_types( types );
+
+ return setup_buffer( core_.clock_rate() );
+}
+
+void Sgc_Emu::update_eq( blip_eq_t const& eq )
+{
+ core_.apu ().treble_eq( eq );
+ core_.fm_apu().treble_eq( eq );
+}
+
+void Sgc_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ if ( i < core_.apu().osc_count )
+ core_.apu().set_output( i, c, l, r );
+ else
+ core_.fm_apu().set_output( c, l, r );
+}
+
+void Sgc_Emu::set_tempo_( double t )
+{
+ core_.set_tempo( t );
+}
+
+blargg_err_t Sgc_Emu::start_track_( int track )
+{
+ RETURN_ERR( core_.start_track( track ) );
+ return Classic_Emu::start_track_( track );
+}
+
+blargg_err_t Sgc_Emu::run_clocks( blip_time_t& duration, int )
+{
+ RETURN_ERR( core_.end_frame( duration ) );
+ set_warning( core_.warning() );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.h
new file mode 100644
index 00000000..6fed10ad
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Emu.h
@@ -0,0 +1,43 @@
+// Sega/Game Gear/Coleco SGC music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef SGC_EMU_H
+#define SGC_EMU_H
+
+#include "Classic_Emu.h"
+#include "Sgc_Core.h"
+
+class Sgc_Emu : public Classic_Emu {
+public:
+ // SGC file header (see Sgc_Impl.h)
+ typedef Sgc_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core_.header(); }
+
+ // Sets 0x2000-byte Coleco BIOS. Necessary to play Coleco tracks.
+ static void set_coleco_bios( void const* p ){ Sgc_Core::set_coleco_bios( p ); }
+
+ static gme_type_t static_type() { return gme_sgc_type; }
+
+// Internal
+public:
+ Sgc_Emu();
+ ~Sgc_Emu();
+
+protected:
+ // Classic_Emu overrides
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t load_( Data_Reader& );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+ virtual void unload();
+
+private:
+ Sgc_Core core_;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.cpp
new file mode 100644
index 00000000..01c8ae4f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.cpp
@@ -0,0 +1,225 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Sgc_Impl.h"
+
+/* Copyright (C) 2006-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+void const* Sgc_Impl::coleco_bios;
+
+Sgc_Impl::Sgc_Impl() :
+ rom( bank_size )
+{
+ assert( offsetof (header_t,copyright [32]) == header_t::size );
+}
+
+Sgc_Impl::~Sgc_Impl()
+{ }
+
+bool Sgc_Impl::header_t::valid_tag() const
+{
+ return 0 == memcmp( tag, "SGC\x1A", 4 );
+}
+
+blargg_err_t Sgc_Impl::load_( Data_Reader& in )
+{
+ RETURN_ERR( rom.load( in, header_.size, &header_, 0 ) );
+
+ if ( !header_.valid_tag() )
+ return blargg_err_file_type;
+
+ if ( header_.vers != 1 )
+ set_warning( "Unknown file version" );
+
+ if ( header_.system > 2 )
+ set_warning( "Unknown system" );
+
+ addr_t load_addr = get_le16( header_.load_addr );
+ if ( load_addr < 0x400 )
+ set_warning( "Invalid load address" );
+
+ rom.set_addr( load_addr );
+ play_period = clock_rate() / 60;
+
+ if ( sega_mapping() )
+ {
+ RETURN_ERR( ram.resize( 0x2000 + Sgc_Cpu::page_padding ) );
+ RETURN_ERR( ram2.resize( bank_size + Sgc_Cpu::page_padding ) );
+ }
+ else
+ {
+ RETURN_ERR( ram.resize( 0x400 + Sgc_Cpu::page_padding ) );
+ }
+
+ RETURN_ERR( vectors.resize( Sgc_Cpu::page_size + Sgc_Cpu::page_padding ) );
+
+ // TODO: doesn't need to be larger than page size, if we do mapping calls right
+ RETURN_ERR( unmapped_write.resize( bank_size ) );
+
+ return blargg_ok;
+}
+
+void Sgc_Impl::unload()
+{
+ rom.clear();
+ vectors.clear();
+ ram.clear();
+ ram2.clear();
+ unmapped_write.clear();
+ Gme_Loader::unload();
+}
+
+blargg_err_t Sgc_Impl::start_track( int track )
+{
+ memset( ram .begin(), 0, ram .size() );
+ memset( ram2.begin(), 0, ram2.size() );
+ memset( vectors.begin(), 0xFF, vectors.size() );
+ cpu.reset( unmapped_write.begin(), rom.unmapped() );
+
+ if ( sega_mapping() )
+ {
+ vectors_addr = 0x10000 - Sgc_Cpu::page_size;
+ idle_addr = vectors_addr;
+ for ( int i = 1; i < 8; ++i )
+ {
+ vectors [i*8 + 0] = 0xC3; // JP addr
+ vectors [i*8 + 1] = header_.rst_addrs [i*2 + 0];
+ vectors [i*8 + 2] = header_.rst_addrs [i*2 + 1];
+ }
+
+ cpu.map_mem( 0xC000, 0x2000, ram.begin() );
+ cpu.map_mem( vectors_addr, cpu.page_size, unmapped_write.begin(), vectors.begin() );
+
+ bank2 = NULL;
+ for ( int i = 0; i < 4; ++i )
+ cpu_write( 0xFFFC + i, header_.mapping [i] );
+ }
+ else
+ {
+ if ( !coleco_bios )
+ return BLARGG_ERR( BLARGG_ERR_CALLER, "Coleco BIOS not set" );
+
+ vectors_addr = 0;
+ cpu.map_mem( 0, 0x2000, unmapped_write.begin(), coleco_bios );
+ for ( int i = 0; i < 8; ++i )
+ cpu.map_mem( 0x6000 + i*0x400, 0x400, ram.begin() );
+
+ idle_addr = 0x2000;
+ cpu.map_mem( 0x2000, cpu.page_size, unmapped_write.begin(), vectors.begin() );
+
+ for ( int i = 0; i < 0x8000 / bank_size; ++i )
+ {
+ int addr = 0x8000 + i*bank_size;
+ cpu.map_mem( addr, bank_size, unmapped_write.begin(), rom.at_addr( addr ) );
+ }
+ }
+
+ cpu.r.sp = get_le16( header_.stack_ptr );
+ cpu.r.b.a = track;
+ next_play = play_period;
+
+ jsr( header_.init_addr );
+
+ return blargg_ok;
+}
+
+// Emulation
+
+void Sgc_Impl::jsr( byte const (&addr) [2] )
+{
+ *cpu.write( --cpu.r.sp ) = idle_addr >> 8;
+ *cpu.write( --cpu.r.sp ) = idle_addr & 0xFF;
+ cpu.r.pc = get_le16( addr );
+}
+
+void Sgc_Impl::set_bank( int bank, void const* data )
+{
+ //dprintf( "map bank %d to %p\n", bank, (byte*) data - rom.at_addr( 0 ) );
+ cpu.map_mem( bank * bank_size, bank_size, unmapped_write.begin(), data );
+}
+
+void Sgc_Impl::cpu_write( addr_t addr, int data )
+{
+ if ( (addr ^ 0xFFFC) > 3 || !sega_mapping() )
+ {
+ *cpu.write( addr ) = data;
+ return;
+ }
+
+ switch ( addr )
+ {
+ case 0xFFFC:
+ cpu.map_mem( 2 * bank_size, bank_size, ram2.begin() );
+ if ( data & 0x08 )
+ break;
+
+ bank2 = ram2.begin();
+ // FALL THROUGH
+
+ case 0xFFFF: {
+ bool rom_mapped = (cpu.read( 2 * bank_size ) == bank2);
+ bank2 = rom.at_addr( data * bank_size );
+ if ( rom_mapped )
+ set_bank( 2, bank2 );
+ break;
+ }
+
+ case 0xFFFD:
+ set_bank( 0, rom.at_addr( data * bank_size ) );
+ break;
+
+ case 0xFFFE:
+ set_bank( 1, rom.at_addr( data * bank_size ) );
+ break;
+ }
+}
+
+int Sgc_Impl::cpu_in( addr_t addr )
+{
+ dprintf( "in %02X\n", addr );
+ return 0;
+}
+
+void Sgc_Impl::cpu_out( time_t, addr_t addr, int )
+{
+ dprintf( "out %02X\n", addr & 0xFF );
+}
+
+blargg_err_t Sgc_Impl::end_frame( time_t end )
+{
+ while ( cpu.time() < end )
+ {
+ time_t next = min( end, next_play );
+ if ( run_cpu( next ) )
+ {
+ set_warning( "Unsupported CPU instruction" );
+ cpu.set_time( next );
+ }
+
+ if ( cpu.r.pc == idle_addr )
+ cpu.set_time( next );
+
+ if ( cpu.time() >= next_play )
+ {
+ next_play += play_period;
+ if ( cpu.r.pc == idle_addr )
+ jsr( header_.play_addr );
+ }
+ }
+
+ next_play -= end;
+ check( next_play >= 0 );
+ cpu.adjust_time( -end );
+
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.h b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.h
new file mode 100644
index 00000000..21b7e3f4
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sgc_Impl.h
@@ -0,0 +1,114 @@
+// Sega/Game Gear/Coleco SGC music file emulator implementation internals
+
+// Game_Music_Emu 0.6-pre
+#ifndef SGC_IMPL_H
+#define SGC_IMPL_H
+
+#include "Gme_Loader.h"
+#include "Rom_Data.h"
+#include "Z80_Cpu.h"
+
+class Sgc_Impl : public Gme_Loader {
+public:
+
+ // SGC file header
+ struct header_t
+ {
+ enum { size = 0xA0 };
+
+ char tag [4]; // "SGC\x1A"
+ byte vers; // 0x01
+ byte rate; // 0=NTSC 1=PAL
+ byte reserved1 [2];
+ byte load_addr [2];
+ byte init_addr [2];
+ byte play_addr [2];
+ byte stack_ptr [2];
+ byte reserved2 [2];
+ byte rst_addrs [7*2];
+ byte mapping [4]; // Used by Sega only
+ byte first_song; // Song to start playing first
+ byte song_count;
+ byte first_effect;
+ byte last_effect;
+ byte system; // 0=Master System 1=Game Gear 2=Colecovision
+ byte reserved3 [23];
+ char game [32]; // strings can be 32 chars, NOT terminated
+ char author [32];
+ char copyright [32];
+
+ // True if header has valid file signature
+ bool valid_tag() const;
+
+ int effect_count() const { return last_effect ? last_effect - first_effect + 1 : 0; }
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return header_; }
+
+ int clock_rate() const { return header_.rate ? 3546893 : 3579545; }
+
+ // 0x2000 bytes
+ static void set_coleco_bios( void const* p ) { coleco_bios = p; }
+
+ // Clocks between calls to play routine
+ typedef int time_t;
+ void set_play_period( time_t p ) { play_period = p; }
+
+ // 0 = first track
+ blargg_err_t start_track( int );
+
+ // Runs for t clocks
+ blargg_err_t end_frame( time_t t );
+
+ // True if Master System or Game Gear
+ bool sega_mapping() const;
+
+protected:
+ typedef Z80_Cpu Sgc_Cpu;
+ Sgc_Cpu cpu;
+
+ typedef int addr_t;
+ virtual void cpu_out( time_t, addr_t, int data ) BLARGG_PURE( ; )
+
+// Implementation
+public:
+ Sgc_Impl();
+ ~Sgc_Impl();
+ virtual void unload();
+
+protected:
+ virtual blargg_err_t load_( Data_Reader& );
+
+private:
+ enum { bank_size = 0x4000 };
+
+ Rom_Data rom;
+ time_t play_period;
+ time_t next_play;
+ void const* bank2; // ROM selected for bank 2, in case RAM is currently hiding it
+ addr_t vectors_addr; // RST vectors start here
+ addr_t idle_addr; // return address for init/play routines
+ static void const* coleco_bios;
+
+ // large items
+ header_t header_;
+ blargg_vector<byte> vectors;
+ blargg_vector<byte> ram;
+ blargg_vector<byte> ram2;
+ blargg_vector<byte> unmapped_write;
+
+ bool run_cpu( time_t end );
+ void jsr( byte const (&addr) [2] );
+ void cpu_write( addr_t, int data );
+ int cpu_in( addr_t );
+
+ void set_bank( int bank, void const* data );
+};
+
+inline bool Sgc_Impl::sega_mapping() const
+{
+ return header_.system <= 1;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.cpp
new file mode 100644
index 00000000..5ad62e43
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.cpp
@@ -0,0 +1,371 @@
+// Sms_Snd_Emu 0.1.1. http://www.slack.net/~ant/
+
+#include "Sms_Apu.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const noise_osc = 3;
+
+void Sms_Apu::volume( double vol )
+{
+ vol *= 0.85 / osc_count / 64;
+ norm_synth.volume( vol );
+ fast_synth.volume( vol );
+}
+
+void Sms_Apu::treble_eq( blip_eq_t const& eq )
+{
+ norm_synth.treble_eq( eq );
+ fast_synth.treble_eq( eq );
+}
+
+inline int Sms_Apu::calc_output( int i ) const
+{
+ int flags = ggstereo >> i;
+ return (flags >> 3 & 2) | (flags & 1);
+}
+
+void Sms_Apu::set_output( int i, Blip_Buffer* center, Blip_Buffer* left, Blip_Buffer* right )
+{
+ // Must be silent (all NULL), mono (left and right NULL), or stereo (none NULL)
+ require( !center || (center && !left && !right) || (center && left && right) );
+ require( (unsigned) i < osc_count ); // fails if you pass invalid osc index
+
+ if ( center )
+ {
+ unsigned const divisor = 16384 * 16 * 2;
+ min_tone_period = ((unsigned) center->clock_rate() + divisor/2) / divisor;
+ }
+
+ if ( !center || !left || !right )
+ {
+ left = center;
+ right = center;
+ }
+
+ Osc& o = oscs [i];
+ o.outputs [0] = NULL;
+ o.outputs [1] = right;
+ o.outputs [2] = left;
+ o.outputs [3] = center;
+ o.output = o.outputs [calc_output( i )];
+}
+
+void Sms_Apu::set_output( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ for ( int i = osc_count; --i >= 0; )
+ set_output( i, c, l, r );
+}
+
+static inline unsigned fibonacci_to_galois_lfsr( unsigned fibonacci, int width )
+{
+ unsigned galois = 0;
+ while ( --width >= 0 )
+ {
+ galois = (galois << 1) | (fibonacci & 1);
+ fibonacci >>= 1;
+ }
+ return galois;
+}
+
+void Sms_Apu::reset( unsigned feedback, int noise_width )
+{
+ last_time = 0;
+ latch = 0;
+ ggstereo = 0;
+
+ // Calculate noise feedback values
+ if ( !feedback || !noise_width )
+ {
+ feedback = 0x0009;
+ noise_width = 16;
+ }
+ looped_feedback = 1 << (noise_width - 1);
+ noise_feedback = fibonacci_to_galois_lfsr( feedback, noise_width );
+
+ // Reset oscs
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Osc& o = oscs [i];
+ o.output = NULL;
+ o.last_amp = 0;
+ o.delay = 0;
+ o.phase = 0;
+ o.period = 0;
+ o.volume = 15; // silent
+ }
+
+ oscs [noise_osc].phase = 0x8000;
+ write_ggstereo( 0, 0xFF );
+}
+
+Sms_Apu::Sms_Apu()
+{
+ min_tone_period = 7;
+
+ // Clear outputs to NULL FIRST
+ ggstereo = 0;
+ set_output( NULL );
+
+ volume( 1.0 );
+ reset();
+}
+
+void Sms_Apu::run_until( blip_time_t end_time )
+{
+ require( end_time >= last_time );
+ if ( end_time <= last_time )
+ return;
+
+ // Synthesize each oscillator
+ for ( int idx = osc_count; --idx >= 0; )
+ {
+ Osc& osc = oscs [idx];
+ int vol = 0;
+ int amp = 0;
+
+ // Determine what will be generated
+ Blip_Buffer* const out = osc.output;
+ if ( out )
+ {
+ // volumes [i] ~= 64 * pow( 1.26, 15 - i ) / pow( 1.26, 15 )
+ static unsigned char const volumes [16] = {
+ 64, 50, 40, 32, 25, 20, 16, 13, 10, 8, 6, 5, 4, 3, 2, 0
+ };
+
+ vol = volumes [osc.volume];
+ amp = (osc.phase & 1) * vol;
+
+ // Square freq above 16 kHz yields constant amplitude at half volume
+ if ( idx != noise_osc && osc.period < min_tone_period )
+ {
+ amp = vol >> 1;
+ vol = 0;
+ }
+
+ // Update amplitude
+ int delta = amp - osc.last_amp;
+ if ( delta )
+ {
+ osc.last_amp = amp;
+ norm_synth.offset( last_time, delta, out );
+ out->set_modified();
+ }
+ }
+
+ // Generate wave
+ blip_time_t time = last_time + osc.delay;
+ if ( time < end_time )
+ {
+ // Calculate actual period
+ int period = osc.period;
+ if ( idx == noise_osc )
+ {
+ period = 0x20 << (period & 3);
+ if ( period == 0x100 )
+ period = oscs [2].period * 2;
+ }
+ period *= 0x10;
+ if ( !period )
+ period = 0x10;
+
+ // Maintain phase when silent
+ int phase = osc.phase;
+ if ( !vol )
+ {
+ int count = (end_time - time + period - 1) / period;
+ time += count * period;
+ if ( idx != noise_osc ) // TODO: maintain noise LFSR phase?
+ phase ^= count & 1;
+ }
+ else
+ {
+ int delta = amp * 2 - vol;
+
+ if ( idx != noise_osc )
+ {
+ // Square
+ do
+ {
+ delta = -delta;
+ norm_synth.offset( time, delta, out );
+ time += period;
+ }
+ while ( time < end_time );
+ phase = (delta >= 0);
+ }
+ else
+ {
+ // Noise
+ unsigned const feedback = (osc.period & 4 ? noise_feedback : looped_feedback);
+ do
+ {
+ unsigned changed = phase + 1;
+ phase = ((phase & 1) * feedback) ^ (phase >> 1);
+ if ( changed & 2 ) // true if bits 0 and 1 differ
+ {
+ delta = -delta;
+ fast_synth.offset_inline( time, delta, out );
+ }
+ time += period;
+ }
+ while ( time < end_time );
+ check( phase );
+ }
+ osc.last_amp = (phase & 1) * vol;
+ out->set_modified();
+ }
+ osc.phase = phase;
+ }
+ osc.delay = time - end_time;
+ }
+ last_time = end_time;
+}
+
+void Sms_Apu::write_ggstereo( blip_time_t time, int data )
+{
+ require( (unsigned) data <= 0xFF );
+
+ run_until( time );
+ ggstereo = data;
+
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Osc& osc = oscs [i];
+
+ Blip_Buffer* old = osc.output;
+ osc.output = osc.outputs [calc_output( i )];
+ if ( osc.output != old )
+ {
+ int delta = -osc.last_amp;
+ if ( delta )
+ {
+ osc.last_amp = 0;
+ if ( old )
+ {
+ old->set_modified();
+ fast_synth.offset( last_time, delta, old );
+ }
+ }
+ }
+ }
+}
+
+void Sms_Apu::write_data( blip_time_t time, int data )
+{
+ require( (unsigned) data <= 0xFF );
+
+ run_until( time );
+
+ if ( data & 0x80 )
+ latch = data;
+
+ // We want the raw values written so our save state format can be
+ // as close to hardware as possible and unspecific to any emulator.
+ int idx = latch >> 5 & 3;
+ Osc& osc = oscs [idx];
+ if ( latch & 0x10 )
+ {
+ osc.volume = data & 0x0F;
+ }
+ else
+ {
+ if ( idx == noise_osc )
+ osc.phase = 0x8000; // reset noise LFSR
+
+ // Replace high 6 bits/low 4 bits of register with data
+ int lo = osc.period;
+ int hi = data << 4;
+ if ( idx == noise_osc || (data & 0x80) )
+ {
+ hi = lo;
+ lo = data;
+ }
+ osc.period = (hi & 0x3F0) | (lo & 0x00F);
+ }
+}
+
+void Sms_Apu::end_frame( blip_time_t end_time )
+{
+ if ( end_time > last_time )
+ run_until( end_time );
+
+ last_time -= end_time;
+ assert( last_time >= 0 );
+}
+
+#if SMS_APU_CUSTOM_STATE
+ #define REFLECT( x, y ) (save ? (io->y) = (x) : (x) = (io->y) )
+#else
+ #define REFLECT( x, y ) (save ? set_val( io->y, x ) : (void) ((x) = get_val( io->y )))
+
+ static unsigned get_val( byte const p [] )
+ {
+ return p [3] * 0x1000000 + p [2] * 0x10000 + p [1] * 0x100 + p [0];
+ }
+
+ static void set_val( byte p [], unsigned n )
+ {
+ p [0] = (byte) (n );
+ p [1] = (byte) (n >> 8);
+ p [2] = (byte) (n >> 16);
+ p [3] = (byte) (n >> 24);
+ }
+#endif
+
+inline const char* Sms_Apu::save_load( sms_apu_state_t* io, bool save )
+{
+ #if !SMS_APU_CUSTOM_STATE
+ assert( sizeof (sms_apu_state_t) == 128 );
+ #endif
+
+ // Format of data, where later format is incompatible with earlier
+ int format = io->format0;
+ REFLECT( format, format );
+ if ( format != io->format0 )
+ return "Unsupported sound save state format";
+
+ // Version of data, where later versions just add fields to the end
+ int version = 0;
+ REFLECT( version, version );
+
+ REFLECT( latch, latch );
+ REFLECT( ggstereo, ggstereo );
+
+ for ( int i = osc_count; --i >= 0; )
+ {
+ Osc& osc = oscs [i];
+ REFLECT( osc.period, periods [i] );
+ REFLECT( osc.volume, volumes [i] );
+ REFLECT( osc.delay, delays [i] );
+ REFLECT( osc.phase, phases [i] );
+ }
+
+ return 0;
+}
+
+void Sms_Apu::save_state( sms_apu_state_t* out )
+{
+ save_load( out, true );
+ #if !SMS_APU_CUSTOM_STATE
+ memset( out->unused, 0, sizeof out->unused );
+ #endif
+}
+
+blargg_err_t Sms_Apu::load_state( sms_apu_state_t const& in )
+{
+ RETURN_ERR( save_load( CONST_CAST(sms_apu_state_t*,&in), false ) );
+ write_ggstereo( 0, ggstereo );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.h
new file mode 100644
index 00000000..1da4da30
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Apu.h
@@ -0,0 +1,128 @@
+// Sega Master System SN76489 PSG sound chip emulator
+
+// Sms_Snd_Emu 0.1.2
+#ifndef SMS_APU_H
+#define SMS_APU_H
+
+#include "blargg_common.h"
+#include "Blip_Buffer.h"
+
+struct sms_apu_state_t;
+
+class Sms_Apu {
+public:
+// Basics
+
+ // Sets buffer(s) to generate sound into, or 0 to mute. If only center is not 0,
+ // output is mono.
+ void set_output( Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Emulates to time t, then writes data to Game Gear left/right assignment byte
+ void write_ggstereo( blip_time_t t, int data );
+
+ // Emulates to time t, then writes data
+ void write_data( blip_time_t t, int data );
+
+ // Emulates to time t, then subtracts t from the current time.
+ // OK if previous write call had time slightly after t.
+ void end_frame( blip_time_t t );
+
+// More features
+
+ // Resets sound chip and sets noise feedback bits and width
+ void reset( unsigned noise_feedback = 0, int noise_width = 0 );
+
+ // Same as set_output(), but for a particular channel
+ // 0: Square 1, 1: Square 2, 2: Square 3, 3: Noise
+ enum { osc_count = 4 }; // 0 <= chan < osc_count
+ void set_output( int chan, Blip_Buffer* center, Blip_Buffer* left = NULL, Blip_Buffer* right = NULL );
+
+ // Sets overall volume, where 1.0 is normal
+ void volume( double );
+
+ // Sets treble equalization
+ void treble_eq( blip_eq_t const& );
+
+ // Saves full emulation state to state_out. Data format is portable and
+ // includes some extra space to avoid expansion in case more state needs
+ // to be stored in the future.
+ void save_state( sms_apu_state_t* state_out );
+
+ // Loads state. You should call reset() BEFORE this.
+ blargg_err_t load_state( sms_apu_state_t const& in );
+
+private:
+ // noncopyable
+ Sms_Apu( const Sms_Apu& );
+ Sms_Apu& operator = ( const Sms_Apu& );
+
+// Implementation
+public:
+ Sms_Apu();
+ ~Sms_Apu() { }
+ BLARGG_DISABLE_NOTHROW
+
+ // Use set_output() instead
+ BLARGG_DEPRECATED( void output ( Blip_Buffer* c ) { set_output( c, c, c ); } )
+ BLARGG_DEPRECATED( void output ( Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( c, l, r ); } )
+ BLARGG_DEPRECATED( void osc_output( int i, Blip_Buffer* c ) { set_output( i, c, c, c ); } )
+ BLARGG_DEPRECATED( void osc_output( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r ) { set_output( i, c, l, r ); } )
+
+private:
+ struct Osc
+ {
+ Blip_Buffer* outputs [4]; // NULL, right, left, center
+ Blip_Buffer* output;
+ int last_amp;
+
+ int volume;
+ int period;
+ int delay;
+ unsigned phase;
+ };
+
+ Osc oscs [osc_count];
+ int ggstereo;
+ int latch;
+
+ blip_time_t last_time;
+ int min_tone_period;
+ unsigned noise_feedback;
+ unsigned looped_feedback;
+ Blip_Synth_Fast fast_synth;
+ Blip_Synth_Norm norm_synth;
+
+ int calc_output( int i ) const;
+ void run_until( blip_time_t );
+ const char* save_load( sms_apu_state_t*, bool save );
+ friend class Sms_Apu_Tester;
+};
+
+struct sms_apu_state_t
+{
+ // If SMS_APU_CUSTOM_STATE is 1, values are stored as normal integers,
+ // so your code can then save and load them however it likes. Otherwise,
+ // they are 4-byte arrays in little-endian format, making entire
+ // structure suitable for direct storage on disk.
+
+#if SMS_APU_CUSTOM_STATE
+ typedef int val_t;
+#else
+ typedef unsigned char val_t [4];
+#endif
+
+ enum { format0 = 0x50414D53 };
+
+ val_t format;
+ val_t version;
+ val_t latch;
+ val_t ggstereo;
+ val_t periods [4];
+ val_t volumes [4];
+ val_t delays [4];
+ val_t phases [4];
+
+ val_t unused [12]; // for future expansion
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.cpp
new file mode 100644
index 00000000..55ad8beb
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.cpp
@@ -0,0 +1,80 @@
+#include "Sms_Fm_Apu.h"
+
+#include "blargg_source.h"
+
+Sms_Fm_Apu::Sms_Fm_Apu()
+{ }
+
+Sms_Fm_Apu::~Sms_Fm_Apu()
+{ }
+
+blargg_err_t Sms_Fm_Apu::init( double clock_rate, double sample_rate )
+{
+ period_ = clock_rate / sample_rate + 0.5;
+ CHECK_ALLOC( !apu.set_rate( sample_rate, clock_rate ) );
+
+ set_output( 0 );
+ volume( 1.0 );
+ reset();
+ return blargg_ok;
+}
+
+void Sms_Fm_Apu::reset()
+{
+ addr = 0;
+ next_time = 0;
+ last_amp = 0;
+
+ apu.reset();
+}
+
+void Sms_Fm_Apu::write_data( blip_time_t time, int data )
+{
+ if ( time > next_time )
+ run_until( time );
+
+ apu.write( addr, data );
+}
+
+void Sms_Fm_Apu::run_until( blip_time_t end_time )
+{
+ assert( end_time > next_time );
+
+ Blip_Buffer* const output = this->output_;
+ if ( !output )
+ {
+ next_time = end_time;
+ return;
+ }
+
+ blip_time_t time = next_time;
+ do
+ {
+ Ym2413_Emu::sample_t samples [2];
+ apu.run( 1, samples );
+ int amp = (samples [0] + samples [1]) >> 1;
+
+ int delta = amp - last_amp;
+ if ( delta )
+ {
+ last_amp = amp;
+ synth.offset_inline( time, delta, output );
+ }
+ time += period_;
+ }
+ while ( time < end_time );
+
+ next_time = time;
+}
+
+void Sms_Fm_Apu::end_frame( blip_time_t time )
+{
+ if ( time > next_time )
+ run_until( time );
+
+ next_time -= time;
+ assert( next_time >= 0 );
+
+ if ( output_ )
+ output_->set_modified();
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.h b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.h
new file mode 100644
index 00000000..5fc2ea1e
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Sms_Fm_Apu.h
@@ -0,0 +1,47 @@
+#ifndef SMS_FM_APU_H
+#define SMS_FM_APU_H
+
+#include "Blip_Buffer.h"
+#include "Ym2413_Emu.h"
+
+class Sms_Fm_Apu {
+public:
+ static bool supported() { return Ym2413_Emu::supported(); }
+ blargg_err_t init( double clock_rate, double sample_rate );
+
+ void set_output( Blip_Buffer* b, Blip_Buffer* = NULL, Blip_Buffer* = NULL ) { output_ = b; }
+ void volume( double v ) { synth.volume( 0.4 / 4096 * v ); }
+ void treble_eq( blip_eq_t const& eq ) { synth.treble_eq( eq ); }
+
+ void reset();
+
+ void write_addr( int data ) { addr = data; }
+ void write_data( blip_time_t, int data );
+
+ void end_frame( blip_time_t t );
+
+// Implementation
+public:
+ Sms_Fm_Apu();
+ ~Sms_Fm_Apu();
+ BLARGG_DISABLE_NOTHROW
+ enum { osc_count = 1 };
+ void set_output( int i, Blip_Buffer* b, Blip_Buffer* = NULL, Blip_Buffer* = NULL ) { output_ = b; }
+
+private:
+ Blip_Buffer* output_;
+ blip_time_t next_time;
+ int last_amp;
+ int addr;
+
+ int clock_;
+ int rate_;
+ blip_time_t period_;
+
+ Blip_Synth_Norm synth;
+ Ym2413_Emu apu;
+
+ void run_until( blip_time_t );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.cpp
new file mode 100644
index 00000000..caa2fef4
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.cpp
@@ -0,0 +1,378 @@
+// SPC emulation support: init, sample buffering, reset, SPC loading
+
+// snes_spc 0.9.0. http://www.slack.net/~ant/
+
+#include "Snes_Spc.h"
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define RAM (m.ram.ram)
+#define REGS (m.smp_regs [0])
+#define REGS_IN (m.smp_regs [1])
+
+// (n ? n : 256)
+#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1)
+
+
+//// Init
+
+blargg_err_t Snes_Spc::init()
+{
+ memset( &m, 0, sizeof m );
+ dsp.init( RAM );
+
+ m.tempo = tempo_unit;
+
+ // Most SPC music doesn't need ROM, and almost all the rest only rely
+ // on these two bytes
+ m.rom [0x3E] = 0xFF;
+ m.rom [0x3F] = 0xC0;
+
+ static unsigned char const cycle_table [128] =
+ {// 01 23 45 67 89 AB CD EF
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x68, // 0
+ 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x46, // 1
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x74, // 2
+ 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x38, // 3
+ 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x66, // 4
+ 0x48,0x47,0x45,0x56,0x55,0x45,0x22,0x43, // 5
+ 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x75, // 6
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x36, // 7
+ 0x28,0x47,0x34,0x36,0x26,0x54,0x52,0x45, // 8
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0xC5, // 9
+ 0x38,0x47,0x34,0x36,0x26,0x44,0x52,0x44, // A
+ 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x34, // B
+ 0x38,0x47,0x45,0x47,0x25,0x64,0x52,0x49, // C
+ 0x48,0x47,0x56,0x67,0x45,0x55,0x22,0x83, // D
+ 0x28,0x47,0x34,0x36,0x24,0x53,0x43,0x40, // E
+ 0x48,0x47,0x45,0x56,0x34,0x54,0x22,0x60, // F
+ };
+
+ // unpack cycle table
+ for ( int i = 0; i < 128; i++ )
+ {
+ int n = cycle_table [i];
+ m.cycle_table [i * 2 + 0] = n >> 4;
+ m.cycle_table [i * 2 + 1] = n & 0x0F;
+ }
+
+ #if SPC_LESS_ACCURATE
+ memcpy( reg_times, reg_times_, sizeof reg_times );
+ #endif
+
+ reset();
+ return blargg_ok;
+}
+
+void Snes_Spc::init_rom( uint8_t const in [rom_size] )
+{
+ memcpy( m.rom, in, sizeof m.rom );
+}
+
+void Snes_Spc::set_tempo( int t )
+{
+ m.tempo = t;
+ int const timer2_shift = 4; // 64 kHz
+ int const other_shift = 3; // 8 kHz
+
+ #if SPC_DISABLE_TEMPO
+ m.timers [2].prescaler = timer2_shift;
+ m.timers [1].prescaler = timer2_shift + other_shift;
+ m.timers [0].prescaler = timer2_shift + other_shift;
+ #else
+ if ( !t )
+ t = 1;
+ int const timer2_rate = 1 << timer2_shift;
+ int rate = (timer2_rate * tempo_unit + (t >> 1)) / t;
+ if ( rate < timer2_rate / 4 )
+ rate = timer2_rate / 4; // max 4x tempo
+ m.timers [2].prescaler = rate;
+ m.timers [1].prescaler = rate << other_shift;
+ m.timers [0].prescaler = rate << other_shift;
+ #endif
+}
+
+// Timer registers have been loaded. Applies these to the timers. Does not
+// reset timer prescalers or dividers.
+void Snes_Spc::timers_loaded()
+{
+ int i;
+ for ( i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ t->period = IF_0_THEN_256( REGS [r_t0target + i] );
+ t->enabled = REGS [r_control] >> i & 1;
+ t->counter = REGS_IN [r_t0out + i] & 0x0F;
+ }
+
+ set_tempo( m.tempo );
+}
+
+// Loads registers from unified 16-byte format
+void Snes_Spc::load_regs( uint8_t const in [reg_count] )
+{
+ memcpy( REGS, in, reg_count );
+ memcpy( REGS_IN, REGS, reg_count );
+
+ // These always read back as 0
+ REGS_IN [r_test ] = 0;
+ REGS_IN [r_control ] = 0;
+ REGS_IN [r_t0target] = 0;
+ REGS_IN [r_t1target] = 0;
+ REGS_IN [r_t2target] = 0;
+}
+
+// RAM was just loaded from SPC, with $F0-$FF containing SMP registers
+// and timer counts. Copies these to proper registers.
+void Snes_Spc::ram_loaded()
+{
+ m.rom_enabled = 0;
+ load_regs( &RAM [0xF0] );
+
+ // Put STOP instruction around memory to catch PC underflow/overflow
+ memset( m.ram.padding1, cpu_pad_fill, sizeof m.ram.padding1 );
+ memset( m.ram.padding2, cpu_pad_fill, sizeof m.ram.padding2 );
+}
+
+// Registers were just loaded. Applies these new values.
+void Snes_Spc::regs_loaded()
+{
+ enable_rom( REGS [r_control] & 0x80 );
+ timers_loaded();
+}
+
+void Snes_Spc::reset_time_regs()
+{
+ m.cpu_error = NULL;
+ m.echo_accessed = 0;
+ m.spc_time = 0;
+ m.dsp_time = 0;
+ #if SPC_LESS_ACCURATE
+ m.dsp_time = clocks_per_sample + 1;
+ #endif
+
+ for ( int i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ t->next_time = 1;
+ t->divider = 0;
+ }
+
+ regs_loaded();
+
+ m.extra_clocks = 0;
+ reset_buf();
+}
+
+void Snes_Spc::reset_common( int timer_counter_init )
+{
+ int i;
+ for ( i = 0; i < timer_count; i++ )
+ REGS_IN [r_t0out + i] = timer_counter_init;
+
+ // Run IPL ROM
+ memset( &m.cpu_regs, 0, sizeof m.cpu_regs );
+ m.cpu_regs.pc = rom_addr;
+
+ REGS [r_test ] = 0x0A;
+ REGS [r_control] = 0xB0; // ROM enabled, clear ports
+ for ( i = 0; i < port_count; i++ )
+ REGS_IN [r_cpuio0 + i] = 0;
+
+ reset_time_regs();
+}
+
+void Snes_Spc::soft_reset()
+{
+ reset_common( 0 );
+ dsp.soft_reset();
+}
+
+void Snes_Spc::reset()
+{
+ memset( RAM, 0xFF, 0x10000 );
+ ram_loaded();
+ reset_common( 0x0F );
+ dsp.reset();
+}
+
+char const Snes_Spc::signature [signature_size + 1] =
+ "SNES-SPC700 Sound File Data v0.30\x1A\x1A";
+
+blargg_err_t Snes_Spc::load_spc( void const* data, long size )
+{
+ spc_file_t const* const spc = (spc_file_t const*) data;
+
+ // be sure compiler didn't insert any padding into fle_t
+ assert( sizeof (spc_file_t) == spc_min_file_size + 0x80 );
+
+ // Check signature and file size
+ if ( size < signature_size || memcmp( spc, signature, 27 ) )
+ return "Not an SPC file";
+
+ if ( size < spc_min_file_size )
+ return "Corrupt SPC file";
+
+ // CPU registers
+ m.cpu_regs.pc = spc->pch * 0x100 + spc->pcl;
+ m.cpu_regs.a = spc->a;
+ m.cpu_regs.x = spc->x;
+ m.cpu_regs.y = spc->y;
+ m.cpu_regs.psw = spc->psw;
+ m.cpu_regs.sp = spc->sp;
+
+ // RAM and registers
+ memcpy( RAM, spc->ram, 0x10000 );
+ ram_loaded();
+
+ // DSP registers
+ dsp.load( spc->dsp );
+
+ reset_time_regs();
+
+ return blargg_ok;
+}
+
+void Snes_Spc::clear_echo()
+{
+ if ( !(dsp.read( Spc_Dsp::r_flg ) & 0x20) )
+ {
+ int addr = 0x100 * dsp.read( Spc_Dsp::r_esa );
+ int end = addr + 0x800 * (dsp.read( Spc_Dsp::r_edl ) & 0x0F);
+ if ( end > 0x10000 )
+ end = 0x10000;
+ memset( &RAM [addr], 0xFF, end - addr );
+ }
+}
+
+
+//// Sample output
+
+void Snes_Spc::reset_buf()
+{
+ // Start with half extra buffer of silence
+ sample_t* out = m.extra_buf;
+ while ( out < &m.extra_buf [extra_size / 2] )
+ *out++ = 0;
+
+ m.extra_pos = out;
+ m.buf_begin = NULL;
+
+ dsp.set_output( NULL, 0 );
+}
+
+void Snes_Spc::set_output( sample_t out [], int size )
+{
+ require( (size & 1) == 0 ); // size must be even
+
+ m.extra_clocks &= clocks_per_sample - 1;
+ if ( out )
+ {
+ sample_t const* out_end = out + size;
+ m.buf_begin = out;
+ m.buf_end = out_end;
+
+ // Copy extra to output
+ sample_t const* in = m.extra_buf;
+ while ( in < m.extra_pos && out < out_end )
+ *out++ = *in++;
+
+ // Handle output being full already
+ if ( out >= out_end )
+ {
+ // Have DSP write to remaining extra space
+ out = dsp.extra();
+ out_end = &dsp.extra() [extra_size];
+
+ // Copy any remaining extra samples as if DSP wrote them
+ while ( in < m.extra_pos )
+ *out++ = *in++;
+ assert( out <= out_end );
+ }
+
+ dsp.set_output( out, out_end - out );
+ }
+ else
+ {
+ reset_buf();
+ }
+}
+
+void Snes_Spc::save_extra()
+{
+ // Get end pointers
+ sample_t const* main_end = m.buf_end; // end of data written to buf
+ sample_t const* dsp_end = dsp.out_pos(); // end of data written to dsp.extra()
+ if ( m.buf_begin <= dsp_end && dsp_end <= main_end )
+ {
+ main_end = dsp_end;
+ dsp_end = dsp.extra(); // nothing in DSP's extra
+ }
+
+ // Copy any extra samples at these ends into extra_buf
+ sample_t* out = m.extra_buf;
+ sample_t const* in;
+ for ( in = m.buf_begin + sample_count(); in < main_end; in++ )
+ *out++ = *in;
+ for ( in = dsp.extra(); in < dsp_end ; in++ )
+ *out++ = *in;
+
+ m.extra_pos = out;
+ assert( out <= &m.extra_buf [extra_size] );
+}
+
+blargg_err_t Snes_Spc::play( int count, sample_t out [] )
+{
+ require( (count & 1) == 0 ); // must be even
+ if ( count )
+ {
+ set_output( out, count );
+ end_frame( count * (clocks_per_sample / 2) );
+ }
+
+ const char* err = m.cpu_error;
+ m.cpu_error = NULL;
+ return err;
+}
+
+blargg_err_t Snes_Spc::skip( int count )
+{
+ #if SPC_LESS_ACCURATE
+ if ( count > 2 * sample_rate * 2 )
+ {
+ set_output( NULL, 0 );
+
+ // Skip a multiple of 4 samples
+ time_t end = count;
+ count = (count & 3) + 1 * sample_rate * 2;
+ end = (end - count) * (clocks_per_sample / 2);
+
+ m.skipped_kon = 0;
+ m.skipped_koff = 0;
+
+ // Preserve DSP and timer synchronization
+ // TODO: verify that this really preserves it
+ int old_dsp_time = m.dsp_time + m.spc_time;
+ m.dsp_time = end - m.spc_time + skipping_time;
+ end_frame( end );
+ m.dsp_time = m.dsp_time - skipping_time + old_dsp_time;
+
+ dsp.write( Spc_Dsp::r_koff, m.skipped_koff & ~m.skipped_kon );
+ dsp.write( Spc_Dsp::r_kon , m.skipped_kon );
+ clear_echo();
+ }
+ #endif
+
+ return play( count, NULL );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.h b/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.h
new file mode 100644
index 00000000..0882354a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Snes_Spc.h
@@ -0,0 +1,291 @@
+// SNES SPC-700 APU emulator
+
+// snes_spc 0.9.0
+#ifndef SNES_SPC_H
+#define SNES_SPC_H
+
+#include "Spc_Dsp.h"
+#include "blargg_endian.h"
+
+struct Snes_Spc {
+public:
+ typedef BOOST::uint8_t uint8_t;
+
+ // Must be called once before using
+ blargg_err_t init();
+
+ // Sample pairs generated per second
+ enum { sample_rate = 32000 };
+
+// Emulator use
+
+ // Sets IPL ROM data. Library does not include ROM data. Most SPC music files
+ // don't need ROM, but a full emulator must provide this.
+ enum { rom_size = 0x40 };
+ void init_rom( uint8_t const rom [rom_size] );
+
+ // Sets destination for output samples
+ typedef short sample_t;
+ void set_output( sample_t* out, int out_size );
+
+ // Number of samples written to output since last set
+ int sample_count() const;
+
+ // Resets SPC to power-on state. This resets your output buffer, so you must
+ // call set_output() after this.
+ void reset();
+
+ // Emulates pressing reset switch on SNES. This resets your output buffer, so
+ // you must call set_output() after this.
+ void soft_reset();
+
+ // 1024000 SPC clocks per second, sample pair every 32 clocks
+ typedef int time_t;
+ enum { clock_rate = 1024000 };
+ enum { clocks_per_sample = 32 };
+
+ // Emulated port read/write at specified time
+ enum { port_count = 4 };
+ int read_port ( time_t, int port );
+ void write_port( time_t, int port, int data );
+
+ // Runs SPC to end_time and starts a new time frame at 0
+ void end_frame( time_t end_time );
+
+// Sound control
+
+ // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events).
+ // Reduces emulation accuracy.
+ enum { voice_count = 8 };
+ void mute_voices( int mask );
+
+ // If true, prevents channels and global volumes from being phase-negated.
+ void disable_surround( bool disable = true );
+
+ // If true, enables cubic interpolation
+ void interpolation_level( int level = 0 );
+
+ // Sets tempo, where tempo_unit = normal, tempo_unit / 2 = half speed, etc.
+ enum { tempo_unit = 0x100 };
+ void set_tempo( int );
+
+// SPC music files
+
+ // Loads SPC data into emulator
+ enum { spc_min_file_size = 0x10180 };
+ enum { spc_file_size = 0x10200 };
+ blargg_err_t load_spc( void const* in, long size );
+
+ // Clears echo region. Useful after loading an SPC as many have garbage in echo.
+ void clear_echo();
+
+ // Plays for count samples and write samples to out. Discards samples if out
+ // is NULL. Count must be a multiple of 2 since output is stereo.
+ blargg_err_t play( int count, sample_t out [] );
+
+ // Skips count samples. Several times faster than play() when using fast DSP.
+ blargg_err_t skip( int count );
+
+// State save/load (only available with accurate DSP)
+
+#if !SPC_NO_COPY_STATE_FUNCS
+ // Saves/loads state
+ enum { state_size = 67 * 1024 }; // maximum space needed when saving
+ typedef Spc_Dsp::copy_func_t copy_func_t;
+ void copy_state( unsigned char** io, copy_func_t );
+
+ // Writes minimal header to spc_out
+ static void init_header( void* spc_out );
+
+ // Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out.
+ // Does not set up SPC header; use init_header() for that.
+ void save_spc( void* spc_out );
+
+ // Returns true if new key-on events occurred since last check. Useful for
+ // trimming silence while saving an SPC.
+ bool check_kon();
+#endif
+
+public:
+ // TODO: document
+ struct regs_t
+ {
+ int pc;
+ int a;
+ int x;
+ int y;
+ int psw;
+ int sp;
+ };
+ regs_t& smp_regs() { return m.cpu_regs; }
+
+ uint8_t* smp_ram() { return m.ram.ram; }
+
+ void run_until( time_t t ) { run_until_( t ); }
+public:
+ BLARGG_DISABLE_NOTHROW
+
+ typedef BOOST::uint16_t uint16_t;
+
+ // Time relative to m_spc_time. Speeds up code a bit by eliminating need to
+ // constantly add m_spc_time to time from CPU. CPU uses time that ends at
+ // 0 to eliminate reloading end time every instruction. It pays off.
+ typedef int rel_time_t;
+
+ struct Timer
+ {
+ rel_time_t next_time; // time of next event
+ int prescaler;
+ int period;
+ int divider;
+ int enabled;
+ int counter;
+ };
+ enum { reg_count = 0x10 };
+ enum { timer_count = 3 };
+ enum { extra_size = Spc_Dsp::extra_size };
+
+ enum { signature_size = 35 };
+
+private:
+ Spc_Dsp dsp;
+
+ #if SPC_LESS_ACCURATE
+ static signed char const reg_times_ [256];
+ signed char reg_times [256];
+ #endif
+
+ struct state_t
+ {
+ Timer timers [timer_count];
+
+ uint8_t smp_regs [2] [reg_count];
+
+ regs_t cpu_regs;
+
+ rel_time_t dsp_time;
+ time_t spc_time;
+ bool echo_accessed;
+
+ int tempo;
+ int skipped_kon;
+ int skipped_koff;
+ const char* cpu_error;
+
+ int extra_clocks;
+ sample_t* buf_begin;
+ sample_t const* buf_end;
+ sample_t* extra_pos;
+ sample_t extra_buf [extra_size];
+
+ int rom_enabled;
+ uint8_t rom [rom_size];
+ uint8_t hi_ram [rom_size];
+
+ unsigned char cycle_table [256];
+
+ struct
+ {
+ // padding to neutralize address overflow
+ union {
+ uint8_t padding1 [0x100];
+ uint16_t align; // makes compiler align data for 16-bit access
+ } padding1 [1];
+ uint8_t ram [0x10000];
+ uint8_t padding2 [0x100];
+ } ram;
+ };
+ state_t m;
+
+ enum { rom_addr = 0xFFC0 };
+
+ enum { skipping_time = 127 };
+
+ // Value that padding should be filled with
+ enum { cpu_pad_fill = 0xFF };
+
+ enum {
+ r_test = 0x0, r_control = 0x1,
+ r_dspaddr = 0x2, r_dspdata = 0x3,
+ r_cpuio0 = 0x4, r_cpuio1 = 0x5,
+ r_cpuio2 = 0x6, r_cpuio3 = 0x7,
+ r_f8 = 0x8, r_f9 = 0x9,
+ r_t0target = 0xA, r_t1target = 0xB, r_t2target = 0xC,
+ r_t0out = 0xD, r_t1out = 0xE, r_t2out = 0xF
+ };
+
+ void timers_loaded();
+ void enable_rom( int enable );
+ void reset_buf();
+ void save_extra();
+ void load_regs( uint8_t const in [reg_count] );
+ void ram_loaded();
+ void regs_loaded();
+ void reset_time_regs();
+ void reset_common( int timer_counter_init );
+
+ Timer* run_timer_ ( Timer* t, rel_time_t );
+ Timer* run_timer ( Timer* t, rel_time_t );
+ int dsp_read ( rel_time_t );
+ void dsp_write ( int data, rel_time_t );
+ void cpu_write_smp_reg_( int data, rel_time_t, int addr );
+ void cpu_write_smp_reg ( int data, rel_time_t, int addr );
+ void cpu_write_high ( int data, int i, rel_time_t );
+ void cpu_write ( int data, int addr, rel_time_t );
+ int cpu_read_smp_reg ( int i, rel_time_t );
+ int cpu_read ( int addr, rel_time_t );
+ unsigned CPU_mem_bit ( uint8_t const* pc, rel_time_t );
+
+ bool check_echo_access ( int addr );
+ uint8_t* run_until_( time_t end_time );
+
+ struct spc_file_t
+ {
+ char signature [signature_size];
+ uint8_t has_id666;
+ uint8_t version;
+ uint8_t pcl, pch;
+ uint8_t a;
+ uint8_t x;
+ uint8_t y;
+ uint8_t psw;
+ uint8_t sp;
+ char text [212];
+ uint8_t ram [0x10000];
+ uint8_t dsp [128];
+ uint8_t unused [0x40];
+ uint8_t ipl_rom [0x40];
+ };
+
+ static char const signature [signature_size + 1];
+
+ void save_regs( uint8_t out [reg_count] );
+};
+
+#include <assert.h>
+
+inline int Snes_Spc::sample_count() const { return (m.extra_clocks >> 5) * 2; }
+
+inline int Snes_Spc::read_port( time_t t, int port )
+{
+ assert( (unsigned) port < port_count );
+ return run_until_( t ) [port];
+}
+
+inline void Snes_Spc::write_port( time_t t, int port, int data )
+{
+ assert( (unsigned) port < port_count );
+ run_until_( t ) [0x10 + port] = data;
+}
+
+inline void Snes_Spc::mute_voices( int mask ) { dsp.mute_voices( mask ); }
+
+inline void Snes_Spc::disable_surround( bool disable ) { dsp.disable_surround( disable ); }
+
+inline void Snes_Spc::interpolation_level( int level ) { dsp.interpolation_level( level ); }
+
+#if !SPC_NO_COPY_STATE_FUNCS
+inline bool Snes_Spc::check_kon() { return dsp.check_kon(); }
+#endif
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.cpp
new file mode 100644
index 00000000..02e8a354
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.cpp
@@ -0,0 +1,562 @@
+// Core SPC emulation: CPU, timers, SMP registers, memory
+
+// snes_spc 0.9.0. http://www.slack.net/~ant/
+
+#include "Snes_Spc.h"
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#define RAM (m.ram.ram)
+#define REGS (m.smp_regs [0])
+#define REGS_IN (m.smp_regs [1])
+
+// (n ? n : 256)
+#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1)
+
+// Note: SPC_MORE_ACCURACY exists mainly so I can run my validation tests, which
+// do crazy echo buffer accesses.
+#ifndef SPC_MORE_ACCURACY
+ #define SPC_MORE_ACCURACY 0
+#endif
+
+
+//// Timers
+
+#if SPC_DISABLE_TEMPO
+ #define TIMER_DIV( t, n ) ((n) >> t->prescaler)
+ #define TIMER_MUL( t, n ) ((n) << t->prescaler)
+#else
+ #define TIMER_DIV( t, n ) ((n) / t->prescaler)
+ #define TIMER_MUL( t, n ) ((n) * t->prescaler)
+#endif
+
+Snes_Spc::Timer* Snes_Spc::run_timer_( Timer* t, rel_time_t time )
+{
+ int elapsed = TIMER_DIV( t, time - t->next_time ) + 1;
+ t->next_time += TIMER_MUL( t, elapsed );
+
+ if ( t->enabled )
+ {
+ int remain = IF_0_THEN_256( t->period - t->divider );
+ int divider = t->divider + elapsed;
+ int over = elapsed - remain;
+ if ( over >= 0 )
+ {
+ int n = over / t->period;
+ t->counter = (t->counter + 1 + n) & 0x0F;
+ divider = over - n * t->period;
+ }
+ t->divider = (uint8_t) divider;
+ }
+ return t;
+}
+
+inline Snes_Spc::Timer* Snes_Spc::run_timer( Timer* t, rel_time_t time )
+{
+ if ( time >= t->next_time )
+ t = run_timer_( t, time );
+ return t;
+}
+
+
+//// ROM
+
+void Snes_Spc::enable_rom( int enable )
+{
+ if ( m.rom_enabled != enable )
+ {
+ m.rom_enabled = enable;
+ if ( enable )
+ memcpy( m.hi_ram, &RAM [rom_addr], sizeof m.hi_ram );
+ memcpy( &RAM [rom_addr], (enable ? m.rom : m.hi_ram), rom_size );
+ // TODO: ROM can still get overwritten when DSP writes to echo buffer
+ }
+}
+
+
+//// DSP
+
+#if SPC_LESS_ACCURATE
+ int const max_reg_time = 29;
+
+ /* Fast DSP only runs every 32nd clock. By adjusting the end time based
+ on which register is being accessed, in most cases the register access
+ is emulated at the precise time. */
+ signed char const Snes_Spc::reg_times_ [256] =
+ {
+ -1, 0,-11,-10,-15,-11, -2, -2, 4, 3, 14, 14, 26, 26, 14, 22,
+ 2, 3, 0, 1,-12, 0, 1, 1, 7, 6, 14, 14, 27, 14, 14, 23,
+ 5, 6, 3, 4, -1, 3, 4, 4, 10, 9, 14, 14, 26, -5, 14, 23,
+ 8, 9, 6, 7, 2, 6, 7, 7, 13, 12, 14, 14, 27, -4, 14, 24,
+ 11, 12, 9, 10, 5, 9, 10, 10, 16, 15, 14, 14, -2, -4, 14, 24,
+ 14, 15, 12, 13, 8, 12, 13, 13, 19, 18, 14, 14, -2,-36, 14, 24,
+ 17, 18, 15, 16, 11, 15, 16, 16, 22, 21, 14, 14, 28, -3, 14, 25,
+ 20, 21, 18, 19, 14, 18, 19, 19, 25, 24, 14, 14, 14, 29, 14, 25,
+
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ };
+
+ #define RUN_DSP( time, offset ) \
+ int count = (time) - (offset) - m.dsp_time;\
+ if ( count >= 0 )\
+ {\
+ int clock_count = (count & ~(clocks_per_sample - 1)) + clocks_per_sample;\
+ m.dsp_time += clock_count;\
+ dsp.run( clock_count );\
+ }
+#else
+ #define RUN_DSP( time, offset ) \
+ {\
+ int count = (time) - m.dsp_time;\
+ if ( !SPC_MORE_ACCURACY || count )\
+ {\
+ assert( count > 0 );\
+ m.dsp_time = (time);\
+ dsp.run( count );\
+ }\
+ }
+#endif
+
+int Snes_Spc::dsp_read( rel_time_t time )
+{
+ RUN_DSP( time, reg_times [REGS [r_dspaddr] & 0x7F] );
+
+ int result = dsp.read( REGS [r_dspaddr] & 0x7F );
+
+ #ifdef SPC_DSP_READ_HOOK
+ SPC_DSP_READ_HOOK( spc_time + time, (REGS [r_dspaddr] & 0x7F), result );
+ #endif
+
+ return result;
+}
+
+inline void Snes_Spc::dsp_write( int data, rel_time_t time )
+{
+ RUN_DSP( time, reg_times [REGS [r_dspaddr]] )
+ #if SPC_LESS_ACCURATE
+ else if ( m.dsp_time == skipping_time )
+ {
+ int r = REGS [r_dspaddr];
+ if ( r == Spc_Dsp::r_kon )
+ m.skipped_kon |= data & ~dsp.read( Spc_Dsp::r_koff );
+
+ if ( r == Spc_Dsp::r_koff )
+ {
+ m.skipped_koff |= data;
+ m.skipped_kon &= ~data;
+ }
+ }
+ #endif
+
+ #ifdef SPC_DSP_WRITE_HOOK
+ SPC_DSP_WRITE_HOOK( m.spc_time + time, REGS [r_dspaddr], (uint8_t) data );
+ #endif
+
+ if ( REGS [r_dspaddr] <= 0x7F )
+ dsp.write( REGS [r_dspaddr], data );
+ else if ( !SPC_MORE_ACCURACY )
+ dprintf( "SPC wrote to DSP register > $7F\n" );
+}
+
+
+//// Memory access extras
+
+#if SPC_MORE_ACCURACY
+ #define MEM_ACCESS( time, addr ) \
+ {\
+ if ( time >= m.dsp_time )\
+ {\
+ RUN_DSP( time, max_reg_time );\
+ }\
+ }
+#elif !defined (NDEBUG)
+ // Debug-only check for read/write within echo buffer, since this might result in
+ // inaccurate emulation due to the DSP not being caught up to the present.
+
+ bool Snes_Spc::check_echo_access( int addr )
+ {
+ if ( !(dsp.read( Spc_Dsp::r_flg ) & 0x20) )
+ {
+ int start = 0x100 * dsp.read( Spc_Dsp::r_esa );
+ int size = 0x800 * (dsp.read( Spc_Dsp::r_edl ) & 0x0F);
+ int end = start + (size ? size : 4);
+ if ( start <= addr && addr < end )
+ {
+ if ( !m.echo_accessed )
+ {
+ m.echo_accessed = 1;
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ #define MEM_ACCESS( time, addr ) check( !check_echo_access( (uint16_t) addr ) );
+#else
+ #define MEM_ACCESS( time, addr )
+#endif
+
+
+//// CPU write
+
+#if SPC_MORE_ACCURACY
+static unsigned char const glitch_probs [3] [256] =
+{
+ 0xC3,0x92,0x5B,0x1C,0xD1,0x92,0x5B,0x1C,0xDB,0x9C,0x72,0x18,0xCD,0x5C,0x38,0x0B,
+ 0xE1,0x9C,0x74,0x17,0xCF,0x75,0x45,0x0C,0xCF,0x6E,0x4A,0x0D,0xA3,0x3A,0x1D,0x08,
+ 0xDB,0xA0,0x82,0x19,0xD9,0x73,0x3C,0x0E,0xCB,0x76,0x52,0x0B,0xA5,0x46,0x1D,0x09,
+ 0xDA,0x74,0x55,0x0F,0xA2,0x3F,0x21,0x05,0x9A,0x40,0x20,0x07,0x63,0x1E,0x10,0x01,
+ 0xDF,0xA9,0x85,0x1D,0xD3,0x84,0x4B,0x0E,0xCF,0x6F,0x49,0x0F,0xB3,0x48,0x1E,0x05,
+ 0xD8,0x77,0x52,0x12,0xB7,0x49,0x23,0x06,0xAA,0x45,0x28,0x07,0x7D,0x28,0x0F,0x07,
+ 0xCC,0x7B,0x4A,0x0E,0xB2,0x4F,0x24,0x07,0xAD,0x43,0x2C,0x06,0x86,0x29,0x11,0x07,
+ 0xAE,0x48,0x1F,0x0A,0x76,0x21,0x19,0x05,0x76,0x21,0x14,0x05,0x44,0x11,0x0B,0x01,
+ 0xE7,0xAD,0x96,0x23,0xDC,0x86,0x59,0x0E,0xDC,0x7C,0x5F,0x15,0xBB,0x53,0x2E,0x09,
+ 0xD6,0x7C,0x4A,0x16,0xBB,0x4A,0x25,0x08,0xB3,0x4F,0x28,0x0B,0x8E,0x23,0x15,0x08,
+ 0xCF,0x7F,0x57,0x11,0xB5,0x4A,0x23,0x0A,0xAA,0x42,0x28,0x05,0x7D,0x22,0x12,0x03,
+ 0xA6,0x49,0x28,0x09,0x82,0x2B,0x0D,0x04,0x7A,0x20,0x0F,0x04,0x3D,0x0F,0x09,0x03,
+ 0xD1,0x7C,0x4C,0x0F,0xAF,0x4E,0x21,0x09,0xA8,0x46,0x2A,0x07,0x85,0x1F,0x0E,0x07,
+ 0xA6,0x3F,0x26,0x07,0x7C,0x24,0x14,0x07,0x78,0x22,0x16,0x04,0x46,0x12,0x0A,0x02,
+ 0xA6,0x41,0x2C,0x0A,0x7E,0x28,0x11,0x05,0x73,0x1B,0x14,0x05,0x3D,0x11,0x0A,0x02,
+ 0x70,0x22,0x17,0x05,0x48,0x13,0x08,0x03,0x3C,0x07,0x0D,0x07,0x26,0x07,0x06,0x01,
+
+ 0xE0,0x9F,0xDA,0x7C,0x4F,0x18,0x28,0x0D,0xE9,0x9F,0xDA,0x7C,0x4F,0x18,0x1F,0x07,
+ 0xE6,0x97,0xD8,0x72,0x64,0x13,0x26,0x09,0xDC,0x67,0xA9,0x38,0x21,0x07,0x15,0x06,
+ 0xE9,0x91,0xD2,0x6B,0x63,0x14,0x2B,0x0E,0xD6,0x61,0xB7,0x41,0x2B,0x0E,0x10,0x09,
+ 0xCF,0x59,0xB0,0x2F,0x35,0x08,0x0F,0x07,0xB6,0x30,0x7A,0x21,0x17,0x07,0x09,0x03,
+ 0xE7,0xA3,0xE5,0x6B,0x65,0x1F,0x34,0x09,0xD8,0x6B,0xBE,0x45,0x27,0x07,0x10,0x07,
+ 0xDA,0x54,0xB1,0x39,0x2E,0x0E,0x17,0x08,0xA9,0x3C,0x86,0x22,0x16,0x06,0x07,0x03,
+ 0xD4,0x51,0xBC,0x3D,0x38,0x0A,0x13,0x06,0xB2,0x37,0x79,0x1C,0x17,0x05,0x0E,0x06,
+ 0xA7,0x31,0x74,0x1C,0x11,0x06,0x0C,0x02,0x6D,0x1A,0x38,0x10,0x0B,0x05,0x06,0x03,
+ 0xEB,0x9A,0xE1,0x7A,0x6F,0x13,0x34,0x0E,0xE6,0x75,0xC5,0x45,0x3E,0x0B,0x1A,0x05,
+ 0xD8,0x63,0xC1,0x40,0x3C,0x1B,0x19,0x06,0xB3,0x42,0x83,0x29,0x18,0x0A,0x08,0x04,
+ 0xD4,0x58,0xBA,0x43,0x3F,0x0A,0x1F,0x09,0xB1,0x33,0x8A,0x1F,0x1F,0x06,0x0D,0x05,
+ 0xAF,0x3C,0x7A,0x1F,0x16,0x08,0x0A,0x01,0x72,0x1B,0x52,0x0D,0x0B,0x09,0x06,0x01,
+ 0xCF,0x63,0xB7,0x47,0x40,0x10,0x14,0x06,0xC0,0x41,0x96,0x20,0x1C,0x09,0x10,0x05,
+ 0xA6,0x35,0x82,0x1A,0x20,0x0C,0x0E,0x04,0x80,0x1F,0x53,0x0F,0x0B,0x02,0x06,0x01,
+ 0xA6,0x31,0x81,0x1B,0x1D,0x01,0x08,0x08,0x7B,0x20,0x4D,0x19,0x0E,0x05,0x07,0x03,
+ 0x6B,0x17,0x49,0x07,0x0E,0x03,0x0A,0x05,0x37,0x0B,0x1F,0x06,0x04,0x02,0x07,0x01,
+
+ 0xF0,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x47,0x1E,0x6E,0x1B,0x32,0x0A,
+ 0xF0,0xD6,0xEA,0xA4,0xED,0xC4,0xDE,0x82,0x98,0x1F,0x50,0x13,0x52,0x15,0x2A,0x0A,
+ 0xF1,0xD1,0xEB,0xA2,0xEB,0xB7,0xD8,0x69,0xA2,0x1F,0x5B,0x18,0x55,0x18,0x2C,0x0A,
+ 0xED,0xB5,0xDE,0x7E,0xE6,0x85,0xD3,0x59,0x59,0x0F,0x2C,0x09,0x24,0x07,0x15,0x09,
+ 0xF1,0xD6,0xEA,0xA0,0xEC,0xBB,0xDA,0x77,0xA9,0x23,0x58,0x14,0x5D,0x12,0x2F,0x09,
+ 0xF1,0xC1,0xE3,0x86,0xE4,0x87,0xD2,0x4E,0x68,0x15,0x26,0x0B,0x27,0x09,0x15,0x02,
+ 0xEE,0xA6,0xE0,0x5C,0xE0,0x77,0xC3,0x41,0x67,0x1B,0x3C,0x07,0x2A,0x06,0x19,0x07,
+ 0xE4,0x75,0xC6,0x43,0xCC,0x50,0x95,0x23,0x35,0x09,0x14,0x04,0x15,0x05,0x0B,0x04,
+ 0xEE,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x56,0x14,0x5A,0x12,0x26,0x0A,
+ 0xEE,0xBB,0xE7,0x7E,0xE9,0x8D,0xCB,0x49,0x67,0x11,0x34,0x07,0x2B,0x0B,0x14,0x07,
+ 0xED,0xA7,0xE5,0x76,0xE3,0x7E,0xC4,0x4B,0x77,0x14,0x34,0x08,0x27,0x07,0x14,0x04,
+ 0xE7,0x8B,0xD2,0x4C,0xCA,0x56,0x9E,0x31,0x36,0x0C,0x11,0x07,0x14,0x04,0x0A,0x02,
+ 0xF0,0x9B,0xEA,0x6F,0xE5,0x81,0xC4,0x43,0x74,0x10,0x30,0x0B,0x2D,0x08,0x1B,0x06,
+ 0xE6,0x83,0xCA,0x48,0xD9,0x56,0xA7,0x23,0x3B,0x09,0x12,0x09,0x15,0x07,0x0A,0x03,
+ 0xE5,0x5F,0xCB,0x3C,0xCF,0x48,0x91,0x22,0x31,0x0A,0x17,0x08,0x15,0x04,0x0D,0x02,
+ 0xD1,0x43,0x91,0x20,0xA9,0x2D,0x54,0x12,0x17,0x07,0x09,0x02,0x0C,0x04,0x05,0x03,
+};
+#endif
+
+// Read/write handlers are divided into multiple functions to keep rarely-used
+// functionality separate so often-used functionality can be optimized better
+// by compiler.
+
+// If write isn't preceded by read, data has this added to it
+int const no_read_before_write = 0x2000;
+
+void Snes_Spc::cpu_write_smp_reg_( int data, rel_time_t time, int addr )
+{
+ switch ( addr )
+ {
+ case r_t0target:
+ case r_t1target:
+ case r_t2target: {
+ Timer* t = &m.timers [addr - r_t0target];
+ int period = IF_0_THEN_256( data );
+ if ( t->period != period )
+ {
+ t = run_timer( t, time );
+ #if SPC_MORE_ACCURACY
+ // Insane behavior when target is written just after counter is
+ // clocked and counter matches new period and new period isn't 1, 2, 4, or 8
+ if ( t->divider == (period & 0xFF) &&
+ t->next_time == time + TIMER_MUL( t, 1 ) &&
+ ((period - 1) | ~0x0F) & period )
+ {
+ //dprintf( "SPC pathological timer target write\n" );
+
+ // If the period is 3, 5, or 9, there's a probability this behavior won't occur,
+ // based on the previous period
+ int prob = 0xFF;
+ int old_period = t->period & 0xFF;
+ if ( period == 3 ) prob = glitch_probs [0] [old_period];
+ if ( period == 5 ) prob = glitch_probs [1] [old_period];
+ if ( period == 9 ) prob = glitch_probs [2] [old_period];
+
+ // The glitch suppresses incrementing of one of the counter bits, based on
+ // the lowest set bit in the new period
+ int b = 1;
+ while ( !(period & b) )
+ b <<= 1;
+
+ if ( (rand() >> 4 & 0xFF) <= prob )
+ t->divider = (t->divider - b) & 0xFF;
+ }
+ #endif
+ t->period = period;
+ }
+ break;
+ }
+
+ case r_t0out:
+ case r_t1out:
+ case r_t2out:
+ if ( !SPC_MORE_ACCURACY )
+ dprintf( "SPC wrote to counter %d\n", (int) addr - r_t0out );
+
+ if ( data < no_read_before_write / 2 )
+ run_timer( &m.timers [addr - r_t0out], time - 1 )->counter = 0;
+ break;
+
+ // Registers that act like RAM
+ case 0x8:
+ case 0x9:
+ REGS_IN [addr] = (uint8_t) data;
+ break;
+
+ case r_test:
+ if ( (uint8_t) data != 0x0A )
+ dprintf( "SPC wrote to test register\n" );
+ break;
+
+ case r_control:
+ // port clears
+ if ( data & 0x10 )
+ {
+ REGS_IN [r_cpuio0] = 0;
+ REGS_IN [r_cpuio1] = 0;
+ }
+ if ( data & 0x20 )
+ {
+ REGS_IN [r_cpuio2] = 0;
+ REGS_IN [r_cpuio3] = 0;
+ }
+
+ // timers
+ {
+ for ( int i = 0; i < timer_count; i++ )
+ {
+ Timer* t = &m.timers [i];
+ int enabled = data >> i & 1;
+ if ( t->enabled != enabled )
+ {
+ t = run_timer( t, time );
+ t->enabled = enabled;
+ if ( enabled )
+ {
+ t->divider = 0;
+ t->counter = 0;
+ }
+ }
+ }
+ }
+ enable_rom( data & 0x80 );
+ break;
+ }
+}
+
+void Snes_Spc::cpu_write_smp_reg( int data, rel_time_t time, int addr )
+{
+ if ( addr == r_dspdata ) // 99%
+ dsp_write( data, time );
+ else
+ cpu_write_smp_reg_( data, time, addr );
+}
+
+void Snes_Spc::cpu_write_high( int data, int i, rel_time_t time )
+{
+ if ( i < rom_size )
+ {
+ m.hi_ram [i] = (uint8_t) data;
+ if ( m.rom_enabled )
+ RAM [i + rom_addr] = m.rom [i]; // restore overwritten ROM
+ }
+ else
+ {
+ assert( RAM [i + rom_addr] == (uint8_t) data );
+ RAM [i + rom_addr] = cpu_pad_fill; // restore overwritten padding
+ cpu_write( data, i + rom_addr - 0x10000, time );
+ }
+}
+
+int const bits_in_int = CHAR_BIT * sizeof (int);
+
+void Snes_Spc::cpu_write( int data, int addr, rel_time_t time )
+{
+ MEM_ACCESS( time, addr )
+
+ // RAM
+ RAM [addr] = (uint8_t) data;
+ int reg = addr - 0xF0;
+ if ( reg >= 0 ) // 64%
+ {
+ // $F0-$FF
+ if ( reg < reg_count ) // 87%
+ {
+ REGS [reg] = (uint8_t) data;
+
+ // Ports
+ #ifdef SPC_PORT_WRITE_HOOK
+ if ( (unsigned) (reg - r_cpuio0) < port_count )
+ SPC_PORT_WRITE_HOOK( m.spc_time + time, (reg - r_cpuio0),
+ (uint8_t) data, &REGS [r_cpuio0] );
+ #endif
+
+ // Registers other than $F2 and $F4-$F7
+ //if ( reg != 2 && reg != 4 && reg != 5 && reg != 6 && reg != 7 )
+ // TODO: this is a bit on the fragile side
+ if ( ((~0x2F00 << (bits_in_int - 16)) << reg) < 0 ) // 36%
+ cpu_write_smp_reg( data, time, reg );
+ }
+ // High mem/address wrap-around
+ else
+ {
+ reg -= rom_addr - 0xF0;
+ if ( reg >= 0 ) // 1% in IPL ROM area or address wrapped around
+ cpu_write_high( data, reg, time );
+ }
+ }
+}
+
+
+//// CPU read
+
+inline int Snes_Spc::cpu_read_smp_reg( int reg, rel_time_t time )
+{
+ int result = REGS_IN [reg];
+ reg -= r_dspaddr;
+ // DSP addr and data
+ if ( (unsigned) reg <= 1 ) // 4% 0xF2 and 0xF3
+ {
+ result = REGS [r_dspaddr];
+ if ( (unsigned) reg == 1 )
+ result = dsp_read( time ); // 0xF3
+ }
+ return result;
+}
+
+int Snes_Spc::cpu_read( int addr, rel_time_t time )
+{
+ MEM_ACCESS( time, addr )
+
+ // RAM
+ int result = RAM [addr];
+ int reg = addr - 0xF0;
+ if ( reg >= 0 ) // 40%
+ {
+ reg -= 0x10;
+ if ( (unsigned) reg >= 0xFF00 ) // 21%
+ {
+ reg += 0x10 - r_t0out;
+
+ // Timers
+ if ( (unsigned) reg < timer_count ) // 90%
+ {
+ Timer* t = &m.timers [reg];
+ if ( time >= t->next_time )
+ t = run_timer_( t, time );
+ result = t->counter;
+ t->counter = 0;
+ }
+ // Other registers
+ else if ( reg < 0 ) // 10%
+ {
+ result = cpu_read_smp_reg( reg + r_t0out, time );
+ }
+ else // 1%
+ {
+ assert( reg + (r_t0out + 0xF0 - 0x10000) < 0x100 );
+ result = cpu_read( reg + (r_t0out + 0xF0 - 0x10000), time );
+ }
+ }
+ }
+
+ return result;
+}
+
+
+//// Run
+
+// Prefix and suffix for CPU emulator function
+#define SPC_CPU_RUN_FUNC \
+BOOST::uint8_t* Snes_Spc::run_until_( time_t end_time )\
+{\
+ rel_time_t rel_time = m.spc_time - end_time;\
+ assert( rel_time <= 0 );\
+ m.spc_time = end_time;\
+ m.dsp_time += rel_time;\
+ m.timers [0].next_time += rel_time;\
+ m.timers [1].next_time += rel_time;\
+ m.timers [2].next_time += rel_time;
+
+#define SPC_CPU_RUN_FUNC_END \
+ m.spc_time += rel_time;\
+ m.dsp_time -= rel_time;\
+ m.timers [0].next_time -= rel_time;\
+ m.timers [1].next_time -= rel_time;\
+ m.timers [2].next_time -= rel_time;\
+ assert( m.spc_time <= end_time );\
+ return &REGS [r_cpuio0];\
+}
+
+int const cpu_lag_max = 12 - 1; // DIV YA,X takes 12 clocks
+
+void Snes_Spc::end_frame( time_t end_time )
+{
+ // Catch CPU up to as close to end as possible. If final instruction
+ // would exceed end, does NOT execute it and leaves m.spc_time < end.
+ if ( end_time > m.spc_time )
+ run_until_( end_time );
+
+ m.spc_time -= end_time;
+ m.extra_clocks += end_time;
+
+ // Greatest number of clocks early that emulation can stop early due to
+ // not being able to execute current instruction without going over
+ // allowed time.
+ assert( -cpu_lag_max <= m.spc_time && m.spc_time <= 0 );
+
+ // Catch timers up to CPU
+ for ( int i = 0; i < timer_count; i++ )
+ run_timer( &m.timers [i], 0 );
+
+ // Catch DSP up to CPU
+ if ( m.dsp_time < 0 )
+ {
+ RUN_DSP( 0, max_reg_time );
+ }
+
+ // Save any extra samples beyond what should be generated
+ if ( m.buf_begin )
+ save_extra();
+}
+
+// Inclusion here allows static memory access functions and better optimization
+#include "Spc_Cpu.h"
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.h b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.h
new file mode 100644
index 00000000..706f7d33
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Cpu.h
@@ -0,0 +1,1225 @@
+// snes_spc 0.9.0. http://www.slack.net/~ant/
+
+/* Copyright (C) 2004-2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+//// Memory access
+
+#if SPC_MORE_ACCURACY
+ #define SUSPICIOUS_OPCODE( name ) ((void) 0)
+#else
+ #define SUSPICIOUS_OPCODE( name ) dprintf( "SPC: suspicious opcode: " name "\n" )
+#endif
+
+#define CPU_READ( time, offset, addr )\
+ cpu_read( addr, time + offset )
+
+#define CPU_WRITE( time, offset, addr, data )\
+ cpu_write( data, addr, time + offset )
+
+#if SPC_MORE_ACCURACY
+ #define CPU_READ_TIMER( time, offset, addr, out )\
+ { out = CPU_READ( time, offset, addr ); }
+
+#else
+ // timers are by far the most common thing read from dp
+ #define CPU_READ_TIMER( time, offset, addr_, out )\
+ {\
+ rel_time_t adj_time = time + offset;\
+ int dp_addr = addr_;\
+ int ti = dp_addr - (r_t0out + 0xF0);\
+ if ( (unsigned) ti < timer_count )\
+ {\
+ Timer* t = &m.timers [ti];\
+ if ( adj_time >= t->next_time )\
+ t = run_timer_( t, adj_time );\
+ out = t->counter;\
+ t->counter = 0;\
+ }\
+ else\
+ {\
+ out = ram [dp_addr];\
+ int i = dp_addr - 0xF0;\
+ if ( (unsigned) i < 0x10 )\
+ out = cpu_read_smp_reg( i, adj_time );\
+ }\
+ }
+#endif
+
+#define TIME_ADJ( n ) (n)
+
+#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out )
+#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) )
+#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) )
+
+#define DP_ADDR( addr ) (dp + (addr))
+
+#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out )
+#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) )
+#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data )
+
+#define READ_PROG16( addr ) GET_LE16( ram + (addr) )
+
+#define SET_PC( n ) (pc = ram + (n))
+#define GET_PC() (pc - ram)
+#define READ_PC( pc ) (*(pc))
+#define READ_PC16( pc ) GET_LE16( pc )
+
+// TODO: remove non-wrapping versions?
+#define SPC_NO_SP_WRAPAROUND 0
+
+#define SET_SP( v ) (sp = ram + 0x101 + (v))
+#define GET_SP() (sp - 0x101 - ram)
+
+#if SPC_NO_SP_WRAPAROUND
+#define PUSH16( v ) (sp -= 2, SET_LE16( sp, v ))
+#define PUSH( v ) (void) (*--sp = (uint8_t) (v))
+#define POP( out ) (void) ((out) = *sp++)
+
+#else
+#define PUSH16( data )\
+{\
+ int addr = (sp -= 2) - ram;\
+ if ( addr > 0x100 )\
+ {\
+ SET_LE16( sp, data );\
+ }\
+ else\
+ {\
+ ram [(uint8_t) addr + 0x100] = (uint8_t) data;\
+ sp [1] = (uint8_t) (data >> 8);\
+ sp += 0x100;\
+ }\
+}
+
+#define PUSH( data )\
+{\
+ *--sp = (uint8_t) (data);\
+ if ( sp - ram == 0x100 )\
+ sp += 0x100;\
+}
+
+#define POP( out )\
+{\
+ out = *sp++;\
+ if ( sp - ram == 0x201 )\
+ {\
+ out = sp [-0x101];\
+ sp -= 0x100;\
+ }\
+}
+
+#endif
+
+#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel )
+
+unsigned Snes_Spc::CPU_mem_bit( uint8_t const* pc, rel_time_t rel_time )
+{
+ unsigned addr = READ_PC16( pc );
+ unsigned t = READ( 0, addr & 0x1FFF ) >> (addr >> 13);
+ return t << 8 & 0x100;
+}
+
+//// Status flag handling
+
+// Flags with hex value for clarity when used as mask.
+// Stored in indicated variable during emulation.
+int const n80 = 0x80; // nz
+int const v40 = 0x40; // psw
+int const p20 = 0x20; // dp
+int const b10 = 0x10; // psw
+int const h08 = 0x08; // psw
+int const i04 = 0x04; // psw
+int const z02 = 0x02; // nz
+int const c01 = 0x01; // c
+
+int const nz_neg_mask = 0x880; // either bit set indicates N flag set
+
+#define GET_PSW( out )\
+{\
+ out = psw & ~(n80 | p20 | z02 | c01);\
+ out |= c >> 8 & c01;\
+ out |= dp >> 3 & p20;\
+ out |= ((nz >> 4) | nz) & n80;\
+ if ( !(uint8_t) nz ) out |= z02;\
+}
+
+#define SET_PSW( in )\
+{\
+ psw = in;\
+ c = in << 8;\
+ dp = in << 3 & 0x100;\
+ nz = (in << 4 & 0x800) | (~in & z02);\
+}
+
+SPC_CPU_RUN_FUNC
+{
+ uint8_t* const ram = RAM;
+ int a = m.cpu_regs.a;
+ int x = m.cpu_regs.x;
+ int y = m.cpu_regs.y;
+ uint8_t const* pc;
+ uint8_t* sp;
+ int psw;
+ int c;
+ int nz;
+ int dp;
+
+ SET_PC( m.cpu_regs.pc );
+ SET_SP( m.cpu_regs.sp );
+ SET_PSW( m.cpu_regs.psw );
+
+ goto loop;
+
+
+ // Main loop
+
+cbranch_taken_loop:
+ pc += *(BOOST::int8_t const*) pc;
+inc_pc_loop:
+ pc++;
+loop:
+{
+ unsigned opcode;
+ unsigned data;
+
+ check( (unsigned) a < 0x100 );
+ check( (unsigned) x < 0x100 );
+ check( (unsigned) y < 0x100 );
+
+ opcode = *pc;
+ if ( (rel_time += m.cycle_table [opcode]) > 0 )
+ goto out_of_time;
+
+ #ifdef SPC_CPU_OPCODE_HOOK
+ SPC_CPU_OPCODE_HOOK( GET_PC(), opcode );
+ #endif
+
+ #ifdef CPU_INSTR_HOOK
+ CPU_INSTR_HOOK( GET_PC(), pc, a, x, y, GET_SP(), rel_time );
+ #endif
+
+ /*
+ //SUB_CASE_COUNTER( 1 );
+ #define PROFILE_TIMER_LOOP( op, addr, len )\
+ if ( opcode == op )\
+ {\
+ int cond = (unsigned) ((addr) - 0xFD) < 3 &&\
+ pc [len] == 0xF0 && pc [len+1] == 0xFE - len;\
+ SUB_CASE_COUNTER( op && cond );\
+ }
+
+ PROFILE_TIMER_LOOP( 0xEC, GET_LE16( pc + 1 ), 3 );
+ PROFILE_TIMER_LOOP( 0xEB, pc [1], 2 );
+ PROFILE_TIMER_LOOP( 0xE4, pc [1], 2 );
+ */
+
+ // TODO: if PC is at end of memory, this will get wrong operand (very obscure)
+ data = *++pc;
+ switch ( opcode )
+ {
+
+// Common instructions
+
+#define BRANCH( cond )\
+{\
+ pc++;\
+ pc += (BOOST::int8_t) data;\
+ if ( cond )\
+ goto loop;\
+ pc -= (BOOST::int8_t) data;\
+ rel_time -= 2;\
+ goto loop;\
+}
+
+ case 0xF0: // BEQ
+ BRANCH( !(uint8_t) nz ) // 89% taken
+
+ case 0xD0: // BNE
+ BRANCH( (uint8_t) nz )
+
+ case 0x3F:{// CALL
+ int old_addr = GET_PC() + 2;
+ SET_PC( READ_PC16( pc ) );
+ PUSH16( old_addr );
+ goto loop;
+ }
+
+ case 0x6F:// RET
+ #if SPC_NO_SP_WRAPAROUND
+ {
+ SET_PC( GET_LE16( sp ) );
+ sp += 2;
+ }
+ #else
+ {
+ int addr = sp - ram;
+ SET_PC( GET_LE16( sp ) );
+ sp += 2;
+ if ( addr < 0x1FF )
+ goto loop;
+
+ SET_PC( sp [-0x101] * 0x100 + ram [(uint8_t) addr + 0x100] );
+ sp -= 0x100;
+ }
+ #endif
+ goto loop;
+
+ case 0xE4: // MOV a,dp
+ ++pc;
+ // 80% from timer
+ READ_DP_TIMER( 0, data, a = nz );
+ goto loop;
+
+ case 0xFA:{// MOV dp,dp
+ int temp;
+ READ_DP_TIMER( -2, data, temp );
+ data = temp + no_read_before_write ;
+ }
+ // fall through
+ case 0x8F:{// MOV dp,#imm
+ int temp = READ_PC( pc + 1 );
+ pc += 2;
+
+ #if !SPC_MORE_ACCURACY
+ {
+ int i = dp + temp;
+ ram [i] = (uint8_t) data;
+ i -= 0xF0;
+ if ( (unsigned) i < 0x10 ) // 76%
+ {
+ REGS [i] = (uint8_t) data;
+
+ // Registers other than $F2 and $F4-$F7
+ //if ( i != 2 && i != 4 && i != 5 && i != 6 && i != 7 )
+ if ( ((~0x2F00 << (bits_in_int - 16)) << i) < 0 ) // 12%
+ cpu_write_smp_reg( data, rel_time, i );
+ }
+ }
+ #else
+ WRITE_DP( 0, temp, data );
+ #endif
+ goto loop;
+ }
+
+ case 0xC4: // MOV dp,a
+ ++pc;
+ #if !SPC_MORE_ACCURACY
+ {
+ int i = dp + data;
+ ram [i] = (uint8_t) a;
+ i -= 0xF0;
+ if ( (unsigned) i < 0x10 ) // 39%
+ {
+ unsigned sel = i - 2;
+ REGS [i] = (uint8_t) a;
+
+ if ( sel == 1 ) // 51% $F3
+ dsp_write( a, rel_time );
+ else if ( sel > 1 ) // 1% not $F2 or $F3
+ cpu_write_smp_reg_( a, rel_time, i );
+ }
+ }
+ #else
+ WRITE_DP( 0, data, a );
+ #endif
+ goto loop;
+
+#define CASE( n ) case n:
+
+// Define common address modes based on opcode for immediate mode. Execution
+// ends with data set to the address of the operand.
+#define ADDR_MODES_( op )\
+ CASE( op - 0x02 ) /* (X) */\
+ data = x + dp;\
+ pc--;\
+ goto end_##op;\
+ CASE( op + 0x0F ) /* (dp)+Y */\
+ data = READ_PROG16( data + dp ) + y;\
+ goto end_##op;\
+ CASE( op - 0x01 ) /* (dp+X) */\
+ data = READ_PROG16( ((uint8_t) (data + x)) + dp );\
+ goto end_##op;\
+ CASE( op + 0x0E ) /* abs+Y */\
+ data += y;\
+ goto abs_##op;\
+ CASE( op + 0x0D ) /* abs+X */\
+ data += x;\
+ CASE( op - 0x03 ) /* abs */\
+ abs_##op:\
+ data += 0x100 * READ_PC( ++pc );\
+ goto end_##op;\
+ CASE( op + 0x0C ) /* dp+X */\
+ data = (uint8_t) (data + x);
+
+#define ADDR_MODES_NO_DP( op )\
+ ADDR_MODES_( op )\
+ data += dp;\
+ end_##op:
+
+#define ADDR_MODES( op )\
+ ADDR_MODES_( op )\
+ CASE( op - 0x04 ) /* dp */\
+ data += dp;\
+ end_##op:
+
+// 1. 8-bit Data Transmission Commands. Group I
+
+ ADDR_MODES_NO_DP( 0xE8 ) // MOV A,addr
+ a = nz = READ( 0, data );
+ goto inc_pc_loop;
+
+ case 0xBF:{// MOV A,(X)+
+ int temp = x + dp;
+ x = (uint8_t) (x + 1);
+ a = nz = READ( -1, temp );
+ goto loop;
+ }
+
+ case 0xE8: // MOV A,imm
+ a = data;
+ nz = data;
+ goto inc_pc_loop;
+
+ case 0xF9: // MOV X,dp+Y
+ data = (uint8_t) (data + y);
+ case 0xF8: // MOV X,dp
+ READ_DP_TIMER( 0, data, x = nz );
+ goto inc_pc_loop;
+
+ case 0xE9: // MOV X,abs
+ data = READ_PC16( pc );
+ ++pc;
+ data = READ( 0, data );
+ case 0xCD: // MOV X,imm
+ x = data;
+ nz = data;
+ goto inc_pc_loop;
+
+ case 0xFB: // MOV Y,dp+X
+ data = (uint8_t) (data + x);
+ case 0xEB: // MOV Y,dp
+ // 70% from timer
+ pc++;
+ READ_DP_TIMER( 0, data, y = nz );
+ goto loop;
+
+ case 0xEC:{// MOV Y,abs
+ int temp = READ_PC16( pc );
+ pc += 2;
+ READ_TIMER( 0, temp, y = nz );
+ //y = nz = READ( 0, temp );
+ goto loop;
+ }
+
+ case 0x8D: // MOV Y,imm
+ y = data;
+ nz = data;
+ goto inc_pc_loop;
+
+// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2
+
+ ADDR_MODES_NO_DP( 0xC8 ) // MOV addr,A
+ WRITE( 0, data, a );
+ goto inc_pc_loop;
+
+ {
+ int temp;
+ case 0xCC: // MOV abs,Y
+ temp = y;
+ goto mov_abs_temp;
+ case 0xC9: // MOV abs,X
+ temp = x;
+ mov_abs_temp:
+ WRITE( 0, READ_PC16( pc ), temp );
+ pc += 2;
+ goto loop;
+ }
+
+ case 0xD9: // MOV dp+Y,X
+ data = (uint8_t) (data + y);
+ case 0xD8: // MOV dp,X
+ WRITE( 0, data + dp, x );
+ goto inc_pc_loop;
+
+ case 0xDB: // MOV dp+X,Y
+ data = (uint8_t) (data + x);
+ case 0xCB: // MOV dp,Y
+ WRITE( 0, data + dp, y );
+ goto inc_pc_loop;
+
+// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3.
+
+ case 0x7D: // MOV A,X
+ a = x;
+ nz = x;
+ goto loop;
+
+ case 0xDD: // MOV A,Y
+ a = y;
+ nz = y;
+ goto loop;
+
+ case 0x5D: // MOV X,A
+ x = a;
+ nz = a;
+ goto loop;
+
+ case 0xFD: // MOV Y,A
+ y = a;
+ nz = a;
+ goto loop;
+
+ case 0x9D: // MOV X,SP
+ x = nz = GET_SP();
+ goto loop;
+
+ case 0xBD: // MOV SP,X
+ SET_SP( x );
+ goto loop;
+
+ //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2)
+
+ case 0xAF: // MOV (X)+,A
+ WRITE_DP( 0, x, a + no_read_before_write );
+ x++;
+ goto loop;
+
+// 5. 8-BIT LOGIC OPERATION COMMANDS
+
+#define LOGICAL_OP( op, func )\
+ ADDR_MODES( op ) /* addr */\
+ data = READ( 0, data );\
+ case op: /* imm */\
+ nz = a func##= data;\
+ goto inc_pc_loop;\
+ { unsigned addr;\
+ case op + 0x11: /* X,Y */\
+ data = READ_DP( -2, y );\
+ addr = x + dp;\
+ goto addr_##op;\
+ case op + 0x01: /* dp,dp */\
+ data = READ_DP( -3, data );\
+ case op + 0x10:{/*dp,imm*/\
+ uint8_t const* addr2 = pc + 1;\
+ pc += 2;\
+ addr = READ_PC( addr2 ) + dp;\
+ }\
+ addr_##op:\
+ nz = data func READ( -1, addr );\
+ WRITE( 0, addr, nz );\
+ goto loop;\
+ }
+
+ LOGICAL_OP( 0x28, & ); // AND
+
+ LOGICAL_OP( 0x08, | ); // OR
+
+ LOGICAL_OP( 0x48, ^ ); // EOR
+
+// 4. 8-BIT ARITHMETIC OPERATION COMMANDS
+
+ ADDR_MODES( 0x68 ) // CMP addr
+ data = READ( 0, data );
+ case 0x68: // CMP imm
+ nz = a - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x79: // CMP (X),(Y)
+ data = READ_DP( -2, y );
+ nz = READ_DP( -1, x ) - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto loop;
+
+ case 0x69: // CMP dp,dp
+ data = READ_DP( -3, data );
+ case 0x78: // CMP dp,imm
+ nz = READ_DP( -1, READ_PC( ++pc ) ) - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x3E: // CMP X,dp
+ data += dp;
+ goto cmp_x_addr;
+ case 0x1E: // CMP X,abs
+ data = READ_PC16( pc );
+ pc++;
+ cmp_x_addr:
+ data = READ( 0, data );
+ case 0xC8: // CMP X,imm
+ nz = x - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ case 0x7E: // CMP Y,dp
+ data += dp;
+ goto cmp_y_addr;
+ case 0x5E: // CMP Y,abs
+ data = READ_PC16( pc );
+ pc++;
+ cmp_y_addr:
+ data = READ( 0, data );
+ case 0xAD: // CMP Y,imm
+ nz = y - data;
+ c = ~nz;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+
+ {
+ int addr;
+ case 0xB9: // SBC (x),(y)
+ case 0x99: // ADC (x),(y)
+ pc--; // compensate for inc later
+ data = READ_DP( -2, y );
+ addr = x + dp;
+ goto adc_addr;
+ case 0xA9: // SBC dp,dp
+ case 0x89: // ADC dp,dp
+ data = READ_DP( -3, data );
+ case 0xB8: // SBC dp,imm
+ case 0x98: // ADC dp,imm
+ addr = READ_PC( ++pc ) + dp;
+ adc_addr:
+ nz = READ( -1, addr );
+ goto adc_data;
+
+// catch ADC and SBC together, then decode later based on operand
+#undef CASE
+#define CASE( n ) case n: case (n) + 0x20:
+ ADDR_MODES( 0x88 ) // ADC/SBC addr
+ data = READ( 0, data );
+ case 0xA8: // SBC imm
+ case 0x88: // ADC imm
+ addr = -1; // A
+ nz = a;
+ adc_data: {
+ int flags;
+ if ( opcode >= 0xA0 ) // SBC
+ data ^= 0xFF;
+
+ flags = data ^ nz;
+ nz += data + (c >> 8 & 1);
+ flags ^= nz;
+
+ psw = (psw & ~(v40 | h08)) |
+ (flags >> 1 & h08) |
+ ((flags + 0x80) >> 2 & v40);
+ c = nz;
+ if ( addr < 0 )
+ {
+ a = (uint8_t) nz;
+ goto inc_pc_loop;
+ }
+ WRITE( 0, addr, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+ }
+
+ }
+
+// 6. ADDITION & SUBTRACTION COMMANDS
+
+#define INC_DEC_REG( reg, op )\
+ nz = reg op;\
+ reg = (uint8_t) nz;\
+ goto loop;
+
+ case 0xBC: INC_DEC_REG( a, + 1 ) // INC A
+ case 0x3D: INC_DEC_REG( x, + 1 ) // INC X
+ case 0xFC: INC_DEC_REG( y, + 1 ) // INC Y
+
+ case 0x9C: INC_DEC_REG( a, - 1 ) // DEC A
+ case 0x1D: INC_DEC_REG( x, - 1 ) // DEC X
+ case 0xDC: INC_DEC_REG( y, - 1 ) // DEC Y
+
+ case 0x9B: // DEC dp+X
+ case 0xBB: // INC dp+X
+ data = (uint8_t) (data + x);
+ case 0x8B: // DEC dp
+ case 0xAB: // INC dp
+ data += dp;
+ goto inc_abs;
+ case 0x8C: // DEC abs
+ case 0xAC: // INC abs
+ data = READ_PC16( pc );
+ pc++;
+ inc_abs:
+ nz = (opcode >> 4 & 2) - 1;
+ nz += READ( -1, data );
+ WRITE( 0, data, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+
+// 7. SHIFT, ROTATION COMMANDS
+
+ case 0x5C: // LSR A
+ c = 0;
+ case 0x7C:{// ROR A
+ nz = (c >> 1 & 0x80) | (a >> 1);
+ c = a << 8;
+ a = nz;
+ goto loop;
+ }
+
+ case 0x1C: // ASL A
+ c = 0;
+ case 0x3C:{// ROL A
+ int temp = c >> 8 & 1;
+ c = a << 1;
+ nz = c | temp;
+ a = (uint8_t) nz;
+ goto loop;
+ }
+
+ case 0x0B: // ASL dp
+ c = 0;
+ data += dp;
+ goto rol_mem;
+ case 0x1B: // ASL dp+X
+ c = 0;
+ case 0x3B: // ROL dp+X
+ data = (uint8_t) (data + x);
+ case 0x2B: // ROL dp
+ data += dp;
+ goto rol_mem;
+ case 0x0C: // ASL abs
+ c = 0;
+ case 0x2C: // ROL abs
+ data = READ_PC16( pc );
+ pc++;
+ rol_mem:
+ nz = c >> 8 & 1;
+ nz |= (c = READ( -1, data ) << 1);
+ WRITE( 0, data, /*(uint8_t)*/ nz );
+ goto inc_pc_loop;
+
+ case 0x4B: // LSR dp
+ c = 0;
+ data += dp;
+ goto ror_mem;
+ case 0x5B: // LSR dp+X
+ c = 0;
+ case 0x7B: // ROR dp+X
+ data = (uint8_t) (data + x);
+ case 0x6B: // ROR dp
+ data += dp;
+ goto ror_mem;
+ case 0x4C: // LSR abs
+ c = 0;
+ case 0x6C: // ROR abs
+ data = READ_PC16( pc );
+ pc++;
+ ror_mem: {
+ int temp = READ( -1, data );
+ nz = (c >> 1 & 0x80) | (temp >> 1);
+ c = temp << 8;
+ WRITE( 0, data, nz );
+ goto inc_pc_loop;
+ }
+
+ case 0x9F: // XCN
+ nz = a = (a >> 4) | (uint8_t) (a << 4);
+ goto loop;
+
+// 8. 16-BIT TRANSMISION COMMANDS
+
+ case 0xBA: // MOVW YA,dp
+ a = READ_DP( -2, data );
+ nz = (a & 0x7F) | (a >> 1);
+ y = READ_DP( 0, (uint8_t) (data + 1) );
+ nz |= y;
+ goto inc_pc_loop;
+
+ case 0xDA: // MOVW dp,YA
+ WRITE_DP( -1, data, a );
+ WRITE_DP( 0, (uint8_t) (data + 1), y + no_read_before_write );
+ goto inc_pc_loop;
+
+// 9. 16-BIT OPERATION COMMANDS
+
+ case 0x3A: // INCW dp
+ case 0x1A:{// DECW dp
+ int temp;
+ // low byte
+ data += dp;
+ temp = READ( -3, data );
+ temp += (opcode >> 4 & 2) - 1; // +1 for INCW, -1 for DECW
+ nz = ((temp >> 1) | temp) & 0x7F;
+ WRITE( -2, data, /*(uint8_t)*/ temp );
+
+ // high byte
+ data = (uint8_t) (data + 1) + dp;
+ temp = (uint8_t) ((temp >> 8) + READ( -1, data ));
+ nz |= temp;
+ WRITE( 0, data, temp );
+
+ goto inc_pc_loop;
+ }
+
+ case 0x7A: // ADDW YA,dp
+ case 0x9A:{// SUBW YA,dp
+ int lo = READ_DP( -2, data );
+ int hi = READ_DP( 0, (uint8_t) (data + 1) );
+ int result;
+ int flags;
+
+ if ( opcode == 0x9A ) // SUBW
+ {
+ lo = (lo ^ 0xFF) + 1;
+ hi ^= 0xFF;
+ }
+
+ lo += a;
+ result = y + hi + (lo >> 8);
+ flags = hi ^ y ^ result;
+
+ psw = (psw & ~(v40 | h08)) |
+ (flags >> 1 & h08) |
+ ((flags + 0x80) >> 2 & v40);
+ c = result;
+ a = (uint8_t) lo;
+ result = (uint8_t) result;
+ y = result;
+ nz = (((lo >> 1) | lo) & 0x7F) | result;
+
+ goto inc_pc_loop;
+ }
+
+ case 0x5A: { // CMPW YA,dp
+ int temp = a - READ_DP( -1, data );
+ nz = ((temp >> 1) | temp) & 0x7F;
+ temp = y + (temp >> 8);
+ temp -= READ_DP( 0, (uint8_t) (data + 1) );
+ nz |= temp;
+ c = ~temp;
+ nz &= 0xFF;
+ goto inc_pc_loop;
+ }
+
+// 10. MULTIPLICATION & DIVISON COMMANDS
+
+ case 0xCF: { // MUL YA
+ unsigned temp = y * a;
+ a = (uint8_t) temp;
+ nz = ((temp >> 1) | temp) & 0x7F;
+ y = temp >> 8;
+ nz |= y;
+ goto loop;
+ }
+
+ case 0x9E: // DIV YA,X
+ {
+ unsigned ya = y * 0x100 + a;
+
+ psw &= ~(h08 | v40);
+
+ if ( y >= x )
+ psw |= v40;
+
+ if ( (y & 15) >= (x & 15) )
+ psw |= h08;
+
+ if ( y < x * 2 )
+ {
+ a = ya / x;
+ y = ya - a * x;
+ }
+ else
+ {
+ a = 255 - (ya - x * 0x200) / (256 - x);
+ y = x + (ya - x * 0x200) % (256 - x);
+ }
+
+ nz = (uint8_t) a;
+ a = (uint8_t) a;
+
+ goto loop;
+ }
+
+// 11. DECIMAL COMPENSATION COMMANDS
+
+ case 0xDF: // DAA
+ SUSPICIOUS_OPCODE( "DAA" );
+ if ( a > 0x99 || c & 0x100 )
+ {
+ a += 0x60;
+ c = 0x100;
+ }
+
+ if ( (a & 0x0F) > 9 || psw & h08 )
+ a += 0x06;
+
+ nz = a;
+ a = (uint8_t) a;
+ goto loop;
+
+ case 0xBE: // DAS
+ SUSPICIOUS_OPCODE( "DAS" );
+ if ( a > 0x99 || !(c & 0x100) )
+ {
+ a -= 0x60;
+ c = 0;
+ }
+
+ if ( (a & 0x0F) > 9 || !(psw & h08) )
+ a -= 0x06;
+
+ nz = a;
+ a = (uint8_t) a;
+ goto loop;
+
+// 12. BRANCHING COMMANDS
+
+ case 0x2F: // BRA rel
+ pc += (BOOST::int8_t) data;
+ goto inc_pc_loop;
+
+ case 0x30: // BMI
+ BRANCH( (nz & nz_neg_mask) )
+
+ case 0x10: // BPL
+ BRANCH( !(nz & nz_neg_mask) )
+
+ case 0xB0: // BCS
+ BRANCH( c & 0x100 )
+
+ case 0x90: // BCC
+ BRANCH( !(c & 0x100) )
+
+ case 0x70: // BVS
+ BRANCH( psw & v40 )
+
+ case 0x50: // BVC
+ BRANCH( !(psw & v40) )
+
+ #define CBRANCH( cond )\
+ {\
+ pc++;\
+ if ( cond )\
+ goto cbranch_taken_loop;\
+ rel_time -= 2;\
+ goto inc_pc_loop;\
+ }
+
+ case 0x03: // BBS dp.bit,rel
+ case 0x23:
+ case 0x43:
+ case 0x63:
+ case 0x83:
+ case 0xA3:
+ case 0xC3:
+ case 0xE3:
+ CBRANCH( READ_DP( -4, data ) >> (opcode >> 5) & 1 )
+
+ case 0x13: // BBC dp.bit,rel
+ case 0x33:
+ case 0x53:
+ case 0x73:
+ case 0x93:
+ case 0xB3:
+ case 0xD3:
+ case 0xF3:
+ CBRANCH( !(READ_DP( -4, data ) >> (opcode >> 5) & 1) )
+
+ case 0xDE: // CBNE dp+X,rel
+ data = (uint8_t) (data + x);
+ // fall through
+ case 0x2E:{// CBNE dp,rel
+ int temp;
+ // 61% from timer
+ READ_DP_TIMER( -4, data, temp );
+ CBRANCH( temp != a )
+ }
+
+ case 0x6E: { // DBNZ dp,rel
+ unsigned temp = READ_DP( -4, data ) - 1;
+ WRITE_DP( -3, (uint8_t) data, /*(uint8_t)*/ temp + no_read_before_write );
+ CBRANCH( temp )
+ }
+
+ case 0xFE: // DBNZ Y,rel
+ y = (uint8_t) (y - 1);
+ BRANCH( y )
+
+ case 0x1F: // JMP [abs+X]
+ SET_PC( READ_PC16( pc ) + x );
+ // fall through
+ case 0x5F: // JMP abs
+ SET_PC( READ_PC16( pc ) );
+ goto loop;
+
+// 13. SUB-ROUTINE CALL RETURN COMMANDS
+
+ case 0x0F:{// BRK
+ int temp;
+ int ret_addr = GET_PC();
+ SUSPICIOUS_OPCODE( "BRK" );
+ SET_PC( READ_PROG16( 0xFFDE ) ); // vector address verified
+ PUSH16( ret_addr );
+ GET_PSW( temp );
+ psw = (psw | b10) & ~i04;
+ PUSH( temp );
+ goto loop;
+ }
+
+ case 0x4F:{// PCALL offset
+ int ret_addr = GET_PC() + 1;
+ SET_PC( 0xFF00 | data );
+ PUSH16( ret_addr );
+ goto loop;
+ }
+
+ case 0x01: // TCALL n
+ case 0x11:
+ case 0x21:
+ case 0x31:
+ case 0x41:
+ case 0x51:
+ case 0x61:
+ case 0x71:
+ case 0x81:
+ case 0x91:
+ case 0xA1:
+ case 0xB1:
+ case 0xC1:
+ case 0xD1:
+ case 0xE1:
+ case 0xF1: {
+ int ret_addr = GET_PC();
+ SET_PC( READ_PROG16( 0xFFDE - (opcode >> 3) ) );
+ PUSH16( ret_addr );
+ goto loop;
+ }
+
+// 14. STACK OPERATION COMMANDS
+
+ {
+ int temp;
+ case 0x7F: // RET1
+ temp = *sp;
+ SET_PC( GET_LE16( sp + 1 ) );
+ sp += 3;
+ goto set_psw;
+ case 0x8E: // POP PSW
+ POP( temp );
+ set_psw:
+ SET_PSW( temp );
+ goto loop;
+ }
+
+ case 0x0D: { // PUSH PSW
+ int temp;
+ GET_PSW( temp );
+ PUSH( temp );
+ goto loop;
+ }
+
+ case 0x2D: // PUSH A
+ PUSH( a );
+ goto loop;
+
+ case 0x4D: // PUSH X
+ PUSH( x );
+ goto loop;
+
+ case 0x6D: // PUSH Y
+ PUSH( y );
+ goto loop;
+
+ case 0xAE: // POP A
+ POP( a );
+ goto loop;
+
+ case 0xCE: // POP X
+ POP( x );
+ goto loop;
+
+ case 0xEE: // POP Y
+ POP( y );
+ goto loop;
+
+// 15. BIT OPERATION COMMANDS
+
+ case 0x02: // SET1
+ case 0x22:
+ case 0x42:
+ case 0x62:
+ case 0x82:
+ case 0xA2:
+ case 0xC2:
+ case 0xE2:
+ case 0x12: // CLR1
+ case 0x32:
+ case 0x52:
+ case 0x72:
+ case 0x92:
+ case 0xB2:
+ case 0xD2:
+ case 0xF2: {
+ int bit = 1 << (opcode >> 5);
+ int mask = ~bit;
+ if ( opcode & 0x10 )
+ bit = 0;
+ data += dp;
+ WRITE( 0, data, (READ( -1, data ) & mask) | bit );
+ goto inc_pc_loop;
+ }
+
+ case 0x0E: // TSET1 abs
+ case 0x4E: // TCLR1 abs
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -2, data );
+ nz = (uint8_t) (a - temp);
+ temp &= ~a;
+ if ( opcode == 0x0E )
+ temp |= a;
+ WRITE( 0, data, temp );
+ }
+ goto loop;
+
+ case 0x4A: // AND1 C,mem.bit
+ c &= MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+ case 0x6A: // AND1 C,/mem.bit
+ c &= ~MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+ case 0x0A: // OR1 C,mem.bit
+ c |= MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0x2A: // OR1 C,/mem.bit
+ c |= ~MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0x8A: // EOR1 C,mem.bit
+ c ^= MEM_BIT( -1 );
+ pc += 2;
+ goto loop;
+
+ case 0xEA: // NOT1 mem.bit
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -1, data & 0x1FFF );
+ temp ^= 1 << (data >> 13);
+ WRITE( 0, data & 0x1FFF, temp );
+ }
+ goto loop;
+
+ case 0xCA: // MOV1 mem.bit,C
+ data = READ_PC16( pc );
+ pc += 2;
+ {
+ unsigned temp = READ( -2, data & 0x1FFF );
+ unsigned bit = data >> 13;
+ temp = (temp & ~(1 << bit)) | ((c >> 8 & 1) << bit);
+ WRITE( 0, data & 0x1FFF, temp + no_read_before_write );
+ }
+ goto loop;
+
+ case 0xAA: // MOV1 C,mem.bit
+ c = MEM_BIT( 0 );
+ pc += 2;
+ goto loop;
+
+// 16. PROGRAM PSW FLAG OPERATION COMMANDS
+
+ case 0x60: // CLRC
+ c = 0;
+ goto loop;
+
+ case 0x80: // SETC
+ c = ~0;
+ goto loop;
+
+ case 0xED: // NOTC
+ c ^= 0x100;
+ goto loop;
+
+ case 0xE0: // CLRV
+ psw &= ~(v40 | h08);
+ goto loop;
+
+ case 0x20: // CLRP
+ dp = 0;
+ goto loop;
+
+ case 0x40: // SETP
+ dp = 0x100;
+ goto loop;
+
+ case 0xA0: // EI
+ SUSPICIOUS_OPCODE( "EI" );
+ psw |= i04;
+ goto loop;
+
+ case 0xC0: // DI
+ SUSPICIOUS_OPCODE( "DI" );
+ psw &= ~i04;
+ goto loop;
+
+// 17. OTHER COMMANDS
+
+ case 0x00: // NOP
+ goto loop;
+
+ case 0xFF:{// STOP
+ // handle PC wrap-around
+ unsigned addr = GET_PC() - 1;
+ if ( addr >= 0x10000 )
+ {
+ addr &= 0xFFFF;
+ SET_PC( addr );
+ dprintf( "SPC: PC wrapped around\n" );
+ goto loop;
+ }
+ }
+ // fall through
+ case 0xEF: // SLEEP
+ SUSPICIOUS_OPCODE( "STOP/SLEEP" );
+ --pc;
+ rel_time = 0;
+ m.cpu_error = "SPC emulation error";
+ goto stop;
+ } // switch
+
+ assert( 0 ); // catch any unhandled instructions
+}
+out_of_time:
+ rel_time -= m.cycle_table [*pc]; // undo partial execution of opcode
+stop:
+
+ // Uncache registers
+ if ( GET_PC() >= 0x10000 )
+ dprintf( "SPC: PC wrapped around\n" );
+ m.cpu_regs.pc = (uint16_t) GET_PC();
+ m.cpu_regs.sp = ( uint8_t) GET_SP();
+ m.cpu_regs.a = ( uint8_t) a;
+ m.cpu_regs.x = ( uint8_t) x;
+ m.cpu_regs.y = ( uint8_t) y;
+ {
+ int temp;
+ GET_PSW( temp );
+ m.cpu_regs.psw = (uint8_t) temp;
+ }
+}
+SPC_CPU_RUN_FUNC_END
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.cpp
new file mode 100644
index 00000000..f423e454
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.cpp
@@ -0,0 +1,1387 @@
+// snes_spc 0.9.0. http://www.slack.net/~ant/
+
+#include "Spc_Dsp.h"
+
+#include "blargg_endian.h"
+#include <string.h>
+
+/* Copyright (C) 2007 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifdef BLARGG_ENABLE_OPTIMIZER
+ #include BLARGG_ENABLE_OPTIMIZER
+#endif
+
+#if INT_MAX < 0x7FFFFFFF
+ #error "Requires that int type have at least 32 bits"
+#endif
+
+// TODO: add to blargg_endian.h
+#define GET_LE16SA( addr ) ((BOOST::int16_t) GET_LE16( addr ))
+#define GET_LE16A( addr ) GET_LE16( addr )
+#define SET_LE16A( addr, data ) SET_LE16( addr, data )
+
+static BOOST::uint8_t const initial_regs [Spc_Dsp::register_count] =
+{
+ 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80,
+ 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF,
+ 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A,
+ 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF,
+ 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67,
+ 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x9C,0x4E,0x7B,0xFF,
+ 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F,
+ 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF
+};
+
+// if ( io < -32768 ) io = -32768;
+// if ( io > 32767 ) io = 32767;
+#define CLAMP16( io )\
+{\
+ if ( (int16_t) io != io )\
+ io = (io >> 31) ^ 0x7FFF;\
+}
+
+// Access global DSP register
+#define REG(n) m.regs [r_##n]
+
+// Access voice DSP register
+#define VREG(r,n) r [v_##n]
+
+#define WRITE_SAMPLES( l, r, out ) \
+{\
+ out [0] = l;\
+ out [1] = r;\
+ out += 2;\
+ if ( out >= m.out_end )\
+ {\
+ check( out == m.out_end );\
+ check( m.out_end != &m.extra [extra_size] || \
+ (m.extra <= m.out_begin && m.extra < &m.extra [extra_size]) );\
+ out = m.extra;\
+ m.out_end = &m.extra [extra_size];\
+ }\
+}\
+
+void Spc_Dsp::set_output( sample_t* out, int size )
+{
+ require( (size & 1) == 0 ); // must be even
+ if ( !out )
+ {
+ out = m.extra;
+ size = extra_size;
+ }
+ m.out_begin = out;
+ m.out = out;
+ m.out_end = out + size;
+}
+
+// Volume registers and efb are signed! Easy to forget int8_t cast.
+// Prefixes are to avoid accidental use of locals with same names.
+
+// Gaussian interpolation
+
+static short const gauss [512] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2,
+ 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10,
+ 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17,
+ 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27,
+ 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77,
+ 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102,
+ 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132,
+ 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168,
+ 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210,
+ 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257,
+ 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311,
+ 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370,
+ 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434,
+ 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504,
+ 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577,
+ 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654,
+ 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732,
+ 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811,
+ 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889,
+ 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965,
+ 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036,
+1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102,
+1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160,
+1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210,
+1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251,
+1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280,
+1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298,
+1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305,
+};
+
+static short const cubic [514] =
+{
+ 0, -4, -8, -12, -16, -20, -23, -27, -30, -34, -37, -41, -44, -47, -50, -53,
+ -56, -59, -62, -65, -68, -71, -73, -76, -78, -81, -84, -87, -89, -91, -93, -95,
+ -98,-100,-102,-104,-106,-109,-110,-112,-113,-116,-117,-119,-121,-122,-123,-125,
+-126,-128,-129,-131,-132,-134,-134,-136,-136,-138,-138,-140,-141,-141,-142,-143,
+-144,-144,-145,-146,-147,-148,-147,-148,-148,-149,-149,-150,-150,-150,-150,-151,
+-151,-151,-151,-151,-152,-152,-151,-152,-151,-152,-151,-151,-151,-151,-150,-150,
+-150,-149,-149,-149,-149,-148,-147,-147,-146,-146,-145,-145,-144,-144,-143,-142,
+-141,-141,-140,-139,-139,-138,-137,-136,-135,-135,-133,-133,-132,-131,-130,-129,
+-128,-127,-126,-125,-124,-123,-121,-121,-119,-118,-117,-116,-115,-114,-112,-111,
+-110,-109,-107,-106,-105,-104,-102,-102,-100, -99, -97, -97, -95, -94, -92, -91,
+ -90, -88, -87, -86, -85, -84, -82, -81, -79, -78, -76, -76, -74, -73, -71, -70,
+ -68, -67, -66, -65, -63, -62, -60, -60, -58, -57, -55, -55, -53, -52, -50, -49,
+ -48, -46, -45, -44, -43, -42, -40, -39, -38, -37, -36, -35, -34, -32, -31, -30,
+ -29, -28, -27, -26, -25, -24, -23, -22, -21, -20, -19, -19, -17, -16, -15, -14,
+ -14, -13, -12, -11, -11, -10, -9, -9, -8, -8, -7, -7, -6, -5, -4, -4,
+ -3, -3, -3, -2, -2, -2, -1, -1, 0, -1, 0, -1, 0, 0, 0, 0,
+ 0,
+2048,2048,2048,2048,2047,2047,2046,2045,2043,2042,2041,2039,2037,2035,2033,2031,
+2028,2026,2024,2021,2018,2015,2012,2009,2005,2002,1999,1995,1991,1987,1982,1978,
+1974,1969,1965,1960,1955,1951,1946,1940,1934,1929,1924,1918,1912,1906,1900,1895,
+1888,1882,1875,1869,1862,1856,1849,1842,1835,1828,1821,1814,1806,1799,1791,1783,
+1776,1768,1760,1753,1744,1737,1728,1720,1711,1703,1695,1686,1677,1668,1659,1651,
+1641,1633,1623,1614,1605,1596,1587,1577,1567,1559,1549,1539,1529,1520,1510,1499,
+1490,1480,1470,1460,1450,1440,1430,1420,1408,1398,1389,1378,1367,1357,1346,1336,
+1325,1315,1304,1293,1282,1272,1261,1250,1239,1229,1218,1207,1196,1185,1174,1163,
+1152,1141,1130,1119,1108,1097,1086,1075,1063,1052,1042,1030,1019,1008, 997, 986,
+ 974, 964, 952, 941, 930, 919, 908, 897, 886, 875, 864, 853, 842, 831, 820, 809,
+ 798, 787, 776, 765, 754, 744, 733, 722, 711, 700, 690, 679, 668, 658, 647, 637,
+ 626, 616, 605, 595, 584, 574, 564, 554, 543, 534, 524, 514, 503, 494, 483, 473,
+ 464, 454, 444, 435, 425, 416, 407, 397, 387, 378, 370, 360, 351, 342, 333, 325,
+ 315, 307, 298, 290, 281, 273, 265, 256, 248, 241, 233, 225, 216, 209, 201, 193,
+ 186, 178, 171, 164, 157, 150, 143, 137, 129, 123, 117, 110, 103, 97, 91, 85,
+ 79, 74, 68, 62, 56, 51, 46, 41, 35, 31, 27, 22, 17, 13, 8, 4,
+ 0
+};
+
+static short const sinc [2048] =
+{
+ 39, -315, 666, 15642, 666, -315, 39, -38,
+ 38, -302, 613, 15642, 718, -328, 41, -38,
+ 36, -288, 561, 15641, 772, -342, 42, -38,
+ 35, -275, 510, 15639, 826, -355, 44, -38,
+ 33, -263, 459, 15636, 880, -369, 46, -38,
+ 32, -250, 408, 15632, 935, -383, 47, -38,
+ 31, -237, 358, 15628, 990, -396, 49, -38,
+ 29, -224, 309, 15622, 1046, -410, 51, -38,
+ 28, -212, 259, 15616, 1103, -425, 53, -38,
+ 27, -200, 211, 15609, 1159, -439, 54, -38,
+ 25, -188, 163, 15601, 1216, -453, 56, -38,
+ 24, -175, 115, 15593, 1274, -467, 58, -38,
+ 23, -164, 68, 15583, 1332, -482, 60, -38,
+ 22, -152, 22, 15573, 1391, -496, 62, -37,
+ 21, -140, -24, 15562, 1450, -511, 64, -37,
+ 19, -128, -70, 15550, 1509, -526, 66, -37,
+ 18, -117, -115, 15538, 1569, -540, 68, -37,
+ 17, -106, -159, 15524, 1629, -555, 70, -37,
+ 16, -94, -203, 15510, 1690, -570, 72, -36,
+ 15, -83, -247, 15495, 1751, -585, 74, -36,
+ 14, -72, -289, 15479, 1813, -600, 76, -36,
+ 13, -62, -332, 15462, 1875, -616, 79, -36,
+ 12, -51, -374, 15445, 1937, -631, 81, -35,
+ 11, -40, -415, 15426, 2000, -646, 83, -35,
+ 11, -30, -456, 15407, 2063, -662, 85, -35,
+ 10, -20, -496, 15387, 2127, -677, 88, -34,
+ 9, -9, -536, 15366, 2191, -693, 90, -34,
+ 8, 1, -576, 15345, 2256, -708, 92, -34,
+ 7, 10, -614, 15323, 2321, -724, 95, -33,
+ 7, 20, -653, 15300, 2386, -740, 97, -33,
+ 6, 30, -690, 15276, 2451, -755, 99, -33,
+ 5, 39, -728, 15251, 2517, -771, 102, -32,
+ 5, 49, -764, 15226, 2584, -787, 104, -32,
+ 4, 58, -801, 15200, 2651, -803, 107, -32,
+ 3, 67, -836, 15173, 2718, -819, 109, -31,
+ 3, 76, -871, 15145, 2785, -835, 112, -31,
+ 2, 85, -906, 15117, 2853, -851, 115, -30,
+ 2, 93, -940, 15087, 2921, -867, 117, -30,
+ 1, 102, -974, 15057, 2990, -883, 120, -29,
+ 1, 110, -1007, 15027, 3059, -899, 122, -29,
+ 0, 118, -1039, 14995, 3128, -915, 125, -29,
+ 0, 127, -1071, 14963, 3198, -931, 128, -28,
+ -1, 135, -1103, 14930, 3268, -948, 131, -28,
+ -1, 142, -1134, 14896, 3338, -964, 133, -27,
+ -1, 150, -1164, 14862, 3409, -980, 136, -27,
+ -2, 158, -1194, 14827, 3480, -996, 139, -26,
+ -2, 165, -1224, 14791, 3551, -1013, 142, -26,
+ -3, 172, -1253, 14754, 3622, -1029, 144, -25,
+ -3, 179, -1281, 14717, 3694, -1045, 147, -25,
+ -3, 187, -1309, 14679, 3766, -1062, 150, -24,
+ -3, 193, -1337, 14640, 3839, -1078, 153, -24,
+ -4, 200, -1363, 14601, 3912, -1094, 156, -23,
+ -4, 207, -1390, 14561, 3985, -1110, 159, -23,
+ -4, 213, -1416, 14520, 4058, -1127, 162, -22,
+ -4, 220, -1441, 14479, 4131, -1143, 165, -22,
+ -4, 226, -1466, 14437, 4205, -1159, 168, -22,
+ -5, 232, -1490, 14394, 4279, -1175, 171, -21,
+ -5, 238, -1514, 14350, 4354, -1192, 174, -21,
+ -5, 244, -1537, 14306, 4428, -1208, 177, -20,
+ -5, 249, -1560, 14261, 4503, -1224, 180, -20,
+ -5, 255, -1583, 14216, 4578, -1240, 183, -19,
+ -5, 260, -1604, 14169, 4653, -1256, 186, -19,
+ -5, 265, -1626, 14123, 4729, -1272, 189, -18,
+ -5, 271, -1647, 14075, 4805, -1288, 192, -18,
+ -5, 276, -1667, 14027, 4881, -1304, 195, -17,
+ -6, 280, -1687, 13978, 4957, -1320, 198, -17,
+ -6, 285, -1706, 13929, 5033, -1336, 201, -16,
+ -6, 290, -1725, 13879, 5110, -1352, 204, -16,
+ -6, 294, -1744, 13829, 5186, -1368, 207, -15,
+ -6, 299, -1762, 13777, 5263, -1383, 210, -15,
+ -6, 303, -1779, 13726, 5340, -1399, 213, -14,
+ -6, 307, -1796, 13673, 5418, -1414, 216, -14,
+ -6, 311, -1813, 13620, 5495, -1430, 219, -13,
+ -5, 315, -1829, 13567, 5573, -1445, 222, -13,
+ -5, 319, -1844, 13512, 5651, -1461, 225, -13,
+ -5, 322, -1859, 13458, 5728, -1476, 229, -12,
+ -5, 326, -1874, 13402, 5806, -1491, 232, -12,
+ -5, 329, -1888, 13347, 5885, -1506, 235, -11,
+ -5, 332, -1902, 13290, 5963, -1521, 238, -11,
+ -5, 335, -1915, 13233, 6041, -1536, 241, -10,
+ -5, 338, -1928, 13176, 6120, -1551, 244, -10,
+ -5, 341, -1940, 13118, 6199, -1566, 247, -10,
+ -5, 344, -1952, 13059, 6277, -1580, 250, -9,
+ -5, 347, -1964, 13000, 6356, -1595, 253, -9,
+ -5, 349, -1975, 12940, 6435, -1609, 256, -8,
+ -4, 352, -1986, 12880, 6514, -1623, 259, -8,
+ -4, 354, -1996, 12819, 6594, -1637, 262, -8,
+ -4, 356, -2005, 12758, 6673, -1651, 265, -7,
+ -4, 358, -2015, 12696, 6752, -1665, 268, -7,
+ -4, 360, -2024, 12634, 6831, -1679, 271, -7,
+ -4, 362, -2032, 12572, 6911, -1693, 274, -6,
+ -4, 364, -2040, 12509, 6990, -1706, 277, -6,
+ -4, 366, -2048, 12445, 7070, -1719, 280, -6,
+ -3, 367, -2055, 12381, 7149, -1732, 283, -5,
+ -3, 369, -2062, 12316, 7229, -1745, 286, -5,
+ -3, 370, -2068, 12251, 7308, -1758, 289, -5,
+ -3, 371, -2074, 12186, 7388, -1771, 291, -4,
+ -3, 372, -2079, 12120, 7467, -1784, 294, -4,
+ -3, 373, -2084, 12054, 7547, -1796, 297, -4,
+ -3, 374, -2089, 11987, 7626, -1808, 300, -4,
+ -2, 375, -2094, 11920, 7706, -1820, 303, -3,
+ -2, 376, -2098, 11852, 7785, -1832, 305, -3,
+ -2, 376, -2101, 11785, 7865, -1844, 308, -3,
+ -2, 377, -2104, 11716, 7944, -1855, 311, -3,
+ -2, 377, -2107, 11647, 8024, -1866, 313, -2,
+ -2, 378, -2110, 11578, 8103, -1877, 316, -2,
+ -2, 378, -2112, 11509, 8182, -1888, 318, -2,
+ -1, 378, -2113, 11439, 8262, -1899, 321, -2,
+ -1, 378, -2115, 11369, 8341, -1909, 323, -2,
+ -1, 378, -2116, 11298, 8420, -1920, 326, -2,
+ -1, 378, -2116, 11227, 8499, -1930, 328, -1,
+ -1, 378, -2116, 11156, 8578, -1940, 331, -1,
+ -1, 378, -2116, 11084, 8656, -1949, 333, -1,
+ -1, 377, -2116, 11012, 8735, -1959, 335, -1,
+ -1, 377, -2115, 10940, 8814, -1968, 337, -1,
+ -1, 377, -2114, 10867, 8892, -1977, 340, -1,
+ -1, 376, -2112, 10795, 8971, -1985, 342, -1,
+ 0, 375, -2111, 10721, 9049, -1994, 344, -1,
+ 0, 375, -2108, 10648, 9127, -2002, 346, 0,
+ 0, 374, -2106, 10574, 9205, -2010, 348, 0,
+ 0, 373, -2103, 10500, 9283, -2018, 350, 0,
+ 0, 372, -2100, 10426, 9360, -2025, 352, 0,
+ 0, 371, -2097, 10351, 9438, -2032, 354, 0,
+ 0, 370, -2093, 10276, 9515, -2039, 355, 0,
+ 0, 369, -2089, 10201, 9592, -2046, 357, 0,
+ 0, 367, -2084, 10126, 9669, -2052, 359, 0,
+ 0, 366, -2080, 10050, 9745, -2058, 360, 0,
+ 0, 365, -2075, 9974, 9822, -2064, 362, 0,
+ 0, 363, -2070, 9898, 9898, -2070, 363, 0,
+ 0, 362, -2064, 9822, 9974, -2075, 365, 0,
+ 0, 360, -2058, 9745, 10050, -2080, 366, 0,
+ 0, 359, -2052, 9669, 10126, -2084, 367, 0,
+ 0, 357, -2046, 9592, 10201, -2089, 369, 0,
+ 0, 355, -2039, 9515, 10276, -2093, 370, 0,
+ 0, 354, -2032, 9438, 10351, -2097, 371, 0,
+ 0, 352, -2025, 9360, 10426, -2100, 372, 0,
+ 0, 350, -2018, 9283, 10500, -2103, 373, 0,
+ 0, 348, -2010, 9205, 10574, -2106, 374, 0,
+ 0, 346, -2002, 9127, 10648, -2108, 375, 0,
+ -1, 344, -1994, 9049, 10721, -2111, 375, 0,
+ -1, 342, -1985, 8971, 10795, -2112, 376, -1,
+ -1, 340, -1977, 8892, 10867, -2114, 377, -1,
+ -1, 337, -1968, 8814, 10940, -2115, 377, -1,
+ -1, 335, -1959, 8735, 11012, -2116, 377, -1,
+ -1, 333, -1949, 8656, 11084, -2116, 378, -1,
+ -1, 331, -1940, 8578, 11156, -2116, 378, -1,
+ -1, 328, -1930, 8499, 11227, -2116, 378, -1,
+ -2, 326, -1920, 8420, 11298, -2116, 378, -1,
+ -2, 323, -1909, 8341, 11369, -2115, 378, -1,
+ -2, 321, -1899, 8262, 11439, -2113, 378, -1,
+ -2, 318, -1888, 8182, 11509, -2112, 378, -2,
+ -2, 316, -1877, 8103, 11578, -2110, 378, -2,
+ -2, 313, -1866, 8024, 11647, -2107, 377, -2,
+ -3, 311, -1855, 7944, 11716, -2104, 377, -2,
+ -3, 308, -1844, 7865, 11785, -2101, 376, -2,
+ -3, 305, -1832, 7785, 11852, -2098, 376, -2,
+ -3, 303, -1820, 7706, 11920, -2094, 375, -2,
+ -4, 300, -1808, 7626, 11987, -2089, 374, -3,
+ -4, 297, -1796, 7547, 12054, -2084, 373, -3,
+ -4, 294, -1784, 7467, 12120, -2079, 372, -3,
+ -4, 291, -1771, 7388, 12186, -2074, 371, -3,
+ -5, 289, -1758, 7308, 12251, -2068, 370, -3,
+ -5, 286, -1745, 7229, 12316, -2062, 369, -3,
+ -5, 283, -1732, 7149, 12381, -2055, 367, -3,
+ -6, 280, -1719, 7070, 12445, -2048, 366, -4,
+ -6, 277, -1706, 6990, 12509, -2040, 364, -4,
+ -6, 274, -1693, 6911, 12572, -2032, 362, -4,
+ -7, 271, -1679, 6831, 12634, -2024, 360, -4,
+ -7, 268, -1665, 6752, 12696, -2015, 358, -4,
+ -7, 265, -1651, 6673, 12758, -2005, 356, -4,
+ -8, 262, -1637, 6594, 12819, -1996, 354, -4,
+ -8, 259, -1623, 6514, 12880, -1986, 352, -4,
+ -8, 256, -1609, 6435, 12940, -1975, 349, -5,
+ -9, 253, -1595, 6356, 13000, -1964, 347, -5,
+ -9, 250, -1580, 6277, 13059, -1952, 344, -5,
+ -10, 247, -1566, 6199, 13118, -1940, 341, -5,
+ -10, 244, -1551, 6120, 13176, -1928, 338, -5,
+ -10, 241, -1536, 6041, 13233, -1915, 335, -5,
+ -11, 238, -1521, 5963, 13290, -1902, 332, -5,
+ -11, 235, -1506, 5885, 13347, -1888, 329, -5,
+ -12, 232, -1491, 5806, 13402, -1874, 326, -5,
+ -12, 229, -1476, 5728, 13458, -1859, 322, -5,
+ -13, 225, -1461, 5651, 13512, -1844, 319, -5,
+ -13, 222, -1445, 5573, 13567, -1829, 315, -5,
+ -13, 219, -1430, 5495, 13620, -1813, 311, -6,
+ -14, 216, -1414, 5418, 13673, -1796, 307, -6,
+ -14, 213, -1399, 5340, 13726, -1779, 303, -6,
+ -15, 210, -1383, 5263, 13777, -1762, 299, -6,
+ -15, 207, -1368, 5186, 13829, -1744, 294, -6,
+ -16, 204, -1352, 5110, 13879, -1725, 290, -6,
+ -16, 201, -1336, 5033, 13929, -1706, 285, -6,
+ -17, 198, -1320, 4957, 13978, -1687, 280, -6,
+ -17, 195, -1304, 4881, 14027, -1667, 276, -5,
+ -18, 192, -1288, 4805, 14075, -1647, 271, -5,
+ -18, 189, -1272, 4729, 14123, -1626, 265, -5,
+ -19, 186, -1256, 4653, 14169, -1604, 260, -5,
+ -19, 183, -1240, 4578, 14216, -1583, 255, -5,
+ -20, 180, -1224, 4503, 14261, -1560, 249, -5,
+ -20, 177, -1208, 4428, 14306, -1537, 244, -5,
+ -21, 174, -1192, 4354, 14350, -1514, 238, -5,
+ -21, 171, -1175, 4279, 14394, -1490, 232, -5,
+ -22, 168, -1159, 4205, 14437, -1466, 226, -4,
+ -22, 165, -1143, 4131, 14479, -1441, 220, -4,
+ -22, 162, -1127, 4058, 14520, -1416, 213, -4,
+ -23, 159, -1110, 3985, 14561, -1390, 207, -4,
+ -23, 156, -1094, 3912, 14601, -1363, 200, -4,
+ -24, 153, -1078, 3839, 14640, -1337, 193, -3,
+ -24, 150, -1062, 3766, 14679, -1309, 187, -3,
+ -25, 147, -1045, 3694, 14717, -1281, 179, -3,
+ -25, 144, -1029, 3622, 14754, -1253, 172, -3,
+ -26, 142, -1013, 3551, 14791, -1224, 165, -2,
+ -26, 139, -996, 3480, 14827, -1194, 158, -2,
+ -27, 136, -980, 3409, 14862, -1164, 150, -1,
+ -27, 133, -964, 3338, 14896, -1134, 142, -1,
+ -28, 131, -948, 3268, 14930, -1103, 135, -1,
+ -28, 128, -931, 3198, 14963, -1071, 127, 0,
+ -29, 125, -915, 3128, 14995, -1039, 118, 0,
+ -29, 122, -899, 3059, 15027, -1007, 110, 1,
+ -29, 120, -883, 2990, 15057, -974, 102, 1,
+ -30, 117, -867, 2921, 15087, -940, 93, 2,
+ -30, 115, -851, 2853, 15117, -906, 85, 2,
+ -31, 112, -835, 2785, 15145, -871, 76, 3,
+ -31, 109, -819, 2718, 15173, -836, 67, 3,
+ -32, 107, -803, 2651, 15200, -801, 58, 4,
+ -32, 104, -787, 2584, 15226, -764, 49, 5,
+ -32, 102, -771, 2517, 15251, -728, 39, 5,
+ -33, 99, -755, 2451, 15276, -690, 30, 6,
+ -33, 97, -740, 2386, 15300, -653, 20, 7,
+ -33, 95, -724, 2321, 15323, -614, 10, 7,
+ -34, 92, -708, 2256, 15345, -576, 1, 8,
+ -34, 90, -693, 2191, 15366, -536, -9, 9,
+ -34, 88, -677, 2127, 15387, -496, -20, 10,
+ -35, 85, -662, 2063, 15407, -456, -30, 11,
+ -35, 83, -646, 2000, 15426, -415, -40, 11,
+ -35, 81, -631, 1937, 15445, -374, -51, 12,
+ -36, 79, -616, 1875, 15462, -332, -62, 13,
+ -36, 76, -600, 1813, 15479, -289, -72, 14,
+ -36, 74, -585, 1751, 15495, -247, -83, 15,
+ -36, 72, -570, 1690, 15510, -203, -94, 16,
+ -37, 70, -555, 1629, 15524, -159, -106, 17,
+ -37, 68, -540, 1569, 15538, -115, -117, 18,
+ -37, 66, -526, 1509, 15550, -70, -128, 19,
+ -37, 64, -511, 1450, 15562, -24, -140, 21,
+ -37, 62, -496, 1391, 15573, 22, -152, 22,
+ -38, 60, -482, 1332, 15583, 68, -164, 23,
+ -38, 58, -467, 1274, 15593, 115, -175, 24,
+ -38, 56, -453, 1216, 15601, 163, -188, 25,
+ -38, 54, -439, 1159, 15609, 211, -200, 27,
+ -38, 53, -425, 1103, 15616, 259, -212, 28,
+ -38, 51, -410, 1046, 15622, 309, -224, 29,
+ -38, 49, -396, 990, 15628, 358, -237, 31,
+ -38, 47, -383, 935, 15632, 408, -250, 32,
+ -38, 46, -369, 880, 15636, 459, -263, 33,
+ -38, 44, -355, 826, 15639, 510, -275, 35,
+ -38, 42, -342, 772, 15641, 561, -288, 36,
+ -38, 41, -328, 718, 15642, 613, -302, 38,
+};
+
+inline int Spc_Dsp::interpolate( voice_t const* v )
+{
+ // Make pointers into gaussian based on fractional position between samples
+ int offset = v->interp_pos >> 4 & 0xFF;
+ short const* fwd = gauss + 255 - offset;
+ short const* rev = gauss + offset; // mirror left half of gaussian
+
+ int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos];
+ int out;
+ out = (fwd [ 0] * in [0]) >> 11;
+ out += (fwd [256] * in [1]) >> 11;
+ out += (rev [256] * in [2]) >> 11;
+ out = (int16_t) out;
+ out += (rev [ 0] * in [3]) >> 11;
+
+ CLAMP16( out );
+ out &= ~1;
+ return out;
+}
+
+inline int Spc_Dsp::interpolate_cubic( voice_t const* v )
+{
+ // Make pointers into cubic based on fractional position between samples
+ int offset = v->interp_pos >> 4 & 0xFF;
+ short const* fwd = cubic + offset;
+ short const* rev = cubic + 256 - offset; // mirror left half of cubic
+
+ int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos];
+ int out;
+ out = fwd [ 0] * in [0];
+ out += fwd [257] * in [1];
+ out += rev [257] * in [2];
+ out += rev [ 0] * in [3];
+ out >>= 11;
+
+ CLAMP16( out );
+ out &= ~1;
+ return out;
+}
+
+inline int Spc_Dsp::interpolate_sinc( voice_t const* v )
+{
+ // Make pointers into cubic based on fractional position between samples
+ int offset = v->interp_pos & 0xFF0;
+ short const* filt = (short const*) (((char const*)sinc) + offset);
+
+ int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos];
+ int out;
+ out = filt [0] * in [0];
+ out += filt [1] * in [1];
+ out += filt [2] * in [2];
+ out += filt [3] * in [3];
+ out += filt [4] * in [4];
+ out += filt [5] * in [5];
+ out += filt [6] * in [6];
+ out += filt [7] * in [7];
+ out >>= 14;
+
+ CLAMP16( out );
+ out &= ~1;
+ return out;
+}
+
+//// Counters
+
+int const simple_counter_range = 2048 * 5 * 3; // 30720
+
+static unsigned const counter_rates [32] =
+{
+ simple_counter_range + 1, // never fires
+ 2048, 1536,
+ 1280, 1024, 768,
+ 640, 512, 384,
+ 320, 256, 192,
+ 160, 128, 96,
+ 80, 64, 48,
+ 40, 32, 24,
+ 20, 16, 12,
+ 10, 8, 6,
+ 5, 4, 3,
+ 2,
+ 1
+};
+
+static unsigned const counter_offsets [32] =
+{
+ 1, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 536, 0, 1040,
+ 0,
+ 0
+};
+
+inline void Spc_Dsp::init_counter()
+{
+ m.counter = 0;
+}
+
+inline void Spc_Dsp::run_counters()
+{
+ if ( --m.counter < 0 )
+ m.counter = simple_counter_range - 1;
+}
+
+inline unsigned Spc_Dsp::read_counter( int rate )
+{
+ return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate];
+}
+
+
+//// Envelope
+
+inline void Spc_Dsp::run_envelope( voice_t* const v )
+{
+ int env = v->env;
+ if ( v->env_mode == env_release ) // 60%
+ {
+ if ( (env -= 0x8) < 0 )
+ env = 0;
+ v->env = env;
+ }
+ else
+ {
+ int rate;
+ int env_data = VREG(v->regs,adsr1);
+ if ( m.t_adsr0 & 0x80 ) // 99% ADSR
+ {
+ if ( v->env_mode >= env_decay ) // 99%
+ {
+ env--;
+ env -= env >> 8;
+ rate = env_data & 0x1F;
+ if ( v->env_mode == env_decay ) // 1%
+ rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10;
+ }
+ else // env_attack
+ {
+ rate = (m.t_adsr0 & 0x0F) * 2 + 1;
+ env += rate < 31 ? 0x20 : 0x400;
+ }
+ }
+ else // GAIN
+ {
+ int mode;
+ env_data = VREG(v->regs,gain);
+ mode = env_data >> 5;
+ if ( mode < 4 ) // direct
+ {
+ env = env_data * 0x10;
+ rate = 31;
+ }
+ else
+ {
+ rate = env_data & 0x1F;
+ if ( mode == 4 ) // 4: linear decrease
+ {
+ env -= 0x20;
+ }
+ else if ( mode < 6 ) // 5: exponential decrease
+ {
+ env--;
+ env -= env >> 8;
+ }
+ else // 6,7: linear increase
+ {
+ env += 0x20;
+ if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 )
+ env += 0x8 - 0x20; // 7: two-slope linear increase
+ }
+ }
+ }
+
+ // Sustain level
+ if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay )
+ v->env_mode = env_sustain;
+
+ v->hidden_env = env;
+
+ // unsigned cast because linear decrease going negative also triggers this
+ if ( (unsigned) env > 0x7FF )
+ {
+ env = (env < 0 ? 0 : 0x7FF);
+ if ( v->env_mode == env_attack )
+ v->env_mode = env_decay;
+ }
+
+ if ( !read_counter( rate ) )
+ v->env = env; // nothing else is controlled by the counter
+ }
+}
+
+
+//// BRR Decoding
+
+inline void Spc_Dsp::decode_brr( voice_t* v )
+{
+ // Arrange the four input nybbles in 0xABCD order for easy decoding
+ int nybbles = m.t_brr_byte * 0x100 + m.ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF];
+
+ int const header = m.t_brr_header;
+
+ // Write to next four samples in circular buffer
+ int* pos = &v->buf [v->buf_pos];
+ int* end;
+ if ( (v->buf_pos += 4) >= brr_buf_size )
+ v->buf_pos = 0;
+
+ // Decode four samples
+ for ( end = pos + 4; pos < end; pos++, nybbles <<= 4 )
+ {
+ // Extract nybble and sign-extend
+ int s = (int16_t) nybbles >> 12;
+
+ // Shift sample based on header
+ int const shift = header >> 4;
+ s = (s << shift) >> 1;
+ if ( shift >= 0xD ) // handle invalid range
+ s = (s >> 25) << 11; // same as: s = (s < 0 ? -0x800 : 0)
+
+ // Apply IIR filter (8 is the most commonly used)
+ int const filter = header & 0x0C;
+ int const p1 = pos [brr_buf_size - 1];
+ int const p2 = pos [brr_buf_size - 2] >> 1;
+ if ( filter >= 8 )
+ {
+ s += p1;
+ s -= p2;
+ if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875
+ {
+ s += p2 >> 4;
+ s += (p1 * -3) >> 6;
+ }
+ else // s += p1 * 0.8984375 - p2 * 0.40625
+ {
+ s += (p1 * -13) >> 7;
+ s += (p2 * 3) >> 4;
+ }
+ }
+ else if ( filter ) // s += p1 * 0.46875
+ {
+ s += p1 >> 1;
+ s += (-p1) >> 5;
+ }
+
+ // Adjust and write sample
+ CLAMP16( s );
+ s = (int16_t) (s * 2);
+ pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around
+ }
+}
+
+
+//// Misc
+
+#define MISC_CLOCK( n ) inline void Spc_Dsp::misc_##n()
+
+MISC_CLOCK( 27 )
+{
+ m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON
+}
+MISC_CLOCK( 28 )
+{
+ m.t_non = REG(non);
+ m.t_eon = REG(eon);
+ m.t_dir = REG(dir);
+}
+MISC_CLOCK( 29 )
+{
+ if ( (m.every_other_sample ^= 1) != 0 )
+ m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read
+}
+MISC_CLOCK( 30 )
+{
+ if ( m.every_other_sample )
+ {
+ m.kon = m.new_kon;
+ m.t_koff = REG(koff) | m.mute_mask;
+ }
+
+ run_counters();
+
+ // Noise
+ if ( !read_counter( REG(flg) & 0x1F ) )
+ {
+ int feedback = (m.noise << 13) ^ (m.noise << 14);
+ m.noise = (feedback & 0x4000) ^ (m.noise >> 1);
+ }
+}
+
+
+//// Voices
+
+#define VOICE_CLOCK( n ) void Spc_Dsp::voice_##n( voice_t* const v )
+
+inline VOICE_CLOCK( V1 )
+{
+ m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4;
+ m.t_srcn = VREG(v->regs,srcn);
+}
+inline VOICE_CLOCK( V2 )
+{
+ // Read sample pointer (ignored if not needed)
+ uint8_t const* entry = &m.ram [m.t_dir_addr];
+ if ( !v->kon_delay )
+ entry += 2;
+ m.t_brr_next_addr = GET_LE16A( entry );
+
+ m.t_adsr0 = VREG(v->regs,adsr0);
+
+ // Read pitch, spread over two clocks
+ m.t_pitch = VREG(v->regs,pitchl);
+}
+inline VOICE_CLOCK( V3a )
+{
+ m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8;
+}
+inline VOICE_CLOCK( V3b )
+{
+ // Read BRR header and byte
+ m.t_brr_byte = m.ram [(v->brr_addr + v->brr_offset) & 0xFFFF];
+ m.t_brr_header = m.ram [v->brr_addr]; // brr_addr doesn't need masking
+}
+VOICE_CLOCK( V3c )
+{
+ // Pitch modulation using previous voice's output
+ if ( m.t_pmon & v->vbit )
+ m.t_pitch += ((m.t_output >> 5) * m.t_pitch) >> 10;
+
+ if ( v->kon_delay )
+ {
+ // Get ready to start BRR decoding on next sample
+ if ( v->kon_delay == 5 )
+ {
+ v->brr_addr = m.t_brr_next_addr;
+ v->brr_offset = 1;
+ v->buf_pos = 0;
+ m.t_brr_header = 0; // header is ignored on this sample
+ m.kon_check = true;
+ }
+
+ // Envelope is never run during KON
+ v->env = 0;
+ v->hidden_env = 0;
+
+ // Disable BRR decoding until last three samples
+ v->interp_pos = 0;
+ if ( --v->kon_delay & 3 )
+ v->interp_pos = 0x4000;
+
+ // Pitch is never added during KON
+ m.t_pitch = 0;
+ }
+
+ // Gaussian interpolation
+ {
+ int output;
+
+ switch ( m.interpolation_level )
+ {
+ case 0:
+ default:
+ output = interpolate( v );
+ break;
+
+ case 1:
+ output = interpolate_cubic( v );
+ break;
+
+ case 2:
+ output = interpolate_sinc( v );
+ break;
+ }
+
+ // Noise
+ if ( m.t_non & v->vbit )
+ output = (int16_t) (m.noise * 2);
+
+ // Apply envelope
+ m.t_output = (output * v->env) >> 11 & ~1;
+ v->t_envx_out = (uint8_t) (v->env >> 4);
+ }
+
+ // Immediate silence due to end of sample or soft reset
+ if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 )
+ {
+ v->env_mode = env_release;
+ v->env = 0;
+ }
+
+ if ( m.every_other_sample )
+ {
+ // KOFF
+ if ( m.t_koff & v->vbit )
+ v->env_mode = env_release;
+
+ // KON
+ if ( m.kon & v->vbit )
+ {
+ v->kon_delay = 5;
+ v->env_mode = env_attack;
+ }
+ }
+
+ // Run envelope for next sample
+ if ( !v->kon_delay )
+ run_envelope( v );
+}
+inline void Spc_Dsp::voice_output( voice_t const* v, int ch )
+{
+ // Check surround removal
+ int vol = (int8_t) VREG(v->regs,voll + ch);
+ int voln = (int8_t) VREG(v->regs,voll + ch ^ 1);
+ if ( vol * voln < m.surround_threshold )
+ vol ^= vol >> 7;
+
+ // Apply left/right volume
+ int amp = (m.t_output * vol) >> 7;
+
+ // Add to output total
+ m.t_main_out [ch] += amp;
+ CLAMP16( m.t_main_out [ch] );
+
+ // Optionally add to echo total
+ if ( m.t_eon & v->vbit )
+ {
+ m.t_echo_out [ch] += amp;
+ CLAMP16( m.t_echo_out [ch] );
+ }
+}
+VOICE_CLOCK( V4 )
+{
+ // Decode BRR
+ m.t_looped = 0;
+ if ( v->interp_pos >= 0x4000 )
+ {
+ decode_brr( v );
+
+ if ( (v->brr_offset += 2) >= brr_block_size )
+ {
+ // Start decoding next BRR block
+ assert( v->brr_offset == brr_block_size );
+ v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF;
+ if ( m.t_brr_header & 1 )
+ {
+ v->brr_addr = m.t_brr_next_addr;
+ m.t_looped = v->vbit;
+ }
+ v->brr_offset = 1;
+ }
+ }
+
+ // Apply pitch
+ v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch;
+
+ // Keep from getting too far ahead (when using pitch modulation)
+ if ( v->interp_pos > 0x7FFF )
+ v->interp_pos = 0x7FFF;
+
+ // Output left
+ voice_output( v, 0 );
+}
+inline VOICE_CLOCK( V5 )
+{
+ // Output right
+ voice_output( v, 1 );
+
+ // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier
+ int endx_buf = REG(endx) | m.t_looped;
+
+ // Clear bit in ENDX if KON just began
+ if ( v->kon_delay == 5 )
+ endx_buf &= ~v->vbit;
+ m.endx_buf = (uint8_t) endx_buf;
+}
+inline VOICE_CLOCK( V6 )
+{
+ (void) v; // avoid compiler warning about unused v
+ m.outx_buf = (uint8_t) (m.t_output >> 8);
+}
+inline VOICE_CLOCK( V7 )
+{
+ // Update ENDX
+ REG(endx) = m.endx_buf;
+
+ m.envx_buf = v->t_envx_out;
+}
+inline VOICE_CLOCK( V8 )
+{
+ // Update OUTX
+ VREG(v->regs,outx) = m.outx_buf;
+}
+inline VOICE_CLOCK( V9 )
+{
+ // Update ENVX
+ VREG(v->regs,envx) = m.envx_buf;
+}
+
+// Most voices do all these in one clock, so make a handy composite
+inline VOICE_CLOCK( V3 )
+{
+ voice_V3a( v );
+ voice_V3b( v );
+ voice_V3c( v );
+}
+
+// Common combinations of voice steps on different voices. This greatly reduces
+// code size and allows everything to be inlined in these functions.
+VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); }
+VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); }
+VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); }
+
+
+//// Echo
+
+// Current echo buffer pointer for left/right channel
+#define ECHO_PTR( ch ) (&m.ram [m.t_echo_ptr + ch * 2])
+
+// Sample in echo history buffer, where 0 is the oldest
+#define ECHO_FIR( i ) (m.echo_hist_pos [i])
+
+// Calculate FIR point for left/right channel
+#define CALC_FIR( i, ch ) ((ECHO_FIR( i + 1 ) [ch] * (int8_t) REG(fir + i * 0x10)) >> 6)
+
+#define ECHO_CLOCK( n ) inline void Spc_Dsp::echo_##n()
+
+inline void Spc_Dsp::echo_read( int ch )
+{
+ int s = GET_LE16SA( ECHO_PTR( ch ) );
+ // second copy simplifies wrap-around handling
+ ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1;
+}
+
+ECHO_CLOCK( 22 )
+{
+ // History
+ if ( ++m.echo_hist_pos >= &m.echo_hist [echo_hist_size] )
+ m.echo_hist_pos = m.echo_hist;
+
+ m.t_echo_ptr = (m.t_esa * 0x100 + m.echo_offset) & 0xFFFF;
+ echo_read( 0 );
+
+ // FIR (using l and r temporaries below helps compiler optimize)
+ int l = CALC_FIR( 0, 0 );
+ int r = CALC_FIR( 0, 1 );
+
+ m.t_echo_in [0] = l;
+ m.t_echo_in [1] = r;
+}
+ECHO_CLOCK( 23 )
+{
+ int l = CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 );
+ int r = CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 );
+
+ m.t_echo_in [0] += l;
+ m.t_echo_in [1] += r;
+
+ echo_read( 1 );
+}
+ECHO_CLOCK( 24 )
+{
+ int l = CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 );
+ int r = CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 );
+
+ m.t_echo_in [0] += l;
+ m.t_echo_in [1] += r;
+}
+ECHO_CLOCK( 25 )
+{
+ int l = m.t_echo_in [0] + CALC_FIR( 6, 0 );
+ int r = m.t_echo_in [1] + CALC_FIR( 6, 1 );
+
+ l = (int16_t) l;
+ r = (int16_t) r;
+
+ l += (int16_t) CALC_FIR( 7, 0 );
+ r += (int16_t) CALC_FIR( 7, 1 );
+
+ CLAMP16( l );
+ CLAMP16( r );
+
+ m.t_echo_in [0] = l & ~1;
+ m.t_echo_in [1] = r & ~1;
+}
+inline int Spc_Dsp::echo_output( int ch )
+{
+ // Check surround removal
+ int vol = (int8_t) REG(mvoll + ch * 0x10);
+ int voln = (int8_t) REG(mvoll + ch * 0x10 ^ 0x10);
+ if ( vol * voln < m.surround_threshold )
+ vol ^= vol >> 7;
+
+ int out = (int16_t) ((m.t_main_out [ch] * vol) >> 7) +
+ (int16_t) ((m.t_echo_in [ch] * (int8_t) REG(evoll + ch * 0x10)) >> 7);
+ CLAMP16( out );
+ return out;
+}
+ECHO_CLOCK( 26 )
+{
+ // Left output volumes
+ // (save sample for next clock so we can output both together)
+ m.t_main_out [0] = echo_output( 0 );
+
+ // Echo feedback
+ int l = m.t_echo_out [0] + (int16_t) ((m.t_echo_in [0] * (int8_t) REG(efb)) >> 7);
+ int r = m.t_echo_out [1] + (int16_t) ((m.t_echo_in [1] * (int8_t) REG(efb)) >> 7);
+
+ CLAMP16( l );
+ CLAMP16( r );
+
+ m.t_echo_out [0] = l & ~1;
+ m.t_echo_out [1] = r & ~1;
+}
+ECHO_CLOCK( 27 )
+{
+ // Output
+ int l = m.t_main_out [0];
+ int r = echo_output( 1 );
+ m.t_main_out [0] = 0;
+ m.t_main_out [1] = 0;
+
+ // TODO: global muting isn't this simple (turns DAC on and off
+ // or something, causing small ~37-sample pulse when first muted)
+ if ( REG(flg) & 0x40 )
+ {
+ l = 0;
+ r = 0;
+ }
+
+ // Output sample to DAC
+ #ifdef SPC_DSP_OUT_HOOK
+ SPC_DSP_OUT_HOOK( l, r );
+ #else
+ sample_t* out = m.out;
+ WRITE_SAMPLES( l, r, out );
+ m.out = out;
+ #endif
+}
+ECHO_CLOCK( 28 )
+{
+ m.t_echo_enabled = REG(flg);
+}
+inline void Spc_Dsp::echo_write( int ch )
+{
+ if ( !(m.t_echo_enabled & 0x20) )
+ SET_LE16A( ECHO_PTR( ch ), m.t_echo_out [ch] );
+ m.t_echo_out [ch] = 0;
+}
+ECHO_CLOCK( 29 )
+{
+ m.t_esa = REG(esa);
+
+ if ( !m.echo_offset )
+ m.echo_length = (REG(edl) & 0x0F) * 0x800;
+
+ m.echo_offset += 4;
+ if ( m.echo_offset >= m.echo_length )
+ m.echo_offset = 0;
+
+ // Write left echo
+ echo_write( 0 );
+
+ m.t_echo_enabled = REG(flg);
+}
+ECHO_CLOCK( 30 )
+{
+ // Write right echo
+ echo_write( 1 );
+}
+
+
+//// Timing
+
+// Execute clock for a particular voice
+#define V( clock, voice ) voice_##clock( &m.voices [voice] );
+
+/* The most common sequence of clocks uses composite operations
+for efficiency. For example, the following are equivalent to the
+individual steps on the right:
+
+V(V7_V4_V1,2) -> V(V7,2) V(V4,3) V(V1,5)
+V(V8_V5_V2,2) -> V(V8,2) V(V5,3) V(V2,4)
+V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */
+
+// Voice 0 1 2 3 4 5 6 7
+#define GEN_DSP_TIMING \
+PHASE( 0) V(V5,0)V(V2,1)\
+PHASE( 1) V(V6,0)V(V3,1)\
+PHASE( 2) V(V7_V4_V1,0)\
+PHASE( 3) V(V8_V5_V2,0)\
+PHASE( 4) V(V9_V6_V3,0)\
+PHASE( 5) V(V7_V4_V1,1)\
+PHASE( 6) V(V8_V5_V2,1)\
+PHASE( 7) V(V9_V6_V3,1)\
+PHASE( 8) V(V7_V4_V1,2)\
+PHASE( 9) V(V8_V5_V2,2)\
+PHASE(10) V(V9_V6_V3,2)\
+PHASE(11) V(V7_V4_V1,3)\
+PHASE(12) V(V8_V5_V2,3)\
+PHASE(13) V(V9_V6_V3,3)\
+PHASE(14) V(V7_V4_V1,4)\
+PHASE(15) V(V8_V5_V2,4)\
+PHASE(16) V(V9_V6_V3,4)\
+PHASE(17) V(V1,0) V(V7,5)V(V4,6)\
+PHASE(18) V(V8_V5_V2,5)\
+PHASE(19) V(V9_V6_V3,5)\
+PHASE(20) V(V1,1) V(V7,6)V(V4,7)\
+PHASE(21) V(V8,6)V(V5,7) V(V2,0) /* t_brr_next_addr order dependency */\
+PHASE(22) V(V3a,0) V(V9,6)V(V6,7) echo_22();\
+PHASE(23) V(V7,7) echo_23();\
+PHASE(24) V(V8,7) echo_24();\
+PHASE(25) V(V3b,0) V(V9,7) echo_25();\
+PHASE(26) echo_26();\
+PHASE(27) misc_27(); echo_27();\
+PHASE(28) misc_28(); echo_28();\
+PHASE(29) misc_29(); echo_29();\
+PHASE(30) misc_30();V(V3c,0) echo_30();\
+PHASE(31) V(V4,0) V(V1,2)\
+
+#if !SPC_DSP_CUSTOM_RUN
+
+void Spc_Dsp::run( int clocks_remain )
+{
+ require( clocks_remain > 0 );
+
+ int const phase = m.phase;
+ m.phase = (phase + clocks_remain) & 31;
+ switch ( phase )
+ {
+ loop:
+
+ #define PHASE( n ) if ( n && !--clocks_remain ) break; case n:
+ GEN_DSP_TIMING
+ #undef PHASE
+
+ if ( --clocks_remain )
+ goto loop;
+ }
+}
+
+#endif
+
+
+//// Setup
+
+void Spc_Dsp::init( void* ram_64k )
+{
+ m.ram = (uint8_t*) ram_64k;
+ mute_voices( 0 );
+ disable_surround( false );
+ interpolation_level( 0 );
+ set_output( 0, 0 );
+ reset();
+
+ #ifndef NDEBUG
+ // be sure this sign-extends
+ assert( (int16_t) 0x8000 == -0x8000 );
+
+ // be sure right shift preserves sign
+ assert( (-1 >> 1) == -1 );
+
+ // check clamp macro
+ int i;
+ i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF );
+ i = -0x8001; CLAMP16( i ); assert( i == -0x8000 );
+
+ blargg_verify_byte_order();
+ #endif
+}
+
+void Spc_Dsp::soft_reset_common()
+{
+ require( m.ram ); // init() must have been called already
+
+ m.noise = 0x4000;
+ m.echo_hist_pos = m.echo_hist;
+ m.every_other_sample = 1;
+ m.echo_offset = 0;
+ m.phase = 0;
+
+ init_counter();
+}
+
+void Spc_Dsp::soft_reset()
+{
+ REG(flg) = 0xE0;
+ soft_reset_common();
+}
+
+void Spc_Dsp::load( uint8_t const regs [register_count] )
+{
+ memcpy( m.regs, regs, sizeof m.regs );
+ memset( &m.regs [register_count], 0, offsetof (state_t,ram) - register_count );
+
+ // Internal state
+ for ( int i = voice_count; --i >= 0; )
+ {
+ voice_t* v = &m.voices [i];
+ v->brr_offset = 1;
+ v->vbit = 1 << i;
+ v->regs = &m.regs [i * 0x10];
+ }
+ m.new_kon = REG(kon);
+ m.t_dir = REG(dir);
+ m.t_esa = REG(esa);
+
+ soft_reset_common();
+}
+
+void Spc_Dsp::reset() { load( initial_regs ); }
+
+
+//// State save/load
+
+#if !SPC_NO_COPY_STATE_FUNCS
+
+void SPC_State_Copier::copy( void* state, size_t size )
+{
+ func( buf, state, size );
+}
+
+int SPC_State_Copier::copy_int( int state, int size )
+{
+ BOOST::uint8_t s [2];
+ SET_LE16( s, state );
+ func( buf, &s, size );
+ return GET_LE16( s );
+}
+
+void SPC_State_Copier::skip( int count )
+{
+ if ( count > 0 )
+ {
+ char temp [64];
+ memset( temp, 0, sizeof temp );
+ do
+ {
+ int n = sizeof temp;
+ if ( n > count )
+ n = count;
+ count -= n;
+ func( buf, temp, n );
+ }
+ while ( count );
+ }
+}
+
+void SPC_State_Copier::extra()
+{
+ int n = 0;
+ SPC_State_Copier& copier = *this;
+ SPC_COPY( uint8_t, n );
+ skip( n );
+}
+
+void Spc_Dsp::copy_state( unsigned char** io, copy_func_t copy )
+{
+ SPC_State_Copier copier( io, copy );
+
+ // DSP registers
+ copier.copy( m.regs, register_count );
+
+ // Internal state
+
+ // Voices
+ int i;
+ for ( i = 0; i < voice_count; i++ )
+ {
+ voice_t* v = &m.voices [i];
+
+ // BRR buffer
+ int i;
+ for ( i = 0; i < brr_buf_size; i++ )
+ {
+ int s = v->buf [i];
+ SPC_COPY( int16_t, s );
+ v->buf [i] = v->buf [i + brr_buf_size] = s;
+ }
+
+ SPC_COPY( uint16_t, v->interp_pos );
+ SPC_COPY( uint16_t, v->brr_addr );
+ SPC_COPY( uint16_t, v->env );
+ SPC_COPY( int16_t, v->hidden_env );
+ SPC_COPY( uint8_t, v->buf_pos );
+ SPC_COPY( uint8_t, v->brr_offset );
+ SPC_COPY( uint8_t, v->kon_delay );
+ {
+ int m = v->env_mode;
+ SPC_COPY( uint8_t, m );
+ v->env_mode = (enum env_mode_t) m;
+ }
+ SPC_COPY( uint8_t, v->t_envx_out );
+
+ copier.extra();
+ }
+
+ // Echo history
+ for ( i = 0; i < echo_hist_size; i++ )
+ {
+ int j;
+ for ( j = 0; j < 2; j++ )
+ {
+ int s = m.echo_hist_pos [i] [j];
+ SPC_COPY( int16_t, s );
+ m.echo_hist [i] [j] = s; // write back at offset 0
+ }
+ }
+ m.echo_hist_pos = m.echo_hist;
+ memcpy( &m.echo_hist [echo_hist_size], m.echo_hist, echo_hist_size * sizeof m.echo_hist [0] );
+
+ // Misc
+ SPC_COPY( uint8_t, m.every_other_sample );
+ SPC_COPY( uint8_t, m.kon );
+
+ SPC_COPY( uint16_t, m.noise );
+ SPC_COPY( uint16_t, m.counter );
+ SPC_COPY( uint16_t, m.echo_offset );
+ SPC_COPY( uint16_t, m.echo_length );
+ SPC_COPY( uint8_t, m.phase );
+
+ SPC_COPY( uint8_t, m.new_kon );
+ SPC_COPY( uint8_t, m.endx_buf );
+ SPC_COPY( uint8_t, m.envx_buf );
+ SPC_COPY( uint8_t, m.outx_buf );
+
+ SPC_COPY( uint8_t, m.t_pmon );
+ SPC_COPY( uint8_t, m.t_non );
+ SPC_COPY( uint8_t, m.t_eon );
+ SPC_COPY( uint8_t, m.t_dir );
+ SPC_COPY( uint8_t, m.t_koff );
+
+ SPC_COPY( uint16_t, m.t_brr_next_addr );
+ SPC_COPY( uint8_t, m.t_adsr0 );
+ SPC_COPY( uint8_t, m.t_brr_header );
+ SPC_COPY( uint8_t, m.t_brr_byte );
+ SPC_COPY( uint8_t, m.t_srcn );
+ SPC_COPY( uint8_t, m.t_esa );
+ SPC_COPY( uint8_t, m.t_echo_enabled );
+
+ SPC_COPY( int16_t, m.t_main_out [0] );
+ SPC_COPY( int16_t, m.t_main_out [1] );
+ SPC_COPY( int16_t, m.t_echo_out [0] );
+ SPC_COPY( int16_t, m.t_echo_out [1] );
+ SPC_COPY( int16_t, m.t_echo_in [0] );
+ SPC_COPY( int16_t, m.t_echo_in [1] );
+
+ SPC_COPY( uint16_t, m.t_dir_addr );
+ SPC_COPY( uint16_t, m.t_pitch );
+ SPC_COPY( int16_t, m.t_output );
+ SPC_COPY( uint16_t, m.t_echo_ptr );
+ SPC_COPY( uint8_t, m.t_looped );
+
+ copier.extra();
+}
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.h b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.h
new file mode 100644
index 00000000..bd9b620c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Dsp.h
@@ -0,0 +1,315 @@
+// Highly accurate SNES SPC-700 DSP emulator
+
+// snes_spc 0.9.0
+#ifndef SPC_DSP_H
+#define SPC_DSP_H
+
+#include "blargg_common.h"
+
+extern "C" { typedef void (*dsp_copy_func_t)( unsigned char** io, void* state, size_t ); }
+
+class Spc_Dsp {
+public:
+ typedef BOOST::uint8_t uint8_t;
+
+// Setup
+
+ // Initializes DSP and has it use the 64K RAM provided
+ void init( void* ram_64k );
+
+ // Sets destination for output samples. If out is NULL or out_size is 0,
+ // doesn't generate any.
+ typedef short sample_t;
+ void set_output( sample_t* out, int out_size );
+
+ // Number of samples written to output since it was last set, always
+ // a multiple of 2. Undefined if more samples were generated than
+ // output buffer could hold.
+ int sample_count() const;
+
+// Emulation
+
+ // Resets DSP to power-on state
+ void reset();
+
+ // Emulates pressing reset switch on SNES
+ void soft_reset();
+
+ // Reads/writes DSP registers. For accuracy, you must first call run()
+ // to catch the DSP up to present.
+ int read ( int addr ) const;
+ void write( int addr, int data );
+
+ // Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks
+ // a pair of samples is be generated.
+ void run( int clock_count );
+
+// Sound control
+
+ // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events).
+ // Reduces emulation accuracy.
+ enum { voice_count = 8 };
+ void mute_voices( int mask );
+
+// State
+
+ // Resets DSP and uses supplied values to initialize registers
+ enum { register_count = 128 };
+ void load( uint8_t const regs [register_count] );
+
+ // Saves/loads exact emulator state
+ enum { state_size = 640 }; // maximum space needed when saving
+ typedef dsp_copy_func_t copy_func_t;
+ void copy_state( unsigned char** io, copy_func_t );
+
+ // Returns non-zero if new key-on events occurred since last call
+ bool check_kon();
+
+// DSP register addresses
+
+ // Global registers
+ enum {
+ r_mvoll = 0x0C, r_mvolr = 0x1C,
+ r_evoll = 0x2C, r_evolr = 0x3C,
+ r_kon = 0x4C, r_koff = 0x5C,
+ r_flg = 0x6C, r_endx = 0x7C,
+ r_efb = 0x0D, r_pmon = 0x2D,
+ r_non = 0x3D, r_eon = 0x4D,
+ r_dir = 0x5D, r_esa = 0x6D,
+ r_edl = 0x7D,
+ r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F
+ };
+
+ // Voice registers
+ enum {
+ v_voll = 0x00, v_volr = 0x01,
+ v_pitchl = 0x02, v_pitchh = 0x03,
+ v_srcn = 0x04, v_adsr0 = 0x05,
+ v_adsr1 = 0x06, v_gain = 0x07,
+ v_envx = 0x08, v_outx = 0x09
+ };
+
+public:
+ enum { extra_size = 16 };
+ sample_t* extra() { return m.extra; }
+ sample_t const* out_pos() const { return m.out; }
+ void disable_surround( bool disable = true );
+ void interpolation_level( int level = 0 ) { m.interpolation_level = level; }
+public:
+ BLARGG_DISABLE_NOTHROW
+
+ typedef BOOST::int8_t int8_t;
+ typedef BOOST::int16_t int16_t;
+
+ enum { echo_hist_size = 8 };
+
+ enum env_mode_t { env_release, env_attack, env_decay, env_sustain };
+ enum { brr_buf_size = 12 };
+ struct voice_t
+ {
+ int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling)
+ int buf_pos; // place in buffer where next samples will be decoded
+ int interp_pos; // relative fractional position in sample (0x1000 = 1.0)
+ int brr_addr; // address of current BRR block
+ int brr_offset; // current decoding offset in BRR block
+ uint8_t* regs; // pointer to voice's DSP registers
+ int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc.
+ int kon_delay; // KON delay/current setup phase
+ env_mode_t env_mode;
+ int env; // current envelope level
+ int hidden_env; // used by GAIN mode 7, very obscure quirk
+ uint8_t t_envx_out;
+ };
+
+private:
+ enum { brr_block_size = 9 };
+
+ struct state_t
+ {
+ uint8_t regs [register_count];
+
+ // Echo history keeps most recent 8 samples (twice the size to simplify wrap handling)
+ int echo_hist [echo_hist_size * 2] [2];
+ int (*echo_hist_pos) [2]; // &echo_hist [0 to 7]
+
+ int every_other_sample; // toggles every sample
+ int kon; // KON value when last checked
+ int noise;
+ int counter;
+ int echo_offset; // offset from ESA in echo buffer
+ int echo_length; // number of bytes that echo_offset will stop at
+ int phase; // next clock cycle to run (0-31)
+ bool kon_check; // set when a new KON occurs
+
+ // Hidden registers also written to when main register is written to
+ int new_kon;
+ uint8_t endx_buf;
+ uint8_t envx_buf;
+ uint8_t outx_buf;
+
+ // Temporary state between clocks
+
+ // read once per sample
+ int t_pmon;
+ int t_non;
+ int t_eon;
+ int t_dir;
+ int t_koff;
+
+ // read a few clocks ahead then used
+ int t_brr_next_addr;
+ int t_adsr0;
+ int t_brr_header;
+ int t_brr_byte;
+ int t_srcn;
+ int t_esa;
+ int t_echo_enabled;
+
+ // internal state that is recalculated every sample
+ int t_dir_addr;
+ int t_pitch;
+ int t_output;
+ int t_looped;
+ int t_echo_ptr;
+
+ // left/right sums
+ int t_main_out [2];
+ int t_echo_out [2];
+ int t_echo_in [2];
+
+ voice_t voices [voice_count];
+
+ // non-emulation state
+ uint8_t* ram; // 64K shared RAM between DSP and SMP
+ int mute_mask;
+ int surround_threshold;
+ int interpolation_level;
+ sample_t* out;
+ sample_t* out_end;
+ sample_t* out_begin;
+ sample_t extra [extra_size];
+ };
+ state_t m;
+
+ void init_counter();
+ void run_counters();
+ unsigned read_counter( int rate );
+
+ int interpolate( voice_t const* v );
+ int interpolate_cubic( voice_t const* v );
+ int interpolate_sinc( voice_t const* v );
+ void run_envelope( voice_t* const v );
+ void decode_brr( voice_t* v );
+
+ void misc_27();
+ void misc_28();
+ void misc_29();
+ void misc_30();
+
+ void voice_output( voice_t const* v, int ch );
+ void voice_V1( voice_t* const );
+ void voice_V2( voice_t* const );
+ void voice_V3( voice_t* const );
+ void voice_V3a( voice_t* const );
+ void voice_V3b( voice_t* const );
+ void voice_V3c( voice_t* const );
+ void voice_V4( voice_t* const );
+ void voice_V5( voice_t* const );
+ void voice_V6( voice_t* const );
+ void voice_V7( voice_t* const );
+ void voice_V8( voice_t* const );
+ void voice_V9( voice_t* const );
+ void voice_V7_V4_V1( voice_t* const );
+ void voice_V8_V5_V2( voice_t* const );
+ void voice_V9_V6_V3( voice_t* const );
+
+ void echo_read( int ch );
+ int echo_output( int ch );
+ void echo_write( int ch );
+ void echo_22();
+ void echo_23();
+ void echo_24();
+ void echo_25();
+ void echo_26();
+ void echo_27();
+ void echo_28();
+ void echo_29();
+ void echo_30();
+
+ void soft_reset_common();
+};
+
+#include <assert.h>
+
+inline int Spc_Dsp::sample_count() const { return m.out - m.out_begin; }
+
+inline int Spc_Dsp::read( int addr ) const
+{
+ assert( (unsigned) addr < register_count );
+ return m.regs [addr];
+}
+
+inline void Spc_Dsp::write( int addr, int data )
+{
+ assert( (unsigned) addr < register_count );
+
+ m.regs [addr] = (uint8_t) data;
+ switch ( addr & 0x0F )
+ {
+ case v_envx:
+ m.envx_buf = (uint8_t) data;
+ break;
+
+ case v_outx:
+ m.outx_buf = (uint8_t) data;
+ break;
+
+ case 0x0C:
+ if ( addr == r_kon )
+ m.new_kon = (uint8_t) data;
+
+ if ( addr == r_endx ) // always cleared, regardless of data written
+ {
+ m.endx_buf = 0;
+ m.regs [r_endx] = 0;
+ }
+ break;
+ }
+}
+
+inline void Spc_Dsp::mute_voices( int mask ) { m.mute_mask = mask; }
+
+inline void Spc_Dsp::disable_surround( bool disable )
+{
+ m.surround_threshold = disable ? 0 : -0x4000;
+}
+
+inline bool Spc_Dsp::check_kon()
+{
+ bool old = m.kon_check;
+ m.kon_check = 0;
+ return old;
+}
+
+#if !SPC_NO_COPY_STATE_FUNCS
+
+class SPC_State_Copier {
+ Spc_Dsp::copy_func_t func;
+ unsigned char** buf;
+public:
+ SPC_State_Copier( unsigned char** p, Spc_Dsp::copy_func_t f ) { func = f; buf = p; }
+ void copy( void* state, size_t size );
+ int copy_int( int state, int size );
+ void skip( int count );
+ void extra();
+};
+
+#define SPC_COPY( type, state )\
+{\
+ state = (BOOST::type) copier.copy_int( state, sizeof (BOOST::type) );\
+ assert( (BOOST::type) state == state );\
+}
+
+#endif
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.cpp
index 22be9e2a..51cb10bc 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Spc_Emu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.cpp
@@ -1,326 +1,393 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-#include "Spc_Emu.h"
-
-#include "blargg_endian.h"
-#include <stdlib.h>
-#include <string.h>
-
-/* Copyright (C) 2004-2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#include "blargg_source.h"
-
-Spc_Emu::Spc_Emu()
-{
- set_type( gme_spc_type );
-
- static const char* const names [Snes_Spc::voice_count] = {
- "DSP 1", "DSP 2", "DSP 3", "DSP 4", "DSP 5", "DSP 6", "DSP 7", "DSP 8"
- };
- set_voice_names( names );
-
- set_gain( 1.4 );
-}
-
-Spc_Emu::~Spc_Emu() { }
-
-// Track info
-
-long const trailer_offset = 0x10200;
-
-byte const* Spc_Emu::trailer() const { return &file_data [min( file_size, trailer_offset )]; }
-
-long Spc_Emu::trailer_size() const { return max( 0L, file_size - trailer_offset ); }
-
-static void get_spc_xid6( byte const* begin, long size, track_info_t* out )
-{
- // header
- byte const* end = begin + size;
- if ( size < 8 || memcmp( begin, "xid6", 4 ) )
- {
- check( false );
- return;
- }
- long info_size = get_le32( begin + 4 );
- byte const* in = begin + 8;
- if ( end - in > info_size )
- {
- dprintf( "Extra data after SPC xid6 info\n" );
- end = in + info_size;
- }
-
- int year = 0;
- char copyright [256 + 5];
- int copyright_len = 0;
- int const year_len = 5;
-
- while ( end - in >= 4 )
- {
- // header
- int id = in [0];
- int data = in [3] * 0x100 + in [2];
- int type = in [1];
- int len = type ? data : 0;
- in += 4;
- if ( len > end - in )
- {
- check( false );
- break; // block goes past end of data
- }
-
- // handle specific block types
- char* field = 0;
- switch ( id )
- {
- case 0x01: field = out->song; break;
- case 0x02: field = out->game; break;
- case 0x03: field = out->author; break;
- case 0x04: field = out->dumper; break;
- case 0x07: field = out->comment; break;
- case 0x14: year = data; break;
-
- //case 0x30: // intro length
- // Many SPCs have intro length set wrong for looped tracks, making it useless
- /*
- case 0x30:
- check( len == 4 );
- if ( len >= 4 )
- {
- out->intro_length = get_le32( in ) / 64;
- if ( out->length > 0 )
- {
- long loop = out->length - out->intro_length;
- if ( loop >= 2000 )
- out->loop_length = loop;
- }
- }
- break;
- */
-
- case 0x13:
- copyright_len = min( len, (int) sizeof copyright - year_len );
- memcpy( &copyright [year_len], in, copyright_len );
- break;
-
- default:
- if ( id < 0x01 || (id > 0x07 && id < 0x10) ||
- (id > 0x14 && id < 0x30) || id > 0x36 )
- dprintf( "Unknown SPC xid6 block: %X\n", (int) id );
- break;
- }
- if ( field )
- {
- check( type == 1 );
- Gme_File::copy_field_( field, (char const*) in, len );
- }
-
- // skip to next block
- in += len;
-
- // blocks are supposed to be 4-byte aligned with zero-padding...
- byte const* unaligned = in;
- while ( (in - begin) & 3 && in < end )
- {
- if ( *in++ != 0 )
- {
- // ...but some files have no padding
- in = unaligned;
- dprintf( "SPC info tag wasn't properly padded to align\n" );
- break;
- }
- }
- }
-
- char* p = &copyright [year_len];
- if ( year )
- {
- *--p = ' ';
- for ( int n = 4; n--; )
- {
- *--p = char (year % 10 + '0');
- year /= 10;
- }
- copyright_len += year_len;
- }
- if ( copyright_len )
- Gme_File::copy_field_( out->copyright, p, copyright_len );
-
- check( in == end );
-}
-
-static void get_spc_info( Spc_Emu::header_t const& h, byte const* xid6, long xid6_size,
- track_info_t* out )
-{
- // decode length (can be in text or binary format, sometimes ambiguous ugh)
- long len_secs = 0;
- for ( int i = 0; i < 3; i++ )
- {
- unsigned n = h.len_secs [i] - '0';
- if ( n > 9 )
- {
- // ignore single-digit text lengths
- // (except if author field is present and begins at offset 1, ugh)
- if ( i == 1 && (h.author [0] || !h.author [1]) )
- len_secs = 0;
- break;
- }
- len_secs *= 10;
- len_secs += n;
- }
- if ( !len_secs || len_secs > 0x1FFF )
- len_secs = get_le16( h.len_secs );
- if ( len_secs < 0x1FFF )
- out->length = len_secs * 1000;
-
- int offset = (h.author [0] < ' ' || unsigned (h.author [0] - '0') <= 9);
- Gme_File::copy_field_( out->author, &h.author [offset], sizeof h.author - offset );
-
- GME_COPY_FIELD( h, out, song );
- GME_COPY_FIELD( h, out, game );
- GME_COPY_FIELD( h, out, dumper );
- GME_COPY_FIELD( h, out, comment );
-
- if ( xid6_size )
- get_spc_xid6( xid6, xid6_size, out );
-}
-
-blargg_err_t Spc_Emu::track_info_( track_info_t* out, int ) const
-{
- get_spc_info( header(), trailer(), trailer_size(), out );
- return 0;
-}
-
-static blargg_err_t check_spc_header( void const* header )
-{
- if ( memcmp( header, "SNES-SPC700 Sound File Data", 27 ) )
- return gme_wrong_file_type;
- return 0;
-}
-
-struct Spc_File : Gme_Info_
-{
- Spc_Emu::header_t header;
- blargg_vector<byte> xid6;
-
- Spc_File() { set_type( gme_spc_type ); }
-
- blargg_err_t load_( Data_Reader& in )
- {
- long file_size = in.remain();
- if ( file_size < Snes_Spc::spc_file_size )
- return gme_wrong_file_type;
- RETURN_ERR( in.read( &header, Spc_Emu::header_size ) );
- RETURN_ERR( check_spc_header( header.tag ) );
- long const xid6_offset = 0x10200;
- long xid6_size = file_size - xid6_offset;
- if ( xid6_size > 0 )
- {
- RETURN_ERR( xid6.resize( xid6_size ) );
- RETURN_ERR( in.skip( xid6_offset - Spc_Emu::header_size ) );
- RETURN_ERR( in.read( xid6.begin(), xid6.size() ) );
- }
- return 0;
- }
-
- blargg_err_t track_info_( track_info_t* out, int ) const
- {
- get_spc_info( header, xid6.begin(), xid6.size(), out );
- return 0;
- }
-};
-
-static Music_Emu* new_spc_emu () { return BLARGG_NEW Spc_Emu ; }
-static Music_Emu* new_spc_file() { return BLARGG_NEW Spc_File; }
-
-gme_type_t_ const gme_spc_type [1] = { "Super Nintendo", 1, &new_spc_emu, &new_spc_file, "SPC", 0 };
-
-// Setup
-
-blargg_err_t Spc_Emu::set_sample_rate_( long sample_rate )
-{
- apu.set_gain( gain() );
- if ( sample_rate != native_sample_rate )
- {
- RETURN_ERR( resampler.buffer_size( native_sample_rate / 20 * 2 ) );
- resampler.time_ratio( (double) native_sample_rate / sample_rate, 0.9965 );
- }
- return 0;
-}
-
-void Spc_Emu::mute_voices_( int m )
-{
- Music_Emu::mute_voices_( m );
- apu.mute_voices( m );
-}
-
-blargg_err_t Spc_Emu::load_mem_( byte const* in, long size )
-{
- assert( offsetof (header_t,unused2 [46]) == header_size );
- file_data = in;
- file_size = size;
- set_voice_count( Snes_Spc::voice_count );
- if ( size < Snes_Spc::spc_file_size )
- return gme_wrong_file_type;
- return check_spc_header( in );
-}
-
-// Emulation
-
-void Spc_Emu::set_tempo_( double t ) { apu.set_tempo( t ); }
-
-blargg_err_t Spc_Emu::start_track_( int track )
-{
- RETURN_ERR( Music_Emu::start_track_( track ) );
- resampler.clear();
- RETURN_ERR( apu.load_spc( file_data, file_size ) );
- apu.clear_echo();
- return 0;
-}
-
-blargg_err_t Spc_Emu::skip_( long count )
-{
- if ( sample_rate() != native_sample_rate )
- {
- count = long (count * resampler.ratio()) & ~1;
- count -= resampler.skip_input( count );
- }
-
- // TODO: shouldn't skip be adjusted for the 64 samples read afterwards?
-
- if ( count > 0 )
- RETURN_ERR( apu.skip( count ) );
-
- // eliminate pop due to resampler
- const int resampler_latency = 64;
- sample_t buf [resampler_latency];
- return play_( resampler_latency, buf );
-}
-
-blargg_err_t Spc_Emu::play_( long count, sample_t* out )
-{
- if ( sample_rate() == native_sample_rate )
- return apu.play( count, out );
-
- long remain = count;
- while ( remain > 0 )
- {
- remain -= resampler.read( &out [count - remain], remain );
- if ( remain > 0 )
- {
- long n = resampler.max_write();
- RETURN_ERR( apu.play( n, resampler.buffer() ) );
- resampler.write( n );
- }
- }
- check( remain == 0 );
- return 0;
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Spc_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2004-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// TODO: support Spc_Filter's bass
+
+Spc_Emu::Spc_Emu()
+{
+ set_type( gme_spc_type );
+ set_gain( 1.4 );
+}
+
+Spc_Emu::~Spc_Emu() { }
+
+// Track info
+
+int const trailer_offset = 0x10200;
+
+inline byte const* Spc_Emu::trailer_() const { return &file_begin() [min( file_size(), trailer_offset )]; }
+
+inline int Spc_Emu::trailer_size_() const { return max( 0, file_size() - trailer_offset ); }
+
+static void get_spc_xid6( byte const begin [], int size, track_info_t* out )
+{
+ // header
+ byte const* end = begin + size;
+ if ( size < 8 || memcmp( begin, "xid6", 4 ) )
+ {
+ check( false );
+ return;
+ }
+ int info_size = get_le32( begin + 4 );
+ byte const* in = begin + 8;
+ if ( end - in > info_size )
+ {
+ dprintf( "SPC: Extra data after xid6\n" );
+ end = in + info_size;
+ }
+
+ int year = 0;
+ char copyright [256 + 5];
+ int copyright_len = 0;
+ int const year_len = 5;
+ int disc = 0, track = 0;
+
+ while ( end - in >= 4 )
+ {
+ // header
+ int id = in [0];
+ int data = in [3] * 0x100 + in [2];
+ int type = in [1];
+ int len = type ? data : 0;
+ in += 4;
+ if ( len > end - in )
+ {
+ dprintf( "SPC: xid6 goes past end" );
+ break; // block goes past end of data
+ }
+
+ // handle specific block types
+ char* field = NULL;
+ switch ( id )
+ {
+ case 0x01: field = out->song; break;
+ case 0x02: field = out->game; break;
+ case 0x03: field = out->author; break;
+ case 0x04: field = out->dumper; break;
+ case 0x07: field = out->comment; break;
+ case 0x10: field = out->ost; break;
+ case 0x11: disc = data; break;
+ case 0x12: track = data; break;
+ case 0x14: year = data; break;
+
+ //case 0x30: // intro length
+ // Many SPCs have intro length set wrong for looped tracks, making it useless
+ /*
+ case 0x30:
+ check( len == 4 );
+ if ( len >= 4 )
+ {
+ out->intro_length = get_le32( in ) / 64;
+ if ( out->length > 0 )
+ {
+ int loop = out->length - out->intro_length;
+ if ( loop >= 2000 )
+ out->loop_length = loop;
+ }
+ }
+ break;
+ */
+
+ case 0x33:
+ check( len == 4 );
+ if ( len >= 4 )
+ {
+ out->fade_length = get_le32( in ) / 64;
+ }
+ break;
+
+ case 0x13:
+ copyright_len = min( len, (int) sizeof copyright - year_len );
+ memcpy( &copyright [year_len], in, copyright_len );
+ break;
+
+ default:
+ if ( id < 0x01 || (id > 0x07 && id < 0x10) ||
+ (id > 0x14 && id < 0x30) || id > 0x36 )
+ dprintf( "SPC: Unknown xid6 block: %X\n", (int) id );
+ break;
+ }
+ if ( field )
+ {
+ check( type == 1 );
+ Gme_File::copy_field_( field, (char const*) in, len );
+ }
+
+ // skip to next block
+ in += len;
+
+ // blocks are supposed to be 4-byte aligned with zero-padding...
+ byte const* unaligned = in;
+ while ( (in - begin) & 3 && in < end )
+ {
+ if ( *in++ != 0 )
+ {
+ // ...but some files have no padding
+ in = unaligned;
+ //dprintf( "SPC: xid6 info tag wasn't properly padded to align\n" );
+ break;
+ }
+ }
+ }
+
+ char* p = &copyright [year_len];
+ if ( year )
+ {
+ *--p = ' ';
+ // avoid using bloated printf
+ for ( int n = 4; n--; )
+ {
+ *--p = char (year % 10 + '0');
+ year /= 10;
+ }
+ copyright_len += year_len;
+ }
+ if ( copyright_len )
+ Gme_File::copy_field_( out->copyright, p, copyright_len );
+
+ if ( disc > 0 && disc <= 9 )
+ {
+ out->disc [0] = disc + '0';
+ out->disc [1] = 0;
+ }
+
+ if ( track > 255 && track < ( ( 100 << 8 ) - 1 ) )
+ {
+ char* p = &copyright [3];
+ *p = 0;
+ if ( track & 255 ) *--p = char (track & 255);
+ track >>= 8;
+ for ( int n = 2; n-- && track; )
+ {
+ *--p = char (track % 10 + '0');
+ track /= 10;
+ }
+ memcpy( out->track, p, &copyright [4] - p );
+ }
+
+ check( in == end );
+}
+
+static void get_spc_info( Spc_Emu::header_t const& h, byte const xid6 [], int xid6_size,
+ track_info_t* out )
+{
+ // decode length (can be in text or binary format, sometimes ambiguous ugh)
+ int len_secs = 0;
+ int i;
+ for ( i = 0; i < 3; i++ )
+ {
+ unsigned n = h.len_secs [i] - '0';
+ if ( n > 9 )
+ {
+ // ignore single-digit text lengths
+ // (except if author field is present and begins at offset 1, ugh)
+ if ( i == 1 && (h.author [0] || !h.author [1]) )
+ len_secs = 0;
+ break;
+ }
+ len_secs *= 10;
+ len_secs += n;
+ }
+ if ( !len_secs || len_secs > 0x1FFF )
+ len_secs = get_le16( h.len_secs );
+ if ( len_secs < 0x1FFF )
+ out->length = len_secs * 1000;
+
+ long fade_msec = 0;
+ for ( i = 0; i < 4; i++ )
+ {
+ unsigned n = h.fade_msec [i] - '0';
+ if ( n > 9 )
+ {
+ if ( i == 1 && (h.author [0] || !h.author [1]) )
+ fade_msec = -1;
+ break;
+ }
+ fade_msec *= 10;
+ fade_msec += n;
+ }
+ if ( i == 4 && unsigned( h.author [0] - '0' ) <= 9 )
+ fade_msec = fade_msec * 10 + h.author [0] - '0';
+ if ( fade_msec < 0 || fade_msec > 0x7FFF )
+ fade_msec = get_le32( h.fade_msec );
+ if ( fade_msec < 0x7FFF )
+ out->fade_length = fade_msec;
+
+ int offset = (h.author [0] < ' ' || unsigned (h.author [0] - '0') <= 9);
+ Gme_File::copy_field_( out->author, &h.author [offset], sizeof h.author - offset );
+
+ GME_COPY_FIELD( h, out, song );
+ GME_COPY_FIELD( h, out, game );
+ GME_COPY_FIELD( h, out, dumper );
+ GME_COPY_FIELD( h, out, comment );
+
+ if ( xid6_size )
+ get_spc_xid6( xid6, xid6_size, out );
+}
+
+blargg_err_t Spc_Emu::track_info_( track_info_t* out, int ) const
+{
+ get_spc_info( header(), trailer_(), trailer_size_(), out );
+ return blargg_ok;
+}
+
+static blargg_err_t check_spc_header( void const* header )
+{
+ if ( memcmp( header, "SNES-SPC700 Sound File Data", 27 ) )
+ return blargg_err_file_type;
+ return blargg_ok;
+}
+
+struct Spc_File : Gme_Info_
+{
+ Spc_Emu::header_t header;
+ blargg_vector<byte> xid6;
+
+ Spc_File() { set_type( gme_spc_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ int file_size = in.remain();
+ if ( file_size < Snes_Spc::spc_min_file_size )
+ return blargg_err_file_type;
+ RETURN_ERR( in.read( &header, header.size ) );
+ RETURN_ERR( check_spc_header( header.tag ) );
+ int const xid6_offset = 0x10200;
+ int xid6_size = file_size - xid6_offset;
+ if ( xid6_size > 0 )
+ {
+ RETURN_ERR( xid6.resize( xid6_size ) );
+ RETURN_ERR( in.skip( xid6_offset - header.size ) );
+ RETURN_ERR( in.read( xid6.begin(), xid6.size() ) );
+ }
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ get_spc_info( header, xid6.begin(), xid6.size(), out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_spc_emu () { return BLARGG_NEW Spc_Emu ; }
+static Music_Emu* new_spc_file() { return BLARGG_NEW Spc_File; }
+
+gme_type_t_ const gme_spc_type [1] = {{ "Super Nintendo", 1, &new_spc_emu, &new_spc_file, "SPC", 0 }};
+
+// Setup
+
+blargg_err_t Spc_Emu::set_sample_rate_( int sample_rate )
+{
+ RETURN_ERR( apu.init() );
+ if ( sample_rate != native_sample_rate )
+ {
+ RETURN_ERR( resampler.resize_buffer( native_sample_rate / 20 * 2 ) );
+ RETURN_ERR( resampler.set_rate( (double) native_sample_rate / sample_rate ) ); // 0.9965 rolloff
+ }
+ return blargg_ok;
+}
+
+void Spc_Emu::mute_voices_( int m )
+{
+ Music_Emu::mute_voices_( m );
+ apu.mute_voices( m );
+}
+
+blargg_err_t Spc_Emu::load_mem_( byte const in [], int size )
+{
+ assert( offsetof (header_t,unused2 [46]) == header_t::size );
+ set_voice_count( Spc_Dsp::voice_count );
+ if ( size < Snes_Spc::spc_min_file_size )
+ return blargg_err_file_type;
+
+ static const char* const names [Spc_Dsp::voice_count] = {
+ "DSP 1", "DSP 2", "DSP 3", "DSP 4", "DSP 5", "DSP 6", "DSP 7", "DSP 8"
+ };
+ set_voice_names( names );
+
+ return check_spc_header( in );
+}
+
+// Emulation
+
+void Spc_Emu::set_tempo_( double t )
+{
+ apu.set_tempo( (int) (t * Snes_Spc::tempo_unit) );
+}
+
+blargg_err_t Spc_Emu::start_track_( int track )
+{
+ RETURN_ERR( Music_Emu::start_track_( track ) );
+ resampler.clear();
+ filter.clear();
+ RETURN_ERR( apu.load_spc( file_begin(), file_size() ) );
+ filter.set_gain( (int) (gain() * SPC_Filter::gain_unit) );
+ apu.clear_echo();
+ return blargg_ok;
+}
+
+blargg_err_t Spc_Emu::play_and_filter( int count, sample_t out [] )
+{
+ RETURN_ERR( apu.play( count, out ) );
+ filter.run( out, count );
+ return blargg_ok;
+}
+
+blargg_err_t Spc_Emu::skip_( int count )
+{
+ if ( sample_rate() != native_sample_rate )
+ {
+ count = (int) (count * resampler.rate()) & ~1;
+ count -= resampler.skip_input( count );
+ }
+
+ // TODO: shouldn't skip be adjusted for the 64 samples read afterwards?
+
+ if ( count > 0 )
+ {
+ RETURN_ERR( apu.skip( count ) );
+ filter.clear();
+ }
+
+ // eliminate pop due to resampler
+ const int resampler_latency = 64;
+ sample_t buf [resampler_latency];
+ return play_( resampler_latency, buf );
+}
+
+blargg_err_t Spc_Emu::play_( int count, sample_t out [] )
+{
+ if ( sample_rate() == native_sample_rate )
+ return play_and_filter( count, out );
+
+ int remain = count;
+ while ( remain > 0 )
+ {
+ remain -= resampler.read( &out [count - remain], remain );
+ if ( remain > 0 )
+ {
+ int n = resampler.buffer_free();
+ RETURN_ERR( play_and_filter( n, resampler.buffer() ) );
+ resampler.write( n );
+ }
+ }
+ check( remain == 0 );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.h
new file mode 100644
index 00000000..00901424
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Emu.h
@@ -0,0 +1,85 @@
+// Super Nintendo SPC music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef SPC_EMU_H
+#define SPC_EMU_H
+
+#include "Music_Emu.h"
+#include "Snes_Spc.h"
+#include "Spc_Filter.h"
+
+#if GME_SPC_FAST_RESAMPLER
+ #include "Upsampler.h"
+ typedef Upsampler Spc_Emu_Resampler;
+#else
+ #include "Fir_Resampler.h"
+ typedef Fir_Resampler<24> Spc_Emu_Resampler;
+#endif
+
+class Spc_Emu : public Music_Emu {
+public:
+ // The Super Nintendo hardware samples at 32kHz. Other sample rates are
+ // handled by resampling the 32kHz output; emulation accuracy is not affected.
+ enum { native_sample_rate = 32000 };
+
+ // Disables annoying pseudo-surround effect some music uses
+ void disable_surround( bool disable = true ) { apu.disable_surround( disable ); }
+
+ // Enables gaussian, cubic or sinc interpolation
+ void interpolation_level( int level = 0 ) { apu.interpolation_level( level ); }
+
+ // SPC file header
+ struct header_t
+ {
+ enum { size = 0x100 };
+
+ char tag [35];
+ byte format;
+ byte version;
+ byte pc [ 2];
+ byte a, x, y, psw, sp;
+ byte unused [ 2];
+ char song [32];
+ char game [32];
+ char dumper [16];
+ char comment [32];
+ byte date [11];
+ byte len_secs [ 3];
+ byte fade_msec [ 4];
+ char author [32]; // sometimes first char should be skipped (see official SPC spec)
+ byte mute_mask;
+ byte emulator;
+ byte unused2 [46];
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return *(header_t const*) file_begin(); }
+
+ static gme_type_t static_type() { return gme_spc_type; }
+
+// Implementation
+public:
+ Spc_Emu();
+ ~Spc_Emu();
+
+protected:
+ virtual blargg_err_t load_mem_( byte const [], int );
+ virtual blargg_err_t track_info_( track_info_t*, int track ) const;
+ virtual blargg_err_t set_sample_rate_( int );
+ virtual blargg_err_t start_track_( int );
+ virtual blargg_err_t play_( int, sample_t [] );
+ virtual blargg_err_t skip_( int );
+ virtual void mute_voices_( int );
+ virtual void set_tempo_( double );
+
+private:
+ Spc_Emu_Resampler resampler;
+ SPC_Filter filter;
+ Snes_Spc apu;
+
+ byte const* trailer_() const;
+ int trailer_size_() const;
+ blargg_err_t play_and_filter( int count, sample_t out [] );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Spc_Filter.h b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Filter.h
new file mode 100644
index 00000000..9de56b18
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Spc_Filter.h
@@ -0,0 +1,53 @@
+// Simple low-pass and high-pass filter to better match sound output of a SNES
+
+// Game_Music_Emu 0.5.5
+#ifndef SPC_FILTER_H
+#define SPC_FILTER_H
+
+#include "blargg_common.h"
+
+struct SPC_Filter {
+public:
+
+ // Filters count samples of stereo sound in place. Count must be a multiple of 2.
+ typedef short sample_t;
+ void run( sample_t* io, int count );
+
+// Optional features
+
+ // Clears filter to silence
+ void clear();
+
+ // Sets gain (volume), where gain_unit is normal. Gains greater than gain_unit
+ // are fine, since output is clamped to 16-bit sample range.
+ enum { gain_unit = 0x100 };
+ void set_gain( int gain );
+
+ // Enables/disables filtering (when disabled, gain is still applied)
+ void enable( bool b );
+
+ // Sets amount of bass (logarithmic scale)
+ enum { bass_none = 0 };
+ enum { bass_norm = 8 }; // normal amount
+ enum { bass_max = 31 };
+ void set_bass( int bass );
+
+public:
+ SPC_Filter();
+ BLARGG_DISABLE_NOTHROW
+private:
+ enum { gain_bits = 8 };
+ int gain;
+ int bass;
+ bool enabled;
+ struct chan_t { int p1, pp1, sum; };
+ chan_t ch [2];
+};
+
+inline void SPC_Filter::enable( bool b ) { enabled = b; }
+
+inline void SPC_Filter::set_gain( int g ) { gain = g; }
+
+inline void SPC_Filter::set_bass( int b ) { bass = b; }
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.cpp
new file mode 100644
index 00000000..dc54ea81
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.cpp
@@ -0,0 +1,293 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Track_Filter.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const fade_block_size = 512;
+int const fade_shift = 8; // fade ends with gain at 1.0 / (1 << fade_shift)
+int const silence_threshold = 8;
+
+blargg_err_t Track_Filter::init( callbacks_t* c )
+{
+ callbacks = c;
+ return buf.resize( buf_size );
+}
+
+void Track_Filter::clear_time_vars()
+{
+ emu_time = buf_remain;
+ out_time = 0;
+ silence_time = 0;
+ silence_count = 0;
+}
+
+void Track_Filter::stop()
+{
+ emu_track_ended_ = true;
+ track_ended_ = true;
+ fade_start = indefinite_count;
+ fade_step = 1;
+ buf_remain = 0;
+ emu_error = NULL;
+ clear_time_vars();
+}
+
+Track_Filter::Track_Filter() : setup_()
+{
+ callbacks = NULL;
+ setup_.max_silence = indefinite_count;
+ silence_ignored_ = false;
+ stop();
+}
+
+Track_Filter::~Track_Filter() { }
+
+blargg_err_t Track_Filter::start_track()
+{
+ emu_error = NULL;
+ stop();
+
+ emu_track_ended_ = false;
+ track_ended_ = false;
+
+ if ( !silence_ignored_ )
+ {
+ // play until non-silence or end of track
+ while ( emu_time < setup_.max_initial )
+ {
+ fill_buf();
+ if ( buf_remain | emu_track_ended_ )
+ break;
+ }
+ }
+
+ clear_time_vars();
+ return emu_error;
+}
+
+void Track_Filter::end_track_if_error( blargg_err_t err )
+{
+ if ( err )
+ {
+ emu_error = err;
+ emu_track_ended_ = true;
+ }
+}
+
+blargg_err_t Track_Filter::skip( int count )
+{
+ emu_error = NULL;
+ out_time += count;
+
+ // remove from silence and buf first
+ {
+ int n = min( count, silence_count );
+ silence_count -= n;
+ count -= n;
+
+ n = min( count, buf_remain );
+ buf_remain -= n;
+ count -= n;
+ }
+
+ if ( count && !emu_track_ended_ )
+ {
+ emu_time += count;
+ silence_time = emu_time; // would otherwise be invalid
+ end_track_if_error( callbacks->skip_( count ) );
+ }
+
+ if ( !(silence_count | buf_remain) ) // caught up to emulator, so update track ended
+ track_ended_ |= emu_track_ended_;
+
+ return emu_error;
+}
+
+blargg_err_t Track_Filter::skip_( int count )
+{
+ while ( count && !emu_track_ended_ )
+ {
+ int n = buf_size;
+ if ( n > count )
+ n = count;
+ count -= n;
+ RETURN_ERR( callbacks->play_( n, buf.begin() ) );
+ }
+ return blargg_ok;
+}
+
+// Fading
+
+void Track_Filter::set_fade( int start, int length )
+{
+ fade_start = start;
+ fade_step = length / (fade_block_size * fade_shift);
+ if ( fade_step < 1 )
+ fade_step = 1;
+}
+
+bool Track_Filter::is_fading() const
+{
+ return out_time >= fade_start && fade_start != indefinite_count;
+}
+
+// unit / pow( 2.0, (double) x / step )
+static int int_log( int x, int step, int unit )
+{
+ int shift = x / step;
+ int fraction = (x - shift * step) * unit / step;
+ return ((unit - fraction) + (fraction >> 1)) >> shift;
+}
+
+void Track_Filter::handle_fade( sample_t out [], int out_count )
+{
+ for ( int i = 0; i < out_count; i += fade_block_size )
+ {
+ int const shift = 14;
+ int const unit = 1 << shift;
+ int gain = int_log( (out_time + i - fade_start) / fade_block_size,
+ fade_step, unit );
+ if ( gain < (unit >> fade_shift) )
+ track_ended_ = emu_track_ended_ = true;
+
+ sample_t* io = &out [i];
+ for ( int count = min( fade_block_size, out_count - i ); count; --count )
+ {
+ *io = sample_t ((*io * gain) >> shift);
+ ++io;
+ }
+ }
+}
+
+// Silence detection
+
+void Track_Filter::emu_play( sample_t out [], int count )
+{
+ emu_time += count;
+ if ( !emu_track_ended_ )
+ end_track_if_error( callbacks->play_( count, out ) );
+ else
+ memset( out, 0, count * sizeof *out );
+}
+
+// number of consecutive silent samples at end
+static int count_silence( Track_Filter::sample_t begin [], int size )
+{
+ Track_Filter::sample_t first = *begin;
+ *begin = silence_threshold * 2; // sentinel
+ Track_Filter::sample_t* p = begin + size;
+ while ( (unsigned) (*--p + silence_threshold) <= (unsigned) silence_threshold * 2 ) { }
+ *begin = first;
+ return size - (p - begin);
+}
+
+// fill internal buffer and check it for silence
+void Track_Filter::fill_buf()
+{
+ assert( !buf_remain );
+ if ( !emu_track_ended_ )
+ {
+ emu_play( buf.begin(), buf_size );
+ int silence = count_silence( buf.begin(), buf_size );
+ if ( silence < buf_size )
+ {
+ silence_time = emu_time - silence;
+ buf_remain = buf_size;
+ return;
+ }
+ }
+ silence_count += buf_size;
+}
+
+blargg_err_t Track_Filter::play( int out_count, sample_t out [] )
+{
+ emu_error = NULL;
+ if ( track_ended_ )
+ {
+ memset( out, 0, out_count * sizeof *out );
+ }
+ else
+ {
+ assert( emu_time >= out_time );
+
+ // prints nifty graph of how far ahead we are when searching for silence
+ //dprintf( "%*s \n", int ((emu_time - out_time) * 7 / 44100), "*" );
+
+ // use any remaining silence samples
+ int pos = 0;
+ if ( silence_count )
+ {
+ if ( !silence_ignored_ )
+ {
+ // during a run of silence, run emulator at >=2x speed so it gets ahead
+ int ahead_time = setup_.lookahead * (out_time + out_count - silence_time) +
+ silence_time;
+ while ( emu_time < ahead_time && !(buf_remain | emu_track_ended_) )
+ fill_buf();
+
+ // end track if sufficient silence has been found
+ if ( emu_time - silence_time > setup_.max_silence )
+ {
+ track_ended_ = emu_track_ended_ = true;
+ silence_count = out_count;
+ buf_remain = 0;
+ }
+ }
+
+ // fill from remaining silence
+ pos = min( silence_count, out_count );
+ memset( out, 0, pos * sizeof *out );
+ silence_count -= pos;
+ }
+
+ // use any remaining samples from buffer
+ if ( buf_remain )
+ {
+ int n = min( buf_remain, (int) (out_count - pos) );
+ memcpy( out + pos, buf.begin() + (buf_size - buf_remain), n * sizeof *out );
+ buf_remain -= n;
+ pos += n;
+ }
+
+ // generate remaining samples normally
+ int remain = out_count - pos;
+ if ( remain )
+ {
+ emu_play( out + pos, remain );
+ track_ended_ |= emu_track_ended_;
+
+ if ( silence_ignored_ && !is_fading() )
+ {
+ // if left unupdated, ahead_time could become too large
+ silence_time = emu_time;
+ }
+ else
+ {
+ // check end for a new run of silence
+ int silence = count_silence( out + pos, remain );
+ if ( silence < remain )
+ silence_time = emu_time - silence;
+
+ if ( emu_time - silence_time >= buf_size )
+ fill_buf(); // cause silence detection on next play()
+ }
+ }
+
+ if ( is_fading() )
+ handle_fade( out, out_count );
+ }
+ out_time += out_count;
+ return emu_error;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.h b/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.h
new file mode 100644
index 00000000..2743543f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Track_Filter.h
@@ -0,0 +1,105 @@
+// Removes silence from beginning of track, fades end of track. Also looks ahead
+// for excessive silence, and if found, ends track.
+
+// Game_Music_Emu 0.6-pre
+#ifndef TRACK_FILTER_H
+#define TRACK_FILTER_H
+
+#include "blargg_common.h"
+
+class Track_Filter {
+public:
+ typedef int sample_count_t;
+ typedef short sample_t;
+
+ enum { indefinite_count = INT_MAX/2 + 1 };
+
+ struct callbacks_t {
+ // Samples may be stereo or mono
+ virtual blargg_err_t play_( int count, sample_t* out ) BLARGG_PURE( { return blargg_ok; } )
+ virtual blargg_err_t skip_( int count ) BLARGG_PURE( { return blargg_ok; } )
+ virtual ~callbacks_t() { } // avoids silly "non-virtual dtor" warning
+ };
+
+ // Initializes filter. Must be done once before using object.
+ blargg_err_t init( callbacks_t* );
+
+ struct setup_t {
+ sample_count_t max_initial; // maximum silence to strip from beginning of track
+ sample_count_t max_silence; // maximum silence in middle of track without it ending
+ int lookahead; // internal speed when looking ahead for silence (2=200% etc.)
+ };
+
+ // Gets/sets setup
+ setup_t const& setup() const { return setup_; }
+ void setup( setup_t const& s ) { setup_ = s; }
+
+ // Disables automatic end-of-track detection and skipping of silence at beginning
+ void ignore_silence( bool disable = true ) { silence_ignored_ = disable; }
+
+ // Clears state and skips initial silence in track
+ blargg_err_t start_track();
+
+ // Sets time that fade starts, and how long until track ends.
+ void set_fade( sample_count_t start, sample_count_t length );
+
+ // Generates n samples into buf
+ blargg_err_t play( int n, sample_t buf [] );
+
+ // Skips n samples
+ blargg_err_t skip( int n );
+
+ // Number of samples played/skipped since start_track()
+ int sample_count() const { return out_time; }
+
+ // True if track ended. Causes are end of source samples, end of fade,
+ // or excessive silence.
+ bool track_ended() const { return track_ended_; }
+
+ // Clears state
+ void stop();
+
+// For use by callbacks
+
+ // Sets internal "track ended" flag and stops generation of further source samples
+ void set_track_ended() { emu_track_ended_ = true; }
+
+ // For use by skip_() callback
+ blargg_err_t skip_( int count );
+
+// Implementation
+public:
+ Track_Filter();
+ ~Track_Filter();
+
+private:
+ callbacks_t* callbacks;
+ setup_t setup_;
+ const char* emu_error;
+ bool silence_ignored_;
+
+ // Timing
+ int out_time; // number of samples played since start of track
+ int emu_time; // number of samples emulator has generated since start of track
+ int emu_track_ended_; // emulator has reached end of track
+ volatile int track_ended_;
+ void clear_time_vars();
+ void end_track_if_error( blargg_err_t );
+
+ // Fading
+ int fade_start;
+ int fade_step;
+ bool is_fading() const;
+ void handle_fade( sample_t out [], int count );
+
+ // Silence detection
+ int silence_time; // absolute number of samples where most recent silence began
+ int silence_count; // number of samples of silence to play before using buf
+ int buf_remain; // number of samples left in silence buffer
+ enum { buf_size = 2048 };
+ blargg_vector<sample_t> buf;
+ void fill_buf();
+ void emu_play( sample_t out [], int count );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.cpp
new file mode 100644
index 00000000..8272b978
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.cpp
@@ -0,0 +1,73 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Upsampler.h"
+
+/* Copyright (C) 2004-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const shift = 15;
+int const unit = 1 << shift;
+
+void Upsampler::clear_()
+{
+ pos = 0;
+ Resampler::clear_();
+}
+
+Upsampler::Upsampler()
+{
+ clear();
+}
+
+blargg_err_t Upsampler::set_rate_( double new_factor )
+{
+ step = (int) (new_factor * unit + 0.5);
+ return Resampler::set_rate_( 1.0 / unit * step );
+}
+
+Resampler::sample_t const* Upsampler::resample_( sample_t** out_, sample_t const* out_end,
+ sample_t const in [], int in_size )
+{
+ in_size -= write_offset;
+ if ( in_size > 0 )
+ {
+ sample_t* BLARGG_RESTRICT out = *out_;
+ sample_t const* const in_end = in + in_size;
+
+ int const step = this->step;
+ int pos = this->pos;
+
+ do
+ {
+ #define INTERP( i, out )\
+ {\
+ int t = in [0 + i] * (unit - pos) + in [stereo + i] * pos;\
+ out = t >> shift;\
+ }
+
+ int out_0;
+ INTERP( 0, out_0 )
+ INTERP( 1, out [0] = out_0; out [1] )
+ out += stereo;
+
+ pos += step;
+ in += ((unsigned) pos >> shift) * stereo;
+ pos &= unit - 1;
+ }
+ while ( in < in_end && out < out_end );
+
+ this->pos = pos;
+ *out_ = out;
+ }
+ return in;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.h b/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.h
new file mode 100644
index 00000000..1bdec661
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Upsampler.h
@@ -0,0 +1,25 @@
+// Increases sampling rate using linear interpolation
+
+// Game_Music_Emu 0.6-pre
+#ifndef UPSAMPLER_H
+#define UPSAMPLER_H
+
+#include "Resampler.h"
+
+class Upsampler : public Resampler {
+public:
+ Upsampler();
+
+protected:
+ virtual blargg_err_t set_rate_( double );
+ virtual void clear_();
+ virtual sample_t const* resample_( sample_t**, sample_t const*, sample_t const [], int );
+
+protected:
+ enum { stereo = 2 };
+ enum { write_offset = 2 * stereo };
+ int pos;
+ int step;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.cpp
new file mode 100644
index 00000000..333cd2dc
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.cpp
@@ -0,0 +1,441 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Vgm_Core.h"
+
+#include "blargg_endian.h"
+#include <math.h>
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+int const stereo = 2;
+int const fm_time_bits = 12;
+int const blip_time_bits = 12;
+
+enum {
+ cmd_gg_stereo = 0x4F,
+ cmd_psg = 0x50,
+ cmd_ym2413 = 0x51,
+ cmd_ym2612_port0 = 0x52,
+ cmd_ym2612_port1 = 0x53,
+ cmd_ym2151 = 0x54,
+ cmd_delay = 0x61,
+ cmd_delay_735 = 0x62,
+ cmd_delay_882 = 0x63,
+ cmd_byte_delay = 0x64,
+ cmd_end = 0x66,
+ cmd_data_block = 0x67,
+ cmd_short_delay = 0x70,
+ cmd_pcm_delay = 0x80,
+ cmd_pcm_seek = 0xE0,
+
+ pcm_block_type = 0x00,
+ ym2612_dac_port = 0x2A,
+ ym2612_dac_pan_port = 0xB6
+};
+
+inline int command_len( int command )
+{
+ static byte const lens [0x10] = {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 1,1,1,2,2,3,1,1,1,1,3,3,4,4,5,5
+ };
+ int len = lens [command >> 4];
+ check( len != 1 );
+ return len;
+}
+
+int Vgm_Core::run_ym2413( int time )
+{
+ return ym2413.run_until( time );
+}
+
+int Vgm_Core::run_ym2612( int time )
+{
+ return ym2612.run_until( time );
+}
+
+Vgm_Core::Vgm_Core() { blip_buf = stereo_buf.center(); }
+
+void Vgm_Core::set_tempo( double t )
+{
+ if ( file_begin() )
+ {
+ vgm_rate = (int) (44100 * t + 0.5);
+ blip_time_factor = (int) ((double)
+ (1 << blip_time_bits) / vgm_rate * stereo_buf.center()->clock_rate() + 0.5);
+ //dprintf( "blip_time_factor: %ld\n", blip_time_factor );
+ //dprintf( "vgm_rate: %ld\n", vgm_rate );
+ // TODO: remove? calculates vgm_rate more accurately (above differs at most by one Hz only)
+ //blip_time_factor = (int) floor( double (1 << blip_time_bits) * psg_rate_ / 44100 / t + 0.5 );
+ //vgm_rate = (int) floor( double (1 << blip_time_bits) * psg_rate_ / blip_time_factor + 0.5 );
+
+ fm_time_factor = 2 + (int) (fm_rate * (1 << fm_time_bits) / vgm_rate + 0.5);
+ }
+}
+
+bool Vgm_Core::header_t::valid_tag() const
+{
+ return !memcmp( tag, "Vgm ", 4 );
+}
+
+blargg_err_t Vgm_Core::load_mem_( byte const data [], int size )
+{
+ assert( offsetof (header_t,unused2 [8]) == header_t::size );
+
+ if ( size <= header_t::size )
+ return blargg_err_file_type;
+
+ header_t const& h = *(header_t const*) data;
+
+ if ( !h.valid_tag() )
+ return blargg_err_file_type;
+
+ check( get_le32( h.version ) <= 0x150 );
+
+ // Get loop
+ loop_begin = file_end();
+ if ( get_le32( h.loop_offset ) )
+ loop_begin = &data [get_le32( h.loop_offset ) + offsetof (header_t,loop_offset)];
+
+ // PSG rate
+ int psg_rate = get_le32( h.psg_rate );
+ if ( !psg_rate )
+ psg_rate = 3579545;
+ stereo_buf.clock_rate( psg_rate );
+
+ // Disable FM
+ fm_rate = 0;
+ ym2612.enable( false );
+ ym2413.enable( false );
+
+ set_tempo( 1 );
+
+ return blargg_ok;
+}
+
+// Update pre-1.10 header FM rates by scanning commands
+void Vgm_Core::update_fm_rates( int* ym2413_rate, int* ym2612_rate ) const
+{
+ byte const* p = file_begin() + 0x40;
+ while ( p < file_end() )
+ {
+ switch ( *p )
+ {
+ case cmd_end:
+ return;
+
+ case cmd_psg:
+ case cmd_byte_delay:
+ p += 2;
+ break;
+
+ case cmd_delay:
+ p += 3;
+ break;
+
+ case cmd_data_block:
+ p += 7 + get_le32( p + 3 );
+ break;
+
+ case cmd_ym2413:
+ *ym2612_rate = 0;
+ return;
+
+ case cmd_ym2612_port0:
+ case cmd_ym2612_port1:
+ *ym2612_rate = *ym2413_rate;
+ *ym2413_rate = 0;
+ return;
+
+ case cmd_ym2151:
+ *ym2413_rate = 0;
+ *ym2612_rate = 0;
+ return;
+
+ default:
+ p += command_len( *p );
+ }
+ }
+}
+
+blargg_err_t Vgm_Core::init_fm( double* rate )
+{
+ int ym2612_rate = get_le32( header().ym2612_rate );
+ int ym2413_rate = get_le32( header().ym2413_rate );
+ if ( ym2413_rate && get_le32( header().version ) < 0x110 )
+ update_fm_rates( &ym2413_rate, &ym2612_rate );
+
+ if ( ym2612_rate )
+ {
+ if ( !*rate )
+ *rate = ym2612_rate / 144.0;
+ RETURN_ERR( ym2612.set_rate( *rate, ym2612_rate ) );
+ ym2612.enable();
+ }
+ else if ( ym2413_rate )
+ {
+ if ( !*rate )
+ *rate = ym2413_rate / 72.0;
+ int result = ym2413.set_rate( *rate, ym2413_rate );
+ if ( result == 2 )
+ return "YM2413 FM sound not supported";
+ CHECK_ALLOC( !result );
+ ym2413.enable();
+ }
+
+ fm_rate = *rate;
+
+ return blargg_ok;
+}
+
+void Vgm_Core::start_track()
+{
+ psg.reset( get_le16( header().noise_feedback ), header().noise_width );
+
+ blip_buf = stereo_buf.center();
+
+ dac_disabled = -1;
+ pos = file_begin() + header_t::size;
+ pcm_data = pos;
+ pcm_pos = pos;
+ dac_amp = -1;
+ vgm_time = 0;
+ if ( get_le32( header().version ) >= 0x150 )
+ {
+ int data_offset = get_le32( header().data_offset );
+ check( data_offset );
+ if ( data_offset )
+ pos += data_offset + offsetof (header_t,data_offset) - 0x40;
+ }
+
+ if ( uses_fm() )
+ {
+ if ( ym2413.enabled() )
+ ym2413.reset();
+
+ if ( ym2612.enabled() )
+ ym2612.reset();
+
+ stereo_buf.clear();
+ }
+
+ fm_time_offset = 0;
+}
+
+inline Vgm_Core::fm_time_t Vgm_Core::to_fm_time( vgm_time_t t ) const
+{
+ return (t * fm_time_factor + fm_time_offset) >> fm_time_bits;
+}
+
+inline blip_time_t Vgm_Core::to_psg_time( vgm_time_t t ) const
+{
+ return (t * blip_time_factor) >> blip_time_bits;
+}
+
+void Vgm_Core::write_pcm( vgm_time_t vgm_time, int amp )
+{
+ if ( blip_buf )
+ {
+ check( amp >= 0 );
+ blip_time_t blip_time = to_psg_time( vgm_time );
+ int old = dac_amp;
+ int delta = amp - old;
+ dac_amp = amp;
+ blip_buf->set_modified();
+ if ( old >= 0 ) // first write is ignored, to avoid click
+ pcm.offset_inline( blip_time, delta, blip_buf );
+ else
+ dac_amp |= dac_disabled;
+ }
+}
+
+blip_time_t Vgm_Core::run( vgm_time_t end_time )
+{
+ vgm_time_t vgm_time = this->vgm_time;
+ vgm_time_t vgm_loop_time = ~0;
+ byte const* pos = this->pos;
+ if ( pos > file_end() )
+ set_warning( "Stream lacked end event" );
+
+ while ( vgm_time < end_time && pos < file_end() )
+ {
+ // TODO: be sure there are enough bytes left in stream for particular command
+ // so we don't read past end
+ switch ( *pos++ )
+ {
+ case cmd_end:
+ if ( vgm_loop_time == ~0 ) vgm_loop_time = vgm_time;
+ else if ( vgm_loop_time == vgm_time ) loop_begin = file_end(); // XXX some files may loop forever on a region without any delay commands
+ pos = loop_begin; // if not looped, loop_begin == file_end()
+ break;
+
+ case cmd_delay_735:
+ vgm_time += 735;
+ break;
+
+ case cmd_delay_882:
+ vgm_time += 882;
+ break;
+
+ case cmd_gg_stereo:
+ psg.write_ggstereo( to_psg_time( vgm_time ), *pos++ );
+ break;
+
+ case cmd_psg:
+ psg.write_data( to_psg_time( vgm_time ), *pos++ );
+ break;
+
+ case cmd_delay:
+ vgm_time += pos [1] * 0x100 + pos [0];
+ pos += 2;
+ break;
+
+ case cmd_byte_delay:
+ vgm_time += *pos++;
+ break;
+
+ case cmd_ym2413:
+ if ( run_ym2413( to_fm_time( vgm_time ) ) )
+ ym2413.write( pos [0], pos [1] );
+ pos += 2;
+ break;
+
+ case cmd_ym2612_port0:
+ if ( pos [0] == ym2612_dac_port )
+ {
+ write_pcm( vgm_time, pos [1] );
+ }
+ else if ( run_ym2612( to_fm_time( vgm_time ) ) )
+ {
+ if ( pos [0] == 0x2B )
+ {
+ dac_disabled = (pos [1] >> 7 & 1) - 1;
+ dac_amp |= dac_disabled;
+ }
+ ym2612.write0( pos [0], pos [1] );
+ }
+ pos += 2;
+ break;
+
+ case cmd_ym2612_port1:
+ if ( run_ym2612( to_fm_time( vgm_time ) ) )
+ {
+ if ( pos [0] == ym2612_dac_pan_port )
+ {
+ Blip_Buffer * blip_buf = NULL;
+ switch ( pos [1] >> 6 )
+ {
+ case 0: blip_buf = NULL; break;
+ case 1: blip_buf = stereo_buf.right(); break;
+ case 2: blip_buf = stereo_buf.left(); break;
+ case 3: blip_buf = stereo_buf.center(); break;
+ }
+ /*if ( this->blip_buf != blip_buf )
+ {
+ blip_time_t blip_time = to_psg_time( vgm_time );
+ if ( this->blip_buf ) pcm.offset_inline( blip_time, -dac_amp, this->blip_buf );
+ if ( blip_buf ) pcm.offset_inline( blip_time, dac_amp, blip_buf );
+ }*/
+ this->blip_buf = blip_buf;
+ }
+ ym2612.write1( pos [0], pos [1] );
+ }
+ pos += 2;
+ break;
+
+ case cmd_data_block: {
+ check( *pos == cmd_end );
+ int type = pos [1];
+ int size = get_le32( pos + 2 );
+ pos += 6;
+ if ( type == pcm_block_type )
+ pcm_data = pos;
+ pos += size;
+ break;
+ }
+
+ case cmd_pcm_seek:
+ pcm_pos = pcm_data + pos [3] * 0x1000000 + pos [2] * 0x10000 +
+ pos [1] * 0x100 + pos [0];
+ pos += 4;
+ break;
+
+ default:
+ int cmd = pos [-1];
+ switch ( cmd & 0xF0 )
+ {
+ case cmd_pcm_delay:
+ write_pcm( vgm_time, *pcm_pos++ );
+ vgm_time += cmd & 0x0F;
+ break;
+
+ case cmd_short_delay:
+ vgm_time += (cmd & 0x0F) + 1;
+ break;
+
+ case 0x50:
+ pos += 2;
+ break;
+
+ default:
+ pos += command_len( cmd ) - 1;
+ set_warning( "Unknown stream event" );
+ }
+ }
+ }
+ vgm_time -= end_time;
+ this->pos = pos;
+ this->vgm_time = vgm_time;
+
+ return to_psg_time( end_time );
+}
+
+blip_time_t Vgm_Core::run_psg( int msec )
+{
+ blip_time_t t = run( msec * vgm_rate / 1000 );
+ psg.end_frame( t );
+ return t;
+}
+
+int Vgm_Core::play_frame( blip_time_t blip_time, int sample_count, blip_sample_t out [] )
+{
+ // to do: timing is working mostly by luck
+ int min_pairs = (unsigned) sample_count / 2;
+ int vgm_time = (min_pairs << fm_time_bits) / fm_time_factor - 1;
+ assert( to_fm_time( vgm_time ) <= min_pairs );
+ int pairs;
+ while ( (pairs = to_fm_time( vgm_time )) < min_pairs )
+ vgm_time++;
+ //dprintf( "pairs: %d, min_pairs: %d\n", pairs, min_pairs );
+
+ if ( ym2612.enabled() )
+ {
+ ym2612.begin_frame( out );
+ memset( out, 0, pairs * stereo * sizeof *out );
+ }
+ else if ( ym2413.enabled() )
+ {
+ ym2413.begin_frame( out );
+ }
+
+ run( vgm_time );
+ run_ym2612( pairs );
+ run_ym2413( pairs );
+
+ fm_time_offset = (vgm_time * fm_time_factor + fm_time_offset) - (pairs << fm_time_bits);
+
+ psg.end_frame( blip_time );
+
+ return pairs * stereo;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.h b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.h
new file mode 100644
index 00000000..7f83610c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Core.h
@@ -0,0 +1,160 @@
+// Sega VGM music file emulator core
+
+// Game_Music_Emu 0.6-pre
+#ifndef VGM_CORE_H
+#define VGM_CORE_H
+
+#include "Gme_Loader.h"
+#include "Ym2612_Emu.h"
+#include "Ym2413_Emu.h"
+#include "Sms_Apu.h"
+#include "Multi_Buffer.h"
+
+ template<class Emu>
+ class Ym_Emu : public Emu {
+ int last_time;
+ short* out;
+ enum { disabled_time = -1 };
+ public:
+ Ym_Emu() { last_time = disabled_time; out = NULL; }
+ void enable( bool b = true ) { last_time = b ? 0 : disabled_time; }
+ bool enabled() const { return last_time != disabled_time; }
+ void begin_frame( short* buf ) { out = buf; last_time = 0; }
+
+ int run_until( int time )
+ {
+ int count = time - last_time;
+ if ( count > 0 )
+ {
+ if ( last_time < 0 )
+ return false;
+ last_time = time;
+ short* p = out;
+ out += count * Emu::out_chan_count;
+ Emu::run( count, p );
+ }
+ return true;
+ }
+ };
+
+class Vgm_Core : public Gme_Loader {
+public:
+
+ // VGM file header
+ struct header_t
+ {
+ enum { size = 0x40 };
+
+ char tag [4];
+ byte data_size [4];
+ byte version [4];
+ byte psg_rate [4];
+ byte ym2413_rate [4];
+ byte gd3_offset [4];
+ byte track_duration [4];
+ byte loop_offset [4];
+ byte loop_duration [4];
+ byte frame_rate [4];
+ byte noise_feedback [2];
+ byte noise_width;
+ byte unused1;
+ byte ym2612_rate [4];
+ byte ym2151_rate [4];
+ byte data_offset [4];
+ byte unused2 [8];
+
+ // True if header has valid file signature
+ bool valid_tag() const;
+ };
+
+ // Header for currently loaded file
+ header_t const& header() const { return *(header_t const*) file_begin(); }
+
+ // Raw file data, for parsing GD3 tags
+ byte const* file_begin() const { return Gme_Loader::file_begin(); }
+ byte const* file_end () const { return Gme_Loader::file_end(); }
+
+ // If file uses FM, initializes FM sound emulator using *sample_rate. If
+ // *sample_rate is zero, sets *sample_rate to the proper accurate rate and
+ // uses that. The output of the FM sound emulator is resampled to the
+ // final sampling rate.
+ blargg_err_t init_fm( double* sample_rate );
+
+ // True if any FM chips are used by file. Always false until init_fm()
+ // is called.
+ bool uses_fm() const { return ym2612.enabled() || ym2413.enabled(); }
+
+ // Adjusts music tempo, where 1.0 is normal. Can be changed while playing.
+ // Loading a file resets tempo to 1.0.
+ void set_tempo( double );
+
+ // Starts track
+ void start_track();
+
+ // Runs PSG-only VGM for msec and returns number of clocks it ran for
+ blip_time_t run_psg( int msec );
+
+ // Plays FM for at most count samples into *out, and returns number of
+ // samples actually generated (always even). Also runs PSG for blip_time.
+ int play_frame( blip_time_t blip_time, int count, blip_sample_t out [] );
+
+ // True if all of file data has been played
+ bool track_ended() const { return pos >= file_end(); }
+
+ // PCM sound is always generated here
+ Stereo_Buffer stereo_buf;
+ Blip_Buffer * blip_buf;
+
+ // PSG sound chip, for assigning to Blip_Buffer, and setting volume and EQ
+ Sms_Apu psg;
+
+ // PCM synth, for setting volume and EQ
+ Blip_Synth_Fast pcm;
+
+ // FM sound chips
+ Ym_Emu<Ym2612_Emu> ym2612;
+ Ym_Emu<Ym2413_Emu> ym2413;
+
+// Implementation
+public:
+ Vgm_Core();
+
+protected:
+ virtual blargg_err_t load_mem_( byte const [], int );
+
+private:
+ // blip_time_t // PSG clocks
+ typedef int vgm_time_t; // 44100 per second, REGARDLESS of sample rate
+ typedef int fm_time_t; // FM sample count
+
+ int vgm_rate; // rate of log, 44100 normally, adjusted by tempo
+ double fm_rate; // FM samples per second
+
+ // VGM to FM time
+ int fm_time_factor;
+ int fm_time_offset;
+ fm_time_t to_fm_time( vgm_time_t ) const;
+
+ // VGM to PSG time
+ int blip_time_factor;
+ blip_time_t to_psg_time( vgm_time_t ) const;
+
+ // Current time and position in log
+ vgm_time_t vgm_time;
+ byte const* pos;
+ byte const* loop_begin;
+
+ // PCM
+ byte const* pcm_data; // location of PCM data in log
+ byte const* pcm_pos; // current position in PCM data
+ int dac_amp;
+ int dac_disabled; // -1 if disabled
+ void write_pcm( vgm_time_t, int amp );
+
+ blip_time_t run( vgm_time_t );
+ int run_ym2413( int time );
+ int run_ym2612( int time );
+ void update_fm_rates( int* ym2413_rate, int* ym2612_rate ) const;
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.cpp
new file mode 100644
index 00000000..ea8fb558
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.cpp
@@ -0,0 +1,360 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Vgm_Emu.h"
+
+#include "blargg_endian.h"
+
+/* Copyright (C) 2003-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// FM emulators are internally quieter to avoid 16-bit overflow
+double const fm_gain = 3.0;
+double const rolloff = 0.990;
+double const oversample_factor = 1.5;
+
+Vgm_Emu::Vgm_Emu()
+{
+ resampler.set_callback( play_frame_, this );
+ disable_oversampling_ = false;
+ set_type( gme_vgm_type );
+ set_max_initial_silence( 1 );
+ set_silence_lookahead( 1 ); // tracks should already be trimmed
+
+ static equalizer_t const eq = { -14.0, 80 };
+ set_equalizer( eq );
+}
+
+Vgm_Emu::~Vgm_Emu() { }
+
+void Vgm_Emu::unload()
+{
+ core.unload();
+ Classic_Emu::unload();
+}
+
+// Track info
+
+static byte const* skip_gd3_str( byte const in [], byte const* end )
+{
+ while ( end - in >= 2 )
+ {
+ in += 2;
+ if ( !(in [-2] | in [-1]) )
+ break;
+ }
+ return in;
+}
+
+static byte const* get_gd3_str( byte const* in, byte const* end, char field [] )
+{
+ byte const* mid = skip_gd3_str( in, end );
+ int len = (mid - in) / 2 - 1;
+ if ( len > 0 )
+ {
+ len = min( len, (int) Gme_File::max_field_ );
+ field [len] = 0;
+ for ( int i = 0; i < len; i++ )
+ field [i] = (in [i * 2 + 1] ? '?' : in [i * 2]); // TODO: convert to utf-8
+ }
+ return mid;
+}
+
+static byte const* get_gd3_pair( byte const* in, byte const* end, char field [] )
+{
+ return skip_gd3_str( get_gd3_str( in, end, field ), end );
+}
+
+static void parse_gd3( byte const in [], byte const* end, track_info_t* out )
+{
+ in = get_gd3_pair( in, end, out->song );
+ in = get_gd3_pair( in, end, out->game );
+ in = get_gd3_pair( in, end, out->system );
+ in = get_gd3_pair( in, end, out->author );
+ in = get_gd3_str ( in, end, out->copyright );
+ in = get_gd3_pair( in, end, out->dumper );
+ in = get_gd3_str ( in, end, out->comment );
+}
+
+int const gd3_header_size = 12;
+
+static int check_gd3_header( byte const h [], int remain )
+{
+ if ( remain < gd3_header_size ) return 0;
+ if ( memcmp( h, "Gd3 ", 4 ) ) return 0;
+ if ( get_le32( h + 4 ) >= 0x200 ) return 0;
+
+ int gd3_size = get_le32( h + 8 );
+ if ( gd3_size > remain - gd3_header_size ) return 0;
+
+ return gd3_size;
+}
+
+static void get_vgm_length( Vgm_Emu::header_t const& h, track_info_t* out )
+{
+ int length = get_le32( h.track_duration ) * 10 / 441; // 1000 / 44100
+ if ( length > 0 )
+ {
+ int loop = get_le32( h.loop_duration );
+ if ( loop > 0 && get_le32( h.loop_offset ) )
+ {
+ out->loop_length = loop * 10 / 441;
+ out->intro_length = length - out->loop_length;
+ check( out->loop_length <= length );
+ // TODO: Also set out->length? We now have play_length for suggested play time.
+ }
+ else
+ {
+ out->length = length;
+ out->intro_length = length;
+ out->loop_length = 0;
+ }
+ }
+}
+
+blargg_err_t Vgm_Emu::track_info_( track_info_t* out, int ) const
+{
+ get_vgm_length( header(), out );
+
+ int gd3_offset = get_le32( header().gd3_offset ) - 0x2C;
+ if ( gd3_offset < 0 )
+ return blargg_ok;
+
+ byte const* gd3 = core.file_begin() + header_t::size + gd3_offset;
+ int gd3_size = check_gd3_header( gd3, core.file_end() - gd3 );
+ if ( gd3_size )
+ {
+ byte const* gd3_data = gd3 + gd3_header_size;
+ parse_gd3( gd3_data, gd3_data + gd3_size, out );
+ }
+
+ return blargg_ok;
+}
+
+blargg_err_t Vgm_Emu::gd3_data( const unsigned char ** data, int * size )
+{
+ *data = 0;
+ *size = 0;
+
+ int gd3_offset = get_le32( header().gd3_offset ) - 0x2C;
+ if ( gd3_offset < 0 )
+ return blargg_ok;
+
+ byte const* gd3 = core.file_begin() + header_t::size + gd3_offset;
+ int gd3_size = check_gd3_header( gd3, core.file_end() - gd3 );
+ if ( gd3_size )
+ {
+ *data = gd3;
+ *size = gd3_size + gd3_header_size;
+ }
+
+ return blargg_ok;
+}
+
+struct Vgm_File : Gme_Info_
+{
+ Vgm_Emu::header_t h;
+ blargg_vector<byte> gd3;
+
+ Vgm_File() { set_type( gme_vgm_type ); }
+
+ blargg_err_t load_( Data_Reader& in )
+ {
+ int file_size = in.remain();
+ if ( file_size <= h.size )
+ return blargg_err_file_type;
+
+ RETURN_ERR( in.read( &h, h.size ) );
+ if ( !h.valid_tag() )
+ return blargg_err_file_type;
+
+ int gd3_offset = get_le32( h.gd3_offset ) - 0x2C;
+ int remain = file_size - h.size - gd3_offset;
+ byte gd3_h [gd3_header_size];
+ if ( gd3_offset > 0 && remain >= gd3_header_size )
+ {
+ RETURN_ERR( in.skip( gd3_offset ) );
+ RETURN_ERR( in.read( gd3_h, sizeof gd3_h ) );
+ int gd3_size = check_gd3_header( gd3_h, remain );
+ if ( gd3_size )
+ {
+ RETURN_ERR( gd3.resize( gd3_size ) );
+ RETURN_ERR( in.read( gd3.begin(), gd3.size() ) );
+ }
+ }
+ return blargg_ok;
+ }
+
+ blargg_err_t track_info_( track_info_t* out, int ) const
+ {
+ get_vgm_length( h, out );
+ if ( gd3.size() )
+ parse_gd3( gd3.begin(), gd3.end(), out );
+ return blargg_ok;
+ }
+};
+
+static Music_Emu* new_vgm_emu () { return BLARGG_NEW Vgm_Emu ; }
+static Music_Emu* new_vgm_file() { return BLARGG_NEW Vgm_File; }
+
+gme_type_t_ const gme_vgm_type [1] = {{ "Sega SMS/Genesis", 1, &new_vgm_emu, &new_vgm_file, "VGM", 1 }};
+
+gme_type_t_ const gme_vgz_type [1] = {{ "Sega SMS/Genesis", 1, &new_vgm_emu, &new_vgm_file, "VGZ", 1 }};
+
+// Setup
+
+void Vgm_Emu::set_tempo_( double t )
+{
+ core.set_tempo( t );
+}
+
+blargg_err_t Vgm_Emu::set_sample_rate_( int sample_rate )
+{
+ RETURN_ERR( core.stereo_buf.set_sample_rate( sample_rate, 1000 / 30 ) );
+ return Classic_Emu::set_sample_rate_( sample_rate );
+}
+
+void Vgm_Emu::update_eq( blip_eq_t const& eq )
+{
+ core.psg.treble_eq( eq );
+ core.pcm.treble_eq( eq );
+}
+
+void Vgm_Emu::set_voice( int i, Blip_Buffer* c, Blip_Buffer* l, Blip_Buffer* r )
+{
+ if ( i < core.psg.osc_count )
+ core.psg.set_output( i, c, l, r );
+}
+
+void Vgm_Emu::mute_voices_( int mask )
+{
+ Classic_Emu::mute_voices_( mask );
+
+ // TODO: what was this for?
+ //core.pcm.output( &core.blip_buf );
+
+ // TODO: silence PCM if FM isn't used?
+ if ( core.uses_fm() )
+ {
+ core.psg.set_output( ( mask & 0x80 ) ? 0 : core.stereo_buf.center() );
+ if ( core.ym2612.enabled() )
+ {
+ core.pcm.volume( (mask & 0x40) ? 0.0 : 0.1115 / 256 * fm_gain * gain() );
+ core.ym2612.mute_voices( mask );
+ }
+
+ if ( core.ym2413.enabled() )
+ {
+ int m = mask & 0x3F;
+ if ( mask & 0x20 )
+ m |= 0x01E0; // channels 5-8
+ if ( mask & 0x40 )
+ m |= 0x3E00;
+ core.ym2413.mute_voices( m );
+ }
+ }
+}
+
+blargg_err_t Vgm_Emu::load_mem_( byte const data [], int size )
+{
+ RETURN_ERR( core.load_mem( data, size ) );
+
+ set_voice_count( core.psg.osc_count );
+
+ double fm_rate = 0.0;
+ if ( !disable_oversampling_ )
+ fm_rate = sample_rate() * oversample_factor;
+ RETURN_ERR( core.init_fm( &fm_rate ) );
+
+ if ( core.uses_fm() )
+ {
+ set_voice_count( 8 );
+ RETURN_ERR( resampler.setup( fm_rate / sample_rate(), rolloff, fm_gain * gain() ) );
+ RETURN_ERR( resampler.reset( core.stereo_buf.length() * sample_rate() / 1000 ) );
+ core.psg.volume( 0.135 * fm_gain * gain() );
+ }
+ else
+ {
+ core.psg.volume( gain() );
+ }
+
+ static const char* const fm_names [] = {
+ "FM 1", "FM 2", "FM 3", "FM 4", "FM 5", "FM 6", "PCM", "PSG"
+ };
+ static const char* const psg_names [] = { "Square 1", "Square 2", "Square 3", "Noise" };
+ set_voice_names( core.uses_fm() ? fm_names : psg_names );
+
+ static int const types [8] = {
+ wave_type+1, wave_type+2, wave_type+3, noise_type+1,
+ 0, 0, 0, 0
+ };
+ set_voice_types( types );
+
+ return Classic_Emu::setup_buffer( core.stereo_buf.center()->clock_rate() );
+}
+
+// Emulation
+
+blargg_err_t Vgm_Emu::start_track_( int track )
+{
+ RETURN_ERR( Classic_Emu::start_track_( track ) );
+
+ core.start_track();
+
+ if ( core.uses_fm() )
+ resampler.clear();
+
+ return blargg_ok;
+}
+
+inline void Vgm_Emu::check_end()
+{
+ if ( core.track_ended() )
+ set_track_ended();
+}
+
+inline void Vgm_Emu::check_warning()
+{
+ const char* w = core.warning();
+ if ( w )
+ set_warning( w );
+}
+
+blargg_err_t Vgm_Emu::run_clocks( blip_time_t& time_io, int msec )
+{
+ check_end();
+ time_io = core.run_psg( msec );
+ check_warning();
+ return blargg_ok;
+}
+
+inline int Vgm_Emu::play_frame( blip_time_t blip_time, int sample_count, sample_t buf [] )
+{
+ check_end();
+ int result = core.play_frame( blip_time, sample_count, buf );
+ check_warning();
+ return result;
+}
+
+int Vgm_Emu::play_frame_( void* p, blip_time_t a, int b, sample_t c [] )
+{
+ return STATIC_CAST(Vgm_Emu*,p)->play_frame( a, b, c );
+}
+
+blargg_err_t Vgm_Emu::play_( int count, sample_t out [] )
+{
+ if ( !core.uses_fm() )
+ return Classic_Emu::play_( count, out );
+
+ resampler.dual_play( count, out, core.stereo_buf );
+ return blargg_ok;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.h
new file mode 100644
index 00000000..67163d20
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Vgm_Emu.h
@@ -0,0 +1,66 @@
+// Sega VGM music file emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef VGM_EMU_H
+#define VGM_EMU_H
+
+#include "Classic_Emu.h"
+#include "Dual_Resampler.h"
+#include "Vgm_Core.h"
+
+/* Emulates VGM music using SN76489/SN76496 PSG, and YM2612 and YM2413 FM sound chips.
+Supports custom sound buffer and frequency equalization when VGM uses just the PSG. FM
+sound chips can be run at their proper rates, or slightly higher to reduce aliasing on
+high notes. A YM2413 is supported but not provided separately from the library. */
+class Vgm_Emu : public Classic_Emu {
+public:
+
+ // True if custom buffer and custom equalization are supported
+ // TODO: move into Music_Emu and rename to something like supports_custom_buffer()
+ bool is_classic_emu() const { return !core.uses_fm(); }
+
+ // Disables running FM chips at higher than normal rate. Will result in slightly
+ // more aliasing of high notes.
+ void disable_oversampling( bool disable = true ) { disable_oversampling_ = disable; }
+
+ // VGM file header (see Vgm_Core.h)
+ typedef Vgm_Core::header_t header_t;
+
+ // Header for currently loaded file
+ header_t const& header() const { return core.header(); }
+
+ // Gd3 tag for currently loaded file
+ blargg_err_t gd3_data( const unsigned char ** data, int * size );
+
+ static gme_type_t static_type() { return gme_vgm_type; }
+
+// Implementation
+public:
+ Vgm_Emu();
+ ~Vgm_Emu();
+
+protected:
+ blargg_err_t track_info_( track_info_t*, int track ) const;
+ blargg_err_t load_mem_( byte const [], int );
+ blargg_err_t set_sample_rate_( int sample_rate );
+ blargg_err_t start_track_( int );
+ blargg_err_t play_( int count, sample_t []);
+ blargg_err_t run_clocks( blip_time_t&, int );
+ virtual void set_tempo_( double );
+ virtual void mute_voices_( int mask );
+ virtual void set_voice( int, Blip_Buffer*, Blip_Buffer*, Blip_Buffer* );
+ virtual void update_eq( blip_eq_t const& );
+ virtual void unload();
+
+private:
+ bool disable_oversampling_;
+ Dual_Resampler resampler;
+ Vgm_Core core;
+
+ void check_end();
+ void check_warning();
+ int play_frame( blip_time_t blip_time, int sample_count, sample_t buf [] );
+ static int play_frame_( void*, blip_time_t, int, sample_t [] );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.cpp
new file mode 100644
index 00000000..99fb407c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.cpp
@@ -0,0 +1,70 @@
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+#include "Ym2413_Emu.h"
+#include "ym2413.h"
+
+Ym2413_Emu::Ym2413_Emu() { opll = 0; }
+
+Ym2413_Emu::~Ym2413_Emu()
+{
+ if ( opll ) ym2413_shutdown( opll );
+}
+
+int Ym2413_Emu::set_rate( double sample_rate, double clock_rate )
+{
+ if ( opll )
+ {
+ ym2413_shutdown( opll );
+ opll = 0;
+ }
+
+ opll = ym2413_init( clock_rate, sample_rate, 0 );
+ if ( !opll )
+ return 1;
+
+ reset();
+ return 0;
+}
+
+void Ym2413_Emu::reset()
+{
+ ym2413_reset_chip( opll );
+ ym2413_set_mask( opll, 0 );
+}
+
+void Ym2413_Emu::write( int addr, int data )
+{
+ ym2413_write( opll, 0, addr );
+ ym2413_write( opll, 1, data );
+}
+
+void Ym2413_Emu::mute_voices( int mask )
+{
+ ym2413_set_mask( opll, mask );
+}
+
+void Ym2413_Emu::run( int pair_count, sample_t* out )
+{
+ SAMP bufMO[ 1024 ];
+ SAMP bufRO[ 1024 ];
+ SAMP * buffers[2] = { bufMO, bufRO };
+
+ while (pair_count > 0)
+ {
+ int todo = pair_count;
+ if (todo > 1024) todo = 1024;
+ ym2413_update_one( opll, buffers, todo );
+
+ for (int i = 0; i < todo; i++)
+ {
+ int output = bufMO [i];
+ output += bufRO [i];
+ if ( (short)output != output ) output = 0x7FFF ^ ( output >> 31 );
+ out [0] = output;
+ out [1] = output;
+ out += 2;
+ }
+
+ pair_count -= todo;
+ }
+}
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.h
index 98a2a48e..5b82af5e 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Ym2413_Emu.h
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ym2413_Emu.h
@@ -1,33 +1,37 @@
-// YM2413 FM sound chip emulator interface
-
-// Game_Music_Emu 0.5.2
-#ifndef YM2413_EMU_H
-#define YM2413_EMU_H
-
-class Ym2413_Emu {
- struct OPLL* opll;
-public:
- Ym2413_Emu();
- ~Ym2413_Emu();
-
- // Set output sample rate and chip clock rates, in Hz. Returns non-zero
- // if error.
- int set_rate( double sample_rate, double clock_rate );
-
- // Reset to power-up state
- void reset();
-
- // Mute voice n if bit n (1 << n) of mask is set
- enum { channel_count = 14 };
- void mute_voices( int mask );
-
- // Write 'data' to 'addr'
- void write( int addr, int data );
-
- // Run and write pair_count samples to output
- typedef short sample_t;
- enum { out_chan_count = 2 }; // stereo
- void run( int pair_count, sample_t* out );
-};
-
-#endif
+// YM2413 FM sound chip emulator interface
+
+// Game_Music_Emu 0.6-pre
+#ifndef YM2413_EMU_H
+#define YM2413_EMU_H
+
+struct OPLL;
+
+class Ym2413_Emu {
+ void* opll;
+public:
+ Ym2413_Emu();
+ ~Ym2413_Emu();
+
+ static bool supported() { return true; }
+
+ // Sets output sample rate and chip clock rates, in Hz. Returns non-zero
+ // if error.
+ int set_rate( double sample_rate, double clock_rate );
+
+ // Resets to power-up state
+ void reset();
+
+ // Mutes voice n if bit n (1 << n) of mask is set
+ enum { channel_count = 14 };
+ void mute_voices( int mask );
+
+ // Writes data to addr
+ void write( int addr, int data );
+
+ // Runs and writes pair_count*2 samples to output
+ typedef short sample_t;
+ enum { out_chan_count = 2 }; // stereo
+ void run( int pair_count, sample_t* out );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.cpp
new file mode 100644
index 00000000..a670d8cd
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.cpp
@@ -0,0 +1,2510 @@
+// Game_Music_Emu 0.5.5. http://www.slack.net/~ant/
+
+// File: fm.c -- software implementation of Yamaha FM sound generator
+// Copyright (C) 2001, 2002, 2003 Jarek Burczynski (bujar at mame dot net)
+// Copyright (C) 1998 Tatsuyuki Satoh , MultiArcadeMachineEmulator development
+// Version 1.4 (final beta)
+
+#include "Ym2612_Emu.h"
+typedef Ym2612_Impl YM2612;
+
+#include "blargg_errors.h"
+
+// fm.h
+YM2612* YM2612Init( void* user_data, int index, long baseclock, long rate );
+void YM2612Shutdown( YM2612* );
+void YM2612ResetChip( YM2612* );
+void YM2612UpdateOne( YM2612*, short* out, int pair_count );
+int YM2612Write( YM2612*, unsigned int a, unsigned int v );
+unsigned char YM2612Read( YM2612*, int a );
+int YM2612TimerOver( YM2612*, int c );
+void YM2612Postload( YM2612* );
+void YM2612Mute( YM2612*, int mask );
+
+#include <stdlib.h>
+#include <limits.h>
+#include <math.h>
+
+/* Copyright (C) 1997-2005, Nicola Salmoria and the MAME team. All rights
+reserved. Redistribution and use of this code or any derivative works are
+permitted provided that the following conditions are met:
+- Redistributions may not be sold, nor may they be used in a commercial
+product or activity.
+- Redistributions that are modified from the original source must include the
+complete source code, including the source code for all components used by a
+binary built from the modified sources. However, as a special exception, the
+source code distributed need not include anything that is normally distributed
+(in either source or binary form) with the major components (compiler, kernel,
+and so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+- Redistributions must reproduce the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
+
+#define BUILD_YM2612 1
+#define FM_BUSY_FLAG_SUPPORT 0
+#define YM2612UpdateReq( chip ) ((void) 0)
+
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+
+#if ULONG_MAX == 0xFFFFFFFF
+ typedef long INT32;
+ typedef unsigned long UINT32;
+#elif UINT_MAX == 0xFFFFFFFF
+ typedef int INT32;
+ typedef unsigned int UINT32;
+#else
+ #error "No suitable 32-bit type available"
+#endif
+
+#define INLINE inline
+
+#define logerror
+#define state_save_register_UINT8(mod, ins, name, val, size)
+#define state_save_register_UINT16(mod, ins, name, val, size)
+#define state_save_register_UINT32(mod, ins, name, val, size)
+#define state_save_register_INT8(mod, ins, name, val, size)
+#define state_save_register_INT16(mod, ins, name, val, size)
+#define state_save_register_INT32(mod, ins, name, val, size)
+#define state_save_register_int(mod, ins, name, val)
+#define state_save_register_func_postload(a) a();
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+/* shared function building option */
+#define BUILD_OPN (BUILD_YM2203||BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B||BUILD_YM2612)
+#define BUILD_OPN_PRESCALER (BUILD_YM2203||BUILD_YM2608)
+
+/* globals */
+#define TYPE_SSG 0x01 /* SSG support */
+#define TYPE_LFOPAN 0x02 /* OPN type LFO and PAN */
+#define TYPE_6CH 0x04 /* FM 6CH / 3CH */
+#define TYPE_DAC 0x08 /* YM2612's DAC device */
+#define TYPE_ADPCM 0x10 /* two ADPCM units */
+#define TYPE_2610 0x20 /* bogus flag to differentiate 2608 from 2610 */
+
+#define TYPE_YM2203 (TYPE_SSG)
+#define TYPE_YM2608 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM)
+#define TYPE_YM2610 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM |TYPE_2610)
+#define TYPE_YM2612 (TYPE_DAC |TYPE_LFOPAN |TYPE_6CH)
+
+#define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */
+#define EG_SH 16 /* 16.16 fixed point (envelope generator timing) */
+#define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */
+#define TIMER_SH 16 /* 16.16 fixed point (timers calculations) */
+
+#define FREQ_MASK ((1<<FREQ_SH)-1)
+
+#define ENV_BITS 10
+#define ENV_LEN (1<<ENV_BITS)
+#define ENV_STEP (128.0/ENV_LEN)
+
+#define MAX_ATT_INDEX (ENV_LEN-1) /* 1023 */
+#define MIN_ATT_INDEX (0) /* 0 */
+
+#define EG_ATT 4
+#define EG_DEC 3
+#define EG_SUS 2
+#define EG_REL 1
+#define EG_OFF 0
+
+#define SIN_BITS 10
+#define SIN_LEN (1<<SIN_BITS)
+#define SIN_MASK (SIN_LEN-1)
+
+#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
+
+/* TL_TAB_LEN is calculated as:
+* 13 - sinus amplitude bits (Y axis)
+* 2 - sinus sign bit (Y axis)
+* TL_RES_LEN - sinus resolution (X axis)
+*/
+#define TL_TAB_LEN (13*2*TL_RES_LEN)
+static signed int tl_tab[TL_TAB_LEN];
+
+#define ENV_QUIET (TL_TAB_LEN>>3)
+
+/* sin waveform table in 'decibel' scale */
+static unsigned int sin_tab[SIN_LEN];
+
+/* sustain level table (3dB per step) */
+/* bit0, bit1, bit2, bit3, bit4, bit5, bit6 */
+/* 1, 2, 4, 8, 16, 32, 64 (value)*/
+/* 0.75, 1.5, 3, 6, 12, 24, 48 (dB)*/
+
+/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
+#define SC(db) (UINT32) ( db * (4.0/ENV_STEP) )
+static const UINT32 sl_table[16]={
+ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
+ SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
+};
+#undef SC
+
+
+#define RATE_STEPS (8)
+static const UINT8 eg_inc[19*RATE_STEPS]={
+
+/*cycle:0 1 2 3 4 5 6 7*/
+
+/* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..11 0 (increment by 0 or 1) */
+/* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..11 1 */
+/* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..11 2 */
+/* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..11 3 */
+
+/* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 12 0 (increment by 1) */
+/* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 12 1 */
+/* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 12 2 */
+/* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 12 3 */
+
+/* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 13 0 (increment by 2) */
+/* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 13 1 */
+/*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 13 2 */
+/*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 13 3 */
+
+/*12 */ 4,4, 4,4, 4,4, 4,4, /* rate 14 0 (increment by 4) */
+/*13 */ 4,4, 4,8, 4,4, 4,8, /* rate 14 1 */
+/*14 */ 4,8, 4,8, 4,8, 4,8, /* rate 14 2 */
+/*15 */ 4,8, 8,8, 4,8, 8,8, /* rate 14 3 */
+
+/*16 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 8) */
+/*17 */ 16,16,16,16,16,16,16,16, /* rates 15 2, 15 3 for attack */
+/*18 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */
+};
+
+
+#define O(a) (a*RATE_STEPS)
+
+static const UINT8 eg_rate_select[32+64+32]={ /* Envelope Generator rates (32 + 64 rates + 32 RKS) from tests on YM2612 */
+/* 32 infinite time rates */
+O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
+O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
+O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
+O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
+
+/* rates 00-11 */
+O( 18),O( 18),O( 0),O( 0),
+O( 0),O( 0),O( 2),O( 2), // Nemesis's tests
+
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+
+/* rate 12 */
+O( 4),O( 5),O( 6),O( 7),
+
+/* rate 13 */
+O( 8),O( 9),O(10),O(11),
+
+/* rate 14 */
+O(12),O(13),O(14),O(15),
+
+/* rate 15 */
+O(16),O(16),O(16),O(16),
+
+/* 32 dummy rates (same as 15 3) */
+O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
+O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
+O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
+O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16)
+
+};
+#undef O
+
+/*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15*/
+/*shift 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 */
+/*mask 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0, 0, 0 */
+
+#define O(a) (a*1)
+static const UINT8 eg_rate_shift[32+64+32]={ /* Envelope Generator counter shifts (32 + 64 rates + 32 RKS) */
+/* 32 infinite time rates */
+/* O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0), */
+
+/* fixed (should be the same as rate 0, even if it makes no difference since increment value is 0 for these rates) */
+O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11),
+O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11),
+O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11),
+O(11),O(11),O(11),O(11),O(11),O(11),O(11),O(11),
+
+/* rates 00-11 */
+O(11),O(11),O(11),O(11),
+O(10),O(10),O(10),O(10),
+O( 9),O( 9),O( 9),O( 9),
+O( 8),O( 8),O( 8),O( 8),
+O( 7),O( 7),O( 7),O( 7),
+O( 6),O( 6),O( 6),O( 6),
+O( 5),O( 5),O( 5),O( 5),
+O( 4),O( 4),O( 4),O( 4),
+O( 3),O( 3),O( 3),O( 3),
+O( 2),O( 2),O( 2),O( 2),
+O( 1),O( 1),O( 1),O( 1),
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 12 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 13 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 14 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 15 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* 32 dummy rates (same as 15 3) */
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0)
+
+};
+#undef O
+
+static const UINT8 dt_tab[4 * 32]={
+/* this is YM2151 and YM2612 phase increment data (in 10.10 fixed point format)*/
+/* FD=0 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+/* FD=1 */
+ 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
+ 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8,
+/* FD=2 */
+ 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
+ 5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16,
+/* FD=3 */
+ 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
+ 8 , 8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22
+};
+
+
+/* OPN key frequency number -> key code follow table */
+/* fnum higher 4bit -> keycode lower 2bit */
+static const UINT8 opn_fktable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3};
+
+
+/* 8 LFO speed parameters */
+/* each value represents number of samples that one LFO level will last for */
+static const UINT32 lfo_samples_per_step[8] = {108, 77, 71, 67, 62, 44, 8, 5};
+
+
+
+/*There are 4 different LFO AM depths available, they are:
+ 0 dB, 1.4 dB, 5.9 dB, 11.8 dB
+ Here is how it is generated (in EG steps):
+
+ 11.8 dB = 0, 2, 4, 6, 8, 10,12,14,16...126,126,124,122,120,118,....4,2,0
+ 5.9 dB = 0, 1, 2, 3, 4, 5, 6, 7, 8....63, 63, 62, 61, 60, 59,.....2,1,0
+ 1.4 dB = 0, 0, 0, 0, 1, 1, 1, 1, 2,...15, 15, 15, 15, 14, 14,.....0,0,0
+
+ (1.4 dB is loosing precision as you can see)
+
+ It's implemented as generator from 0..126 with step 2 then a shift
+ right N times, where N is:
+ 8 for 0 dB
+ 3 for 1.4 dB
+ 1 for 5.9 dB
+ 0 for 11.8 dB
+*/
+static const UINT8 lfo_ams_depth_shift[4] = {8, 3, 1, 0};
+
+
+
+/*There are 8 different LFO PM depths available, they are:
+ 0, 3.4, 6.7, 10, 14, 20, 40, 80 (cents)
+
+ Modulation level at each depth depends on F-NUMBER bits: 4,5,6,7,8,9,10
+ (bits 8,9,10 = FNUM MSB from OCT/FNUM register)
+
+ Here we store only first quarter (positive one) of full waveform.
+ Full table (lfo_pm_table) containing all 128 waveforms is build
+ at run (init) time.
+
+ One value in table below represents 4 (four) basic LFO steps
+ (1 PM step = 4 AM steps).
+
+ For example:
+ at LFO SPEED=0 (which is 108 samples per basic LFO step)
+ one value from "lfo_pm_output" table lasts for 432 consecutive
+ samples (4*108=432) and one full LFO waveform cycle lasts for 13824
+ samples (32*432=13824; 32 because we store only a quarter of whole
+ waveform in the table below)
+*/
+static const UINT8 lfo_pm_output[7*8][8]={ /* 7 bits meaningful (of F-NUMBER), 8 LFO output levels per one depth (out of 32), 8 LFO depths */
+/* FNUM BIT 4: 000 0001xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 6 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 7 */ {0, 0, 0, 0, 1, 1, 1, 1},
+
+/* FNUM BIT 5: 000 0010xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 6 */ {0, 0, 0, 0, 1, 1, 1, 1},
+/* DEPTH 7 */ {0, 0, 1, 1, 2, 2, 2, 3},
+
+/* FNUM BIT 6: 000 0100xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 1},
+/* DEPTH 5 */ {0, 0, 0, 0, 1, 1, 1, 1},
+/* DEPTH 6 */ {0, 0, 1, 1, 2, 2, 2, 3},
+/* DEPTH 7 */ {0, 0, 2, 3, 4, 4, 5, 6},
+
+/* FNUM BIT 7: 000 1000xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 1, 1},
+/* DEPTH 3 */ {0, 0, 0, 0, 1, 1, 1, 1},
+/* DEPTH 4 */ {0, 0, 0, 1, 1, 1, 1, 2},
+/* DEPTH 5 */ {0, 0, 1, 1, 2, 2, 2, 3},
+/* DEPTH 6 */ {0, 0, 2, 3, 4, 4, 5, 6},
+/* DEPTH 7 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
+
+/* FNUM BIT 8: 001 0000xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 1, 1, 1, 1},
+/* DEPTH 2 */ {0, 0, 0, 1, 1, 1, 2, 2},
+/* DEPTH 3 */ {0, 0, 1, 1, 2, 2, 3, 3},
+/* DEPTH 4 */ {0, 0, 1, 2, 2, 2, 3, 4},
+/* DEPTH 5 */ {0, 0, 2, 3, 4, 4, 5, 6},
+/* DEPTH 6 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
+/* DEPTH 7 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
+
+/* FNUM BIT 9: 010 0000xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 2, 2, 2, 2},
+/* DEPTH 2 */ {0, 0, 0, 2, 2, 2, 4, 4},
+/* DEPTH 3 */ {0, 0, 2, 2, 4, 4, 6, 6},
+/* DEPTH 4 */ {0, 0, 2, 4, 4, 4, 6, 8},
+/* DEPTH 5 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
+/* DEPTH 6 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
+/* DEPTH 7 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30},
+
+/* FNUM BIT10: 100 0000xxxx */
+/* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
+/* DEPTH 1 */ {0, 0, 0, 0, 4, 4, 4, 4},
+/* DEPTH 2 */ {0, 0, 0, 4, 4, 4, 8, 8},
+/* DEPTH 3 */ {0, 0, 4, 4, 8, 8, 0xc, 0xc},
+/* DEPTH 4 */ {0, 0, 4, 8, 8, 8, 0xc,0x10},
+/* DEPTH 5 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
+/* DEPTH 6 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30},
+/* DEPTH 7 */ {0, 0,0x20,0x30,0x40,0x40,0x50,0x60},
+
+};
+
+/* all 128 LFO PM waveforms */
+static INT32 lfo_pm_table[128*8*32]; /* 128 combinations of 7 bits meaningful (of F-NUMBER), 8 LFO depths, 32 LFO output levels per one depth */
+
+
+
+
+
+/* register number to channel number , slot offset */
+#define OPN_CHAN(N) (N&3)
+#define OPN_SLOT(N) ((N>>2)&3)
+
+/* slot number */
+#define SLOT1 0
+#define SLOT2 2
+#define SLOT3 1
+#define SLOT4 3
+
+/* bit0 = Right enable , bit1 = Left enable */
+#define OUTD_RIGHT 1
+#define OUTD_LEFT 2
+#define OUTD_CENTER 3
+
+
+/* save output as raw 16-bit sample */
+/* #define SAVE_SAMPLE */
+
+#ifdef SAVE_SAMPLE
+static FILE *sample[1];
+ #if 1 /*save to MONO file */
+ #define SAVE_ALL_CHANNELS \
+ { signed int pom = lt; \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ }
+ #else /*save to STEREO file */
+ #define SAVE_ALL_CHANNELS \
+ { signed int pom = lt; \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ pom = rt; \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ }
+ #endif
+#endif
+
+
+/* struct describing a single operator (SLOT) */
+typedef struct
+{
+ INT32 *DT; /* detune :dt_tab[DT] */
+ UINT8 KSR; /* key scale rate :3-KSR */
+ UINT32 ar; /* attack rate */
+ UINT32 d1r; /* decay rate */
+ UINT32 d2r; /* sustain rate */
+ UINT32 rr; /* release rate */
+ UINT8 ksr; /* key scale rate :kcode>>(3-KSR) */
+ UINT32 mul; /* multiple :ML_TABLE[ML] */
+
+ /* Phase Generator */
+ UINT32 phase; /* phase counter */
+ INT32 Incr; /* phase step */
+
+ /* Envelope Generator */
+ UINT8 state; /* phase type */
+ UINT32 tl; /* total level: TL << 3 */
+ INT32 volume; /* envelope counter */
+ UINT32 sl; /* sustain level:sl_table[SL] */
+ UINT32 vol_out; /* current output from EG circuit (without AM from LFO) */
+
+ UINT8 eg_sh_ar; /* (attack state) */
+ UINT8 eg_sel_ar; /* (attack state) */
+ UINT8 eg_sh_d1r; /* (decay state) */
+ UINT8 eg_sel_d1r; /* (decay state) */
+ UINT8 eg_sh_d2r; /* (sustain state) */
+ UINT8 eg_sel_d2r; /* (sustain state) */
+ UINT8 eg_sh_rr; /* (release state) */
+ UINT8 eg_sel_rr; /* (release state) */
+
+ UINT8 ssg; /* SSG-EG waveform */
+ UINT8 ssgn; /* SSG-EG negated output */
+
+ UINT8 key; /* 0=last key was KEY OFF, 1=KEY ON */
+
+ /* LFO */
+ UINT32 AMmask; /* AM enable flag */
+
+} FM_SLOT;
+
+typedef struct
+{
+ FM_SLOT SLOT[4]; /* four SLOTs (operators) */
+
+ UINT8 ALGO; /* algorithm */
+ UINT8 FB; /* feedback shift */
+ INT32 op1_out[2]; /* op1 output for feedback */
+
+ INT32 *connect1; /* SLOT1 output pointer */
+ INT32 *connect3; /* SLOT3 output pointer */
+ INT32 *connect2; /* SLOT2 output pointer */
+ INT32 *connect4; /* SLOT4 output pointer */
+
+ INT32 *mem_connect;/* where to put the delayed sample (MEM) */
+ INT32 mem_value; /* delayed sample (MEM) value */
+
+ INT32 pms; /* channel PMS */
+ UINT8 ams; /* channel AMS */
+
+ UINT32 fc; /* fnum,blk:adjusted to sample rate */
+ UINT8 kcode; /* key code: */
+ UINT32 block_fnum; /* current blk/fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
+} FM_CH;
+
+
+typedef struct
+{
+ void * param; /* this chip parameter */
+ float clock; /* master clock (Hz) */
+ int rate; /* sampling rate (Hz) */
+ double freqbase; /* frequency base */
+#if FM_BUSY_FLAG_SUPPORT
+ double BusyExpire; /* ExpireTime of Busy clear */
+#endif
+ UINT16 address; /* address register */
+ UINT8 irq; /* interrupt level */
+ UINT8 irqmask; /* irq mask */
+ UINT8 status; /* status flag */
+ UINT32 mode; /* mode CSM / 3SLOT */
+ UINT8 prescaler_sel;/* prescaler selector */
+ UINT8 fn_h; /* freq latch */
+ INT32 TimerBase; /* Timer base time */
+ INT32 TA; /* timer a value */
+ INT32 TAL; /* timer a base */
+ INT32 TAC; /* timer a counter */
+ INT32 TB; /* timer b value */
+ INT32 TBL; /* timer b base */
+ INT32 TBC; /* timer b counter */
+ /* Extention Timer and IRQ handler */
+ //const struct ssg_callbacks *SSG;
+ /* local time tables */
+ INT32 dt_tab[8][32];/* DeTune table */
+} FM_ST;
+
+
+
+/***********************************************************/
+/* OPN unit */
+/***********************************************************/
+
+/* OPN 3slot struct */
+typedef struct
+{
+ UINT32 fc[3]; /* fnum3,blk3: calculated */
+ UINT8 fn_h; /* freq3 latch */
+ UINT8 kcode[3]; /* key code */
+ UINT32 block_fnum[3]; /* current fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
+ UINT8 key_csm;
+} FM_3SLOT;
+
+/* OPN/A/B common state */
+typedef struct
+{
+ FM_ST ST; /* general state */
+ FM_3SLOT SL3; /* 3 slot mode state */
+ FM_CH *P_CH; /* pointer of CH */
+ unsigned char pan_regs [6]; /* last pan register write (high two bits) */
+ unsigned char pan_mutes [6]; /* external channel *disable* mask to apply to pan registers */
+ unsigned int pan[6*2]; /* fm channels output masks (0xffffffff = enable) */
+
+ UINT32 eg_cnt; /* global envelope generator counter */
+ UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/144/3 */
+ UINT32 eg_timer_add; /* step of eg_timer */
+ UINT32 eg_timer_overflow;/* envelope generator timer overlfows every 3 samples (on real chip) */
+
+ /* LFO */
+ UINT32 lfo_cnt;
+ UINT32 lfo_timer;
+ UINT32 lfo_timer_add;
+ UINT32 lfo_timer_overflow;
+ UINT32 LFO_AM; /* runtime LFO calculations helper */
+ INT32 LFO_PM; /* runtime LFO calculations helper */
+
+ /* there are 2048 FNUMs that can be generated using FNUM/BLK registers
+ but LFO works with one more bit of a precision so we really need 4096 elements */
+
+ UINT32 fn_table[4096]; /* fnumber->increment counter */
+
+ UINT32 fn_max;
+
+ INT32 m2,c1,c2; /* Phase Modulation input for operators 2,3,4 */
+ INT32 mem; /* one sample delay memory */
+
+ INT32 out_fm[8]; /* outputs of working channels */
+} FM_OPN;
+
+
+/* limitter */
+#define Limit(val) { \
+ if ( (short)(val) != (val) ) val = 0x7FFF ^ ( ( val ) >> 31 ); \
+}
+
+
+/* status set and IRQ handling */
+INLINE void FM_STATUS_SET(FM_ST *ST,int flag)
+{
+ /* set status flag */
+ ST->status |= flag;
+ if ( !(ST->irq) && (ST->status & ST->irqmask) )
+ {
+ ST->irq = 1;
+ }
+}
+
+/* status reset and IRQ handling */
+INLINE void FM_STATUS_RESET(FM_ST *ST,int flag)
+{
+ /* reset status flag */
+ ST->status &=~flag;
+ if ( (ST->irq) && !(ST->status & ST->irqmask) )
+ {
+ ST->irq = 0;
+ }
+}
+
+/* IRQ mask set */
+INLINE void FM_IRQMASK_SET(FM_ST *ST,int flag)
+{
+ ST->irqmask = flag;
+ /* IRQ handling check */
+ FM_STATUS_SET(ST,0);
+ FM_STATUS_RESET(ST,0);
+}
+
+/* Timer A Overflow */
+INLINE void TimerAOver(FM_ST *ST)
+{
+ /* set status (if enabled) */
+ if(ST->mode & 0x04) FM_STATUS_SET(ST,0x01);
+ /* clear or reload the counter */
+ ST->TAC = (1024-ST->TA);
+}
+/* Timer B Overflow */
+INLINE void TimerBOver(FM_ST *ST)
+{
+ /* set status (if enabled) */
+ if(ST->mode & 0x08) FM_STATUS_SET(ST,0x02);
+ /* clear or reload the counter */
+ ST->TBC = ( 256-ST->TB)<<4;
+}
+
+
+#if FM_BUSY_FLAG_SUPPORT
+INLINE UINT8 FM_STATUS_FLAG(FM_ST *ST)
+{
+ if( ST->BusyExpire )
+ {
+ if( (ST->BusyExpire - FM_GET_TIME_NOW()) > 0)
+ return ST->status | 0x80; /* with busy */
+ /* expire */
+ ST->BusyExpire = 0;
+ }
+ return ST->status;
+}
+INLINE void FM_BUSY_SET(FM_ST *ST,int busyclock )
+{
+ ST->BusyExpire = FM_GET_TIME_NOW() + (ST->TimerBase * busyclock);
+}
+#define FM_BUSY_CLEAR(ST) ((ST)->BusyExpire = 0)
+#else
+#define FM_STATUS_FLAG(ST) ((ST)->status)
+#define FM_BUSY_SET(ST,bclock) {}
+#define FM_BUSY_CLEAR(ST) {}
+#endif
+
+
+
+
+INLINE void FM_KEYON(FM_OPN *OPN, FM_CH *CH , int s )
+{
+ FM_SLOT *SLOT = &CH->SLOT[s];
+ if( !SLOT->key && !OPN->SL3.key_csm)
+ {
+ /* restart Phase Generator */
+ SLOT->phase = 0;
+
+ /* reset SSG-EG inversion flag */
+ SLOT->ssgn = 0;
+
+ if( (SLOT->ar + SLOT->ksr) < 94 /*32+62*/)
+ {
+ SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT;
+ }
+ else
+ {
+ /* force attenuation level to 0 */
+ SLOT->volume = MIN_ATT_INDEX;
+
+ /* directly switch to Decay (or Sustain) */
+ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC;
+ }
+
+ /* recalculate EG output */
+ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04)))
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+
+ SLOT->key = 1;
+}
+
+INLINE void FM_KEYOFF(FM_OPN *OPN, FM_CH *CH , int s )
+{
+ FM_SLOT *SLOT = &CH->SLOT[s];
+ if( SLOT->key && !OPN->SL3.key_csm)
+ {
+ if (SLOT->state>EG_REL)
+ {
+ SLOT->state = EG_REL; /* phase -> Release */
+
+ if ( SLOT->ssg & 0x8 )
+ {
+ /* convert EG attenuation level */
+ if (SLOT->ssgn ^ (SLOT->ssg&0x04))
+ SLOT->volume = (0x200 - SLOT->volume);
+
+ /* force EG attenuation level */
+ if (SLOT->volume >= 0x200)
+ {
+ SLOT->volume = MAX_ATT_INDEX;
+ SLOT->state = EG_OFF;
+ }
+
+ /* recalculate EG output */
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ }
+ }
+
+ SLOT->key = 0;
+}
+
+INLINE void FM_KEYON_CSM(FM_OPN *OPN, FM_CH *CH , int s )
+{
+ FM_SLOT *SLOT = &CH->SLOT[s];
+
+ if( !SLOT->key && !OPN->SL3.key_csm)
+ {
+ /* restart Phase Generator */
+ SLOT->phase = 0;
+
+ /* reset SSG-EG inversion flag */
+ SLOT->ssgn = 0;
+
+ if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/)
+ {
+ SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT;
+ }
+ else
+ {
+ /* force attenuation level to 0 */
+ SLOT->volume = MIN_ATT_INDEX;
+
+ /* directly switch to Decay (or Sustain) */
+ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC;
+ }
+
+ /* recalculate EG output */
+ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04)))
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+}
+
+INLINE void FM_KEYOFF_CSM(FM_CH *CH , int s )
+{
+ FM_SLOT *SLOT = &CH->SLOT[s];
+ if (!SLOT->key)
+ {
+ if (SLOT->state>EG_REL)
+ {
+ SLOT->state = EG_REL; /* phase -> Release */
+
+ /* SSG-EG specific update */
+ if (SLOT->ssg&0x08)
+ {
+ /* convert EG attenuation level */
+ if (SLOT->ssgn ^ (SLOT->ssg&0x04))
+ SLOT->volume = (0x200 - SLOT->volume);
+
+ /* force EG attenuation level */
+ if (SLOT->volume >= 0x200)
+ {
+ SLOT->volume = MAX_ATT_INDEX;
+ SLOT->state = EG_OFF;
+ }
+
+ /* recalculate EG output */
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ }
+ }
+}
+
+/* CSM Key Controll */
+INLINE void CSMKeyControll(FM_OPN *OPN, FM_CH *CH)
+{
+ /* all key ON (verified by Nemesis on real hardware) */
+ FM_KEYON_CSM(OPN,CH,SLOT1);
+ FM_KEYON_CSM(OPN,CH,SLOT2);
+ FM_KEYON_CSM(OPN,CH,SLOT3);
+ FM_KEYON_CSM(OPN,CH,SLOT4);
+ OPN->SL3.key_csm = 1;
+}
+
+INLINE void INTERNAL_TIMER_A(FM_OPN * OPN)
+{
+ if (OPN->ST.mode & 0x01)
+ {
+ if ((OPN->ST.TAC -= OPN->ST.TimerBase) <= 0)
+ {
+ /* set status (if enabled) */
+ if (OPN->ST.mode & 0x04) OPN->ST.status |= 0x01;
+
+ /* reload the counter */
+ if (OPN->ST.TAL) OPN->ST.TAC += OPN->ST.TAL;
+ else OPN->ST.TAC = OPN->ST.TAL;
+
+ /* CSM mode auto key on */
+ if ((OPN->ST.mode & 0xC0) == 0x80) CSMKeyControll(OPN, &OPN->P_CH[2]);
+ }
+ }
+}
+
+INLINE void INTERNAL_TIMER_B(FM_ST * ST, int step)
+{
+ if (ST->mode & 0x02)
+ {
+ if ((ST->TBC -= (ST->TimerBase * step)) <= 0)
+ {
+ /* set status (if enabled) */
+ if (ST->mode & 0x08) ST->status |= 0x02;
+
+ /* reload the counter */
+ if (ST->TBL) ST->TBC += ST->TBL;
+ else ST->TBC = ST->TBL;
+ }
+ }
+}
+
+/* OPN Mode Register Write */
+INLINE void set_timers( FM_OPN *OPN, int v )
+{
+ /* b7 = CSM MODE */
+ /* b6 = 3 slot mode */
+ /* b5 = reset b */
+ /* b4 = reset a */
+ /* b3 = timer enable b */
+ /* b2 = timer enable a */
+ /* b1 = load b */
+ /* b0 = load a */
+
+ if ((OPN->ST.mode ^ v) & 0xC0)
+ {
+ /* phase increment need to be recalculated */
+ OPN->P_CH[2].SLOT[SLOT1].Incr=-1;
+
+ /* CSM mode disabled and CSM key ON active*/
+ if (((v & 0xC0) != 0x80) && OPN->SL3.key_csm)
+ {
+ /* CSM Mode Key OFF (verified by Nemesis on real hardware) */
+ FM_KEYOFF_CSM(&OPN->P_CH[2],SLOT1);
+ FM_KEYOFF_CSM(&OPN->P_CH[2],SLOT2);
+ FM_KEYOFF_CSM(&OPN->P_CH[2],SLOT3);
+ FM_KEYOFF_CSM(&OPN->P_CH[2],SLOT4);
+ OPN->SL3.key_csm = 0;
+ }
+ }
+
+ /* reload Timers */
+ if ((v&1) & !(OPN->ST.mode&1)) OPN->ST.TAC = OPN->ST.TAL;
+ if ((v&2) & !(OPN->ST.mode&2)) OPN->ST.TBC = OPN->ST.TBL;
+
+ /* reset Timers flags */
+ OPN->ST.status &= (~v >> 4);
+
+ OPN->ST.mode = v;
+}
+
+
+/* set algorithm connection */
+static void setup_connection( FM_OPN *OPN, FM_CH *CH, int ch )
+{
+ INT32 *carrier = &OPN->out_fm[ch];
+
+ INT32 **om1 = &CH->connect1;
+ INT32 **om2 = &CH->connect3;
+ INT32 **oc1 = &CH->connect2;
+
+ INT32 **memc = &CH->mem_connect;
+
+ switch( CH->ALGO ){
+ case 0:
+ /* M1---C1---MEM---M2---C2---OUT */
+ *om1 = &OPN->c1;
+ *oc1 = &OPN->mem;
+ *om2 = &OPN->c2;
+ *memc= &OPN->m2;
+ break;
+ case 1:
+ /* M1------+-MEM---M2---C2---OUT */
+ /* C1-+ */
+ *om1 = &OPN->mem;
+ *oc1 = &OPN->mem;
+ *om2 = &OPN->c2;
+ *memc= &OPN->m2;
+ break;
+ case 2:
+ /* M1-----------------+-C2---OUT */
+ /* C1---MEM---M2-+ */
+ *om1 = &OPN->c2;
+ *oc1 = &OPN->mem;
+ *om2 = &OPN->c2;
+ *memc= &OPN->m2;
+ break;
+ case 3:
+ /* M1---C1---MEM------+-C2---OUT */
+ /* M2-+ */
+ *om1 = &OPN->c1;
+ *oc1 = &OPN->mem;
+ *om2 = &OPN->c2;
+ *memc= &OPN->c2;
+ break;
+ case 4:
+ /* M1---C1-+-OUT */
+ /* M2---C2-+ */
+ /* MEM: not used */
+ *om1 = &OPN->c1;
+ *oc1 = carrier;
+ *om2 = &OPN->c2;
+ *memc= &OPN->mem; /* store it anywhere where it will not be used */
+ break;
+ case 5:
+ /* +----C1----+ */
+ /* M1-+-MEM---M2-+-OUT */
+ /* +----C2----+ */
+ *om1 = 0; /* special mark */
+ *oc1 = carrier;
+ *om2 = carrier;
+ *memc= &OPN->m2;
+ break;
+ case 6:
+ /* M1---C1-+ */
+ /* M2-+-OUT */
+ /* C2-+ */
+ /* MEM: not used */
+ *om1 = &OPN->c1;
+ *oc1 = carrier;
+ *om2 = carrier;
+ *memc= &OPN->mem; /* store it anywhere where it will not be used */
+ break;
+ case 7:
+ /* M1-+ */
+ /* C1-+-OUT */
+ /* M2-+ */
+ /* C2-+ */
+ /* MEM: not used*/
+ *om1 = carrier;
+ *oc1 = carrier;
+ *om2 = carrier;
+ *memc= &OPN->mem; /* store it anywhere where it will not be used */
+ break;
+ }
+
+ CH->connect4 = carrier;
+}
+
+/* set detune & multiple */
+INLINE void set_det_mul(FM_ST *ST,FM_CH *CH,FM_SLOT *SLOT,int v)
+{
+ SLOT->mul = (v&0x0f)? (v&0x0f)*2 : 1;
+ SLOT->DT = ST->dt_tab[(v>>4)&7];
+ CH->SLOT[SLOT1].Incr=-1;
+}
+
+/* set total level */
+INLINE void set_tl(FM_CH *CH,FM_SLOT *SLOT , int v)
+{
+ SLOT->tl = (v&0x7f)<<(ENV_BITS-7); /* 7bit TL */
+
+ /* recalculate EG output */
+ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04)) && (SLOT->state > EG_REL))
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+}
+
+/* set attack rate & key scale */
+INLINE void set_ar_ksr(FM_CH *CH,FM_SLOT *SLOT,int v)
+{
+ UINT8 old_KSR = SLOT->KSR;
+
+ SLOT->ar = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
+
+ SLOT->KSR = 3-(v>>6);
+ if (SLOT->KSR != old_KSR)
+ {
+ CH->SLOT[SLOT1].Incr=-1;
+ }
+
+ /* Even if it seems unnecessary, in some odd case, KSR and KC are both modified */
+ /* and could result in SLOT->kc remaining unchanged. */
+ /* In such case, AR values would not be recalculated despite SLOT->ar has changed */
+ /* This fixes the introduction music of Batman & Robin (Eke-Eke) */
+ if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 18*RATE_STEPS; /* verified by Nemesis on real hardware */
+ }
+}
+
+/* set decay rate */
+INLINE void set_dr(FM_SLOT *SLOT,int v)
+{
+ SLOT->d1r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
+
+ SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + SLOT->ksr];
+ SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + SLOT->ksr];
+}
+
+/* set sustain rate */
+INLINE void set_sr(FM_SLOT *SLOT,int v)
+{
+ SLOT->d2r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
+
+ SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + SLOT->ksr];
+ SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + SLOT->ksr];
+}
+
+/* set release rate */
+INLINE void set_sl_rr(FM_SLOT *SLOT,int v)
+{
+ SLOT->sl = sl_table[ v>>4 ];
+
+ /* check EG state changes */
+ if ((SLOT->state == EG_DEC) && (SLOT->volume >= (INT32)(SLOT->sl)))
+ SLOT->state = EG_SUS;
+
+ SLOT->rr = 34 + ((v&0x0f)<<2);
+
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr];
+}
+
+
+
+/* advance LFO to next sample */
+INLINE void advance_lfo(FM_OPN *OPN)
+{
+ if (OPN->lfo_timer_overflow) /* LFO enabled ? */
+ {
+ /* increment LFO timer */
+ OPN->lfo_timer += OPN->lfo_timer_add;
+
+ /* when LFO is enabled, one level will last for 108, 77, 71, 67, 62, 44, 8 or 5 samples */
+ while (OPN->lfo_timer >= OPN->lfo_timer_overflow)
+ {
+ OPN->lfo_timer -= OPN->lfo_timer_overflow;
+
+ /* There are 128 LFO steps */
+ OPN->lfo_cnt = ( OPN->lfo_cnt + 1 ) & 127;
+
+ /* triangle */
+ /* AM: 0 to 126 step +2, 126 to 0 step -2 */
+ if (OPN->lfo_cnt<64)
+ OPN->LFO_AM = OPN->lfo_cnt * 2;
+ else
+ OPN->LFO_AM = 126 - ((OPN->lfo_cnt&63) * 2);
+
+ /* PM works with 4 times slower clock */
+ OPN->LFO_PM = OPN->lfo_cnt >> 2;
+ }
+ }
+}
+
+/* changed from INLINE to static here to work around gcc 4.2.1 codegen bug */
+static void advance_eg_channel(FM_OPN *OPN, FM_SLOT *SLOT)
+{
+ unsigned int i = 4; /* four operators per channel */
+
+ do
+ {
+ switch(SLOT->state)
+ {
+ case EG_ATT: /* attack phase */
+ if (!(OPN->eg_cnt & ((1<<SLOT->eg_sh_ar)-1)))
+ {
+ /* update attenuation level */
+ SLOT->volume += (~SLOT->volume * (eg_inc[SLOT->eg_sel_ar + ((OPN->eg_cnt>>SLOT->eg_sh_ar)&7)]))>>4;
+
+ /* check phase transition*/
+ if (SLOT->volume <= MIN_ATT_INDEX)
+ {
+ SLOT->volume = MIN_ATT_INDEX;
+ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC; /* special case where SL=0 */
+ }
+
+ /* recalculate EG output */
+ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04))) /* SSG-EG Output Inversion */
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ break;
+
+ case EG_DEC: /* decay phase */
+ if (!(OPN->eg_cnt & ((1<<SLOT->eg_sh_d1r)-1)))
+ {
+ /* SSG EG type */
+ if (SLOT->ssg&0x08)
+ {
+ /* update attenuation level */
+ if (SLOT->volume < 0x200)
+ {
+ SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
+
+ /* recalculate EG output */
+ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) /* SSG-EG Output Inversion */
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ }
+ else
+ {
+ /* update attenuation level */
+ SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
+
+ /* recalculate EG output */
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+
+ /* check phase transition*/
+ if (SLOT->volume >= (INT32)(SLOT->sl))
+ SLOT->state = EG_SUS;
+ }
+ break;
+
+ case EG_SUS: /* sustain phase */
+ if (!(OPN->eg_cnt & ((1<<SLOT->eg_sh_d2r)-1)))
+ {
+ /* SSG EG type */
+ if (SLOT->ssg&0x08)
+ {
+ /* update attenuation level */
+ if (SLOT->volume < 0x200)
+ {
+ SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)];
+
+ /* recalculate EG output */
+ if (SLOT->ssgn ^ (SLOT->ssg&0x04)) /* SSG-EG Output Inversion */
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ }
+ else
+ {
+ /* update attenuation level */
+ SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)];
+
+ /* check phase transition*/
+ if ( SLOT->volume >= MAX_ATT_INDEX )
+ SLOT->volume = MAX_ATT_INDEX;
+ /* do not change SLOT->state (verified on real chip) */
+
+ /* recalculate EG output */
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+ }
+ break;
+
+ case EG_REL: /* release phase */
+ if (!(OPN->eg_cnt & ((1<<SLOT->eg_sh_rr)-1)))
+ {
+ /* SSG EG type */
+ if (SLOT->ssg&0x08)
+ {
+ /* update attenuation level */
+ if (SLOT->volume < 0x200)
+ SLOT->volume += 4 * eg_inc[SLOT->eg_sel_rr + ((OPN->eg_cnt>>SLOT->eg_sh_rr)&7)];
+ /* check phase transition */
+ if (SLOT->volume >= 0x200)
+ {
+ SLOT->volume = MAX_ATT_INDEX;
+ SLOT->state = EG_OFF;
+ }
+ }
+ else
+ {
+ /* update attenuation level */
+ SLOT->volume += eg_inc[SLOT->eg_sel_rr + ((OPN->eg_cnt>>SLOT->eg_sh_rr)&7)];
+
+ /* check phase transition*/
+ if (SLOT->volume >= MAX_ATT_INDEX)
+ {
+ SLOT->volume = MAX_ATT_INDEX;
+ SLOT->state = EG_OFF;
+ }
+ }
+
+ /* recalculate EG output */
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+
+ }
+ break;
+ }
+
+ SLOT++;
+ i--;
+ } while (i);
+}
+
+/* SSG-EG update process */
+/* The behavior is based upon Nemesis tests on real hardware */
+/* This is actually executed before each samples */
+static void update_ssg_eg_channel(FM_SLOT *SLOT)
+{
+ unsigned int i = 4; /* four operators per channel */
+
+ do
+ {
+ /* detect SSG-EG transition */
+ /* this is not required during release phase as the attenuation has been forced to MAX and output invert flag is not used */
+ /* if an Attack Phase is programmed, inversion can occur on each sample */
+ if ((SLOT->ssg & 0x08) && (SLOT->volume >= 0x200) && (SLOT->state > EG_REL))
+ {
+ if (SLOT->ssg & 0x01) /* bit 0 = hold SSG-EG */
+ {
+ /* set inversion flag */
+ if (SLOT->ssg & 0x02)
+ SLOT->ssgn = 4;
+
+ /* force attenuation level during decay phases */
+ if ((SLOT->state != EG_ATT) && !(SLOT->ssgn ^ (SLOT->ssg & 0x04)))
+ SLOT->volume = MAX_ATT_INDEX;
+ }
+ else /* loop SSG-EG */
+ {
+ /* toggle output inversion flag or reset Phase Generator */
+ if (SLOT->ssg & 0x02)
+ SLOT->ssgn ^= 4;
+ else
+ SLOT->phase = 0;
+
+ /* same as Key ON */
+ if (SLOT->state != EG_ATT)
+ {
+ if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/)
+ {
+ SLOT->state = (SLOT->volume <= MIN_ATT_INDEX) ? ((SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC) : EG_ATT;
+ }
+ else
+ {
+ /* Attack Rate is maximal: directly switch to Decay or Substain */
+ SLOT->volume = MIN_ATT_INDEX;
+ SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC;
+ }
+ }
+ }
+
+ /* recalculate EG output */
+ if (SLOT->ssgn ^ (SLOT->ssg&0x04))
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+ }
+
+ /* next slot */
+ SLOT++;
+ i--;
+ } while (i);
+}
+
+
+INLINE void update_phase_lfo_slot(FM_OPN *OPN, FM_SLOT *SLOT, INT32 pms, UINT32 block_fnum)
+{
+ UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8;
+ INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + pms + OPN->LFO_PM ];
+
+ if (lfo_fn_table_index_offset) /* LFO phase modulation active */
+ {
+ block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
+
+ UINT8 blk = (block_fnum&0x7000) >> 12;
+ UINT32 fn = block_fnum & 0xfff;
+
+ /* recalculate keyscale code */
+ int kc = (blk<<2) | opn_fktable[fn >> 8];
+
+ /* recalculate (frequency) phase increment counter */
+ int fc = (OPN->fn_table[fn]>>(7-blk)) + SLOT->DT[kc];
+
+ /* (frequency) phase overflow (credits to Nemesis) */
+ if (fc < 0) fc += OPN->fn_max;
+
+ /* update phase */
+ SLOT->phase += (fc * SLOT->mul) >> 1;
+ }
+ else /* LFO phase modulation = zero */
+ {
+ SLOT->phase += SLOT->Incr;
+ }
+}
+
+INLINE void update_phase_lfo_channel(FM_OPN *OPN, FM_CH *CH)
+{
+ UINT32 block_fnum = CH->block_fnum;
+
+ UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8;
+ INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + CH->pms + OPN->LFO_PM ];
+
+ if (lfo_fn_table_index_offset) /* LFO phase modulation active */
+ {
+ block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
+
+ UINT8 blk = (block_fnum&0x7000) >> 12;
+ UINT32 fn = block_fnum & 0xfff;
+
+ /* recalculate keyscale code */
+ int kc = (blk<<2) | opn_fktable[fn >> 8];
+
+ /* recalculate (frequency) phase increment counter */
+ int fc = (OPN->fn_table[fn]>>(7-blk));
+
+ /* (frequency) phase overflow (credits to Nemesis) */
+ int finc = fc + CH->SLOT[SLOT1].DT[kc];
+ if (finc < 0) finc += OPN->fn_max;
+ CH->SLOT[SLOT1].phase += (finc*CH->SLOT[SLOT1].mul) >> 1;
+
+ finc = fc + CH->SLOT[SLOT2].DT[kc];
+ if (finc < 0) finc += OPN->fn_max;
+ CH->SLOT[SLOT2].phase += (finc*CH->SLOT[SLOT2].mul) >> 1;
+
+ finc = fc + CH->SLOT[SLOT3].DT[kc];
+ if (finc < 0) finc += OPN->fn_max;
+ CH->SLOT[SLOT3].phase += (finc*CH->SLOT[SLOT3].mul) >> 1;
+
+ finc = fc + CH->SLOT[SLOT4].DT[kc];
+ if (finc < 0) finc += OPN->fn_max;
+ CH->SLOT[SLOT4].phase += (finc*CH->SLOT[SLOT4].mul) >> 1;
+ }
+ else /* LFO phase modulation = zero */
+ {
+ CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr;
+ CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr;
+ CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr;
+ CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr;
+ }
+}
+
+/* update phase increment and envelope generator */
+INLINE void refresh_fc_eg_slot(FM_OPN *OPN, FM_SLOT *SLOT , int fc , int kc )
+{
+ int ksr = kc >> SLOT->KSR;
+
+ fc += SLOT->DT[kc];
+
+ /* detects frequency overflow (credits to Nemesis) */
+ if (fc < 0) fc += OPN->fn_max;
+
+ /* (frequency) phase increment counter */
+ SLOT->Incr = (fc * SLOT->mul) >> 1;
+
+ if( SLOT->ksr != ksr )
+ {
+ SLOT->ksr = ksr;
+
+ /* calculate envelope generator rates */
+ if ((SLOT->ar + SLOT->ksr) < 32+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ /* verified by Nemesis on real hardware (Attack phase is blocked) */
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 18*RATE_STEPS;
+ }
+
+ SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + SLOT->ksr];
+ SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + SLOT->ksr];
+
+ SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + SLOT->ksr];
+ SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + SLOT->ksr];
+
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr];
+ }
+}
+
+/* update phase increment counters */
+INLINE void refresh_fc_eg_chan(FM_OPN *OPN, FM_CH *CH )
+{
+ if( CH->SLOT[SLOT1].Incr==-1){
+ int fc = CH->fc;
+ int kc = CH->kcode;
+ refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT1] , fc , kc );
+ refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT2] , fc , kc );
+ refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT3] , fc , kc );
+ refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT4] , fc , kc );
+ }
+}
+
+#define volume_calc(OP) ((OP)->vol_out + (AM & (OP)->AMmask))
+
+INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm)
+{
+ UINT32 p;
+
+ p = (env<<3) + sin_tab[ ( ((signed int)((phase & ~FREQ_MASK) + (pm<<15))) >> FREQ_SH ) & SIN_MASK ];
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm)
+{
+ UINT32 p;
+
+ p = (env<<3) + sin_tab[ ( ((signed int)((phase & ~FREQ_MASK) + pm )) >> FREQ_SH ) & SIN_MASK ];
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+INLINE void chan_calc(FM_OPN *OPN, FM_CH *CH)
+{
+ UINT32 AM = OPN->LFO_AM >> CH->ams;
+
+ OPN->m2 = OPN->c1 = OPN->c2 = OPN->mem = 0;
+
+ *CH->mem_connect = CH->mem_value; /* restore delayed sample (MEM) value to m2 or c2 */
+
+ unsigned int eg_out = volume_calc(&CH->SLOT[SLOT1]);
+ {
+ INT32 out = CH->op1_out[0] + CH->op1_out[1];
+ CH->op1_out[0] = CH->op1_out[1];
+
+ if( !CH->connect1 ){
+ /* algorithm 5 */
+ OPN->mem = OPN->c1 = OPN->c2 = CH->op1_out[0];
+ }else{
+ /* other algorithms */
+ *CH->connect1 += CH->op1_out[0];
+ }
+
+ CH->op1_out[1] = 0;
+ if( eg_out < ENV_QUIET ) /* SLOT 1 */
+ {
+ if (!CH->FB)
+ out=0;
+
+ CH->op1_out[1] = op_calc1(CH->SLOT[SLOT1].phase, eg_out, (out<<CH->FB) );
+ }
+ }
+
+ eg_out = volume_calc(&CH->SLOT[SLOT3]);
+ if( eg_out < ENV_QUIET ) /* SLOT 3 */
+ *CH->connect3 += op_calc(CH->SLOT[SLOT3].phase, eg_out, OPN->m2);
+
+ eg_out = volume_calc(&CH->SLOT[SLOT2]);
+ if( eg_out < ENV_QUIET ) /* SLOT 2 */
+ *CH->connect2 += op_calc(CH->SLOT[SLOT2].phase, eg_out, OPN->c1);
+
+ eg_out = volume_calc(&CH->SLOT[SLOT4]);
+ if( eg_out < ENV_QUIET ) /* SLOT 4 */
+ *CH->connect4 += op_calc(CH->SLOT[SLOT4].phase, eg_out, OPN->c2);
+
+
+ /* store current MEM */
+ CH->mem_value = OPN->mem;
+
+ /* update phase counters AFTER output calculations */
+ if(CH->pms)
+ {
+ /* add support for 3 slot mode */
+ if ((OPN->ST.mode & 0xC0) && (CH == &OPN->P_CH[2]))
+ {
+ update_phase_lfo_slot(OPN, &CH->SLOT[SLOT1], CH->pms, OPN->SL3.block_fnum[1]);
+ update_phase_lfo_slot(OPN, &CH->SLOT[SLOT2], CH->pms, OPN->SL3.block_fnum[2]);
+ update_phase_lfo_slot(OPN, &CH->SLOT[SLOT3], CH->pms, OPN->SL3.block_fnum[0]);
+ update_phase_lfo_slot(OPN, &CH->SLOT[SLOT4], CH->pms, CH->block_fnum);
+ }
+ else update_phase_lfo_channel(OPN, CH);
+ }
+ else /* no LFO phase modulation */
+ {
+ CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr;
+ CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr;
+ CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr;
+ CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr;
+ }
+}
+
+/* initialize time tables */
+static void init_timetables( FM_OPN *OPN )
+{
+ int i,d;
+ double rate;
+
+ /* DeTune table */
+ for (d = 0;d <= 3;d++)
+ {
+ for (i = 0;i <= 31;i++)
+ {
+ rate = ((double)dt_tab[d*32 + i]) * OPN->ST.freqbase * (1<<(FREQ_SH-10)); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
+ OPN->ST.dt_tab[d][i] = (INT32) rate;
+ OPN->ST.dt_tab[d+4][i] = -OPN->ST.dt_tab[d][i];
+ }
+ }
+
+ /* there are 2048 FNUMs that can be generated using FNUM/BLK registers
+ but LFO works with one more bit of a precision so we really need 4096 elements */
+ /* calculate fnumber -> increment counter table */
+ for(i = 0; i < 4096; i++)
+ {
+ /* freq table for octave 7 */
+ /* OPN phase increment counter = 20bit */
+ /* the correct formula is : F-Number = (144 * fnote * 2^20 / M) / 2^(B-1) */
+ /* where sample clock is M/144 */
+ /* this means the increment value for one clock sample is FNUM * 2^(B-1) = FNUM * 64 for octave 7 */
+ /* we also need to handle the ratio between the chip frequency and the emulated frequency (can be 1.0) */
+ OPN->fn_table[i] = (UINT32)( (double)i * 32 * OPN->ST.freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
+ }
+
+ /* maximal frequency is required for Phase overflow calculation, register size is 17 bits (Nemesis) */
+ OPN->fn_max = (UINT32)( (double)0x20000 * OPN->ST.freqbase * (1<<(FREQ_SH-10)) );
+}
+
+
+static void reset_channels( FM_CH *CH , int num )
+{
+ int c,s;
+
+ for( c = 0 ; c < num ; c++ )
+ {
+ CH[c].mem_value = 0;
+ CH[c].op1_out[0] = 0;
+ CH[c].op1_out[1] = 0;
+ for(s = 0 ; s < 4 ; s++ )
+ {
+ CH[c].SLOT[s].Incr = -1;
+ CH[c].SLOT[s].key = 0;
+ CH[c].SLOT[s].phase = 0;
+ CH[c].SLOT[s].ssgn = 0;
+ CH[c].SLOT[s].state = EG_OFF;
+ CH[c].SLOT[s].volume = MAX_ATT_INDEX;
+ CH[c].SLOT[s].vol_out = MAX_ATT_INDEX;
+ }
+ }
+}
+
+/* initialize generic tables */
+static int init_tables(void)
+{
+ signed int i,x;
+ signed int n;
+ double o,m;
+
+ for (x=0; x<TL_RES_LEN; x++)
+ {
+ m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
+ m = floor(m);
+
+ /* we never reach (1<<16) here due to the (x+1) */
+ /* result fits within 16 bits at maximum */
+
+ n = (int)m; /* 16 bits here */
+ n >>= 4; /* 12 bits here */
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+ /* 11 bits here (rounded) */
+ n <<= 2; /* 13 bits here (as in real chip) */
+ tl_tab[ x*2 + 0 ] = n;
+ tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ];
+
+ for (i=1; i<13; i++)
+ {
+ tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i;
+ tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ];
+ }
+ #if 0
+ logerror("tl %04i", x);
+ for (i=0; i<13; i++)
+ logerror(", [%02i] %4x", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ]);
+ logerror("\n");
+ }
+ #endif
+ }
+ /*logerror("FM.C: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/
+
+
+ for (i=0; i<SIN_LEN; i++)
+ {
+ /* non-standard sinus */
+ m = sin( ((i*2)+1) * PI / SIN_LEN ); /* checked against the real chip */
+
+ /* we never reach zero here due to ((i*2)+1) */
+
+ if (m>0.0)
+ o = 8*log(1.0/m)/log(2.); /* convert to 'decibels' */
+ else
+ o = 8*log(-1.0/m)/log(2.); /* convert to 'decibels' */
+
+ o = o / (ENV_STEP/4);
+
+ n = (int)(2.0*o);
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+
+ sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 );
+ /*logerror("FM.C: sin [%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[i],tl_tab[sin_tab[i]]);*/
+ }
+
+ /*logerror("FM.C: ENV_QUIET= %08x\n",ENV_QUIET );*/
+
+
+ /* build LFO PM modulation table */
+ for(i = 0; i < 8; i++) /* 8 PM depths */
+ {
+ UINT8 fnum;
+ for (fnum=0; fnum<128; fnum++) /* 7 bits meaningful of F-NUMBER */
+ {
+ UINT8 value;
+ UINT8 step;
+ UINT32 offset_depth = i;
+ UINT32 offset_fnum_bit;
+ UINT32 bit_tmp;
+
+ for (step=0; step<8; step++)
+ {
+ value = 0;
+ for (bit_tmp=0; bit_tmp<7; bit_tmp++) /* 7 bits */
+ {
+ if (fnum & (1<<bit_tmp)) /* only if bit "bit_tmp" is set */
+ {
+ offset_fnum_bit = bit_tmp * 8;
+ value += lfo_pm_output[offset_fnum_bit + offset_depth][step];
+ }
+ }
+ lfo_pm_table[(fnum*32*8) + (i*32) + step + 0] = value;
+ lfo_pm_table[(fnum*32*8) + (i*32) +(step^7)+ 8] = value;
+ lfo_pm_table[(fnum*32*8) + (i*32) + step +16] = -value;
+ lfo_pm_table[(fnum*32*8) + (i*32) +(step^7)+24] = -value;
+ }
+#if 0
+ logerror("LFO depth=%1x FNUM=%04x (<<4=%4x): ", i, fnum, fnum<<4);
+ for (step=0; step<16; step++) /* dump only positive part of waveforms */
+ logerror("%02x ", lfo_pm_table[(fnum*32*8) + (i*32) + step] );
+ logerror("\n");
+#endif
+
+ }
+ }
+
+
+
+#ifdef SAVE_SAMPLE
+ sample[0]=fopen("sampsum.pcm","wb");
+#endif
+
+ return 1;
+
+}
+
+
+
+static void FMCloseTable( void )
+{
+#ifdef SAVE_SAMPLE
+ fclose(sample[0]);
+#endif
+ return;
+}
+
+
+#ifdef _STATE_H
+/* FM channel save , internal state only */
+static void FMsave_state_channel(const char *name,int num,FM_CH *CH,int num_ch)
+{
+ int slot , ch;
+ char state_name[20];
+ const char slot_array[4] = { 1 , 3 , 2 , 4 };
+
+ for(ch=0;ch<num_ch;ch++,CH++)
+ {
+ /* channel */
+ sprintf(state_name,"%s.CH%d",name,ch);
+ state_save_register_INT32(state_name, num, "feedback" , CH->op1_out , 2);
+ state_save_register_UINT32(state_name, num, "phasestep" , &CH->fc , 1);
+ /* slots */
+ for(slot=0;slot<4;slot++)
+ {
+ FM_SLOT *SLOT = &CH->SLOT[slot];
+
+ sprintf(state_name,"%s.CH%d.SLOT%d",name,ch,slot_array[slot]);
+ state_save_register_UINT32(state_name, num, "phasecount" , &SLOT->phase, 1);
+ state_save_register_UINT8 (state_name, num, "state" , &SLOT->state, 1);
+ state_save_register_INT32 (state_name, num, "volume" , &SLOT->volume, 1);
+ }
+ }
+}
+
+static void FMsave_state_st(const char *state_name,int num,FM_ST *ST)
+{
+#if FM_BUSY_FLAG_SUPPORT
+ state_save_register_double(state_name, num, "BusyExpire", &ST->BusyExpire , 1);
+#endif
+ state_save_register_UINT8 (state_name, num, "address" , &ST->address , 1);
+ state_save_register_UINT8 (state_name, num, "IRQ" , &ST->irq , 1);
+ state_save_register_UINT8 (state_name, num, "IRQ MASK" , &ST->irqmask , 1);
+ state_save_register_UINT8 (state_name, num, "status" , &ST->status , 1);
+ state_save_register_UINT32(state_name, num, "mode" , &ST->mode , 1);
+ state_save_register_UINT8 (state_name, num, "prescaler" , &ST->prescaler_sel , 1);
+ state_save_register_UINT8 (state_name, num, "freq latch", &ST->fn_h , 1);
+ state_save_register_int (state_name, num, "TIMER A" , &ST->TA );
+ state_save_register_int (state_name, num, "TIMER Acnt", &ST->TAC );
+ state_save_register_UINT8 (state_name, num, "TIMER B" , &ST->TB , 1);
+ state_save_register_int (state_name, num, "TIMER Bcnt", &ST->TBC );
+}
+#endif /* _STATE_H */
+
+#if BUILD_OPN
+
+
+
+/* prescaler set (and make time tables) */
+static void OPNSetPres(FM_OPN *OPN , int pres , int TimerPres, int SSGpres)
+{
+ /* frequency base */
+ OPN->ST.freqbase = (OPN->ST.rate) ? ((double)OPN->ST.clock / OPN->ST.rate) / pres : 0;
+ if ( fabs( OPN->ST.freqbase - 1.0 ) < 0.0001 )
+ OPN->ST.freqbase = 1.0;
+
+ OPN->eg_timer_add = (UINT32)((1<<EG_SH) * OPN->ST.freqbase);
+ OPN->eg_timer_overflow = ( 3 ) * (1<<EG_SH);
+
+ /* LFO timer increment (every samples) */
+ OPN->lfo_timer_add = (UINT32)((1<<LFO_SH) * OPN->ST.freqbase);
+
+ /* Timer base time (every samples) */
+ OPN->ST.TimerBase = (int) ((1 << TIMER_SH) * OPN->ST.freqbase);
+
+ /* make time tables */
+ init_timetables( OPN );
+}
+
+
+
+/* write a OPN mode register 0x20-0x2f */
+static void OPNWriteMode(FM_OPN *OPN, int r, int v)
+{
+ UINT8 c;
+ FM_CH *CH;
+
+ switch(r){
+ case 0x21: /* Test */
+ break;
+ case 0x22: /* LFO FREQ (YM2608/YM2610/YM2610B/YM2612) */
+ if (v&8) /* LFO enabled ? */
+ {
+ if (!OPN->lfo_timer_overflow)
+ {
+ /* restart LFO */
+ OPN->lfo_cnt = 0;
+ OPN->lfo_timer = 0;
+ OPN->LFO_AM = 0;
+ OPN->LFO_PM = 0;
+ }
+
+ OPN->lfo_timer_overflow = lfo_samples_per_step[v&7] << LFO_SH;
+ }
+ else
+ {
+ OPN->lfo_timer_overflow = 0;
+ }
+ break;
+ case 0x24: /* timer A High 8*/
+ OPN->ST.TA = (OPN->ST.TA & 0x03)|(((int)v)<<2);
+ OPN->ST.TAL = (1024 - OPN->ST.TA) << TIMER_SH;
+ break;
+ case 0x25: /* timer A Low 2*/
+ OPN->ST.TA = (OPN->ST.TA & 0x3fc)|(v&3);
+ OPN->ST.TAL = (1024 - OPN->ST.TA) << TIMER_SH;
+ break;
+ case 0x26: /* timer B */
+ OPN->ST.TB = v;
+ OPN->ST.TBL = (256 - OPN->ST.TB) << (TIMER_SH + 4);
+ break;
+ case 0x27: /* mode, timer control */
+ set_timers( OPN, v );
+ break;
+ case 0x28: /* key on / off */
+ c = v & 0x03;
+ if( c == 3 ) break;
+ if( (v&0x04) ) c+=3;
+ CH = OPN->P_CH;
+ CH = &CH[c];
+ if(v&0x10) FM_KEYON(OPN,CH,SLOT1); else FM_KEYOFF(OPN,CH,SLOT1);
+ if(v&0x20) FM_KEYON(OPN,CH,SLOT2); else FM_KEYOFF(OPN,CH,SLOT2);
+ if(v&0x40) FM_KEYON(OPN,CH,SLOT3); else FM_KEYOFF(OPN,CH,SLOT3);
+ if(v&0x80) FM_KEYON(OPN,CH,SLOT4); else FM_KEYOFF(OPN,CH,SLOT4);
+ break;
+ }
+}
+
+INLINE void OPNUpdatePan( FM_OPN *OPN, int c )
+{
+ int v = OPN->pan_regs [c] & ~OPN->pan_mutes [c];
+ OPN->pan[ c*2 ] = (v & 0x80) ? ~0 : 0;
+ OPN->pan[ c*2+1 ] = (v & 0x40) ? ~0 : 0;
+}
+
+/* write a OPN register (0x30-0xff) */
+static void OPNWriteReg(FM_OPN *OPN, int r, int v)
+{
+ FM_CH *CH;
+ FM_SLOT *SLOT;
+
+ UINT8 c = OPN_CHAN(r);
+
+ if (c == 3) return; /* 0xX3,0xX7,0xXB,0xXF */
+
+ if (r >= 0x100) c+=3;
+
+ CH = OPN->P_CH;
+ CH = &CH[c];
+
+ SLOT = &(CH->SLOT[OPN_SLOT(r)]);
+
+ switch( r & 0xf0 ) {
+ case 0x30: /* DET , MUL */
+ set_det_mul(&OPN->ST,CH,SLOT,v);
+ break;
+
+ case 0x40: /* TL */
+ set_tl(CH,SLOT,v);
+ break;
+
+ case 0x50: /* KS, AR */
+ set_ar_ksr(CH,SLOT,v);
+ break;
+
+ case 0x60: /* bit7 = AM ENABLE, DR */
+ set_dr(SLOT,v);
+
+ SLOT->AMmask = (v&0x80) ? ~0 : 0;
+ break;
+
+ case 0x70: /* SR */
+ set_sr(SLOT,v);
+ break;
+
+ case 0x80: /* SL, RR */
+ set_sl_rr(SLOT,v);
+ break;
+
+ case 0x90: /* SSG-EG */
+ SLOT->ssg = v&0x0f;
+
+ /* recalculate EG output */
+ if ((SLOT->ssg&0x08) && (SLOT->ssgn ^ (SLOT->ssg&0x04)) && (SLOT->state > EG_REL))
+ SLOT->vol_out = ((UINT32)(0x200 - SLOT->volume) & MAX_ATT_INDEX) + SLOT->tl;
+ else
+ SLOT->vol_out = (UINT32)SLOT->volume + SLOT->tl;
+
+ /* SSG-EG envelope shapes :
+
+ E AtAlH
+ 1 0 0 0 \\\\
+
+ 1 0 0 1 \___
+
+ 1 0 1 0 \/\/
+ ___
+ 1 0 1 1 \
+
+ 1 1 0 0 ////
+ ___
+ 1 1 0 1 /
+
+ 1 1 1 0 /\/\
+
+ 1 1 1 1 /___
+
+
+ E = SSG-EG enable
+
+
+ The shapes are generated using Attack, Decay and Sustain phases.
+
+ Each single character in the diagrams above represents this whole
+ sequence:
+
+ - when KEY-ON = 1, normal Attack phase is generated (*without* any
+ difference when compared to normal mode),
+
+ - later, when envelope level reaches minimum level (max volume),
+ the EG switches to Decay phase (which works with bigger steps
+ when compared to normal mode - see below),
+
+ - later when envelope level passes the SL level,
+ the EG swithes to Sustain phase (which works with bigger steps
+ when compared to normal mode - see below),
+
+ - finally when envelope level reaches maximum level (min volume),
+ the EG switches to Attack phase again (depends on actual waveform).
+
+ Important is that when switch to Attack phase occurs, the phase counter
+ of that operator will be zeroed-out (as in normal KEY-ON) but not always.
+ (I havent found the rule for that - perhaps only when the output level is low)
+
+ The difference (when compared to normal Envelope Generator mode) is
+ that the resolution in Decay and Sustain phases is 4 times lower;
+ this results in only 256 steps instead of normal 1024.
+ In other words:
+ when SSG-EG is disabled, the step inside of the EG is one,
+ when SSG-EG is enabled, the step is four (in Decay and Sustain phases).
+
+ Times between the level changes are the same in both modes.
+
+
+ Important:
+ Decay 1 Level (so called SL) is compared to actual SSG-EG output, so
+ it is the same in both SSG and no-SSG modes, with this exception:
+
+ when the SSG-EG is enabled and is generating raising levels
+ (when the EG output is inverted) the SL will be found at wrong level !!!
+ For example, when SL=02:
+ 0 -6 = -6dB in non-inverted EG output
+ 96-6 = -90dB in inverted EG output
+ Which means that EG compares its level to SL as usual, and that the
+ output is simply inverted afterall.
+
+
+ The Yamaha's manuals say that AR should be set to 0x1f (max speed).
+ That is not necessary, but then EG will be generating Attack phase.
+
+ */
+
+
+ break;
+
+ case 0xa0:
+ switch( OPN_SLOT(r) ){
+ case 0: /* 0xa0-0xa2 : FNUM1 */
+ {
+ UINT32 fn = (((UINT32)( (OPN->ST.fn_h)&7))<<8) + v;
+ UINT8 blk = OPN->ST.fn_h>>3;
+ /* keyscale code */
+ CH->kcode = (blk<<2) | opn_fktable[fn >> 7];
+ /* phase increment counter */
+ CH->fc = OPN->fn_table[fn*2]>>(7-blk);
+
+ /* store fnum in clear form for LFO PM calculations */
+ CH->block_fnum = (blk<<11) | fn;
+
+ CH->SLOT[SLOT1].Incr=-1;
+ }
+ break;
+ case 1: /* 0xa4-0xa6 : FNUM2,BLK */
+ OPN->ST.fn_h = v&0x3f;
+ break;
+ case 2: /* 0xa8-0xaa : 3CH FNUM1 */
+ if(r < 0x100)
+ {
+ UINT32 fn = (((UINT32)(OPN->SL3.fn_h&7))<<8) + v;
+ UINT8 blk = OPN->SL3.fn_h>>3;
+ /* keyscale code */
+ OPN->SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7];
+ /* phase increment counter */
+ OPN->SL3.fc[c] = OPN->fn_table[fn*2]>>(7-blk);
+ OPN->SL3.block_fnum[c] = (blk<<11) | fn;
+ (OPN->P_CH)[2].SLOT[SLOT1].Incr=-1;
+ }
+ break;
+ case 3: /* 0xac-0xae : 3CH FNUM2,BLK */
+ if(r < 0x100)
+ OPN->SL3.fn_h = v&0x3f;
+ break;
+ }
+ break;
+
+ case 0xb0:
+ switch( OPN_SLOT(r) ){
+ case 0: /* 0xb0-0xb2 : FB,ALGO */
+ {
+ int feedback = (v>>3)&7;
+ CH->ALGO = v&7;
+ CH->FB = feedback ? feedback+6 : 0;
+ setup_connection( OPN, CH, c );
+ }
+ break;
+ case 1: /* 0xb4-0xb6 : L , R , AMS , PMS (YM2612/YM2610B/YM2610/YM2608) */
+ {
+ /* b0-2 PMS */
+ CH->pms = (v & 7) * 32; /* CH->pms = PM depth * 32 (index in lfo_pm_table) */
+
+ /* b4-5 AMS */
+ CH->ams = lfo_ams_depth_shift[(v>>4) & 0x03];
+
+ /* PAN : b7 = L, b6 = R */
+ OPN->pan_regs [c] = v & 0xc0;
+ OPNUpdatePan( OPN, c );
+
+ }
+ break;
+ }
+ break;
+ }
+}
+
+#endif /* BUILD_OPN */
+
+#if BUILD_YM2612
+/*******************************************************************************/
+/* YM2612 local section */
+/*******************************************************************************/
+/* here's the virtual YM2612 */
+struct Ym2612_Impl
+{
+#ifdef _STATE_H
+ UINT8 REGS[512]; /* registers */
+#endif
+ FM_OPN OPN; /* OPN state */
+ FM_CH CH[6]; /* channel state */
+
+ /* dac output (YM2612) */
+ int dacen;
+ INT32 dacout;
+};
+
+//static int dacen;
+
+/* Generate samples for one of the YM2612s */
+void YM2612UpdateOne(YM2612 *F2612, short *buffer, int length)
+{
+ FM_OPN *OPN = &F2612->OPN;
+ int i;
+ INT32 dacout = F2612->dacout;
+ FM_CH *cch[6];
+ int dacen;
+
+ cch[0] = &F2612->CH[0];
+ cch[1] = &F2612->CH[1];
+ cch[2] = &F2612->CH[2];
+ cch[3] = &F2612->CH[3];
+ cch[4] = &F2612->CH[4];
+ cch[5] = &F2612->CH[5];
+ /* DAC mode */
+ dacen = F2612->dacen;
+
+ /* refresh PG and EG */
+ refresh_fc_eg_chan( OPN, cch[0] );
+ refresh_fc_eg_chan( OPN, cch[1] );
+ if( (OPN->ST.mode & 0xc0) )
+ {
+ /* 3SLOT MODE */
+ if( cch[2]->SLOT[SLOT1].Incr==-1)
+ {
+ refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
+ refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
+ refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
+ refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode );
+ }
+ }else refresh_fc_eg_chan( OPN, cch[2] );
+ refresh_fc_eg_chan( OPN, cch[3] );
+ refresh_fc_eg_chan( OPN, cch[4] );
+ refresh_fc_eg_chan( OPN, cch[5] );
+
+ /* buffering */
+ for(i=0; i < length ; i++)
+ {
+ /* clear outputs */
+ OPN->out_fm[0] = 0;
+ OPN->out_fm[1] = 0;
+ OPN->out_fm[2] = 0;
+ OPN->out_fm[3] = 0;
+ OPN->out_fm[4] = 0;
+ OPN->out_fm[5] = 0;
+
+ /* update SSG-EG output */
+ update_ssg_eg_channel(&cch[0]->SLOT[SLOT1]);
+ update_ssg_eg_channel(&cch[1]->SLOT[SLOT1]);
+ update_ssg_eg_channel(&cch[2]->SLOT[SLOT1]);
+ update_ssg_eg_channel(&cch[3]->SLOT[SLOT1]);
+ update_ssg_eg_channel(&cch[4]->SLOT[SLOT1]);
+ update_ssg_eg_channel(&cch[5]->SLOT[SLOT1]);
+
+ /* calculate FM */
+ chan_calc(OPN, cch[0] );
+ chan_calc(OPN, cch[1] );
+ chan_calc(OPN, cch[2] );
+ chan_calc(OPN, cch[3] );
+ chan_calc(OPN, cch[4] );
+ if( dacen )
+ /* *cch[5]->connect4 += dacout */;
+ else
+ chan_calc(OPN, cch[5] );
+
+ /* advance LFO */
+ advance_lfo(OPN);
+
+ /* advance envelope generator */
+ OPN->eg_timer += OPN->eg_timer_add;
+ while (OPN->eg_timer >= OPN->eg_timer_overflow)
+ {
+ OPN->eg_timer -= OPN->eg_timer_overflow;
+ OPN->eg_cnt++;
+
+ advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
+ advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
+ advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
+ advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]);
+ advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]);
+ advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]);
+ }
+
+ {
+ int lt,rt;
+
+ if (OPN->out_fm[0] > 8191) OPN->out_fm[0] = 8191;
+ else if (OPN->out_fm[0] < -8192) OPN->out_fm[0] = -8192;
+ if (OPN->out_fm[1] > 8191) OPN->out_fm[1] = 8191;
+ else if (OPN->out_fm[1] < -8192) OPN->out_fm[1] = -8192;
+ if (OPN->out_fm[2] > 8191) OPN->out_fm[2] = 8191;
+ else if (OPN->out_fm[2] < -8192) OPN->out_fm[2] = -8192;
+ if (OPN->out_fm[3] > 8191) OPN->out_fm[3] = 8191;
+ else if (OPN->out_fm[3] < -8192) OPN->out_fm[3] = -8192;
+ if (OPN->out_fm[4] > 8191) OPN->out_fm[4] = 8191;
+ else if (OPN->out_fm[4] < -8192) OPN->out_fm[4] = -8192;
+ if (OPN->out_fm[5] > 8191) OPN->out_fm[5] = 8191;
+ else if (OPN->out_fm[5] < -8192) OPN->out_fm[5] = -8192;
+
+ lt = ((OPN->out_fm[0]>>0) & OPN->pan[0]);
+ rt = ((OPN->out_fm[0]>>0) & OPN->pan[1]);
+ lt += ((OPN->out_fm[1]>>0) & OPN->pan[2]);
+ rt += ((OPN->out_fm[1]>>0) & OPN->pan[3]);
+ lt += ((OPN->out_fm[2]>>0) & OPN->pan[4]);
+ rt += ((OPN->out_fm[2]>>0) & OPN->pan[5]);
+ lt += ((OPN->out_fm[3]>>0) & OPN->pan[6]);
+ rt += ((OPN->out_fm[3]>>0) & OPN->pan[7]);
+ lt += ((OPN->out_fm[4]>>0) & OPN->pan[8]);
+ rt += ((OPN->out_fm[4]>>0) & OPN->pan[9]);
+ lt += ((OPN->out_fm[5]>>0) & OPN->pan[10]);
+ rt += ((OPN->out_fm[5]>>0) & OPN->pan[11]);
+
+ lt >>= 1;
+ rt >>= 1;
+
+ Limit( lt );
+ Limit( rt );
+
+ #ifdef SAVE_SAMPLE
+ SAVE_ALL_CHANNELS
+ #endif
+
+ /* buffering */
+ buffer[i*2] = lt;
+ buffer[i*2+1] = rt;
+ }
+
+ /* CSM mode: if CSM Key ON has occured, CSM Key OFF need to be sent */
+ /* only if Timer A does not overflow again (i.e CSM Key ON not set again) */
+ OPN->SL3.key_csm <<= 1;
+
+ /* timer A control */
+ INTERNAL_TIMER_A( OPN );
+
+ /* CSM Mode Key ON still disabled */
+ /* CSM Mode Key OFF (verified by Nemesis on real hardware) */
+ FM_KEYOFF_CSM(cch[2],SLOT1);
+ FM_KEYOFF_CSM(cch[2],SLOT2);
+ FM_KEYOFF_CSM(cch[2],SLOT3);
+ FM_KEYOFF_CSM(cch[2],SLOT4);
+ OPN->SL3.key_csm = 0;
+ }
+ INTERNAL_TIMER_B(&OPN->ST,length);
+
+}
+
+#ifdef _STATE_H
+void YM2612Postload(void *chip)
+{
+ if (chip)
+ {
+ YM2612 *F2612 = (YM2612 *)chip;
+ int r;
+
+ /* DAC data & port */
+ F2612->dacout = ((int)F2612->REGS[0x2a] - 0x80) << 0; /* level unknown */
+ F2612->dacen = F2612->REGS[0x2d] & 0x80;
+ /* OPN registers */
+ /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */
+ for(r=0x30;r<0x9e;r++)
+ if((r&3) != 3)
+ {
+ OPNWriteReg(&F2612->OPN,r,F2612->REGS[r]);
+ OPNWriteReg(&F2612->OPN,r|0x100,F2612->REGS[r|0x100]);
+ }
+ /* FB / CONNECT , L / R / AMS / PMS */
+ for(r=0xb0;r<0xb6;r++)
+ if((r&3) != 3)
+ {
+ OPNWriteReg(&F2612->OPN,r,F2612->REGS[r]);
+ OPNWriteReg(&F2612->OPN,r|0x100,F2612->REGS[r|0x100]);
+ }
+ /* channels */
+ /*FM_channel_postload(F2612->CH,6);*/
+ OPN->cur_chip = NULL;
+ }
+}
+
+static void YM2612_save_state(YM2612 *F2612, int index)
+{
+ const char statename[] = "YM2612";
+
+ state_save_register_UINT8 (statename, index, "regs" , F2612->REGS , 512);
+ FMsave_state_st(statename,index,&F2612->OPN.ST);
+ FMsave_state_channel(statename,index,F2612->CH,6);
+ /* 3slots */
+ state_save_register_UINT32 (statename, index, "slot3fc" , F2612->OPN.SL3.fc , 3);
+ state_save_register_UINT8 (statename, index, "slot3fh" , &F2612->OPN.SL3.fn_h, 1);
+ state_save_register_UINT8 (statename, index, "slot3kc" , F2612->OPN.SL3.kcode, 3);
+ /* address register1 */
+ state_save_register_UINT8 (statename, index, "addr_A1" , &F2612->addr_A1, 1);
+}
+#endif /* _STATE_H */
+
+/* initialize YM2612 emulator(s) */
+YM2612 * YM2612Init(void *param, int index, long clock, long rate)
+{
+ YM2612 *F2612;
+
+ /* allocate extend state space */
+ if( (F2612 = (YM2612 *)calloc(1, sizeof(YM2612)))==NULL)
+ return NULL;
+ /* allocate total level table (128kb space) */
+ if( !init_tables() )
+ {
+ free( F2612 );
+ return NULL;
+ }
+
+ F2612->OPN.ST.param = param;
+ F2612->OPN.P_CH = F2612->CH;
+ F2612->OPN.ST.clock = clock;
+ F2612->OPN.ST.rate = rate;
+ /* F2612->OPN.ST.irq = 0; */
+ /* F2612->OPN.ST.status = 0; */
+ /* Extend handler */
+ OPNSetPres(&F2612->OPN, 6*24, 6*24, 0);
+ YM2612ResetChip( F2612 );
+
+#ifdef _STATE_H
+ YM2612_save_state(F2612, index);
+#endif
+ return F2612;
+}
+
+void YM2612Mute(YM2612* F2612, int mask)
+{
+ int c;
+ for ( c = 0; c < 6; c++ )
+ {
+ F2612->OPN.pan_mutes [c] = -(mask >> c & 1);
+ OPNUpdatePan( &F2612->OPN, c );
+ }
+}
+
+/* shut down emulator */
+void YM2612Shutdown(YM2612 *F2612)
+{
+ FMCloseTable();
+ free(F2612);
+}
+
+/* reset one of chip */
+void YM2612ResetChip(YM2612 *F2612)
+{
+ int i;
+ FM_OPN *OPN = &F2612->OPN;
+
+ OPN->eg_timer = 0;
+ OPN->eg_cnt = 0;
+
+ OPN->lfo_timer = 0;
+ OPN->lfo_cnt = 0;
+ OPN->LFO_AM = 0;
+ OPN->LFO_PM = 0;
+
+ OPN->ST.TAC = 0;
+ OPN->ST.TBC = 0;
+
+ OPN->SL3.key_csm = 0;
+
+ OPNWriteMode(OPN,0x27,0x30);
+ OPNWriteMode(OPN,0x26,0x00);
+ OPNWriteMode(OPN,0x25,0x00);
+ OPNWriteMode(OPN,0x24,0x00);
+ OPNWriteMode(OPN,0x22,0x00);
+
+ reset_channels( &F2612->CH[0] , 6 );
+
+ for(i = 0xb6 ; i >= 0xb4 ; i-- )
+ {
+ OPNWriteReg(OPN,i ,0xc0);
+ OPNWriteReg(OPN,i|0x100,0xc0);
+ }
+ for(i = 0xb2 ; i >= 0x30 ; i-- )
+ {
+ OPNWriteReg(OPN,i ,0);
+ OPNWriteReg(OPN,i|0x100,0);
+ }
+}
+
+/* YM2612 write */
+/* n = number */
+/* a = address */
+/* v = value */
+int YM2612Write(YM2612 *F2612, unsigned int a, unsigned int v)
+{
+ v &= 0xff; /* adjust to 8 bit bus */
+
+ switch( a )
+ {
+ case 0: /* address port 0 */
+ F2612->OPN.ST.address = v;
+ break;
+
+ case 2: /* address port 1 */
+ F2612->OPN.ST.address = v | 0x100;
+ break;
+
+ default:
+ {
+ int addr = F2612->OPN.ST.address; /* verified by Nemesis on real YM2612 */
+#ifdef _STATE_H
+ F2612->REGS[addr] = v;
+#endif
+ switch( addr & 0x1f0 )
+ {
+ case 0x20: /* 0x20-0x2f Mode */
+ switch( addr )
+ {
+ case 0x2a: /* DAC data (YM2612) */
+ YM2612UpdateReq(F2612->OPN.ST.param);
+ F2612->dacout = ((int)v - 0x80) << 8; /* level unknown */
+ break;
+ case 0x2b: /* DAC Sel (YM2612) */
+ /* b7 = dac enable */
+ F2612->dacen = v & 0x80;
+ break;
+ default: /* OPN section */
+ YM2612UpdateReq(F2612->OPN.ST.param);
+ /* write register */
+ OPNWriteMode(&(F2612->OPN),addr,v);
+ }
+ break;
+ default: /* 0x30-0xff OPN section */
+ YM2612UpdateReq(F2612->OPN.ST.param);
+ /* write register */
+ OPNWriteReg(&(F2612->OPN),addr,v);
+ }
+ break;
+ }
+ }
+ return F2612->OPN.ST.irq;
+}
+
+UINT8 YM2612Read(YM2612 *F2612,int a)
+{
+ switch( a&3){
+ case 0: /* status 0 */
+ return FM_STATUS_FLAG(&F2612->OPN.ST);
+ case 1:
+ case 2:
+ case 3:
+ logerror("YM2612 #%p:A=%d read unmapped area\n",F2612->OPN.ST.param,a);
+ return FM_STATUS_FLAG(&F2612->OPN.ST);
+ }
+ return 0;
+}
+
+int YM2612TimerOver(YM2612 *F2612,int c)
+{
+ if( c )
+ { /* Timer B */
+ TimerBOver( &(F2612->OPN.ST) );
+ }
+ else
+ { /* Timer A */
+ YM2612UpdateReq(F2612->OPN.ST.param);
+ /* timer update */
+ TimerAOver( &(F2612->OPN.ST) );
+ /* CSM mode key,TL controll */
+ if ((F2612->OPN.ST.mode & 0xc0) == 0x80)
+ { /* CSM mode total level latch and auto key on */
+ CSMKeyControll( &F2612->OPN, &(F2612->CH[2]) );
+ }
+ }
+ return F2612->OPN.ST.irq;
+}
+
+#endif /* BUILD_YM2612 */
+
+// Ym2612_Emu
+
+Ym2612_Emu::~Ym2612_Emu()
+{
+ if ( impl )
+ YM2612Shutdown( impl );
+}
+
+const char* Ym2612_Emu::set_rate( double sample_rate, double clock_rate )
+{
+ if ( impl )
+ {
+ YM2612Shutdown( impl );
+ impl = 0;
+ }
+
+ if ( !clock_rate )
+ clock_rate = sample_rate * 144.;
+
+ impl = YM2612Init( 0, 0, (long) (clock_rate + 0.5), (long) (sample_rate + 0.5) );
+ if ( !impl )
+ return blargg_err_memory;
+
+ return 0;
+}
+
+void Ym2612_Emu::reset()
+{
+ YM2612ResetChip( impl );
+}
+
+void Ym2612_Emu::write0( int addr, int data )
+{
+ YM2612Write( impl, 0, addr );
+ YM2612Write( impl, 1, data );
+}
+
+void Ym2612_Emu::write1( int addr, int data )
+{
+ YM2612Write( impl, 2, addr );
+ YM2612Write( impl, 3, data );
+}
+
+void Ym2612_Emu::mute_voices( int mask )
+{
+ YM2612Mute( impl, mask );
+}
+
+void Ym2612_Emu::run( int pair_count, sample_t* out )
+{
+ YM2612UpdateOne( impl, out, pair_count );
+}
+
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.h b/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.h
new file mode 100644
index 00000000..74933337
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Ym2612_Emu.h
@@ -0,0 +1,38 @@
+// YM2612 FM sound chip emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef YM2612_EMU_H
+#define YM2612_EMU_H
+
+struct Ym2612_Impl;
+
+class Ym2612_Emu {
+ Ym2612_Impl* impl;
+public:
+ Ym2612_Emu() { impl = 0; }
+ ~Ym2612_Emu();
+
+ // Sets sample rate and chip clock rate, in Hz. Returns non-zero
+ // if error. If clock_rate=0, uses sample_rate*144
+ const char* set_rate( double sample_rate, double clock_rate = 0 );
+
+ // Resets to power-up state
+ void reset();
+
+ // Mutes voice n if bit n (1 << n) of mask is set
+ enum { channel_count = 6 };
+ void mute_voices( int mask );
+
+ // Writes addr to register 0 then data to register 1
+ void write0( int addr, int data );
+
+ // Writes addr to register 2 then data to register 3
+ void write1( int addr, int data );
+
+ // Runs and adds pair_count*2 samples into current output buffer contents
+ typedef short sample_t;
+ enum { out_chan_count = 2 }; // stereo
+ void run( int pair_count, sample_t* out );
+};
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.cpp
new file mode 100644
index 00000000..cfc71b7c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.cpp
@@ -0,0 +1,82 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Z80_Cpu.h"
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// flags, named with hex value for clarity
+int const S80 = 0x80;
+int const Z40 = 0x40;
+int const F20 = 0x20;
+int const H10 = 0x10;
+int const F08 = 0x08;
+int const V04 = 0x04;
+int const P04 = 0x04;
+int const N02 = 0x02;
+int const C01 = 0x01;
+
+Z80_Cpu::Z80_Cpu()
+{
+ cpu_state = &cpu_state_;
+
+ for ( int i = 0x100; --i >= 0; )
+ {
+ int even = 1;
+ for ( int p = i; p; p >>= 1 )
+ even ^= p;
+ int n = (i & (S80 | F20 | F08)) | ((even & 1) * P04);
+ szpc [i] = n;
+ szpc [i + 0x100] = n | C01;
+ }
+ szpc [0x000] |= Z40;
+ szpc [0x100] |= Z40;
+}
+
+inline void Z80_Cpu::set_page( int i, void* write, void const* read )
+{
+ int offset = Z80_CPU_OFFSET( i * page_size );
+ byte * write2 = STATIC_CAST(byte *,write) - offset;
+ byte const* read2 = STATIC_CAST(byte const*,read ) - offset;
+ cpu_state_.write [i] = write2;
+ cpu_state_.read [i] = read2;
+ cpu_state->write [i] = write2;
+ cpu_state->read [i] = read2;
+}
+
+void Z80_Cpu::reset( void* unmapped_write, void const* unmapped_read )
+{
+ check( cpu_state == &cpu_state_ );
+ cpu_state = &cpu_state_;
+ cpu_state_.time = 0;
+ cpu_state_.base = 0;
+ end_time_ = 0;
+
+ for ( int i = 0; i < page_count + 1; i++ )
+ set_page( i, unmapped_write, unmapped_read );
+
+ memset( &r, 0, sizeof r );
+}
+
+void Z80_Cpu::map_mem( addr_t start, int size, void* write, void const* read )
+{
+ // address range must begin and end on page boundaries
+ require( start % page_size == 0 );
+ require( size % page_size == 0 );
+ require( start + size <= 0x10000 );
+
+ for ( int offset = 0; offset < size; offset += page_size )
+ set_page( (start + offset) >> page_bits,
+ STATIC_CAST(char *,write) + offset,
+ STATIC_CAST(char const*,read ) + offset );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.h b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.h
new file mode 100644
index 00000000..743cbb65
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu.h
@@ -0,0 +1,122 @@
+// Z80 CPU emulator
+
+// Game_Music_Emu 0.6-pre
+#ifndef Z80_CPU_H
+#define Z80_CPU_H
+
+#include "blargg_endian.h"
+
+class Z80_Cpu {
+public:
+ typedef int time_t;
+ typedef int addr_t;
+ typedef BOOST::uint8_t byte;
+
+ // Clears registers and maps all pages to unmapped
+ void reset( void* unmapped_write, void const* unmapped_read );
+
+ // TODO: split mapping out of CPU
+
+ // Maps memory. Start and size must be multiple of page_size.
+ enum { page_bits = 10 };
+ enum { page_size = 1 << page_bits };
+ void map_mem( addr_t addr, int size, void* write, void const* read );
+ void map_mem( addr_t addr, int size, void* read_write );
+
+ // Maps address to pointer to that byte
+ byte * write( addr_t addr );
+ byte const* read( addr_t addr );
+
+ // Time of beginning of next instruction
+ time_t time() const { return cpu_state->time + cpu_state->base; }
+
+ // Alter current time
+ void set_time( time_t t ) { cpu_state->time = t - cpu_state->base; }
+ void adjust_time( int delta ) { cpu_state->time += delta; }
+
+ #if BLARGG_BIG_ENDIAN
+ struct regs_t { byte b,c, d,e, h,l, flags,a; };
+ #else
+ struct regs_t { byte c,b, e,d, l,h, a,flags; };
+ #endif
+ BLARGG_STATIC_ASSERT( sizeof (regs_t) == 8 );
+
+ struct pairs_t { BOOST::uint16_t bc, de, hl, fa; };
+
+ // Registers are not updated until run() returns
+ struct registers_t {
+ BOOST::uint16_t pc;
+ BOOST::uint16_t sp;
+ BOOST::uint16_t ix;
+ BOOST::uint16_t iy;
+ union {
+ regs_t b; // b.b, b.c, b.d, b.e, b.h, b.l, b.flags, b.a
+ pairs_t w; // w.bc, w.de, w.hl. w.fa
+ };
+ union {
+ regs_t b;
+ pairs_t w;
+ } alt;
+ byte iff1;
+ byte iff2;
+ byte r;
+ byte i;
+ byte im;
+ };
+ //registers_t r; (below for efficiency)
+
+ // can read this far past end of memory
+ enum { cpu_padding = 0x100 };
+
+ // Can read this many bytes past end of a page
+ enum { page_padding = 4 };
+
+ void set_end_time( time_t t );
+public:
+ Z80_Cpu();
+
+ enum { page_count = 0x10000 / page_size };
+ byte szpc [0x200];
+ time_t end_time_;
+ struct cpu_state_t {
+ byte const* read [page_count + 1];
+ byte * write [page_count + 1];
+ time_t base;
+ time_t time;
+ };
+ cpu_state_t* cpu_state; // points to cpu_state_ or a local copy within run()
+ cpu_state_t cpu_state_;
+ void set_page( int i, void* write, void const* read );
+public:
+ registers_t r;
+};
+
+#if BLARGG_NONPORTABLE
+ #define Z80_CPU_OFFSET( addr ) (addr)
+#else
+ #define Z80_CPU_OFFSET( addr ) ((addr) & (Z80_Cpu::page_size - 1))
+#endif
+
+inline Z80_Cpu::byte* Z80_Cpu::write( addr_t addr )
+{
+ return cpu_state->write [(unsigned) addr >> page_bits] + Z80_CPU_OFFSET( addr );
+}
+
+inline Z80_Cpu::byte const* Z80_Cpu::read( addr_t addr )
+{
+ return cpu_state->read [(unsigned) addr >> page_bits] + Z80_CPU_OFFSET( addr );
+}
+
+inline void Z80_Cpu::map_mem( addr_t addr, int size, void* p )
+{
+ map_mem( addr, size, p, p );
+}
+
+inline void Z80_Cpu::set_end_time( time_t t )
+{
+ time_t delta = cpu_state->base - t;
+ cpu_state->base = t;
+ cpu_state->time += delta;
+}
+
+#endif
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.cpp b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu_run.h
index 37c4a724..0a8cd97d 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/gme/Kss_Cpu.cpp
+++ b/plugins/gme/game-music-emu-0.6pre/gme/Z80_Cpu_run.h
@@ -1,1706 +1,1695 @@
-// Game_Music_Emu 0.5.2. http://www.slack.net/~ant/
-
-/*
-Last validated with zexall 2006.11.14 2:19 PM
-* Doesn't implement the R register or immediate interrupt after EI.
-* Address wrap-around isn't completely correct, but is prevented from crashing emulator.
-*/
-
-#include "Kss_Cpu.h"
-
-#include "blargg_endian.h"
-#include <string.h>
-
-//#include "z80_cpu_log.h"
-
-/* Copyright (C) 2006 Shay Green. This module is free software; you
-can redistribute it and/or modify it under the terms of the GNU Lesser
-General Public License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version. This
-module 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 Lesser General Public License for more
-details. You should have received a copy of the GNU Lesser General Public
-License along with this module; if not, write to the Free Software Foundation,
-Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
-
-#define SYNC_TIME() (void) (s.time = s_time)
-#define RELOAD_TIME() (void) (s_time = s.time)
-
-// Callbacks to emulator
-
-#define CPU_OUT( cpu, addr, data, time )\
- kss_cpu_out( this, time, addr, data )
-
-#define CPU_IN( cpu, addr, time )\
- kss_cpu_in( this, time, addr )
-
-#define CPU_WRITE( cpu, addr, data, time )\
- (SYNC_TIME(), kss_cpu_write( this, addr, data ))
-
-#include "blargg_source.h"
-
-// flags, named with hex value for clarity
-int const S80 = 0x80;
-int const Z40 = 0x40;
-int const F20 = 0x20;
-int const H10 = 0x10;
-int const F08 = 0x08;
-int const V04 = 0x04;
-int const P04 = 0x04;
-int const N02 = 0x02;
-int const C01 = 0x01;
-
-#define SZ28P( n ) szpc [n]
-#define SZ28PC( n ) szpc [n]
-#define SZ28C( n ) (szpc [n] & ~P04)
-#define SZ28( n ) SZ28C( n )
-
-#define SET_R( n ) (void) (r.r = n)
-#define GET_R() (r.r)
-
-Kss_Cpu::Kss_Cpu()
-{
- state = &state_;
-
- for ( int i = 0x100; --i >= 0; )
- {
- int even = 1;
- for ( int p = i; p; p >>= 1 )
- even ^= p;
- int n = (i & (S80 | F20 | F08)) | ((even & 1) * P04);
- szpc [i] = n;
- szpc [i + 0x100] = n | C01;
- }
- szpc [0x000] |= Z40;
- szpc [0x100] |= Z40;
-}
-
-inline void Kss_Cpu::set_page( int i, void* write, void const* read )
-{
- blargg_long offset = KSS_CPU_PAGE_OFFSET( i * (blargg_long) page_size );
- state->write [i] = (byte *) write - offset;
- state->read [i] = (byte const*) read - offset;
-}
-
-void Kss_Cpu::reset( void* unmapped_write, void const* unmapped_read )
-{
- check( state == &state_ );
- state = &state_;
- state_.time = 0;
- state_.base = 0;
- end_time_ = 0;
-
- for ( int i = 0; i < page_count + 1; i++ )
- set_page( i, unmapped_write, unmapped_read );
-
- memset( &r, 0, sizeof r );
-}
-
-void Kss_Cpu::map_mem( unsigned addr, blargg_ulong size, void* write, void const* read )
-{
- // address range must begin and end on page boundaries
- require( addr % page_size == 0 );
- require( size % page_size == 0 );
-
- unsigned first_page = addr / page_size;
- for ( unsigned i = size / page_size; i--; )
- {
- blargg_long offset = i * (blargg_long) page_size;
- set_page( first_page + i, (byte*) write + offset, (byte const*) read + offset );
- }
-}
-
-#define TIME (s_time + s.base)
-#define RW_MEM( addr, rw ) (s.rw [(addr) >> page_shift] [KSS_CPU_PAGE_OFFSET( addr )])
-#define READ_PROG( addr ) RW_MEM( addr, read )
-#define READ( addr ) READ_PROG( addr )
-//#define WRITE( addr, data ) (void) (RW_MEM( addr, write ) = data)
-#define WRITE( addr, data ) CPU_WRITE( this, addr, data, TIME )
-#define READ_WORD( addr ) GET_LE16( &READ( addr ) )
-#define WRITE_WORD( addr, data ) SET_LE16( &RW_MEM( addr, write ), data )
-#define IN( addr ) CPU_IN( this, addr, TIME )
-#define OUT( addr, data ) CPU_OUT( this, addr, data, TIME )
-
-#if BLARGG_BIG_ENDIAN
- #define R8( n, offset ) ((r8_ - offset) [n])
-#elif BLARGG_LITTLE_ENDIAN
- #define R8( n, offset ) ((r8_ - offset) [(n) ^ 1])
-#else
- #error "Byte order of CPU must be known"
-#endif
-
-//#define R16( n, shift, offset ) (r16_ [((n) >> shift) - (offset >> shift)])
-
-// help compiler see that it can just adjust stack offset, saving an extra instruction
-#define R16( n, shift, offset )\
- (*(uint16_t*) ((char*) r16_ - (offset >> (shift - 1)) + ((n) >> (shift - 1))))
-
-#define CASE5( a, b, c, d, e ) case 0x##a:case 0x##b:case 0x##c:case 0x##d:case 0x##e
-#define CASE6( a, b, c, d, e, f ) CASE5( a, b, c, d, e ): case 0x##f
-#define CASE7( a, b, c, d, e, f, g ) CASE6( a, b, c, d, e, f ): case 0x##g
-#define CASE8( a, b, c, d, e, f, g, h ) CASE7( a, b, c, d, e, f, g ): case 0x##h
-
-// high four bits are $ED time - 8, low four bits are $DD/$FD time - 8
-static byte const ed_dd_timing [0x100] = {
-//0 1 2 3 4 5 6 7 8 9 A B C D E F
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x06,0x0C,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x0C,0x02,0x00,0x00,0x03,0x00,
-0x00,0x00,0x00,0x00,0x0F,0x0F,0x0B,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
-0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,
-0x4B,0x4B,0x7B,0xCB,0x0B,0x6B,0x00,0x0B,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
-0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,
-0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x06,0x00,0x0F,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
-0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
-};
-
-// even on x86, using short and unsigned char was slower
-typedef int fint16;
-typedef unsigned fuint16;
-typedef unsigned fuint8;
-
-bool Kss_Cpu::run( cpu_time_t end_time )
-{
- set_end_time( end_time );
- state_t s = this->state_;
- this->state = &s;
- bool warning = false;
-
- typedef BOOST::int8_t int8_t;
-
- union {
- regs_t rg;
- pairs_t rp;
- uint8_t r8_ [8]; // indexed
- uint16_t r16_ [4];
- };
- rg = this->r.b;
-
- cpu_time_t s_time = s.time;
- fuint16 pc = r.pc;
- fuint16 sp = r.sp;
- fuint16 ix = r.ix; // TODO: keep in memory for direct access?
- fuint16 iy = r.iy;
- int flags = r.b.flags;
-
- goto loop;
-jr_not_taken:
- s_time -= 5;
- goto loop;
-call_not_taken:
- s_time -= 7;
-jp_not_taken:
- pc += 2;
-loop:
-
- check( (unsigned long) pc < 0x10000 );
- check( (unsigned long) sp < 0x10000 );
- check( (unsigned) flags < 0x100 );
- check( (unsigned) ix < 0x10000 );
- check( (unsigned) iy < 0x10000 );
-
- uint8_t const* instr = s.read [pc >> page_shift];
-#define GET_ADDR() GET_LE16( instr )
-
- fuint8 opcode;
-
- // TODO: eliminate this special case
- #if BLARGG_NONPORTABLE
- opcode = instr [pc];
- pc++;
- instr += pc;
- #else
- instr += KSS_CPU_PAGE_OFFSET( pc );
- opcode = *instr++;
- pc++;
- #endif
-
- static byte const base_timing [0x100] = {
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, // 0
- 13,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, // 1
- 12,10,16, 6, 4, 4, 7, 4,12,11,16, 6, 4, 4, 7, 4, // 2
- 12,10,13, 6,11,11,10, 4,12,11,13, 6, 4, 4, 7, 4, // 3
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 4
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 5
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 6
- 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, // 7
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 8
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 9
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // A
- 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // B
- 11,10,10,10,17,11, 7,11,11,10,10, 8,17,17, 7,11, // C
- 11,10,10,11,17,11, 7,11,11, 4,10,11,17, 8, 7,11, // D
- 11,10,10,19,17,11, 7,11,11, 4,10, 4,17, 8, 7,11, // E
- 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17, 8, 7,11, // F
- };
-
- fuint16 data;
- data = base_timing [opcode];
- if ( (s_time += data) >= 0 )
- goto possibly_out_of_time;
-almost_out_of_time:
-
- data = READ_PROG( pc );
-
- #ifdef Z80_CPU_LOG_H
- //log_opcode( opcode, READ_PROG( pc ) );
- z80_log_regs( rg.a, rp.bc, rp.de, rp.hl, sp, ix, iy );
- z80_cpu_log( "new", pc - 1, opcode, READ_PROG( pc ),
- READ_PROG( pc + 1 ), READ_PROG( pc + 2 ) );
- #endif
-
- switch ( opcode )
- {
-possibly_out_of_time:
- if ( s_time < (int) data )
- goto almost_out_of_time;
- s_time -= data;
- goto out_of_time;
-
-// Common
-
- case 0x00: // NOP
- CASE7( 40, 49, 52, 5B, 64, 6D, 7F ): // LD B,B etc.
- goto loop;
-
- case 0x08:{// EX AF,AF'
- int temp = r.alt.b.a;
- r.alt.b.a = rg.a;
- rg.a = temp;
-
- temp = r.alt.b.flags;
- r.alt.b.flags = flags;
- flags = temp;
- goto loop;
- }
-
- case 0xD3: // OUT (imm),A
- pc++;
- OUT( data + rg.a * 0x100, rg.a );
- goto loop;
-
- case 0x2E: // LD L,imm
- pc++;
- rg.l = data;
- goto loop;
-
- case 0x3E: // LD A,imm
- pc++;
- rg.a = data;
- goto loop;
-
- case 0x3A:{// LD A,(addr)
- fuint16 addr = GET_ADDR();
- pc += 2;
- rg.a = READ( addr );
- goto loop;
- }
-
-// Conditional
-
-#define ZERO (flags & Z40)
-#define CARRY (flags & C01)
-#define EVEN (flags & P04)
-#define MINUS (flags & S80)
-
-// JR
-// TODO: more efficient way to handle negative branch that wraps PC around
-#define JR( cond ) {\
- int offset = (BOOST::int8_t) data;\
- pc++;\
- if ( !(cond) )\
- goto jr_not_taken;\
- pc = uint16_t (pc + offset);\
- goto loop;\
-}
-
- case 0x20: JR( !ZERO ) // JR NZ,disp
- case 0x28: JR( ZERO ) // JR Z,disp
- case 0x30: JR( !CARRY ) // JR NC,disp
- case 0x38: JR( CARRY ) // JR C,disp
- case 0x18: JR( true ) // JR disp
-
- case 0x10:{// DJNZ disp
- int temp = rg.b - 1;
- rg.b = temp;
- JR( temp )
- }
-
-// JP
-#define JP( cond ) if ( !(cond) ) goto jp_not_taken; pc = GET_ADDR(); goto loop;
-
- case 0xC2: JP( !ZERO ) // JP NZ,addr
- case 0xCA: JP( ZERO ) // JP Z,addr
- case 0xD2: JP( !CARRY ) // JP NC,addr
- case 0xDA: JP( CARRY ) // JP C,addr
- case 0xE2: JP( !EVEN ) // JP PO,addr
- case 0xEA: JP( EVEN ) // JP PE,addr
- case 0xF2: JP( !MINUS ) // JP P,addr
- case 0xFA: JP( MINUS ) // JP M,addr
-
- case 0xC3: // JP addr
- pc = GET_ADDR();
- goto loop;
-
- case 0xE9: // JP HL
- pc = rp.hl;
- goto loop;
-
-// RET
-#define RET( cond ) if ( cond ) goto ret_taken; s_time -= 6; goto loop;
-
- case 0xC0: RET( !ZERO ) // RET NZ
- case 0xC8: RET( ZERO ) // RET Z
- case 0xD0: RET( !CARRY ) // RET NC
- case 0xD8: RET( CARRY ) // RET C
- case 0xE0: RET( !EVEN ) // RET PO
- case 0xE8: RET( EVEN ) // RET PE
- case 0xF0: RET( !MINUS ) // RET P
- case 0xF8: RET( MINUS ) // RET M
-
- case 0xC9: // RET
- ret_taken:
- pc = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto loop;
-
-// CALL
-#define CALL( cond ) if ( cond ) goto call_taken; goto call_not_taken;
-
- case 0xC4: CALL( !ZERO ) // CALL NZ,addr
- case 0xCC: CALL( ZERO ) // CALL Z,addr
- case 0xD4: CALL( !CARRY ) // CALL NC,addr
- case 0xDC: CALL( CARRY ) // CALL C,addr
- case 0xE4: CALL( !EVEN ) // CALL PO,addr
- case 0xEC: CALL( EVEN ) // CALL PE,addr
- case 0xF4: CALL( !MINUS ) // CALL P,addr
- case 0xFC: CALL( MINUS ) // CALL M,addr
-
- case 0xCD:{// CALL addr
- call_taken:
- fuint16 addr = pc + 2;
- pc = GET_ADDR();
- sp = uint16_t (sp - 2);
- WRITE_WORD( sp, addr );
- goto loop;
- }
-
- case 0xFF: // RST
- if ( pc > idle_addr )
- goto hit_idle_addr;
- CASE7( C7, CF, D7, DF, E7, EF, F7 ):
- data = pc;
- pc = opcode & 0x38;
- goto push_data;
-
-// PUSH/POP
- case 0xF5: // PUSH AF
- data = rg.a * 0x100u + flags;
- goto push_data;
-
- case 0xC5: // PUSH BC
- case 0xD5: // PUSH DE
- case 0xE5: // PUSH HL
- data = R16( opcode, 4, 0xC5 );
- push_data:
- sp = uint16_t (sp - 2);
- WRITE_WORD( sp, data );
- goto loop;
-
- case 0xF1: // POP AF
- flags = READ( sp );
- rg.a = READ( sp + 1 );
- sp = uint16_t (sp + 2);
- goto loop;
-
- case 0xC1: // POP BC
- case 0xD1: // POP DE
- case 0xE1: // POP HL
- R16( opcode, 4, 0xC1 ) = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto loop;
-
-// ADC/ADD/SBC/SUB
- case 0x96: // SUB (HL)
- case 0x86: // ADD (HL)
- flags &= ~C01;
- case 0x9E: // SBC (HL)
- case 0x8E: // ADC (HL)
- data = READ( rp.hl );
- goto adc_data;
-
- case 0xD6: // SUB A,imm
- case 0xC6: // ADD imm
- flags &= ~C01;
- case 0xDE: // SBC A,imm
- case 0xCE: // ADC imm
- pc++;
- goto adc_data;
-
- CASE7( 90, 91, 92, 93, 94, 95, 97 ): // SUB r
- CASE7( 80, 81, 82, 83, 84, 85, 87 ): // ADD r
- flags &= ~C01;
- CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // SBC r
- CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // ADC r
- data = R8( opcode & 7, 0 );
- adc_data: {
- int result = data + (flags & C01);
- data ^= rg.a;
- flags = opcode >> 3 & N02; // bit 4 is set in subtract opcodes
- if ( flags )
- result = -result;
- result += rg.a;
- data ^= result;
- flags |=(data & H10) |
- ((data - -0x80) >> 6 & V04) |
- SZ28C( result & 0x1FF );
- rg.a = result;
- goto loop;
- }
-
-// CP
- case 0xBE: // CP (HL)
- data = READ( rp.hl );
- goto cp_data;
-
- case 0xFE: // CP imm
- pc++;
- goto cp_data;
-
- CASE7( B8, B9, BA, BB, BC, BD, BF ): // CP r
- data = R8( opcode, 0xB8 );
- cp_data: {
- int result = rg.a - data;
- flags = N02 | (data & (F20 | F08)) | (result >> 8 & C01);
- data ^= rg.a;
- flags |=(((result ^ rg.a) & data) >> 5 & V04) |
- (((data & H10) ^ result) & (S80 | H10));
- if ( (uint8_t) result )
- goto loop;
- flags |= Z40;
- goto loop;
- }
-
-// ADD HL,rp
-
- case 0x39: // ADD HL,SP
- data = sp;
- goto add_hl_data;
-
- case 0x09: // ADD HL,BC
- case 0x19: // ADD HL,DE
- case 0x29: // ADD HL,HL
- data = R16( opcode, 4, 0x09 );
- add_hl_data: {
- blargg_ulong sum = rp.hl + data;
- data ^= rp.hl;
- rp.hl = sum;
- flags = (flags & (S80 | Z40 | V04)) |
- (sum >> 16) |
- (sum >> 8 & (F20 | F08)) |
- ((data ^ sum) >> 8 & H10);
- goto loop;
- }
-
- case 0x27:{// DAA
- int a = rg.a;
- if ( a > 0x99 )
- flags |= C01;
-
- int adjust = 0x60 & -(flags & C01);
-
- if ( flags & H10 || (a & 0x0F) > 9 )
- adjust |= 0x06;
-
- if ( flags & N02 )
- adjust = -adjust;
- a += adjust;
-
- flags = (flags & (C01 | N02)) |
- ((rg.a ^ a) & H10) |
- SZ28P( (uint8_t) a );
- rg.a = a;
- goto loop;
- }
- /*
- case 0x27:{// DAA
- // more optimized, but probably not worth the obscurity
- int f = (rg.a + (0xFF - 0x99)) >> 8 | flags; // (a > 0x99 ? C01 : 0) | flags
- int adjust = 0x60 & -(f & C01); // f & C01 ? 0x60 : 0
-
- if ( (((rg.a + (0x0F - 9)) ^ rg.a) | f) & H10 ) // flags & H10 || (rg.a & 0x0F) > 9
- adjust |= 0x06;
-
- if ( f & N02 )
- adjust = -adjust;
- int a = rg.a + adjust;
-
- flags = (f & (N02 | C01)) | ((rg.a ^ a) & H10) | SZ28P( (uint8_t) a );
- rg.a = a;
- goto loop;
- }
- */
-
-// INC/DEC
- case 0x34: // INC (HL)
- data = READ( rp.hl ) + 1;
- WRITE( rp.hl, data );
- goto inc_set_flags;
-
- CASE7( 04, 0C, 14, 1C, 24, 2C, 3C ): // INC r
- data = ++R8( opcode >> 3, 0 );
- inc_set_flags:
- flags = (flags & C01) |
- (((data & 0x0F) - 1) & H10) |
- SZ28( (uint8_t) data );
- if ( data != 0x80 )
- goto loop;
- flags |= V04;
- goto loop;
-
- case 0x35: // DEC (HL)
- data = READ( rp.hl ) - 1;
- WRITE( rp.hl, data );
- goto dec_set_flags;
-
- CASE7( 05, 0D, 15, 1D, 25, 2D, 3D ): // DEC r
- data = --R8( opcode >> 3, 0 );
- dec_set_flags:
- flags = (flags & C01) | N02 |
- (((data & 0x0F) + 1) & H10) |
- SZ28( (uint8_t) data );
- if ( data != 0x7F )
- goto loop;
- flags |= V04;
- goto loop;
-
- case 0x03: // INC BC
- case 0x13: // INC DE
- case 0x23: // INC HL
- R16( opcode, 4, 0x03 )++;
- goto loop;
-
- case 0x33: // INC SP
- sp = uint16_t (sp + 1);
- goto loop;
-
- case 0x0B: // DEC BC
- case 0x1B: // DEC DE
- case 0x2B: // DEC HL
- R16( opcode, 4, 0x0B )--;
- goto loop;
-
- case 0x3B: // DEC SP
- sp = uint16_t (sp - 1);
- goto loop;
-
-// AND
- case 0xA6: // AND (HL)
- data = READ( rp.hl );
- goto and_data;
-
- case 0xE6: // AND imm
- pc++;
- goto and_data;
-
- CASE7( A0, A1, A2, A3, A4, A5, A7 ): // AND r
- data = R8( opcode, 0xA0 );
- and_data:
- rg.a &= data;
- flags = SZ28P( rg.a ) | H10;
- goto loop;
-
-// OR
- case 0xB6: // OR (HL)
- data = READ( rp.hl );
- goto or_data;
-
- case 0xF6: // OR imm
- pc++;
- goto or_data;
-
- CASE7( B0, B1, B2, B3, B4, B5, B7 ): // OR r
- data = R8( opcode, 0xB0 );
- or_data:
- rg.a |= data;
- flags = SZ28P( rg.a );
- goto loop;
-
-// XOR
- case 0xAE: // XOR (HL)
- data = READ( rp.hl );
- goto xor_data;
-
- case 0xEE: // XOR imm
- pc++;
- goto xor_data;
-
- CASE7( A8, A9, AA, AB, AC, AD, AF ): // XOR r
- data = R8( opcode, 0xA8 );
- xor_data:
- rg.a ^= data;
- flags = SZ28P( rg.a );
- goto loop;
-
-// LD
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (HL),r
- WRITE( rp.hl, R8( opcode, 0x70 ) );
- goto loop;
-
- CASE6( 41, 42, 43, 44, 45, 47 ): // LD B,r
- CASE6( 48, 4A, 4B, 4C, 4D, 4F ): // LD C,r
- CASE6( 50, 51, 53, 54, 55, 57 ): // LD D,r
- CASE6( 58, 59, 5A, 5C, 5D, 5F ): // LD E,r
- CASE6( 60, 61, 62, 63, 65, 67 ): // LD H,r
- CASE6( 68, 69, 6A, 6B, 6C, 6F ): // LD L,r
- CASE6( 78, 79, 7A, 7B, 7C, 7D ): // LD A,r
- R8( opcode >> 3 & 7, 0 ) = R8( opcode & 7, 0 );
- goto loop;
-
- CASE5( 06, 0E, 16, 1E, 26 ): // LD r,imm
- R8( opcode >> 3, 0 ) = data;
- pc++;
- goto loop;
-
- case 0x36: // LD (HL),imm
- pc++;
- WRITE( rp.hl, data );
- goto loop;
-
- CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(HL)
- R8( opcode >> 3, 8 ) = READ( rp.hl );
- goto loop;
-
- case 0x01: // LD rp,imm
- case 0x11:
- case 0x21:
- R16( opcode, 4, 0x01 ) = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x31: // LD sp,imm
- sp = GET_ADDR();
- pc += 2;
- goto loop;
-
- case 0x2A:{// LD HL,(addr)
- fuint16 addr = GET_ADDR();
- pc += 2;
- rp.hl = READ_WORD( addr );
- goto loop;
- }
-
- case 0x32:{// LD (addr),A
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE( addr, rg.a );
- goto loop;
- }
-
- case 0x22:{// LD (addr),HL
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, rp.hl );
- goto loop;
- }
-
- case 0x02: // LD (BC),A
- case 0x12: // LD (DE),A
- WRITE( R16( opcode, 4, 0x02 ), rg.a );
- goto loop;
-
- case 0x0A: // LD A,(BC)
- case 0x1A: // LD A,(DE)
- rg.a = READ( R16( opcode, 4, 0x0A ) );
- goto loop;
-
- case 0xF9: // LD SP,HL
- sp = rp.hl;
- goto loop;
-
-// Rotate
-
- case 0x07:{// RLCA
- fuint16 temp = rg.a;
- temp = (temp << 1) | (temp >> 7);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08 | C01));
- rg.a = temp;
- goto loop;
- }
-
- case 0x0F:{// RRCA
- fuint16 temp = rg.a;
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & C01);
- temp = (temp << 7) | (temp >> 1);
- flags |= temp & (F20 | F08);
- rg.a = temp;
- goto loop;
- }
-
- case 0x17:{// RLA
- blargg_ulong temp = (rg.a << 1) | (flags & C01);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08)) |
- (temp >> 8);
- rg.a = temp;
- goto loop;
- }
-
- case 0x1F:{// RRA
- fuint16 temp = (flags << 7) | (rg.a >> 1);
- flags = (flags & (S80 | Z40 | P04)) |
- (temp & (F20 | F08)) |
- (rg.a & C01);
- rg.a = temp;
- goto loop;
- }
-
-// Misc
- case 0x2F:{// CPL
- fuint16 temp = ~rg.a;
- flags = (flags & (S80 | Z40 | P04 | C01)) |
- (temp & (F20 | F08)) |
- (H10 | N02);
- rg.a = temp;
- goto loop;
- }
-
- case 0x3F:{// CCF
- flags = ((flags & (S80 | Z40 | P04 | C01)) ^ C01) |
- (flags << 4 & H10) |
- (rg.a & (F20 | F08));
- goto loop;
- }
-
- case 0x37: // SCF
- flags = (flags & (S80 | Z40 | P04)) | C01 |
- (rg.a & (F20 | F08));
- goto loop;
-
- case 0xDB: // IN A,(imm)
- pc++;
- rg.a = IN( data + rg.a * 0x100 );
- goto loop;
-
- case 0xE3:{// EX (SP),HL
- fuint16 temp = READ_WORD( sp );
- WRITE_WORD( sp, rp.hl );
- rp.hl = temp;
- goto loop;
- }
-
- case 0xEB:{// EX DE,HL
- fuint16 temp = rp.hl;
- rp.hl = rp.de;
- rp.de = temp;
- goto loop;
- }
-
- case 0xD9:{// EXX DE,HL
- fuint16 temp = r.alt.w.bc;
- r.alt.w.bc = rp.bc;
- rp.bc = temp;
-
- temp = r.alt.w.de;
- r.alt.w.de = rp.de;
- rp.de = temp;
-
- temp = r.alt.w.hl;
- r.alt.w.hl = rp.hl;
- rp.hl = temp;
- goto loop;
- }
-
- case 0xF3: // DI
- r.iff1 = 0;
- r.iff2 = 0;
- goto loop;
-
- case 0xFB: // EI
- r.iff1 = 1;
- r.iff2 = 1;
- // TODO: delayed effect
- goto loop;
-
- case 0x76: // HALT
- goto halt;
-
-//////////////////////////////////////// CB prefix
- {
- case 0xCB:
- unsigned data2;
- data2 = instr [1];
- pc++;
- switch ( data )
- {
-
- // Rotate left
-
- #define RLC( read, write ) {\
- fuint8 result = read;\
- result = uint8_t (result << 1) | (result >> 7);\
- flags = SZ28P( result ) | (result & C01);\
- write;\
- goto loop;\
- }
-
- case 0x06: // RLC (HL)
- s_time += 7;
- data = rp.hl;
- rlc_data_addr:
- RLC( READ( data ), WRITE( data, result ) )
-
- CASE7( 00, 01, 02, 03, 04, 05, 07 ):{// RLC r
- uint8_t& reg = R8( data, 0 );
- RLC( reg, reg = result )
- }
-
- #define RL( read, write ) {\
- fuint16 result = (read << 1) | (flags & C01);\
- flags = SZ28PC( result );\
- write;\
- goto loop;\
- }
-
- case 0x16: // RL (HL)
- s_time += 7;
- data = rp.hl;
- rl_data_addr:
- RL( READ( data ), WRITE( data, result ) )
-
- CASE7( 10, 11, 12, 13, 14, 15, 17 ):{// RL r
- uint8_t& reg = R8( data, 0x10 );
- RL( reg, reg = result )
- }
-
- #define SLA( read, add, write ) {\
- fuint16 result = (read << 1) | add;\
- flags = SZ28PC( result );\
- write;\
- goto loop;\
- }
-
- case 0x26: // SLA (HL)
- s_time += 7;
- data = rp.hl;
- sla_data_addr:
- SLA( READ( data ), 0, WRITE( data, result ) )
-
- CASE7( 20, 21, 22, 23, 24, 25, 27 ):{// SLA r
- uint8_t& reg = R8( data, 0x20 );
- SLA( reg, 0, reg = result )
- }
-
- case 0x36: // SLL (HL)
- s_time += 7;
- data = rp.hl;
- sll_data_addr:
- SLA( READ( data ), 1, WRITE( data, result ) )
-
- CASE7( 30, 31, 32, 33, 34, 35, 37 ):{// SLL r
- uint8_t& reg = R8( data, 0x30 );
- SLA( reg, 1, reg = result )
- }
-
- // Rotate right
-
- #define RRC( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result = uint8_t (result << 7) | (result >> 1);\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x0E: // RRC (HL)
- s_time += 7;
- data = rp.hl;
- rrc_data_addr:
- RRC( READ( data ), WRITE( data, result ) )
-
- CASE7( 08, 09, 0A, 0B, 0C, 0D, 0F ):{// RRC r
- uint8_t& reg = R8( data, 0x08 );
- RRC( reg, reg = result )
- }
-
- #define RR( read, write ) {\
- fuint8 result = read;\
- fuint8 temp = result & C01;\
- result = uint8_t (flags << 7) | (result >> 1);\
- flags = SZ28P( result ) | temp;\
- write;\
- goto loop;\
- }
-
- case 0x1E: // RR (HL)
- s_time += 7;
- data = rp.hl;
- rr_data_addr:
- RR( READ( data ), WRITE( data, result ) )
-
- CASE7( 18, 19, 1A, 1B, 1C, 1D, 1F ):{// RR r
- uint8_t& reg = R8( data, 0x18 );
- RR( reg, reg = result )
- }
-
- #define SRA( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result = (result & 0x80) | (result >> 1);\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x2E: // SRA (HL)
- data = rp.hl;
- s_time += 7;
- sra_data_addr:
- SRA( READ( data ), WRITE( data, result ) )
-
- CASE7( 28, 29, 2A, 2B, 2C, 2D, 2F ):{// SRA r
- uint8_t& reg = R8( data, 0x28 );
- SRA( reg, reg = result )
- }
-
- #define SRL( read, write ) {\
- fuint8 result = read;\
- flags = result & C01;\
- result >>= 1;\
- flags |= SZ28P( result );\
- write;\
- goto loop;\
- }
-
- case 0x3E: // SRL (HL)
- s_time += 7;
- data = rp.hl;
- srl_data_addr:
- SRL( READ( data ), WRITE( data, result ) )
-
- CASE7( 38, 39, 3A, 3B, 3C, 3D, 3F ):{// SRL r
- uint8_t& reg = R8( data, 0x38 );
- SRL( reg, reg = result )
- }
-
- // BIT
- {
- unsigned temp;
- CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ): // BIT b,(HL)
- s_time += 4;
- temp = READ( rp.hl );
- flags &= C01;
- goto bit_temp;
- CASE7( 40, 41, 42, 43, 44, 45, 47 ): // BIT 0,r
- CASE7( 48, 49, 4A, 4B, 4C, 4D, 4F ): // BIT 1,r
- CASE7( 50, 51, 52, 53, 54, 55, 57 ): // BIT 2,r
- CASE7( 58, 59, 5A, 5B, 5C, 5D, 5F ): // BIT 3,r
- CASE7( 60, 61, 62, 63, 64, 65, 67 ): // BIT 4,r
- CASE7( 68, 69, 6A, 6B, 6C, 6D, 6F ): // BIT 5,r
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // BIT 6,r
- CASE7( 78, 79, 7A, 7B, 7C, 7D, 7F ): // BIT 7,r
- temp = R8( data & 7, 0 );
- flags = (flags & C01) | (temp & (F20 | F08));
- bit_temp:
- int masked = temp & 1 << (data >> 3 & 7);
- flags |=(masked & S80) | H10 |
- ((masked - 1) >> 8 & (Z40 | P04));
- goto loop;
- }
-
- // SET/RES
- CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(HL)
- CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(HL)
- s_time += 7;
- int temp = READ( rp.hl );
- int bit = 1 << (data >> 3 & 7);
- temp |= bit; // SET
- if ( !(data & 0x40) )
- temp ^= bit; // RES
- WRITE( rp.hl, temp );
- goto loop;
- }
-
- CASE7( C0, C1, C2, C3, C4, C5, C7 ): // SET 0,r
- CASE7( C8, C9, CA, CB, CC, CD, CF ): // SET 1,r
- CASE7( D0, D1, D2, D3, D4, D5, D7 ): // SET 2,r
- CASE7( D8, D9, DA, DB, DC, DD, DF ): // SET 3,r
- CASE7( E0, E1, E2, E3, E4, E5, E7 ): // SET 4,r
- CASE7( E8, E9, EA, EB, EC, ED, EF ): // SET 5,r
- CASE7( F0, F1, F2, F3, F4, F5, F7 ): // SET 6,r
- CASE7( F8, F9, FA, FB, FC, FD, FF ): // SET 7,r
- R8( data & 7, 0 ) |= 1 << (data >> 3 & 7);
- goto loop;
-
- CASE7( 80, 81, 82, 83, 84, 85, 87 ): // RES 0,r
- CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // RES 1,r
- CASE7( 90, 91, 92, 93, 94, 95, 97 ): // RES 2,r
- CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // RES 3,r
- CASE7( A0, A1, A2, A3, A4, A5, A7 ): // RES 4,r
- CASE7( A8, A9, AA, AB, AC, AD, AF ): // RES 5,r
- CASE7( B0, B1, B2, B3, B4, B5, B7 ): // RES 6,r
- CASE7( B8, B9, BA, BB, BC, BD, BF ): // RES 7,r
- R8( data & 7, 0 ) &= ~(1 << (data >> 3 & 7));
- goto loop;
- }
- assert( false );
- }
-
-#undef GET_ADDR
-#define GET_ADDR() GET_LE16( instr + 1 )
-
-//////////////////////////////////////// ED prefix
- {
- case 0xED:
- pc++;
- s_time += ed_dd_timing [data] >> 4;
- switch ( data )
- {
- {
- blargg_ulong temp;
- case 0x72: // SBC HL,SP
- case 0x7A: // ADC HL,SP
- temp = sp;
- if ( 0 )
- case 0x42: // SBC HL,BC
- case 0x52: // SBC HL,DE
- case 0x62: // SBC HL,HL
- case 0x4A: // ADC HL,BC
- case 0x5A: // ADC HL,DE
- case 0x6A: // ADC HL,HL
- temp = R16( data >> 3 & 6, 1, 0 );
- blargg_ulong sum = temp + (flags & C01);
- flags = ~data >> 2 & N02;
- if ( flags )
- sum = -sum;
- sum += rp.hl;
- temp ^= rp.hl;
- temp ^= sum;
- flags |=(sum >> 16 & C01) |
- (temp >> 8 & H10) |
- (sum >> 8 & (S80 | F20 | F08)) |
- ((temp - -0x8000) >> 14 & V04);
- rp.hl = sum;
- if ( (uint16_t) sum )
- goto loop;
- flags |= Z40;
- goto loop;
- }
-
- CASE8( 40, 48, 50, 58, 60, 68, 70, 78 ):{// IN r,(C)
- int temp = IN( rp.bc );
- R8( data >> 3, 8 ) = temp;
- flags = (flags & C01) | SZ28P( temp );
- goto loop;
- }
-
- case 0x71: // OUT (C),0
- rg.flags = 0;
- CASE7( 41, 49, 51, 59, 61, 69, 79 ): // OUT (C),r
- OUT( rp.bc, R8( data >> 3, 8 ) );
- goto loop;
-
- {
- unsigned temp;
- case 0x73: // LD (ADDR),SP
- temp = sp;
- if ( 0 )
- case 0x43: // LD (ADDR),BC
- case 0x53: // LD (ADDR),DE
- temp = R16( data, 4, 0x43 );
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, temp );
- goto loop;
- }
-
- case 0x4B: // LD BC,(ADDR)
- case 0x5B:{// LD DE,(ADDR)
- fuint16 addr = GET_ADDR();
- pc += 2;
- R16( data, 4, 0x4B ) = READ_WORD( addr );
- goto loop;
- }
-
- case 0x7B:{// LD SP,(ADDR)
- fuint16 addr = GET_ADDR();
- pc += 2;
- sp = READ_WORD( addr );
- goto loop;
- }
-
- case 0x67:{// RRD
- fuint8 temp = READ( rp.hl );
- WRITE( rp.hl, (rg.a << 4) | (temp >> 4) );
- temp = (rg.a & 0xF0) | (temp & 0x0F);
- flags = (flags & C01) | SZ28P( temp );
- rg.a = temp;
- goto loop;
- }
-
- case 0x6F:{// RLD
- fuint8 temp = READ( rp.hl );
- WRITE( rp.hl, (temp << 4) | (rg.a & 0x0F) );
- temp = (rg.a & 0xF0) | (temp >> 4);
- flags = (flags & C01) | SZ28P( temp );
- rg.a = temp;
- goto loop;
- }
-
- CASE8( 44, 4C, 54, 5C, 64, 6C, 74, 7C ): // NEG
- opcode = 0x10; // flag to do SBC instead of ADC
- flags &= ~C01;
- data = rg.a;
- rg.a = 0;
- goto adc_data;
-
- {
- int inc;
- case 0xA9: // CPD
- case 0xB9: // CPDR
- inc = -1;
- if ( 0 )
- case 0xA1: // CPI
- case 0xB1: // CPIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- int result = rg.a - temp;
- flags = (flags & C01) | N02 |
- ((((temp ^ rg.a) & H10) ^ result) & (S80 | H10));
-
- if ( !(uint8_t) result ) flags |= Z40;
- result -= (flags & H10) >> 4;
- flags |= result & F08;
- flags |= result << 4 & F20;
- if ( !--rp.bc )
- goto loop;
-
- flags |= V04;
- if ( flags & Z40 || data < 0xB0 )
- goto loop;
-
- pc -= 2;
- s_time += 5;
- goto loop;
- }
-
- {
- int inc;
- case 0xA8: // LDD
- case 0xB8: // LDDR
- inc = -1;
- if ( 0 )
- case 0xA0: // LDI
- case 0xB0: // LDIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- addr = rp.de;
- rp.de = addr + inc;
- WRITE( addr, temp );
-
- temp += rg.a;
- flags = (flags & (S80 | Z40 | C01)) |
- (temp & F08) | (temp << 4 & F20);
- if ( !--rp.bc )
- goto loop;
-
- flags |= V04;
- if ( data < 0xB0 )
- goto loop;
-
- pc -= 2;
- s_time += 5;
- goto loop;
- }
-
- {
- int inc;
- case 0xAB: // OUTD
- case 0xBB: // OTDR
- inc = -1;
- if ( 0 )
- case 0xA3: // OUTI
- case 0xB3: // OTIR
- inc = +1;
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
- int temp = READ( addr );
-
- int b = --rg.b;
- flags = (temp >> 6 & N02) | SZ28( b );
- if ( b && data >= 0xB0 )
- {
- pc -= 2;
- s_time += 5;
- }
-
- OUT( rp.bc, temp );
- goto loop;
- }
-
- {
- int inc;
- case 0xAA: // IND
- case 0xBA: // INDR
- inc = -1;
- if ( 0 )
- case 0xA2: // INI
- case 0xB2: // INIR
- inc = +1;
-
- fuint16 addr = rp.hl;
- rp.hl = addr + inc;
-
- int temp = IN( rp.bc );
-
- int b = --rg.b;
- flags = (temp >> 6 & N02) | SZ28( b );
- if ( b && data >= 0xB0 )
- {
- pc -= 2;
- s_time += 5;
- }
-
- WRITE( addr, temp );
- goto loop;
- }
-
- case 0x47: // LD I,A
- r.i = rg.a;
- goto loop;
-
- case 0x4F: // LD R,A
- SET_R( rg.a );
- dprintf( "LD R,A not supported\n" );
- warning = true;
- goto loop;
-
- case 0x57: // LD A,I
- rg.a = r.i;
- goto ld_ai_common;
-
- case 0x5F: // LD A,R
- rg.a = GET_R();
- dprintf( "LD A,R not supported\n" );
- warning = true;
- ld_ai_common:
- flags = (flags & C01) | SZ28( rg.a ) | (r.iff2 << 2 & V04);
- goto loop;
-
- CASE8( 45, 4D, 55, 5D, 65, 6D, 75, 7D ): // RETI/RETN
- r.iff1 = r.iff2;
- goto ret_taken;
-
- case 0x46: case 0x4E: case 0x66: case 0x6E: // IM 0
- r.im = 0;
- goto loop;
-
- case 0x56: case 0x76: // IM 1
- r.im = 1;
- goto loop;
-
- case 0x5E: case 0x7E: // IM 2
- r.im = 2;
- goto loop;
-
- default:
- dprintf( "Opcode $ED $%02X not supported\n", data );
- warning = true;
- goto loop;
- }
- assert( false );
- }
-
-//////////////////////////////////////// DD/FD prefix
- {
- fuint16 ixy;
- case 0xDD:
- ixy = ix;
- goto ix_prefix;
- case 0xFD:
- ixy = iy;
- ix_prefix:
- pc++;
- unsigned data2 = READ_PROG( pc );
- s_time += ed_dd_timing [data] & 0x0F;
- switch ( data )
- {
- // TODO: more efficient way of avoid negative address
- // TODO: avoid using this as argument to READ() since it is evaluated twice
- #define IXY_DISP( ixy, disp ) uint16_t ((ixy) + (disp))
-
- #define SET_IXY( in ) if ( opcode == 0xDD ) ix = in; else iy = in;
-
- // ADD/ADC/SUB/SBC
-
- case 0x96: // SUB (IXY+disp)
- case 0x86: // ADD (IXY+disp)
- flags &= ~C01;
- case 0x9E: // SBC (IXY+disp)
- case 0x8E: // ADC (IXY+disp)
- pc++;
- opcode = data;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto adc_data;
-
- case 0x94: // SUB HXY
- case 0x84: // ADD HXY
- flags &= ~C01;
- case 0x9C: // SBC HXY
- case 0x8C: // ADC HXY
- opcode = data;
- data = ixy >> 8;
- goto adc_data;
-
- case 0x95: // SUB LXY
- case 0x85: // ADD LXY
- flags &= ~C01;
- case 0x9D: // SBC LXY
- case 0x8D: // ADC LXY
- opcode = data;
- data = (uint8_t) ixy;
- goto adc_data;
-
- {
- unsigned temp;
- case 0x39: // ADD IXY,SP
- temp = sp;
- goto add_ixy_data;
-
- case 0x29: // ADD IXY,HL
- temp = ixy;
- goto add_ixy_data;
-
- case 0x09: // ADD IXY,BC
- case 0x19: // ADD IXY,DE
- temp = R16( data, 4, 0x09 );
- add_ixy_data: {
- blargg_ulong sum = ixy + temp;
- temp ^= ixy;
- ixy = (uint16_t) sum;
- flags = (flags & (S80 | Z40 | V04)) |
- (sum >> 16) |
- (sum >> 8 & (F20 | F08)) |
- ((temp ^ sum) >> 8 & H10);
- goto set_ixy;
- }
- }
-
- // AND
- case 0xA6: // AND (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto and_data;
-
- case 0xA4: // AND HXY
- data = ixy >> 8;
- goto and_data;
-
- case 0xA5: // AND LXY
- data = (uint8_t) ixy;
- goto and_data;
-
- // OR
- case 0xB6: // OR (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto or_data;
-
- case 0xB4: // OR HXY
- data = ixy >> 8;
- goto or_data;
-
- case 0xB5: // OR LXY
- data = (uint8_t) ixy;
- goto or_data;
-
- // XOR
- case 0xAE: // XOR (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto xor_data;
-
- case 0xAC: // XOR HXY
- data = ixy >> 8;
- goto xor_data;
-
- case 0xAD: // XOR LXY
- data = (uint8_t) ixy;
- goto xor_data;
-
- // CP
- case 0xBE: // CP (IXY+disp)
- pc++;
- data = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto cp_data;
-
- case 0xBC: // CP HXY
- data = ixy >> 8;
- goto cp_data;
-
- case 0xBD: // CP LXY
- data = (uint8_t) ixy;
- goto cp_data;
-
- // LD
- CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (IXY+disp),r
- data = R8( data, 0x70 );
- if ( 0 )
- case 0x36: // LD (IXY+disp),imm
- pc++, data = READ_PROG( pc );
- pc++;
- WRITE( IXY_DISP( ixy, (int8_t) data2 ), data );
- goto loop;
-
- CASE5( 44, 4C, 54, 5C, 7C ): // LD r,HXY
- R8( data >> 3, 8 ) = ixy >> 8;
- goto loop;
-
- case 0x64: // LD HXY,HXY
- case 0x6D: // LD LXY,LXY
- goto loop;
-
- CASE5( 45, 4D, 55, 5D, 7D ): // LD r,LXY
- R8( data >> 3, 8 ) = ixy;
- goto loop;
-
- CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(IXY+disp)
- pc++;
- R8( data >> 3, 8 ) = READ( IXY_DISP( ixy, (int8_t) data2 ) );
- goto loop;
-
- case 0x26: // LD HXY,imm
- pc++;
- goto ld_hxy_data;
-
- case 0x65: // LD HXY,LXY
- data2 = (uint8_t) ixy;
- goto ld_hxy_data;
-
- CASE5( 60, 61, 62, 63, 67 ): // LD HXY,r
- data2 = R8( data, 0x60 );
- ld_hxy_data:
- ixy = (uint8_t) ixy | (data2 << 8);
- goto set_ixy;
-
- case 0x2E: // LD LXY,imm
- pc++;
- goto ld_lxy_data;
-
- case 0x6C: // LD LXY,HXY
- data2 = ixy >> 8;
- goto ld_lxy_data;
-
- CASE5( 68, 69, 6A, 6B, 6F ): // LD LXY,r
- data2 = R8( data, 0x68 );
- ld_lxy_data:
- ixy = (ixy & 0xFF00) | data2;
- set_ixy:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto loop;
- }
- iy = ixy;
- goto loop;
-
- case 0xF9: // LD SP,IXY
- sp = ixy;
- goto loop;
-
- case 0x22:{// LD (ADDR),IXY
- fuint16 addr = GET_ADDR();
- pc += 2;
- WRITE_WORD( addr, ixy );
- goto loop;
- }
-
- case 0x21: // LD IXY,imm
- ixy = GET_ADDR();
- pc += 2;
- goto set_ixy;
-
- case 0x2A:{// LD IXY,(addr)
- fuint16 addr = GET_ADDR();
- ixy = READ_WORD( addr );
- pc += 2;
- goto set_ixy;
- }
-
- // DD/FD CB prefix
- case 0xCB: {
- data = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data2 = READ_PROG( pc );
- pc++;
- switch ( data2 )
- {
- case 0x06: goto rlc_data_addr; // RLC (IXY)
- case 0x16: goto rl_data_addr; // RL (IXY)
- case 0x26: goto sla_data_addr; // SLA (IXY)
- case 0x36: goto sll_data_addr; // SLL (IXY)
- case 0x0E: goto rrc_data_addr; // RRC (IXY)
- case 0x1E: goto rr_data_addr; // RR (IXY)
- case 0x2E: goto sra_data_addr; // SRA (IXY)
- case 0x3E: goto srl_data_addr; // SRL (IXY)
-
- CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ):{// BIT b,(IXY+disp)
- fuint8 temp = READ( data );
- int masked = temp & 1 << (data2 >> 3 & 7);
- flags = (flags & C01) | H10 |
- (masked & S80) |
- ((masked - 1) >> 8 & (Z40 | P04));
- goto loop;
- }
-
- CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(IXY+disp)
- CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(IXY+disp)
- int temp = READ( data );
- int bit = 1 << (data2 >> 3 & 7);
- temp |= bit; // SET
- if ( !(data2 & 0x40) )
- temp ^= bit; // RES
- WRITE( data, temp );
- goto loop;
- }
-
- default:
- dprintf( "Opcode $%02X $CB $%02X not supported\n", opcode, data2 );
- warning = true;
- goto loop;
- }
- assert( false );
- }
-
- // INC/DEC
- case 0x23: // INC IXY
- ixy = uint16_t (ixy + 1);
- goto set_ixy;
-
- case 0x2B: // DEC IXY
- ixy = uint16_t (ixy - 1);
- goto set_ixy;
-
- case 0x34: // INC (IXY+disp)
- ixy = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data = READ( ixy ) + 1;
- WRITE( ixy, data );
- goto inc_set_flags;
-
- case 0x35: // DEC (IXY+disp)
- ixy = IXY_DISP( ixy, (int8_t) data2 );
- pc++;
- data = READ( ixy ) - 1;
- WRITE( ixy, data );
- goto dec_set_flags;
-
- case 0x24: // INC HXY
- ixy = uint16_t (ixy + 0x100);
- data = ixy >> 8;
- goto inc_xy_common;
-
- case 0x2C: // INC LXY
- data = uint8_t (ixy + 1);
- ixy = (ixy & 0xFF00) | data;
- inc_xy_common:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto inc_set_flags;
- }
- iy = ixy;
- goto inc_set_flags;
-
- case 0x25: // DEC HXY
- ixy = uint16_t (ixy - 0x100);
- data = ixy >> 8;
- goto dec_xy_common;
-
- case 0x2D: // DEC LXY
- data = uint8_t (ixy - 1);
- ixy = (ixy & 0xFF00) | data;
- dec_xy_common:
- if ( opcode == 0xDD )
- {
- ix = ixy;
- goto dec_set_flags;
- }
- iy = ixy;
- goto dec_set_flags;
-
- // PUSH/POP
- case 0xE5: // PUSH IXY
- data = ixy;
- goto push_data;
-
- case 0xE1:{// POP IXY
- ixy = READ_WORD( sp );
- sp = uint16_t (sp + 2);
- goto set_ixy;
- }
-
- // Misc
-
- case 0xE9: // JP (IXY)
- pc = ixy;
- goto loop;
-
- case 0xE3:{// EX (SP),IXY
- fuint16 temp = READ_WORD( sp );
- WRITE_WORD( sp, ixy );
- ixy = temp;
- goto set_ixy;
- }
-
- default:
- dprintf( "Unnecessary DD/FD prefix encountered\n" );
- warning = true;
- pc--;
- goto loop;
- }
- assert( false );
- }
-
- }
- dprintf( "Unhandled main opcode: $%02X\n", opcode );
- assert( false );
-
-hit_idle_addr:
- s_time -= 11;
- goto out_of_time;
-halt:
- s_time &= 3; // increment by multiple of 4
-out_of_time:
- pc--;
-
- s.time = s_time;
- rg.flags = flags;
- r.ix = ix;
- r.iy = iy;
- r.sp = sp;
- r.pc = pc;
- this->r.b = rg;
- this->state_ = s;
- this->state = &this->state_;
-
- return warning;
-}
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+// Last validated with zexall 2009.12.05.
+// Doesn't implement the R register or immediate interrupt after EI.
+// Address wrap-around isn't completely correct, but is prevented from crashing emulator.
+// 16-bit memory accesses are made directly to mapped memory, instead of using macro.
+
+#if 0
+/* Define these macros in the source file before #including this file.
+- Parameters might be expressions, so they are best evaluated only once,
+though they NEVER have side-effects, so multiple evaluation is OK.
+- Output parameters might be a multiple-assignment expression like "a=x",
+so they must NOT be parenthesized.
+- Except where noted, time() and related functions will NOT work
+correctly inside a macro. TIME() is always correct, and between FLUSH_TIME() and
+CACHE_TIME() the normal time changing functions can be used.
+- Macros "returning" void may use a {} statement block. */
+
+ // 0 <= addr <= 0xFFFF + 0x100
+ // Optional; default uses whatever was set with map_mem()
+ int READ_MEM( addr_t );
+ void WRITE_MEM( addr_t, int data );
+
+ // 0 <= port <= 0xFFFF (apparently upper 8 bits are output by hardware)
+ void OUT_PORT( int port, int data );
+ int IN_PORT int port );
+
+ // Reference to Z80_Cpu object used for emulation
+ #define CPU cpu
+
+// The following can be used within macros:
+
+ // Current time
+ time_t TIME();
+
+ // Allows use of time functions
+ void FLUSH_TIME();
+
+ // Must be used before end of macro if FLUSH_TIME() was used earlier
+ void CACHE_TIME();
+
+// Configuration (optional; commented behavior if defined)
+
+ // Optimizes as if map_mem( 0, 0x10000, FLAT_MEM, FLAT_MEM ) is always in effect
+ #define FLAT_MEM my_mem_array
+
+ // If RST 7 ($FF) is encountered and PC = IDLE_ADDR, stops execution
+ #define IDLE_ADDR 0x1234
+
+ // Expanded just before beginning of code, to help debugger
+ #define CPU_BEGIN void my_run_cpu() {
+
+#endif
+
+/* Copyright (C) 2006-2008 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#ifdef CPU_BEGIN
+ CPU_BEGIN
+#endif
+
+#define R CPU.r
+
+// flags, named with hex value for clarity
+int const S80 = 0x80;
+int const Z40 = 0x40;
+int const F20 = 0x20;
+int const H10 = 0x10;
+int const F08 = 0x08;
+int const V04 = 0x04;
+int const P04 = 0x04;
+int const N02 = 0x02;
+int const C01 = 0x01;
+
+#define SZ28P( n ) CPU.szpc [n]
+#define SZ28PC( n ) CPU.szpc [n]
+#define SZ28C( n ) (CPU.szpc [n] & ~P04)
+#define SZ28( n ) SZ28C( n )
+
+#define SET_R( n ) (void) (R.r = n)
+#define GET_R() (R.r)
+
+// Time
+#define TIME() (s_time + s.base)
+#define FLUSH_TIME() {s.time = s_time;}
+#define CACHE_TIME() {s_time = s.time;}
+
+// Memory
+#define RW_MEM( addr, rw ) RW_PAGE( addr, rw ) [RW_OFFSET( addr )]
+#define READ_CODE( addr ) RW_MEM( addr, read )
+
+#ifdef FLAT_MEM
+ #define RW_PAGE( addr, rw ) FLAT_MEM
+ #define RW_OFFSET( addr ) (addr)
+ #define INSTR( off, addr ) READ_CODE( addr )
+#else
+ #define RW_PAGE( addr, rw ) s.rw [(unsigned) (addr) >> Z80_Cpu::page_bits]
+ #define RW_OFFSET( addr ) Z80_CPU_OFFSET( addr )
+ #define INSTR( off, addr ) instr [off]
+#endif
+
+#ifndef READ_MEM
+ #define READ_MEM( addr ) RW_MEM( addr, read )
+#endif
+
+#ifndef WRITE_MEM
+ #define WRITE_MEM( addr, data ) (RW_MEM( addr, write ) = data)
+#endif
+
+#define READ_WORD( addr ) GET_LE16( &RW_MEM( addr, read ) )
+#define WRITE_WORD( addr, data ) SET_LE16( &RW_MEM( addr, write ), data )
+
+// Truncation
+#define BYTE( n ) ((BOOST::uint8_t ) (n)) /* (unsigned) n & 0xFF */
+#define SBYTE( n ) ((BOOST::int8_t ) (n)) /* (BYTE( n ) ^ 0x80) - 0x80 */
+#define WORD( n ) ((BOOST::uint16_t) (n)) /* (unsigned) n & 0xFFFF */
+
+// Misc
+#define CASE5( a, b, c, d, e ) case 0x##a:case 0x##b:case 0x##c:case 0x##d:case 0x##e
+#define CASE6( a, b, c, d, e, f ) CASE5( a, b, c, d, e ): case 0x##f
+#define CASE7( a, b, c, d, e, f, g ) CASE6( a, b, c, d, e, f ): case 0x##g
+#define CASE8( a, b, c, d, e, f, g, h ) CASE7( a, b, c, d, e, f, g ): case 0x##h
+
+#if BLARGG_BIG_ENDIAN
+ #define R8( n, offset ) ((r.r8_ - offset) [n])
+#elif BLARGG_LITTLE_ENDIAN
+ #define R8( n, offset ) ((r.r8_ - offset) [(n) ^ 1])
+#else
+ #error "Byte order of CPU must be known"
+#endif
+
+#define R16( n, shift, offset ) (r.r16_ [((unsigned) (n) >> shift) - (offset >> shift)])
+
+#define EX( x, y ) \
+ {\
+ int temp = x;\
+ x = y;\
+ y = temp;\
+ }
+
+#define EXX( name ) \
+ EX( R.alt.name, r.name )
+
+bool warning = false;
+{
+ Z80_Cpu::cpu_state_t s;
+ #ifdef FLAT_MEM
+ s.base = CPU.cpu_state_.base;
+ #else
+ s = CPU.cpu_state_;
+ #endif
+ CPU.cpu_state = &s;
+
+
+ union r_t {
+ Z80_Cpu::regs_t b;
+ Z80_Cpu::pairs_t w;
+ byte r8_ [8]; // indexed
+ BOOST::uint16_t r16_ [4];
+ } r;
+ r.b = R.b;
+
+ Z80_Cpu::time_t s_time = CPU.cpu_state_.time;
+ int pc = R.pc;
+ int sp = R.sp;
+ int ix = R.ix; // TODO: keep in memory for direct access?
+ int iy = R.iy;
+ int flags = R.b.flags;
+
+ //goto loop; // confuses optimizer
+ s_time += 7;
+ pc -= 2;
+
+call_not_taken:
+ s_time -= 7;
+jp_not_taken:
+ pc += 2;
+loop:
+
+ check( (unsigned) pc < 0x10000 + 1 ); // +1 so emulator can catch wrap-around
+ check( (unsigned) sp < 0x10000 );
+ check( (unsigned) flags < 0x100 );
+ check( (unsigned) ix < 0x10000 );
+ check( (unsigned) iy < 0x10000 );
+
+ byte const* instr = RW_PAGE( pc, read );
+
+ int opcode;
+
+ if ( RW_OFFSET( ~0 ) == ~0 )
+ {
+ opcode = instr [RW_OFFSET( pc )];
+ pc++;
+ instr += RW_OFFSET( pc );
+ }
+ else
+ {
+ instr += RW_OFFSET( pc );
+ opcode = *instr++;
+ pc++;
+ }
+
+ static byte const clock_table [256 * 2] = {
+ // 0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, // 0
+ 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, // 1
+ 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4, // 2
+ 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4, // 3
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 4
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 5
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 6
+ 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, // 7
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 8
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // 9
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // A
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, // B
+ 11,10,10,10,17,11, 7,11,11,10,10, 8,17,17, 7,11, // C
+ 11,10,10,11,17,11, 7,11,11, 4,10,11,17, 8, 7,11, // D
+ 11,10,10,19,17,11, 7,11,11, 4,10, 4,17, 8, 7,11, // E
+ 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17, 8, 7,11, // F
+
+ // high four bits are $ED time - 8, low four bits are $DD/$FD time - 8
+ //0 1 2 3 4 5 6 7 8 9 A B C D E F
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x06,0x0C,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x0C,0x02,0x00,0x00,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x0F,0x0F,0x0B,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
+ 0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x10,
+ 0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0xA0,
+ 0x4B,0x4B,0x7B,0xCB,0x0B,0x6B,0x00,0x0B,0x40,0x40,0x70,0xC0,0x00,0x60,0x0B,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0B,0x00,
+ 0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0B,0x00,
+ 0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,0xD0,0xD0,0xD0,0xD0,0x00,0x00,0x0B,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x06,0x00,0x0F,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
+ };
+
+ if ( s_time >= 0 )
+ goto out_of_time;
+ s_time += clock_table [opcode];
+
+ #ifdef Z80_CPU_LOG_H
+ //log_opcode( opcode, READ_CODE( pc ) );
+ z80_cpu_log( "log.txt", pc - 1, opcode, READ_CODE( pc ),
+ READ_CODE( pc + 1 ), READ_CODE( pc + 2 ) );
+ z80_log_regs( r.b.a, r.w.bc, r.w.de, r.w.hl, sp, ix, iy );
+ #endif
+
+#define GET_ADDR() GET_LE16( &INSTR( 0, pc ) )
+
+ int data;
+ data = INSTR( 0, pc );
+
+ switch ( opcode )
+ {
+// Common
+
+ case 0x00: // NOP
+ CASE7( 40, 49, 52, 5B, 64, 6D, 7F ): // LD B,B etc.
+ goto loop;
+
+ case 0x08:{// EX AF,AF'
+ EXX( b.a );
+ EX( R.alt.b.flags, flags );
+ goto loop;
+ }
+
+ case 0xD3: // OUT (imm),A
+ pc++;
+ OUT_PORT( (data + r.b.a * 0x100), r.b.a );
+ goto loop;
+
+ case 0x2E: // LD L,imm
+ pc++;
+ r.b.l = data;
+ goto loop;
+
+ case 0x3E: // LD A,imm
+ pc++;
+ r.b.a = data;
+ goto loop;
+
+ case 0x3A:{// LD A,(addr)
+ int addr = GET_ADDR();
+ pc += 2;
+ r.b.a = READ_MEM( addr );
+ goto loop;
+ }
+
+// Conditional
+
+#define ZERO (flags & Z40)
+#define CARRY (flags & C01)
+#define EVEN (flags & P04)
+#define MINUS (flags & S80)
+
+// JR
+// TODO: more efficient way to handle negative branch that wraps PC around
+#define JR_( cond, clocks ) {\
+ pc++;\
+ if ( !(cond) )\
+ goto loop;\
+ int offset = SBYTE( data );\
+ pc = WORD( pc + offset );\
+ s_time += clocks;\
+ goto loop;\
+}
+
+#define JR( cond ) JR_( cond, 5 )
+
+ case 0x20: JR( !ZERO ) // JR NZ,disp
+ case 0x28: JR( ZERO ) // JR Z,disp
+ case 0x30: JR( !CARRY ) // JR NC,disp
+ case 0x38: JR( CARRY ) // JR C,disp
+ case 0x18: JR_( true,0) // JR disp
+
+ case 0x10:{// DJNZ disp
+ int temp = r.b.b - 1;
+ r.b.b = temp;
+ JR( temp )
+ }
+
+// JP
+#define JP( cond ) \
+ if ( !(cond) )\
+ goto jp_not_taken;\
+ pc = GET_ADDR();\
+ goto loop;
+
+ case 0xC2: JP( !ZERO ) // JP NZ,addr
+ case 0xCA: JP( ZERO ) // JP Z,addr
+ case 0xD2: JP( !CARRY ) // JP NC,addr
+ case 0xDA: JP( CARRY ) // JP C,addr
+ case 0xE2: JP( !EVEN ) // JP PO,addr
+ case 0xEA: JP( EVEN ) // JP PE,addr
+ case 0xF2: JP( !MINUS ) // JP P,addr
+ case 0xFA: JP( MINUS ) // JP M,addr
+
+ case 0xC3: // JP addr
+ pc = GET_ADDR();
+ goto loop;
+
+ case 0xE9: // JP HL
+ pc = r.w.hl;
+ goto loop;
+
+// RET
+#define RET( cond ) \
+ if ( cond )\
+ goto ret_taken;\
+ s_time -= 6;\
+ goto loop;
+
+ case 0xC0: RET( !ZERO ) // RET NZ
+ case 0xC8: RET( ZERO ) // RET Z
+ case 0xD0: RET( !CARRY ) // RET NC
+ case 0xD8: RET( CARRY ) // RET C
+ case 0xE0: RET( !EVEN ) // RET PO
+ case 0xE8: RET( EVEN ) // RET PE
+ case 0xF0: RET( !MINUS ) // RET P
+ case 0xF8: RET( MINUS ) // RET M
+
+ case 0xC9: // RET
+ ret_taken:
+ pc = READ_WORD( sp );
+ sp = WORD( sp + 2 );
+ goto loop;
+
+// CALL
+#define CALL( cond ) \
+ if ( cond )\
+ goto call_taken;\
+ goto call_not_taken;
+
+ case 0xC4: CALL( !ZERO ) // CALL NZ,addr
+ case 0xCC: CALL( ZERO ) // CALL Z,addr
+ case 0xD4: CALL( !CARRY ) // CALL NC,addr
+ case 0xDC: CALL( CARRY ) // CALL C,addr
+ case 0xE4: CALL( !EVEN ) // CALL PO,addr
+ case 0xEC: CALL( EVEN ) // CALL PE,addr
+ case 0xF4: CALL( !MINUS ) // CALL P,addr
+ case 0xFC: CALL( MINUS ) // CALL M,addr
+
+ case 0xCD:{// CALL addr
+ call_taken:
+ int addr = pc + 2;
+ pc = GET_ADDR();
+ sp = WORD( sp - 2 );
+ WRITE_WORD( sp, addr );
+ goto loop;
+ }
+
+ case 0xFF: // RST
+ #ifdef IDLE_ADDR
+ if ( pc == IDLE_ADDR + 1 )
+ goto hit_idle_addr;
+ #else
+ if ( pc > 0x10000 )
+ {
+ pc = WORD( pc - 1 );
+ s_time -= 11;
+ goto loop;
+ }
+ #endif
+ CASE7( C7, CF, D7, DF, E7, EF, F7 ):
+ data = pc;
+ pc = opcode & 0x38;
+ #ifdef RST_BASE
+ pc += RST_BASE;
+ #endif
+ goto push_data;
+
+// PUSH/POP
+ case 0xF5: // PUSH AF
+ data = r.b.a * 0x100u + flags;
+ goto push_data;
+
+ case 0xC5: // PUSH BC
+ case 0xD5: // PUSH DE
+ case 0xE5: // PUSH HL
+ data = R16( opcode, 4, 0xC5 );
+ push_data:
+ sp = WORD( sp - 2 );
+ WRITE_WORD( sp, data );
+ goto loop;
+
+ case 0xF1: // POP AF
+ flags = READ_MEM( sp );
+ r.b.a = READ_MEM( (sp + 1) );
+ sp = WORD( sp + 2 );
+ goto loop;
+
+ case 0xC1: // POP BC
+ case 0xD1: // POP DE
+ case 0xE1: // POP HL
+ R16( opcode, 4, 0xC1 ) = READ_WORD( sp );
+ sp = WORD( sp + 2 );
+ goto loop;
+
+// ADC/ADD/SBC/SUB
+ case 0x96: // SUB (HL)
+ case 0x86: // ADD (HL)
+ flags &= ~C01;
+ case 0x9E: // SBC (HL)
+ case 0x8E: // ADC (HL)
+ data = READ_MEM( r.w.hl );
+ goto adc_data;
+
+ case 0xD6: // SUB A,imm
+ case 0xC6: // ADD imm
+ flags &= ~C01;
+ case 0xDE: // SBC A,imm
+ case 0xCE: // ADC imm
+ pc++;
+ goto adc_data;
+
+ CASE7( 90, 91, 92, 93, 94, 95, 97 ): // SUB r
+ CASE7( 80, 81, 82, 83, 84, 85, 87 ): // ADD r
+ flags &= ~C01;
+ CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // SBC r
+ CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // ADC r
+ data = R8( opcode & 7, 0 );
+ adc_data: {
+ int result = data + (flags & C01);
+ data ^= r.b.a;
+ flags = opcode >> 3 & N02; // bit 4 is set in subtract opcodes
+ if ( flags )
+ result = -result;
+ result += r.b.a;
+ data ^= result;
+ flags +=(data & H10) +
+ ((data + 0x80) >> 6 & V04) +
+ SZ28C( result & 0x1FF );
+ r.b.a = result;
+ goto loop;
+ }
+
+// CP
+ case 0xBE: // CP (HL)
+ data = READ_MEM( r.w.hl );
+ goto cp_data;
+
+ case 0xFE: // CP imm
+ pc++;
+ goto cp_data;
+
+ CASE7( B8, B9, BA, BB, BC, BD, BF ): // CP r
+ data = R8( opcode, 0xB8 );
+ cp_data: {
+ int result = r.b.a - data;
+ flags = N02 + (data & (F20 | F08)) + (result >> 8 & C01);
+ data ^= r.b.a;
+ flags +=(((result ^ r.b.a) & data) >> 5 & V04) +
+ (((data & H10) ^ result) & (S80 | H10));
+ if ( BYTE( result ) )
+ goto loop;
+ flags += Z40;
+ goto loop;
+ }
+
+// ADD HL,r.w
+
+ case 0x39: // ADD HL,SP
+ data = sp;
+ goto add_hl_data;
+
+ case 0x09: // ADD HL,BC
+ case 0x19: // ADD HL,DE
+ case 0x29: // ADD HL,HL
+ data = R16( opcode, 4, 0x09 );
+ add_hl_data: {
+ int sum = r.w.hl + data;
+ data ^= r.w.hl;
+ r.w.hl = sum;
+ flags = (flags & (S80 | Z40 | V04)) +
+ (sum >> 16) +
+ (sum >> 8 & (F20 | F08)) +
+ ((data ^ sum) >> 8 & H10);
+ goto loop;
+ }
+
+ case 0x27:{// DAA
+ int a = r.b.a;
+ if ( a > 0x99 )
+ flags |= C01;
+
+ int adjust = 0x60 * (flags & C01);
+
+ if ( flags & H10 || (a & 0x0F) > 9 )
+ adjust += 0x06;
+
+ if ( flags & N02 )
+ adjust = -adjust;
+ a += adjust;
+
+ flags = (flags & (C01 | N02)) +
+ ((r.b.a ^ a) & H10) +
+ SZ28P( BYTE( a ) );
+ r.b.a = a;
+ goto loop;
+ }
+
+// INC/DEC
+ case 0x34: // INC (HL)
+ data = READ_MEM( r.w.hl ) + 1;
+ WRITE_MEM( r.w.hl, data );
+ goto inc_set_flags;
+
+ CASE7( 04, 0C, 14, 1C, 24, 2C, 3C ): // INC r
+ data = ++R8( opcode >> 3, 0 );
+ inc_set_flags:
+ flags = (flags & C01) +
+ (((data & 0x0F) - 1) & H10) +
+ SZ28( BYTE( data ) );
+ if ( data != 0x80 )
+ goto loop;
+ flags += V04;
+ goto loop;
+
+ case 0x35: // DEC (HL)
+ data = READ_MEM( r.w.hl ) - 1;
+ WRITE_MEM( r.w.hl, data );
+ goto dec_set_flags;
+
+ CASE7( 05, 0D, 15, 1D, 25, 2D, 3D ): // DEC r
+ data = --R8( opcode >> 3, 0 );
+ dec_set_flags:
+ flags = (flags & C01) + N02 +
+ (((data & 0x0F) + 1) & H10) +
+ SZ28( BYTE( data ) );
+ if ( data != 0x7F )
+ goto loop;
+ flags += V04;
+ goto loop;
+
+ case 0x03: // INC BC
+ case 0x13: // INC DE
+ case 0x23: // INC HL
+ R16( opcode, 4, 0x03 )++;
+ goto loop;
+
+ case 0x33: // INC SP
+ sp = WORD( sp + 1 );
+ goto loop;
+
+ case 0x0B: // DEC BC
+ case 0x1B: // DEC DE
+ case 0x2B: // DEC HL
+ R16( opcode, 4, 0x0B )--;
+ goto loop;
+
+ case 0x3B: // DEC SP
+ sp = WORD( sp - 1 );
+ goto loop;
+
+// AND
+ case 0xA6: // AND (HL)
+ data = READ_MEM( r.w.hl );
+ goto and_data;
+
+ case 0xE6: // AND imm
+ pc++;
+ goto and_data;
+
+ CASE7( A0, A1, A2, A3, A4, A5, A7 ): // AND r
+ data = R8( opcode, 0xA0 );
+ and_data:
+ r.b.a &= data;
+ flags = SZ28P( r.b.a ) + H10;
+ goto loop;
+
+// OR
+ case 0xB6: // OR (HL)
+ data = READ_MEM( r.w.hl );
+ goto or_data;
+
+ case 0xF6: // OR imm
+ pc++;
+ goto or_data;
+
+ CASE7( B0, B1, B2, B3, B4, B5, B7 ): // OR r
+ data = R8( opcode, 0xB0 );
+ or_data:
+ r.b.a |= data;
+ flags = SZ28P( r.b.a );
+ goto loop;
+
+// XOR
+ case 0xAE: // XOR (HL)
+ data = READ_MEM( r.w.hl );
+ goto xor_data;
+
+ case 0xEE: // XOR imm
+ pc++;
+ goto xor_data;
+
+ CASE7( A8, A9, AA, AB, AC, AD, AF ): // XOR r
+ data = R8( opcode, 0xA8 );
+ xor_data:
+ r.b.a ^= data;
+ flags = SZ28P( r.b.a );
+ goto loop;
+
+// LD
+ CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (HL),r
+ WRITE_MEM( r.w.hl, R8( opcode, 0x70 ) );
+ goto loop;
+
+ CASE6( 41, 42, 43, 44, 45, 47 ): // LD B,r
+ CASE6( 48, 4A, 4B, 4C, 4D, 4F ): // LD C,r
+ CASE6( 50, 51, 53, 54, 55, 57 ): // LD D,r
+ CASE6( 58, 59, 5A, 5C, 5D, 5F ): // LD E,r
+ CASE6( 60, 61, 62, 63, 65, 67 ): // LD H,r
+ CASE6( 68, 69, 6A, 6B, 6C, 6F ): // LD L,r
+ CASE6( 78, 79, 7A, 7B, 7C, 7D ): // LD A,r
+ R8( opcode >> 3 & 7, 0 ) = R8( opcode & 7, 0 );
+ goto loop;
+
+ CASE5( 06, 0E, 16, 1E, 26 ): // LD r,imm
+ R8( opcode >> 3, 0 ) = data;
+ pc++;
+ goto loop;
+
+ case 0x36: // LD (HL),imm
+ pc++;
+ WRITE_MEM( r.w.hl, data );
+ goto loop;
+
+ CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(HL)
+ R8( opcode >> 3, 8 ) = READ_MEM( r.w.hl );
+ goto loop;
+
+ case 0x01: // LD r.w,imm
+ case 0x11:
+ case 0x21:
+ R16( opcode, 4, 0x01 ) = GET_ADDR();
+ pc += 2;
+ goto loop;
+
+ case 0x31: // LD sp,imm
+ sp = GET_ADDR();
+ pc += 2;
+ goto loop;
+
+ case 0x2A:{// LD HL,(addr)
+ int addr = GET_ADDR();
+ pc += 2;
+ r.w.hl = READ_WORD( addr );
+ goto loop;
+ }
+
+ case 0x32:{// LD (addr),A
+ int addr = GET_ADDR();
+ pc += 2;
+ WRITE_MEM( addr, r.b.a );
+ goto loop;
+ }
+
+ case 0x22:{// LD (addr),HL
+ int addr = GET_ADDR();
+ pc += 2;
+ WRITE_WORD( addr, r.w.hl );
+ goto loop;
+ }
+
+ case 0x02: // LD (BC),A
+ case 0x12: // LD (DE),A
+ WRITE_MEM( R16( opcode, 4, 0x02 ), r.b.a );
+ goto loop;
+
+ case 0x0A: // LD A,(BC)
+ case 0x1A: // LD A,(DE)
+ r.b.a = READ_MEM( R16( opcode, 4, 0x0A ) );
+ goto loop;
+
+ case 0xF9: // LD SP,HL
+ sp = r.w.hl;
+ goto loop;
+
+// Rotate
+
+ case 0x07:{// RLCA
+ int temp = r.b.a;
+ temp = (temp << 1) + (temp >> 7);
+ flags = (flags & (S80 | Z40 | P04)) +
+ (temp & (F20 | F08 | C01));
+ r.b.a = temp;
+ goto loop;
+ }
+
+ case 0x0F:{// RRCA
+ int temp = r.b.a;
+ flags = (flags & (S80 | Z40 | P04)) +
+ (temp & C01);
+ temp = (temp << 7) + (temp >> 1);
+ flags += temp & (F20 | F08);
+ r.b.a = temp;
+ goto loop;
+ }
+
+ case 0x17:{// RLA
+ int temp = (r.b.a << 1) + (flags & C01);
+ flags = (flags & (S80 | Z40 | P04)) +
+ (temp & (F20 | F08)) +
+ (temp >> 8);
+ r.b.a = temp;
+ goto loop;
+ }
+
+ case 0x1F:{// RRA
+ int temp = (flags << 7) + (r.b.a >> 1);
+ flags = (flags & (S80 | Z40 | P04)) +
+ (temp & (F20 | F08)) +
+ (r.b.a & C01);
+ r.b.a = temp;
+ goto loop;
+ }
+
+// Misc
+ case 0x2F:{// CPL
+ int temp = ~r.b.a;
+ flags = (flags & (S80 | Z40 | P04 | C01)) +
+ (temp & (F20 | F08)) +
+ (H10 | N02);
+ r.b.a = temp;
+ goto loop;
+ }
+
+ case 0x3F:{// CCF
+ flags = ((flags & (S80 | Z40 | P04 | C01)) ^ C01) +
+ (flags << 4 & H10) +
+ (r.b.a & (F20 | F08));
+ goto loop;
+ }
+
+ case 0x37: // SCF
+ flags = (flags & (S80 | Z40 | P04)) | C01 +
+ (r.b.a & (F20 | F08));
+ goto loop;
+
+ case 0xDB: // IN A,(imm)
+ pc++;
+ r.b.a = IN_PORT( (data + r.b.a * 0x100) );
+ goto loop;
+
+ case 0xE3:{// EX (SP),HL
+ int temp = READ_WORD( sp );
+ WRITE_WORD( sp, r.w.hl );
+ r.w.hl = temp;
+ goto loop;
+ }
+
+ case 0xEB: // EX DE,HL
+ EX( r.w.hl, r.w.de );
+ goto loop;
+
+ case 0xD9: // EXX DE,HL
+ EXX( w.bc );
+ EXX( w.de );
+ EXX( w.hl );
+ goto loop;
+
+ case 0xF3: // DI
+ R.iff1 = 0;
+ R.iff2 = 0;
+ goto loop;
+
+ case 0xFB: // EI
+ R.iff1 = 1;
+ R.iff2 = 1;
+ // TODO: delayed effect
+ goto loop;
+
+ case 0x76: // HALT
+ goto halt;
+
+//////////////////////////////////////// CB prefix
+ {
+ case 0xCB:
+ pc++;
+ switch ( data )
+ {
+
+ // Rotate left
+
+ #define RLC( read, write ) {\
+ int result = read;\
+ result = BYTE( result << 1 ) + (result >> 7);\
+ flags = SZ28P( result ) + (result & C01);\
+ write;\
+ goto loop;\
+ }
+
+ case 0x06: // RLC (HL)
+ s_time += 7;
+ data = r.w.hl;
+ rlc_data_addr:
+ RLC( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 00, 01, 02, 03, 04, 05, 07 ):{// RLC r
+ byte& reg = R8( data, 0 );
+ RLC( reg, reg = result )
+ }
+
+ #define RL( read, write ) {\
+ int result = (read << 1) + (flags & C01);\
+ flags = SZ28PC( result );\
+ write;\
+ goto loop;\
+ }
+
+ case 0x16: // RL (HL)
+ s_time += 7;
+ data = r.w.hl;
+ rl_data_addr:
+ RL( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 10, 11, 12, 13, 14, 15, 17 ):{// RL r
+ byte& reg = R8( data, 0x10 );
+ RL( reg, reg = result )
+ }
+
+ #define SLA( read, low_bit, write ) {\
+ int result = (read << 1) + low_bit;\
+ flags = SZ28PC( result );\
+ write;\
+ goto loop;\
+ }
+
+ case 0x26: // SLA (HL)
+ s_time += 7;
+ data = r.w.hl;
+ sla_data_addr:
+ SLA( READ_MEM( data ), 0, WRITE_MEM( data, result ) )
+
+ CASE7( 20, 21, 22, 23, 24, 25, 27 ):{// SLA r
+ byte& reg = R8( data, 0x20 );
+ SLA( reg, 0, reg = result )
+ }
+
+ case 0x36: // SLL (HL)
+ s_time += 7;
+ data = r.w.hl;
+ sll_data_addr:
+ SLA( READ_MEM( data ), 1, WRITE_MEM( data, result ) )
+
+ CASE7( 30, 31, 32, 33, 34, 35, 37 ):{// SLL r
+ byte& reg = R8( data, 0x30 );
+ SLA( reg, 1, reg = result )
+ }
+
+ // Rotate right
+
+ #define RRC( read, write ) {\
+ int result = read;\
+ flags = result & C01;\
+ result = BYTE( result << 7 ) + (result >> 1);\
+ flags += SZ28P( result );\
+ write;\
+ goto loop;\
+ }
+
+ case 0x0E: // RRC (HL)
+ s_time += 7;
+ data = r.w.hl;
+ rrc_data_addr:
+ RRC( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 08, 09, 0A, 0B, 0C, 0D, 0F ):{// RRC r
+ byte& reg = R8( data, 0x08 );
+ RRC( reg, reg = result )
+ }
+
+ #define RR( read, write ) {\
+ int result = read;\
+ int temp = result & C01;\
+ result = BYTE( flags << 7 ) + (result >> 1);\
+ flags = SZ28P( result ) + temp;\
+ write;\
+ goto loop;\
+ }
+
+ case 0x1E: // RR (HL)
+ s_time += 7;
+ data = r.w.hl;
+ rr_data_addr:
+ RR( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 18, 19, 1A, 1B, 1C, 1D, 1F ):{// RR r
+ byte& reg = R8( data, 0x18 );
+ RR( reg, reg = result )
+ }
+
+ #define SRA( read, write ) {\
+ int result = read;\
+ flags = result & C01;\
+ result = (result & 0x80) + (result >> 1);\
+ flags += SZ28P( result );\
+ write;\
+ goto loop;\
+ }
+
+ case 0x2E: // SRA (HL)
+ data = r.w.hl;
+ s_time += 7;
+ sra_data_addr:
+ SRA( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 28, 29, 2A, 2B, 2C, 2D, 2F ):{// SRA r
+ byte& reg = R8( data, 0x28 );
+ SRA( reg, reg = result )
+ }
+
+ #define SRL( read, write ) {\
+ int result = read;\
+ flags = result & C01;\
+ result >>= 1;\
+ flags += SZ28P( result );\
+ write;\
+ goto loop;\
+ }
+
+ case 0x3E: // SRL (HL)
+ s_time += 7;
+ data = r.w.hl;
+ srl_data_addr:
+ SRL( READ_MEM( data ), WRITE_MEM( data, result ) )
+
+ CASE7( 38, 39, 3A, 3B, 3C, 3D, 3F ):{// SRL r
+ byte& reg = R8( data, 0x38 );
+ SRL( reg, reg = result )
+ }
+
+ // BIT
+ {
+ int temp;
+ CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ): // BIT b,(HL)
+ s_time += 4;
+ temp = READ_MEM( r.w.hl );
+ flags &= C01;
+ goto bit_temp;
+ CASE7( 40, 41, 42, 43, 44, 45, 47 ): // BIT 0,r
+ CASE7( 48, 49, 4A, 4B, 4C, 4D, 4F ): // BIT 1,r
+ CASE7( 50, 51, 52, 53, 54, 55, 57 ): // BIT 2,r
+ CASE7( 58, 59, 5A, 5B, 5C, 5D, 5F ): // BIT 3,r
+ CASE7( 60, 61, 62, 63, 64, 65, 67 ): // BIT 4,r
+ CASE7( 68, 69, 6A, 6B, 6C, 6D, 6F ): // BIT 5,r
+ CASE7( 70, 71, 72, 73, 74, 75, 77 ): // BIT 6,r
+ CASE7( 78, 79, 7A, 7B, 7C, 7D, 7F ): // BIT 7,r
+ temp = R8( data & 7, 0 );
+ flags = (flags & C01) + (temp & (F20 | F08));
+ bit_temp:
+ temp = temp & (1 << (data >> 3 & 7));
+ flags += (temp & S80) + H10;
+ flags += (unsigned) --temp >> 8 & (Z40 | P04);
+ goto loop;
+ }
+
+ // SET/RES
+ CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(HL)
+ CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(HL)
+ s_time += 7;
+ int temp = READ_MEM( r.w.hl );
+ int bit = 1 << (data >> 3 & 7);
+ temp |= bit; // SET
+ if ( !(data & 0x40) )
+ temp ^= bit; // RES
+ WRITE_MEM( r.w.hl, temp );
+ goto loop;
+ }
+
+ CASE7( C0, C1, C2, C3, C4, C5, C7 ): // SET 0,r
+ CASE7( C8, C9, CA, CB, CC, CD, CF ): // SET 1,r
+ CASE7( D0, D1, D2, D3, D4, D5, D7 ): // SET 2,r
+ CASE7( D8, D9, DA, DB, DC, DD, DF ): // SET 3,r
+ CASE7( E0, E1, E2, E3, E4, E5, E7 ): // SET 4,r
+ CASE7( E8, E9, EA, EB, EC, ED, EF ): // SET 5,r
+ CASE7( F0, F1, F2, F3, F4, F5, F7 ): // SET 6,r
+ CASE7( F8, F9, FA, FB, FC, FD, FF ): // SET 7,r
+ R8( data & 7, 0 ) |= 1 << (data >> 3 & 7);
+ goto loop;
+
+ CASE7( 80, 81, 82, 83, 84, 85, 87 ): // RES 0,r
+ CASE7( 88, 89, 8A, 8B, 8C, 8D, 8F ): // RES 1,r
+ CASE7( 90, 91, 92, 93, 94, 95, 97 ): // RES 2,r
+ CASE7( 98, 99, 9A, 9B, 9C, 9D, 9F ): // RES 3,r
+ CASE7( A0, A1, A2, A3, A4, A5, A7 ): // RES 4,r
+ CASE7( A8, A9, AA, AB, AC, AD, AF ): // RES 5,r
+ CASE7( B0, B1, B2, B3, B4, B5, B7 ): // RES 6,r
+ CASE7( B8, B9, BA, BB, BC, BD, BF ): // RES 7,r
+ R8( data & 7, 0 ) &= ~(1 << (data >> 3 & 7));
+ goto loop;
+ }
+ assert( false );
+ }
+
+#undef GET_ADDR
+#define GET_ADDR() GET_LE16( &INSTR( 1, pc ) )
+
+//////////////////////////////////////// ED prefix
+ {
+ case 0xED:
+ pc++;
+ s_time += (clock_table + 256) [data] >> 4;
+ switch ( data )
+ {
+ {
+ int temp;
+ case 0x72: // SBC HL,SP
+ case 0x7A: // ADC HL,SP
+ temp = sp;
+ if ( 0 )
+ case 0x42: // SBC HL,BC
+ case 0x52: // SBC HL,DE
+ case 0x62: // SBC HL,HL
+ case 0x4A: // ADC HL,BC
+ case 0x5A: // ADC HL,DE
+ case 0x6A: // ADC HL,HL
+ temp = R16( data >> 3 & 6, 1, 0 );
+ int sum = temp + (flags & C01);
+ flags = ~data >> 2 & N02;
+ if ( flags )
+ sum = -sum;
+ sum += r.w.hl;
+ temp ^= r.w.hl;
+ temp ^= sum;
+ flags +=(sum >> 16 & C01) +
+ (temp >> 8 & H10) +
+ (sum >> 8 & (S80 | F20 | F08)) +
+ ((temp + 0x8000) >> 14 & V04);
+ r.w.hl = sum;
+ if ( WORD( sum ) )
+ goto loop;
+ flags += Z40;
+ goto loop;
+ }
+
+ CASE8( 40, 48, 50, 58, 60, 68, 70, 78 ):{// IN r,(C)
+ int temp = IN_PORT( r.w.bc );
+ R8( data >> 3, 8 ) = temp;
+ flags = (flags & C01) + SZ28P( temp );
+ goto loop;
+ }
+
+ case 0x71: // OUT (C),0
+ r.b.flags = 0;
+ CASE7( 41, 49, 51, 59, 61, 69, 79 ): // OUT (C),r
+ OUT_PORT( r.w.bc, R8( data >> 3, 8 ) );
+ goto loop;
+
+ {
+ int temp;
+ case 0x73: // LD (ADDR),SP
+ temp = sp;
+ if ( 0 )
+ case 0x43: // LD (ADDR),BC
+ case 0x53: // LD (ADDR),DE
+ temp = R16( data, 4, 0x43 );
+ int addr = GET_ADDR();
+ pc += 2;
+ WRITE_WORD( addr, temp );
+ goto loop;
+ }
+
+ case 0x4B: // LD BC,(ADDR)
+ case 0x5B:{// LD DE,(ADDR)
+ int addr = GET_ADDR();
+ pc += 2;
+ R16( data, 4, 0x4B ) = READ_WORD( addr );
+ goto loop;
+ }
+
+ case 0x7B:{// LD SP,(ADDR)
+ int addr = GET_ADDR();
+ pc += 2;
+ sp = READ_WORD( addr );
+ goto loop;
+ }
+
+ case 0x67:{// RRD
+ int temp = READ_MEM( r.w.hl );
+ WRITE_MEM( r.w.hl, ((r.b.a << 4) + (temp >> 4)) );
+ temp = (r.b.a & 0xF0) + (temp & 0x0F);
+ flags = (flags & C01) + SZ28P( temp );
+ r.b.a = temp;
+ goto loop;
+ }
+
+ case 0x6F:{// RLD
+ int temp = READ_MEM( r.w.hl );
+ WRITE_MEM( r.w.hl, ((temp << 4) + (r.b.a & 0x0F)) );
+ temp = (r.b.a & 0xF0) + (temp >> 4);
+ flags = (flags & C01) + SZ28P( temp );
+ r.b.a = temp;
+ goto loop;
+ }
+
+ CASE8( 44, 4C, 54, 5C, 64, 6C, 74, 7C ): // NEG
+ opcode = 0x10; // flag to do SBC instead of ADC
+ flags &= ~C01;
+ data = r.b.a;
+ r.b.a = 0;
+ goto adc_data;
+
+ {
+ int inc;
+ case 0xA9: // CPD
+ case 0xB9: // CPDR
+ inc = -1;
+ if ( 0 )
+ case 0xA1: // CPI
+ case 0xB1: // CPIR
+ inc = +1;
+ int addr = r.w.hl;
+ r.w.hl = addr + inc;
+ int temp = READ_MEM( addr );
+
+ int result = r.b.a - temp;
+ flags = (flags & C01) + N02 +
+ ((((temp ^ r.b.a) & H10) ^ result) & (S80 | H10));
+
+ if ( !BYTE( result ) )
+ flags += Z40;
+ result -= (flags & H10) >> 4;
+ flags += result & F08;
+ flags += result << 4 & F20;
+ if ( !--r.w.bc )
+ goto loop;
+
+ flags += V04;
+ if ( flags & Z40 || data < 0xB0 )
+ goto loop;
+
+ pc -= 2;
+ s_time += 5;
+ goto loop;
+ }
+
+ {
+ int inc;
+ case 0xA8: // LDD
+ case 0xB8: // LDDR
+ inc = -1;
+ if ( 0 )
+ case 0xA0: // LDI
+ case 0xB0: // LDIR
+ inc = +1;
+ int addr = r.w.hl;
+ r.w.hl = addr + inc;
+ int temp = READ_MEM( addr );
+
+ addr = r.w.de;
+ r.w.de = addr + inc;
+ WRITE_MEM( addr, temp );
+
+ temp += r.b.a;
+ flags = (flags & (S80 | Z40 | C01)) +
+ (temp & F08) + (temp << 4 & F20);
+ if ( !--r.w.bc )
+ goto loop;
+
+ flags += V04;
+ if ( data < 0xB0 )
+ goto loop;
+
+ pc -= 2;
+ s_time += 5;
+ goto loop;
+ }
+
+ {
+ int inc;
+ case 0xAB: // OUTD
+ case 0xBB: // OTDR
+ inc = -1;
+ if ( 0 )
+ case 0xA3: // OUTI
+ case 0xB3: // OTIR
+ inc = +1;
+ int addr = r.w.hl;
+ r.w.hl = addr + inc;
+ int temp = READ_MEM( addr );
+
+ int b = --r.b.b;
+ flags = (temp >> 6 & N02) + SZ28( b );
+ if ( b && data >= 0xB0 )
+ {
+ pc -= 2;
+ s_time += 5;
+ }
+
+ OUT_PORT( r.w.bc, temp );
+ goto loop;
+ }
+
+ {
+ int inc;
+ case 0xAA: // IND
+ case 0xBA: // INDR
+ inc = -1;
+ if ( 0 )
+ case 0xA2: // INI
+ case 0xB2: // INIR
+ inc = +1;
+
+ int addr = r.w.hl;
+ r.w.hl = addr + inc;
+
+ int temp = IN_PORT( r.w.bc );
+
+ int b = --r.b.b;
+ flags = (temp >> 6 & N02) + SZ28( b );
+ if ( b && data >= 0xB0 )
+ {
+ pc -= 2;
+ s_time += 5;
+ }
+
+ WRITE_MEM( addr, temp );
+ goto loop;
+ }
+
+ case 0x47: // LD I,A
+ R.i = r.b.a;
+ goto loop;
+
+ case 0x4F: // LD R,A
+ SET_R( r.b.a );
+ dprintf( "LD R,A not supported\n" );
+ warning = true;
+ goto loop;
+
+ case 0x57: // LD A,I
+ r.b.a = R.i;
+ goto ld_ai_common;
+
+ case 0x5F: // LD A,R
+ r.b.a = GET_R();
+ dprintf( "LD A,R not supported\n" );
+ warning = true;
+ ld_ai_common:
+ flags = (flags & C01) + SZ28( r.b.a ) + (R.iff2 << 2 & V04);
+ goto loop;
+
+ CASE8( 45, 4D, 55, 5D, 65, 6D, 75, 7D ): // RETI/RETN
+ R.iff1 = R.iff2;
+ goto ret_taken;
+
+ case 0x46: case 0x4E: case 0x66: case 0x6E: // IM 0
+ R.im = 0;
+ goto loop;
+
+ case 0x56: case 0x76: // IM 1
+ R.im = 1;
+ goto loop;
+
+ case 0x5E: case 0x7E: // IM 2
+ R.im = 2;
+ goto loop;
+
+ default:
+ dprintf( "Opcode $ED $%02X not supported\n", data );
+ warning = true;
+ goto loop;
+ }
+ assert( false );
+ }
+
+//////////////////////////////////////// DD/FD prefix
+ {
+ int ixy;
+ case 0xDD:
+ ixy = ix;
+ goto ix_prefix;
+ case 0xFD:
+ ixy = iy;
+ ix_prefix:
+ pc++;
+ int data2 = READ_CODE( pc );
+ s_time += (clock_table + 256) [data] & 0x0F;
+ switch ( data )
+ {
+ // TODO: more efficient way of avoid negative address
+ // TODO: avoid using this as argument to READ_MEM() since it is evaluated twice
+ #define IXY_DISP( ixy, disp ) WORD( (ixy ) + (disp))
+
+ #define SET_IXY( in ) if ( opcode == 0xDD ) ix = in; else iy = in;
+
+ // ADD/ADC/SUB/SBC
+
+ case 0x96: // SUB (IXY+disp)
+ case 0x86: // ADD (IXY+disp)
+ flags &= ~C01;
+ case 0x9E: // SBC (IXY+disp)
+ case 0x8E: // ADC (IXY+disp)
+ pc++;
+ opcode = data;
+ data = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto adc_data;
+
+ case 0x94: // SUB HXY
+ case 0x84: // ADD HXY
+ flags &= ~C01;
+ case 0x9C: // SBC HXY
+ case 0x8C: // ADC HXY
+ opcode = data;
+ data = ixy >> 8;
+ goto adc_data;
+
+ case 0x95: // SUB LXY
+ case 0x85: // ADD LXY
+ flags &= ~C01;
+ case 0x9D: // SBC LXY
+ case 0x8D: // ADC LXY
+ opcode = data;
+ data = BYTE( ixy );
+ goto adc_data;
+
+ {
+ int temp;
+ case 0x39: // ADD IXY,SP
+ temp = sp;
+ goto add_ixy_data;
+
+ case 0x29: // ADD IXY,HL
+ temp = ixy;
+ goto add_ixy_data;
+
+ case 0x09: // ADD IXY,BC
+ case 0x19: // ADD IXY,DE
+ temp = R16( data, 4, 0x09 );
+ add_ixy_data: {
+ int sum = ixy + temp;
+ temp ^= ixy;
+ ixy = WORD( sum );
+ flags = (flags & (S80 | Z40 | V04)) +
+ (sum >> 16) +
+ (sum >> 8 & (F20 | F08)) +
+ ((temp ^ sum) >> 8 & H10);
+ goto set_ixy;
+ }
+ }
+
+ // AND
+ case 0xA6: // AND (IXY+disp)
+ pc++;
+ data = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto and_data;
+
+ case 0xA4: // AND HXY
+ data = ixy >> 8;
+ goto and_data;
+
+ case 0xA5: // AND LXY
+ data = BYTE( ixy );
+ goto and_data;
+
+ // OR
+ case 0xB6: // OR (IXY+disp)
+ pc++;
+ data = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto or_data;
+
+ case 0xB4: // OR HXY
+ data = ixy >> 8;
+ goto or_data;
+
+ case 0xB5: // OR LXY
+ data = BYTE( ixy );
+ goto or_data;
+
+ // XOR
+ case 0xAE: // XOR (IXY+disp)
+ pc++;
+ data = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto xor_data;
+
+ case 0xAC: // XOR HXY
+ data = ixy >> 8;
+ goto xor_data;
+
+ case 0xAD: // XOR LXY
+ data = BYTE( ixy );
+ goto xor_data;
+
+ // CP
+ case 0xBE: // CP (IXY+disp)
+ pc++;
+ data = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto cp_data;
+
+ case 0xBC: // CP HXY
+ data = ixy >> 8;
+ goto cp_data;
+
+ case 0xBD: // CP LXY
+ data = BYTE( ixy );
+ goto cp_data;
+
+ // LD
+ CASE7( 70, 71, 72, 73, 74, 75, 77 ): // LD (IXY+disp),r
+ data = R8( data, 0x70 );
+ if ( 0 )
+ case 0x36: // LD (IXY+disp),imm
+ pc++, data = READ_CODE( pc );
+ pc++;
+ WRITE_MEM( IXY_DISP( ixy, SBYTE( data2 ) ), data );
+ goto loop;
+
+ CASE5( 44, 4C, 54, 5C, 7C ): // LD r,HXY
+ R8( data >> 3, 8 ) = ixy >> 8;
+ goto loop;
+
+ case 0x64: // LD HXY,HXY
+ case 0x6D: // LD LXY,LXY
+ goto loop;
+
+ CASE5( 45, 4D, 55, 5D, 7D ): // LD r,LXY
+ R8( data >> 3, 8 ) = ixy;
+ goto loop;
+
+ CASE7( 46, 4E, 56, 5E, 66, 6E, 7E ): // LD r,(IXY+disp)
+ pc++;
+ R8( data >> 3, 8 ) = READ_MEM( IXY_DISP( ixy, SBYTE( data2 ) ) );
+ goto loop;
+
+ case 0x26: // LD HXY,imm
+ pc++;
+ goto ld_hxy_data;
+
+ case 0x65: // LD HXY,LXY
+ data2 = BYTE( ixy );
+ goto ld_hxy_data;
+
+ CASE5( 60, 61, 62, 63, 67 ): // LD HXY,r
+ data2 = R8( data, 0x60 );
+ ld_hxy_data:
+ ixy = BYTE( ixy ) + (data2 << 8);
+ goto set_ixy;
+
+ case 0x2E: // LD LXY,imm
+ pc++;
+ goto ld_lxy_data;
+
+ case 0x6C: // LD LXY,HXY
+ data2 = ixy >> 8;
+ goto ld_lxy_data;
+
+ CASE5( 68, 69, 6A, 6B, 6F ): // LD LXY,r
+ data2 = R8( data, 0x68 );
+ ld_lxy_data:
+ ixy = (ixy & 0xFF00) + data2;
+ set_ixy:
+ if ( opcode == 0xDD )
+ {
+ ix = ixy;
+ goto loop;
+ }
+ iy = ixy;
+ goto loop;
+
+ case 0xF9: // LD SP,IXY
+ sp = ixy;
+ goto loop;
+
+ case 0x22:{// LD (ADDR),IXY
+ int addr = GET_ADDR();
+ pc += 2;
+ WRITE_WORD( addr, ixy );
+ goto loop;
+ }
+
+ case 0x21: // LD IXY,imm
+ ixy = GET_ADDR();
+ pc += 2;
+ goto set_ixy;
+
+ case 0x2A:{// LD IXY,(addr)
+ int addr = GET_ADDR();
+ ixy = READ_WORD( addr );
+ pc += 2;
+ goto set_ixy;
+ }
+
+ // DD/FD CB prefix
+ case 0xCB: {
+ data = IXY_DISP( ixy, SBYTE( data2 ) );
+ pc++;
+ data2 = READ_CODE( pc );
+ pc++;
+ switch ( data2 )
+ {
+ case 0x06: goto rlc_data_addr; // RLC (IXY)
+ case 0x16: goto rl_data_addr; // RL (IXY)
+ case 0x26: goto sla_data_addr; // SLA (IXY)
+ case 0x36: goto sll_data_addr; // SLL (IXY)
+ case 0x0E: goto rrc_data_addr; // RRC (IXY)
+ case 0x1E: goto rr_data_addr; // RR (IXY)
+ case 0x2E: goto sra_data_addr; // SRA (IXY)
+ case 0x3E: goto srl_data_addr; // SRL (IXY)
+
+ CASE8( 46, 4E, 56, 5E, 66, 6E, 76, 7E ):{// BIT b,(IXY+disp)
+ int temp = READ_MEM( data );
+ temp = temp & (1 << (data2 >> 3 & 7));
+ flags = (flags & C01) + H10 + (temp & S80);
+ flags += (unsigned) --temp >> 8 & (Z40 | P04);
+ goto loop;
+ }
+
+ CASE8( 86, 8E, 96, 9E, A6, AE, B6, BE ): // RES b,(IXY+disp)
+ CASE8( C6, CE, D6, DE, E6, EE, F6, FE ):{// SET b,(IXY+disp)
+ int temp = READ_MEM( data );
+ int bit = 1 << (data2 >> 3 & 7);
+ temp |= bit; // SET
+ if ( !(data2 & 0x40) )
+ temp ^= bit; // RES
+ WRITE_MEM( data, temp );
+ goto loop;
+ }
+
+ default:
+ dprintf( "Opcode $%02X $CB $%02X not supported\n", opcode, data2 );
+ warning = true;
+ goto loop;
+ }
+ assert( false );
+ }
+
+ // INC/DEC
+ case 0x23: // INC IXY
+ ixy = WORD( ixy + 1 );
+ goto set_ixy;
+
+ case 0x2B: // DEC IXY
+ ixy = WORD( ixy - 1 );
+ goto set_ixy;
+
+ case 0x34: // INC (IXY+disp)
+ ixy = IXY_DISP( ixy, SBYTE( data2 ) );
+ pc++;
+ data = READ_MEM( ixy ) + 1;
+ WRITE_MEM( ixy, data );
+ goto inc_set_flags;
+
+ case 0x35: // DEC (IXY+disp)
+ ixy = IXY_DISP( ixy, SBYTE( data2 ) );
+ pc++;
+ data = READ_MEM( ixy ) - 1;
+ WRITE_MEM( ixy, data );
+ goto dec_set_flags;
+
+ case 0x24: // INC HXY
+ ixy = WORD( ixy + 0x100 );
+ data = ixy >> 8;
+ goto inc_xy_common;
+
+ case 0x2C: // INC LXY
+ data = BYTE( ixy + 1 );
+ ixy = (ixy & 0xFF00) + data;
+ inc_xy_common:
+ if ( opcode == 0xDD )
+ {
+ ix = ixy;
+ goto inc_set_flags;
+ }
+ iy = ixy;
+ goto inc_set_flags;
+
+ case 0x25: // DEC HXY
+ ixy = WORD( ixy - 0x100 );
+ data = ixy >> 8;
+ goto dec_xy_common;
+
+ case 0x2D: // DEC LXY
+ data = BYTE( ixy - 1 );
+ ixy = (ixy & 0xFF00) + data;
+ dec_xy_common:
+ if ( opcode == 0xDD )
+ {
+ ix = ixy;
+ goto dec_set_flags;
+ }
+ iy = ixy;
+ goto dec_set_flags;
+
+ // PUSH/POP
+ case 0xE5: // PUSH IXY
+ data = ixy;
+ goto push_data;
+
+ case 0xE1:{// POP IXY
+ ixy = READ_WORD( sp );
+ sp = WORD( sp + 2 );
+ goto set_ixy;
+ }
+
+ // Misc
+
+ case 0xE9: // JP (IXY)
+ pc = ixy;
+ goto loop;
+
+ case 0xE3:{// EX (SP),IXY
+ int temp = READ_WORD( sp );
+ WRITE_WORD( sp, ixy );
+ ixy = temp;
+ goto set_ixy;
+ }
+
+ default:
+ dprintf( "Unnecessary DD/FD prefix encountered\n" );
+ warning = true;
+ pc--;
+ goto loop;
+ }
+ assert( false );
+ }
+
+ }
+ dprintf( "Unhandled main opcode: $%02X\n", opcode );
+ assert( false );
+
+#ifdef IDLE_ADDR
+hit_idle_addr:
+ s_time -= 11;
+ goto out_of_time;
+#endif
+halt:
+ s_time &= 3; // increment by multiple of 4
+out_of_time:
+ pc--;
+
+ r.b.flags = flags;
+ R.ix = ix;
+ R.iy = iy;
+ R.sp = sp;
+ R.pc = pc;
+ R.b = r.b;
+
+ CPU.cpu_state_.base = s.base;
+ CPU.cpu_state_.time = s_time;
+ CPU.cpu_state = &CPU.cpu_state_;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.cpp b/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.cpp
new file mode 100755
index 00000000..9caaddd7
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.cpp
@@ -0,0 +1,555 @@
+// File_Extractor $vers. http://www.slack.net/~ant/
+
+#include "Data_Reader.h"
+
+#include "blargg_endian.h"
+#include <stdio.h>
+#include <errno.h>
+
+#if BLARGG_UTF8_PATHS
+ #include <windows.h>
+#endif
+
+/* Copyright (C) 2005-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+// Data_Reader
+
+blargg_err_t Data_Reader::read( void* p, int n )
+{
+ assert( n >= 0 );
+
+ if ( n < 0 )
+ return blargg_err_caller;
+
+ if ( n <= 0 )
+ return blargg_ok;
+
+ if ( n > remain() )
+ return blargg_err_file_eof;
+
+ blargg_err_t err = read_v( p, n );
+ if ( !err )
+ remain_ -= n;
+
+ return err;
+}
+
+blargg_err_t Data_Reader::read_avail( void* p, int* n_ )
+{
+ assert( *n_ >= 0 );
+
+ int n = min( *n_, remain() );
+ *n_ = 0;
+
+ if ( n < 0 )
+ return blargg_err_caller;
+
+ if ( n <= 0 )
+ return blargg_ok;
+
+ blargg_err_t err = read_v( p, n );
+ if ( !err )
+ {
+ remain_ -= n;
+ *n_ = n;
+ }
+
+ return err;
+}
+
+blargg_err_t Data_Reader::read_avail( void* p, long* n )
+{
+ int i = STATIC_CAST(int, *n);
+ blargg_err_t err = read_avail( p, &i );
+ *n = i;
+ return err;
+}
+
+blargg_err_t Data_Reader::skip_v( int count )
+{
+ char buf [512];
+ while ( count )
+ {
+ int n = min( count, (int) sizeof buf );
+ count -= n;
+ RETURN_ERR( read_v( buf, n ) );
+ }
+ return blargg_ok;
+}
+
+blargg_err_t Data_Reader::skip( int n )
+{
+ assert( n >= 0 );
+
+ if ( n < 0 )
+ return blargg_err_caller;
+
+ if ( n <= 0 )
+ return blargg_ok;
+
+ if ( n > remain() )
+ return blargg_err_file_eof;
+
+ blargg_err_t err = skip_v( n );
+ if ( !err )
+ remain_ -= n;
+
+ return err;
+}
+
+
+// File_Reader
+
+blargg_err_t File_Reader::seek( int n )
+{
+ assert( n >= 0 );
+
+ if ( n < 0 )
+ return blargg_err_caller;
+
+ if ( n == tell() )
+ return blargg_ok;
+
+ if ( n > size() )
+ return blargg_err_file_eof;
+
+ blargg_err_t err = seek_v( n );
+ if ( !err )
+ set_tell( n );
+
+ return err;
+}
+
+blargg_err_t File_Reader::skip_v( int n )
+{
+ return seek_v( tell() + n );
+}
+
+
+// Subset_Reader
+
+Subset_Reader::Subset_Reader( Data_Reader* dr, int size ) :
+ in( dr )
+{
+ set_remain( min( size, dr->remain() ) );
+}
+
+blargg_err_t Subset_Reader::read_v( void* p, int s )
+{
+ return in->read( p, s );
+}
+
+
+// Remaining_Reader
+
+Remaining_Reader::Remaining_Reader( void const* h, int size, Data_Reader* r ) :
+ in( r )
+{
+ header = h;
+ header_remain = size;
+
+ set_remain( size + r->remain() );
+}
+
+blargg_err_t Remaining_Reader::read_v( void* out, int count )
+{
+ int first = min( count, header_remain );
+ if ( first )
+ {
+ memcpy( out, header, first );
+ header = STATIC_CAST(char const*, header) + first;
+ header_remain -= first;
+ }
+
+ return in->read( STATIC_CAST(char*, out) + first, count - first );
+}
+
+
+// Mem_File_Reader
+
+Mem_File_Reader::Mem_File_Reader( const void* p, long s ) :
+ begin( STATIC_CAST(const char*, p) )
+{
+ set_size( s );
+}
+
+blargg_err_t Mem_File_Reader::read_v( void* p, int s )
+{
+ memcpy( p, begin + tell(), s );
+ return blargg_ok;
+}
+
+blargg_err_t Mem_File_Reader::seek_v( int )
+{
+ return blargg_ok;
+}
+
+
+// Callback_Reader
+
+Callback_Reader::Callback_Reader( callback_t c, long s, void* d ) :
+ callback( c ),
+ user_data( d )
+{
+ set_remain( s );
+}
+
+blargg_err_t Callback_Reader::read_v( void* out, int count )
+{
+ return callback( user_data, out, count );
+}
+
+
+// Callback_File_Reader
+
+Callback_File_Reader::Callback_File_Reader( callback_t c, long s, void* d ) :
+ callback( c ),
+ user_data( d )
+{
+ set_size( s );
+}
+
+blargg_err_t Callback_File_Reader::read_v( void* out, int count )
+{
+ return callback( user_data, out, count, tell() );
+}
+
+blargg_err_t Callback_File_Reader::seek_v( int )
+{
+ return blargg_ok;
+}
+
+
+// BLARGG_UTF8_PATHS
+
+#if BLARGG_UTF8_PATHS
+
+// Thanks to byuu for the idea for BLARGG_UTF8_PATHS and the implementations
+
+BLARGG_NAMESPACE_BEGIN
+
+// Converts wide-character path to UTF-8. Free result with free(). Only supported on Windows.
+char* blargg_to_utf8( const wchar_t* wpath )
+{
+ if ( wpath == NULL )
+ return NULL;
+
+ int needed = WideCharToMultiByte( CP_UTF8, 0, wpath, -1, NULL, 0, NULL, NULL );
+ if ( needed <= 0 )
+ return NULL;
+
+ char* path = (char*) malloc( needed );
+ if ( path == NULL )
+ return NULL;
+
+ int actual = WideCharToMultiByte( CP_UTF8, 0, wpath, -1, path, needed, NULL, NULL );
+ if ( actual == 0 )
+ {
+ free( path );
+ return NULL;
+ }
+
+ assert( actual == needed );
+ return path;
+}
+
+// Converts UTF-8 path to wide-character. Free result with free() Only supported on Windows.
+wchar_t* blargg_to_wide( const char* path )
+{
+ if ( path == NULL )
+ return NULL;
+
+ int needed = MultiByteToWideChar( CP_UTF8, 0, path, -1, NULL, 0 );
+ if ( needed <= 0 )
+ return NULL;
+
+ wchar_t* wpath = (wchar_t*) malloc( needed * sizeof *wpath );
+ if ( wpath == NULL )
+ return NULL;
+
+ int actual = MultiByteToWideChar( CP_UTF8, 0, path, -1, wpath, needed );
+ if ( actual == 0 )
+ {
+ free( wpath );
+ return NULL;
+ }
+
+ assert( actual == needed );
+ return wpath;
+}
+
+BLARGG_NAMESPACE_END
+
+static FILE* blargg_fopen( const char path [], const char mode [] )
+{
+ FILE* file = NULL;
+ wchar_t* wmode = NULL;
+ wchar_t* wpath = NULL;
+
+ wpath = blargg_to_wide( path );
+ if ( wpath )
+ {
+ wmode = blargg_to_wide( mode );
+ if ( wmode )
+ file = _wfopen( wpath, wmode );
+ }
+
+ // Save and restore errno in case free() clears it
+ int saved_errno = errno;
+ free( wmode );
+ free( wpath );
+ errno = saved_errno;
+
+ return file;
+}
+
+#else
+
+static inline FILE* blargg_fopen( const char path [], const char mode [] )
+{
+ return fopen( path, mode );
+}
+
+#endif
+
+
+// Std_File_Reader
+
+Std_File_Reader::Std_File_Reader()
+{
+ file_ = NULL;
+}
+
+Std_File_Reader::~Std_File_Reader()
+{
+ close();
+}
+
+static blargg_err_t blargg_fopen( FILE** out, const char path [] )
+{
+ errno = 0;
+ *out = blargg_fopen( path, "rb" );
+ if ( !*out )
+ {
+ #ifdef ENOENT
+ if ( errno == ENOENT )
+ return blargg_err_file_missing;
+ #endif
+ #ifdef ENOMEM
+ if ( errno == ENOMEM )
+ return blargg_err_memory;
+ #endif
+ return blargg_err_file_read;
+ }
+
+ return blargg_ok;
+}
+
+static blargg_err_t blargg_fsize( FILE* f, long* out )
+{
+ if ( fseek( f, 0, SEEK_END ) )
+ return blargg_err_file_io;
+
+ *out = ftell( f );
+ if ( *out < 0 )
+ return blargg_err_file_io;
+
+ if ( fseek( f, 0, SEEK_SET ) )
+ return blargg_err_file_io;
+
+ return blargg_ok;
+}
+
+blargg_err_t Std_File_Reader::open( const char path [] )
+{
+ close();
+
+ FILE* f;
+ RETURN_ERR( blargg_fopen( &f, path ) );
+
+ long s;
+ blargg_err_t err = blargg_fsize( f, &s );
+ if ( err )
+ {
+ fclose( f );
+ return err;
+ }
+
+ file_ = f;
+ set_size( s );
+
+ return blargg_ok;
+}
+
+void Std_File_Reader::make_unbuffered()
+{
+ if ( setvbuf( STATIC_CAST(FILE*, file_), NULL, _IONBF, 0 ) )
+ check( false ); // shouldn't fail, but OK if it does
+}
+
+blargg_err_t Std_File_Reader::read_v( void* p, int s )
+{
+ if ( (size_t) s != fread( p, 1, s, STATIC_CAST(FILE*, file_) ) )
+ {
+ // Data_Reader's wrapper should prevent EOF
+ check( !feof( STATIC_CAST(FILE*, file_) ) );
+
+ return blargg_err_file_io;
+ }
+
+ return blargg_ok;
+}
+
+blargg_err_t Std_File_Reader::seek_v( int n )
+{
+ if ( fseek( STATIC_CAST(FILE*, file_), n, SEEK_SET ) )
+ {
+ // Data_Reader's wrapper should prevent EOF
+ check( !feof( STATIC_CAST(FILE*, file_) ) );
+
+ return blargg_err_file_io;
+ }
+
+ return blargg_ok;
+}
+
+void Std_File_Reader::close()
+{
+ if ( file_ )
+ {
+ fclose( STATIC_CAST(FILE*, file_) );
+ file_ = NULL;
+ }
+}
+
+
+// Gzip_File_Reader
+
+#ifdef HAVE_ZLIB_H
+
+#include "zlib.h"
+
+static const char* get_gzip_eof( const char path [], long* eof )
+{
+ FILE* file;
+ RETURN_ERR( blargg_fopen( &file, path ) );
+
+ int const h_size = 4;
+ unsigned char h [h_size];
+
+ // read four bytes to ensure that we can seek to -4 later
+ if ( fread( h, 1, h_size, file ) != (size_t) h_size || h[0] != 0x1F || h[1] != 0x8B )
+ {
+ // Not gzipped
+ if ( ferror( file ) )
+ return blargg_err_file_io;
+
+ if ( fseek( file, 0, SEEK_END ) )
+ return blargg_err_file_io;
+
+ *eof = ftell( file );
+ if ( *eof < 0 )
+ return blargg_err_file_io;
+ }
+ else
+ {
+ // Gzipped; get uncompressed size from end
+ if ( fseek( file, -h_size, SEEK_END ) )
+ return blargg_err_file_io;
+
+ if ( fread( h, 1, h_size, file ) != (size_t) h_size )
+ return blargg_err_file_io;
+
+ *eof = get_le32( h );
+ }
+
+ if ( fclose( file ) )
+ check( false );
+
+ return blargg_ok;
+}
+
+Gzip_File_Reader::Gzip_File_Reader()
+{
+ file_ = NULL;
+}
+
+Gzip_File_Reader::~Gzip_File_Reader()
+{
+ close();
+}
+
+blargg_err_t Gzip_File_Reader::open( const char path [] )
+{
+ close();
+
+ long s;
+ RETURN_ERR( get_gzip_eof( path, &s ) );
+
+ file_ = gzopen( path, "rb" );
+ if ( !file_ )
+ return blargg_err_file_read;
+
+ set_size( s );
+ return blargg_ok;
+}
+
+static blargg_err_t convert_gz_error( gzFile file )
+{
+ int err;
+ gzerror( file, &err );
+
+ switch ( err )
+ {
+ case Z_STREAM_ERROR: break;
+ case Z_DATA_ERROR: return blargg_err_file_corrupt;
+ case Z_MEM_ERROR: return blargg_err_memory;
+ case Z_BUF_ERROR: break;
+ }
+ return blargg_err_internal;
+}
+
+blargg_err_t Gzip_File_Reader::read_v( void* p, int s )
+{
+ int result = gzread( file_, p, s );
+ if ( result != s )
+ {
+ if ( result < 0 )
+ return convert_gz_error( file_ );
+
+ return blargg_err_file_corrupt;
+ }
+
+ return blargg_ok;
+}
+
+blargg_err_t Gzip_File_Reader::seek_v( int n )
+{
+ if ( gzseek( file_, n, SEEK_SET ) < 0 )
+ return convert_gz_error( file_ );
+
+ return blargg_ok;
+}
+
+void Gzip_File_Reader::close()
+{
+ if ( file_ )
+ {
+ if ( gzclose( file_ ) )
+ check( false );
+ file_ = NULL;
+ }
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.h b/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.h
new file mode 100755
index 00000000..6150add6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/backup/Data_Reader.h
@@ -0,0 +1,268 @@
+// Lightweight interface for reading data from byte stream
+
+// File_Extractor $vers
+#ifndef DATA_READER_H
+#define DATA_READER_H
+
+#include "blargg_common.h"
+
+BLARGG_NAMESPACE_BEGIN
+
+/* Some functions accept a long instead of int for convenience where caller has
+a long due to some other interface, and would otherwise have to get a warning,
+or cast it (and verify that it wasn't outside the range of an int).
+
+To really support huge (>2GB) files, long isn't a solution, since there's no
+guarantee it's more than 32 bits. We'd need to use long long (if available), or
+something compiler-specific, and change all places file sizes or offsets are
+used. */
+
+// Supports reading and finding out how many bytes are remaining
+class Data_Reader {
+public:
+
+ // Reads min(*n,remain()) bytes and sets *n to this number, thus trying to read more
+ // tham remain() bytes doesn't result in error, just *n being set to remain().
+ blargg_err_t read_avail( void* p, int* n );
+ blargg_err_t read_avail( void* p, long* n );
+
+ // Reads exactly n bytes, or returns error if they couldn't ALL be read.
+ // Reading past end of file results in blargg_err_file_eof.
+ blargg_err_t read( void* p, int n );
+
+ // Number of bytes remaining until end of file
+ int remain() const { return remain_; }
+
+ // Reads and discards n bytes. Skipping past end of file results in blargg_err_file_eof.
+ blargg_err_t skip( int n );
+
+ virtual ~Data_Reader() { }
+
+private:
+ // noncopyable
+ Data_Reader( const Data_Reader& );
+ Data_Reader& operator = ( const Data_Reader& );
+
+// Derived interface
+protected:
+ Data_Reader() : remain_( 0 ) { }
+
+ // Sets remain
+ void set_remain( int n ) { assert( n >= 0 ); remain_ = n; }
+
+ // Do same as read(). Guaranteed that 0 < n <= remain(). Value of remain() is updated
+ // AFTER this call succeeds, not before. set_remain() should NOT be called from this.
+ virtual blargg_err_t read_v( void*, int n ) BLARGG_PURE( { (void)n; return blargg_ok; } )
+
+ // Do same as skip(). Guaranteed that 0 < n <= remain(). Default just reads data
+ // and discards it. Value of remain() is updated AFTER this call succeeds, not
+ // before. set_remain() should NOT be called from this.
+ virtual blargg_err_t skip_v( int n );
+
+// Implementation
+public:
+ BLARGG_DISABLE_NOTHROW
+
+private:
+ int remain_;
+};
+
+
+// Supports seeking in addition to Data_Reader operations
+class File_Reader : public Data_Reader {
+public:
+
+ // Size of file
+ int size() const { return size_; }
+
+ // Current position in file
+ int tell() const { return size_ - remain(); }
+
+ // Goes to new position
+ blargg_err_t seek( int );
+
+// Derived interface
+protected:
+ // Sets size and resets position
+ void set_size( int n ) { size_ = n; Data_Reader::set_remain( n ); }
+ void set_size( long n ) { set_size( STATIC_CAST(int, n) ); }
+
+ // Sets reported position
+ void set_tell( int i ) { assert( 0 <= i && i <= size_ ); Data_Reader::set_remain( size_ - i ); }
+
+ // Do same as seek(). Guaranteed that 0 <= n <= size(). Value of tell() is updated
+ // AFTER this call succeeds, not before. set_* functions should NOT be called from this.
+ virtual blargg_err_t seek_v( int n ) BLARGG_PURE( { (void)n; return blargg_ok; } )
+
+// Implementation
+protected:
+ File_Reader() : size_( 0 ) { }
+
+ virtual blargg_err_t skip_v( int );
+
+private:
+ int size_;
+
+ void set_remain(); // avoid accidental use of set_remain
+};
+
+
+// Reads from file on disk
+class Std_File_Reader : public File_Reader {
+public:
+
+ // Opens file
+ blargg_err_t open( const char path [] );
+
+ // Closes file if one was open
+ void close();
+
+ // Switches to unbuffered mode. Useful if buffering is already being
+ // done at a higher level.
+ void make_unbuffered();
+
+// Implementation
+public:
+ Std_File_Reader();
+ virtual ~Std_File_Reader();
+
+protected:
+ virtual blargg_err_t read_v( void*, int );
+ virtual blargg_err_t seek_v( int );
+
+private:
+ void* file_;
+};
+
+
+// Treats range of memory as a file
+class Mem_File_Reader : public File_Reader {
+public:
+
+ Mem_File_Reader( const void* begin, long size );
+
+// Implementation
+protected:
+ virtual blargg_err_t read_v( void*, int );
+ virtual blargg_err_t seek_v( int );
+
+private:
+ const char* const begin;
+};
+
+
+// Allows only count bytes to be read from reader passed
+class Subset_Reader : public Data_Reader {
+public:
+
+ Subset_Reader( Data_Reader*, int count );
+
+// Implementation
+protected:
+ virtual blargg_err_t read_v( void*, int );
+
+private:
+ Data_Reader* const in;
+};
+
+
+// Joins already-read header and remaining data into original file.
+// Meant for cases where you've already read header and don't want
+// to seek and re-read data (for efficiency).
+class Remaining_Reader : public Data_Reader {
+public:
+
+ Remaining_Reader( void const* header, int header_size, Data_Reader* );
+
+// Implementation
+protected:
+ virtual blargg_err_t read_v( void*, int );
+
+private:
+ Data_Reader* const in;
+ void const* header;
+ int header_remain;
+};
+
+
+// Invokes callback function to read data
+extern "C" { // necessary to be usable from C
+ typedef const char* (*callback_reader_func_t)(
+ void* user_data, // Same value passed to constructor
+ void* out, // Buffer to place data into
+ int count // Number of bytes to read
+ );
+}
+class Callback_Reader : public Data_Reader {
+public:
+ typedef callback_reader_func_t callback_t;
+ Callback_Reader( callback_t, long size, void* user_data );
+
+// Implementation
+protected:
+ virtual blargg_err_t read_v( void*, int );
+
+private:
+ callback_t const callback;
+ void* const user_data;
+};
+
+
+// Invokes callback function to read data
+extern "C" { // necessary to be usable from C
+ typedef const char* (*callback_file_reader_func_t)(
+ void* user_data, // Same value passed to constructor
+ void* out, // Buffer to place data into
+ int count, // Number of bytes to read
+ int pos // Position in file to read from
+ );
+}
+class Callback_File_Reader : public File_Reader {
+public:
+ typedef callback_file_reader_func_t callback_t;
+ Callback_File_Reader( callback_t, long size, void* user_data );
+
+// Implementation
+protected:
+ virtual blargg_err_t read_v( void*, int );
+ virtual blargg_err_t seek_v( int );
+
+private:
+ callback_t const callback;
+ void* const user_data;
+};
+
+
+#ifdef HAVE_ZLIB_H
+
+// Reads file compressed with gzip (or uncompressed)
+class Gzip_File_Reader : public File_Reader {
+public:
+
+ // Opens possibly gzipped file
+ blargg_err_t open( const char path [] );
+
+ // Closes file if one was open
+ void close();
+
+// Implementation
+public:
+ Gzip_File_Reader();
+ ~Gzip_File_Reader();
+
+protected:
+ virtual blargg_err_t read_v( void*, int );
+ virtual blargg_err_t seek_v( int );
+
+private:
+ // void* so "zlib.h" doesn't have to be included here
+ void* file_;
+};
+#endif
+
+char* blargg_to_utf8( const wchar_t* );
+wchar_t* blargg_to_wide( const char* );
+
+BLARGG_NAMESPACE_END
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.cpp b/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.cpp
new file mode 100644
index 00000000..91d2c882
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.cpp
@@ -0,0 +1,58 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "blargg_common.h"
+
+/* Copyright (C) 2008-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+BLARGG_NAMESPACE_BEGIN
+
+// defined here to avoid need for blargg_errors.cpp in simple programs
+blargg_err_def_t blargg_err_memory = BLARGG_ERR_MEMORY;
+
+void blargg_vector_::init()
+{
+ begin_ = NULL;
+ size_ = 0;
+}
+
+void blargg_vector_::clear()
+{
+ void* p = begin_;
+ begin_ = NULL;
+ size_ = 0;
+ free( p );
+}
+
+blargg_err_t blargg_vector_::resize_( size_t n, size_t elem_size )
+{
+ if ( n != size_ )
+ {
+ if ( n == 0 )
+ {
+ // Simpler to handle explicitly. Realloc will handle a size of 0,
+ // but then we have to avoid raising an error for a NULL return.
+ clear();
+ }
+ else
+ {
+ void* p = realloc( begin_, n * elem_size );
+ CHECK_ALLOC( p );
+ begin_ = p;
+ size_ = n;
+ }
+ }
+ return blargg_ok;
+}
+
+BLARGG_NAMESPACE_END
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.h b/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.h
new file mode 100644
index 00000000..44e6d39f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_common.h
@@ -0,0 +1,224 @@
+// Sets up common environment for Shay Green's libraries.
+// To change configuration options, modify blargg_config.h, not this file.
+
+// Game_Music_Emu 0.6-pre
+#ifndef BLARGG_COMMON_H
+#define BLARGG_COMMON_H
+
+#include <stdlib.h>
+#include <assert.h>
+#include <limits.h>
+
+typedef const char* blargg_err_t; // 0 on success, otherwise error string
+
+// Success; no error
+int const blargg_ok = 0;
+
+// BLARGG_RESTRICT: equivalent to C99's restrict, where supported
+#if __GNUC__ >= 3 || _MSC_VER >= 1100
+ #define BLARGG_RESTRICT __restrict
+#else
+ #define BLARGG_RESTRICT
+#endif
+
+#if __cplusplus >= 199711
+ #define BLARGG_MUTABLE mutable
+#else
+ #define BLARGG_MUTABLE
+#endif
+
+/* BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant).
+I don't just use 'abcd' because that's implementation-dependent. */
+#define BLARGG_4CHAR( a, b, c, d ) \
+ ((a&0xFF)*0x1000000 + (b&0xFF)*0x10000 + (c&0xFF)*0x100 + (d&0xFF))
+
+/* BLARGG_STATIC_ASSERT( expr ): Generates compile error if expr is 0.
+Can be used at file, function, or class scope. */
+#ifdef _MSC_VER
+ // MSVC6 (_MSC_VER < 1300) __LINE__ fails when /Zl is specified
+ #define BLARGG_STATIC_ASSERT( expr ) \
+ void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] )
+#else
+ // Others fail when declaring same function multiple times in class,
+ // so differentiate them by line
+ #define BLARGG_STATIC_ASSERT( expr ) \
+ void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] )
+#endif
+
+/* Pure virtual functions cause a vtable entry to a "called pure virtual"
+error handler, requiring linkage to the C++ runtime library. This macro is
+used in place of the "= 0", and simply expands to its argument. During
+development, it expands to "= 0", allowing detection of missing overrides. */
+#define BLARGG_PURE( def ) def
+
+/* My code depends on ASCII anywhere a character or string constant is
+compared with data read from a file, and anywhere file data is read and
+treated as a string. */
+#if '\n'!=0x0A || ' '!=0x20 || '0'!=0x30 || 'A'!=0x41 || 'a'!=0x61
+ #error "ASCII character set required"
+#endif
+
+/* My code depends on int being at least 32 bits. Almost everything these days
+uses at least 32-bit ints, so it's hard to even find a system with 16-bit ints
+to test with. The issue can't be gotten around by using a suitable blargg_int
+everywhere either, because int is often converted to implicitly when doing
+arithmetic on smaller types. */
+#if UINT_MAX < 0xFFFFFFFF
+ #error "int must be at least 32 bits"
+#endif
+
+// In case compiler doesn't support these properly. Used rarely.
+#define STATIC_CAST(T,expr) static_cast<T> (expr)
+#define CONST_CAST( T,expr) const_cast<T> (expr)
+
+// User configuration can override the above macros if necessary
+#include "blargg_config.h"
+
+#ifdef BLARGG_NAMESPACE
+ #define BLARGG_NAMESPACE_BEGIN namespace BLARGG_NAMESPACE {
+ #define BLARGG_NAMESPACE_END }
+
+ BLARGG_NAMESPACE_BEGIN
+ BLARGG_NAMESPACE_END
+ using namespace BLARGG_NAMESPACE;
+#else
+ #define BLARGG_NAMESPACE_BEGIN
+ #define BLARGG_NAMESPACE_END
+#endif
+
+BLARGG_NAMESPACE_BEGIN
+
+/* BLARGG_DEPRECATED [_TEXT] for any declarations/text to be removed in a
+future version. In GCC, we can let the compiler warn. In other compilers,
+we strip it out unless BLARGG_LEGACY is true. */
+#if BLARGG_LEGACY
+ // Allow old client code to work without warnings
+ #define BLARGG_DEPRECATED_TEXT( text ) text
+ #define BLARGG_DEPRECATED( text ) text
+#elif __GNUC__ >= 4
+ // In GCC, we can mark declarations and let the compiler warn
+ #define BLARGG_DEPRECATED_TEXT( text ) text
+ #define BLARGG_DEPRECATED( text ) __attribute__ ((deprecated)) text
+#else
+ // By default, deprecated items are removed, to avoid use in new code
+ #define BLARGG_DEPRECATED_TEXT( text )
+ #define BLARGG_DEPRECATED( text )
+#endif
+
+/* BOOST::int8_t, BOOST::int32_t, etc.
+I used BOOST since I originally was going to allow use of the boost library
+for prividing the definitions. If I'm defining them, they must be scoped or
+else they could conflict with the standard ones at global scope. Even if
+HAVE_STDINT_H isn't defined, I can't assume the typedefs won't exist at
+global scope already. */
+#if defined (HAVE_STDINT_H) || \
+ UCHAR_MAX != 0xFF || USHRT_MAX != 0xFFFF || UINT_MAX != 0xFFFFFFFF
+ #include <stdint.h>
+ #define BOOST
+#else
+ struct BOOST
+ {
+ typedef signed char int8_t;
+ typedef unsigned char uint8_t;
+ typedef short int16_t;
+ typedef unsigned short uint16_t;
+ typedef int int32_t;
+ typedef unsigned int uint32_t;
+ typedef __int64 int64_t;
+ typedef unsigned __int64 uint64_t;
+ };
+#endif
+
+/* My code is not written with exceptions in mind, so either uses new (nothrow)
+OR overrides operator new in my classes. The former is best since clients
+creating objects will get standard exceptions on failure, but that causes it
+to require the standard C++ library. So, when the client is using the C
+interface, I override operator new to use malloc. */
+
+// BLARGG_DISABLE_NOTHROW is put inside classes
+#ifndef BLARGG_DISABLE_NOTHROW
+ // throw spec mandatory in ISO C++ if NULL can be returned
+ #if __cplusplus >= 199711 || __GNUC__ >= 3 || _MSC_VER >= 1300
+ #define BLARGG_THROWS_NOTHING throw ()
+ #else
+ #define BLARGG_THROWS_NOTHING
+ #endif
+
+ #define BLARGG_DISABLE_NOTHROW \
+ void* operator new ( size_t s ) BLARGG_THROWS_NOTHING { return malloc( s ); }\
+ void operator delete( void* p ) BLARGG_THROWS_NOTHING { free( p ); }
+
+ #define BLARGG_NEW new
+#else
+ // BLARGG_NEW is used in place of new in library code
+ #include <new>
+ #define BLARGG_NEW new (std::nothrow)
+#endif
+
+ class blargg_vector_ {
+ protected:
+ void* begin_;
+ size_t size_;
+ void init();
+ blargg_err_t resize_( size_t n, size_t elem_size );
+ public:
+ size_t size() const { return size_; }
+ void clear();
+ };
+
+// Very lightweight vector for POD types (no constructor/destructor)
+template<class T>
+class blargg_vector : public blargg_vector_ {
+ union T_must_be_pod { T t; }; // fails if T is not POD
+public:
+ blargg_vector() { init(); }
+ ~blargg_vector() { clear(); }
+
+ blargg_err_t resize( size_t n ) { return resize_( n, sizeof (T) ); }
+
+ T* begin() { return static_cast<T*> (begin_); }
+ const T* begin() const { return static_cast<T*> (begin_); }
+
+ T* end() { return static_cast<T*> (begin_) + size_; }
+ const T* end() const { return static_cast<T*> (begin_) + size_; }
+
+ T& operator [] ( size_t n )
+ {
+ assert( n < size_ );
+ return static_cast<T*> (begin_) [n];
+ }
+
+ const T& operator [] ( size_t n ) const
+ {
+ assert( n < size_ );
+ return static_cast<T*> (begin_) [n];
+ }
+};
+
+// Callback function with user data.
+// blargg_callback<T> set_callback; // for user, this acts like...
+// void set_callback( T func, void* user_data = NULL ); // ...this
+// To call function, do set_callback.f( .. set_callback.data ... );
+template<class T>
+struct blargg_callback
+{
+ T f;
+ void* data;
+ blargg_callback() { f = NULL; }
+ void operator () ( T callback, void* user_data = NULL ) { f = callback; data = user_data; }
+};
+
+#ifndef _WIN32
+ // Not supported on any other platforms
+ #undef BLARGG_UTF8_PATHS
+#endif
+
+BLARGG_DEPRECATED( typedef signed int blargg_long; )
+BLARGG_DEPRECATED( typedef unsigned int blargg_ulong; )
+#if BLARGG_LEGACY
+ #define BOOST_STATIC_ASSERT BLARGG_STATIC_ASSERT
+#endif
+
+BLARGG_NAMESPACE_END
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_config.h b/plugins/gme/game-music-emu-0.6pre/gme/blargg_config.h
new file mode 100644
index 00000000..b3471d4f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_config.h
@@ -0,0 +1,55 @@
+// Library configuration. Modify this file as necessary.
+
+// Game_Music_Emu 0.6-pre
+#ifndef BLARGG_CONFIG_H
+#define BLARGG_CONFIG_H
+
+// Uncomment a #define line below to have effect described.
+
+// Allow static linking with this library and one of my other libraries
+// in the same program.
+//#define BLARGG_NAMESPACE blargg_gme
+
+// Use zlib for transparent decompression of gzipped files.
+//#define HAVE_ZLIB_H
+
+// Support only listed music types. Remove a line to disable that type.
+/* #define GME_TYPE_LIST \
+ gme_ay_type,\
+ gme_gbs_type,\
+ gme_gym_type,\
+ gme_hes_type,\
+ gme_kss_type,\
+ gme_nsf_type,\
+ gme_nsfe_type,\
+ gme_sap_type,\
+ gme_sgc_type,\
+ gme_spc_type,\
+ gme_vgm_type,\
+ gme_vgz_type
+*/
+
+// Enable platform-specific optimizations.
+//#define BLARGG_NONPORTABLE 1
+
+// Use faster sample rate convertor for SPC music.
+//#define GME_SPC_FAST_RESAMPLER 1
+
+// Use faster sample rate convertor for VGM and GYM music.
+//#define GME_VGM_FAST_RESAMPLER 1
+
+// Use faster, significantly lower quality sound synthesis for classic emulators.
+//#define BLIP_BUFFER_FAST 1
+
+// Reduce memory usage of gme.h by disabling gme_set_effects_config().
+//#define GME_DISABLE_EFFECTS 1
+
+// Force library to use assume big-endian processor.
+//#define BLARGG_BIG_ENDIAN 1
+
+// Use standard config.h if present
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_endian.h b/plugins/gme/game-music-emu-0.6pre/gme/blargg_endian.h
new file mode 100644
index 00000000..423f7101
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_endian.h
@@ -0,0 +1,189 @@
+// CPU Byte Order Utilities
+
+// Game_Music_Emu 0.6-pre
+#ifndef BLARGG_ENDIAN_H
+#define BLARGG_ENDIAN_H
+
+#include "blargg_common.h"
+
+// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16)
+#if defined (__i386__) || defined (__x86_64__) || defined (_M_IX86) || defined (_M_X64)
+ #define BLARGG_CPU_X86 1
+ #define BLARGG_CPU_CISC 1
+#endif
+
+#if defined (__powerpc__) || defined (__ppc__) || defined (__ppc64__) || \
+ defined (__POWERPC__) || defined (__powerc)
+ #define BLARGG_CPU_POWERPC 1
+ #define BLARGG_CPU_RISC 1
+#endif
+
+// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only
+// one may be #defined to 1. Only needed if something actually depends on byte order.
+#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN)
+#ifdef __GLIBC__
+ // GCC handles this for us
+ #include <endian.h>
+ #if __BYTE_ORDER == __LITTLE_ENDIAN
+ #define BLARGG_LITTLE_ENDIAN 1
+ #elif __BYTE_ORDER == __BIG_ENDIAN
+ #define BLARGG_BIG_ENDIAN 1
+ #endif
+#else
+
+#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \
+ (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234)
+ #define BLARGG_LITTLE_ENDIAN 1
+#endif
+
+#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \
+ defined (__sparc__) || BLARGG_CPU_POWERPC || \
+ (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321)
+ #define BLARGG_BIG_ENDIAN 1
+#elif !defined (__mips__)
+ // No endian specified; assume little-endian, since it's most common
+ #define BLARGG_LITTLE_ENDIAN 1
+#endif
+#endif
+#endif
+
+#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN
+ #undef BLARGG_LITTLE_ENDIAN
+ #undef BLARGG_BIG_ENDIAN
+#endif
+
+BLARGG_NAMESPACE_BEGIN
+
+inline void blargg_verify_byte_order()
+{
+ #ifndef NDEBUG
+ #if BLARGG_BIG_ENDIAN
+ volatile int i = 1;
+ assert( *(volatile char*) &i == 0 );
+ #elif BLARGG_LITTLE_ENDIAN
+ volatile int i = 1;
+ assert( *(volatile char*) &i != 0 );
+ #endif
+ #endif
+}
+
+inline unsigned get_le16( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [1] << 8 |
+ (unsigned) ((unsigned char const*) p) [0];
+}
+
+inline unsigned get_be16( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [0] << 8 |
+ (unsigned) ((unsigned char const*) p) [1];
+}
+
+inline unsigned get_le32( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [3] << 24 |
+ (unsigned) ((unsigned char const*) p) [2] << 16 |
+ (unsigned) ((unsigned char const*) p) [1] << 8 |
+ (unsigned) ((unsigned char const*) p) [0];
+}
+
+inline unsigned get_be32( void const* p )
+{
+ return (unsigned) ((unsigned char const*) p) [0] << 24 |
+ (unsigned) ((unsigned char const*) p) [1] << 16 |
+ (unsigned) ((unsigned char const*) p) [2] << 8 |
+ (unsigned) ((unsigned char const*) p) [3];
+}
+
+inline void set_le16( void* p, unsigned n )
+{
+ ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [0] = (unsigned char) n;
+}
+
+inline void set_be16( void* p, unsigned n )
+{
+ ((unsigned char*) p) [0] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [1] = (unsigned char) n;
+}
+
+inline void set_le32( void* p, unsigned n )
+{
+ ((unsigned char*) p) [0] = (unsigned char) n;
+ ((unsigned char*) p) [1] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [2] = (unsigned char) (n >> 16);
+ ((unsigned char*) p) [3] = (unsigned char) (n >> 24);
+}
+
+inline void set_be32( void* p, unsigned n )
+{
+ ((unsigned char*) p) [3] = (unsigned char) n;
+ ((unsigned char*) p) [2] = (unsigned char) (n >> 8);
+ ((unsigned char*) p) [1] = (unsigned char) (n >> 16);
+ ((unsigned char*) p) [0] = (unsigned char) (n >> 24);
+}
+
+#if BLARGG_NONPORTABLE
+ // Optimized implementation if byte order is known
+ #if BLARGG_LITTLE_ENDIAN
+ #define GET_LE16( addr ) (*(BOOST::uint16_t const*) (addr))
+ #define GET_LE32( addr ) (*(BOOST::uint32_t const*) (addr))
+ #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data))
+ #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data))
+ #elif BLARGG_BIG_ENDIAN
+ #define GET_BE16( addr ) (*(BOOST::uint16_t const*) (addr))
+ #define GET_BE32( addr ) (*(BOOST::uint32_t const*) (addr))
+ #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data))
+ #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data))
+
+ #if BLARGG_CPU_POWERPC
+ // PowerPC has special byte-reversed instructions
+ #if defined (__MWERKS__)
+ #define GET_LE16( addr ) (__lhbrx( addr, 0 ))
+ #define GET_LE32( addr ) (__lwbrx( addr, 0 ))
+ #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 ))
+ #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 ))
+ #elif defined (__GNUC__)
+ #define GET_LE16( addr ) ({unsigned short ppc_lhbrx_; __asm__ volatile( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr) : "memory" ); ppc_lhbrx_;})
+ #define GET_LE32( addr ) ({unsigned short ppc_lwbrx_; __asm__ volatile( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr) : "memory" ); ppc_lwbrx_;})
+ #define SET_LE16( addr, in ) ({__asm__ volatile( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) : "memory" );})
+ #define SET_LE32( addr, in ) ({__asm__ volatile( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) : "memory" );})
+ #endif
+ #endif
+ #endif
+#endif
+
+#ifndef GET_LE16
+ #define GET_LE16( addr ) get_le16( addr )
+ #define SET_LE16( addr, data ) set_le16( addr, data )
+#endif
+
+#ifndef GET_LE32
+ #define GET_LE32( addr ) get_le32( addr )
+ #define SET_LE32( addr, data ) set_le32( addr, data )
+#endif
+
+#ifndef GET_BE16
+ #define GET_BE16( addr ) get_be16( addr )
+ #define SET_BE16( addr, data ) set_be16( addr, data )
+#endif
+
+#ifndef GET_BE32
+ #define GET_BE32( addr ) get_be32( addr )
+ #define SET_BE32( addr, data ) set_be32( addr, data )
+#endif
+
+// auto-selecting versions
+
+inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); }
+inline void set_le( BOOST::uint32_t* p, unsigned n ) { SET_LE32( p, n ); }
+inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); }
+inline void set_be( BOOST::uint32_t* p, unsigned n ) { SET_BE32( p, n ); }
+inline unsigned get_le( BOOST::uint16_t const* p ) { return GET_LE16( p ); }
+inline unsigned get_le( BOOST::uint32_t const* p ) { return GET_LE32( p ); }
+inline unsigned get_be( BOOST::uint16_t const* p ) { return GET_BE16( p ); }
+inline unsigned get_be( BOOST::uint32_t const* p ) { return GET_BE32( p ); }
+
+BLARGG_NAMESPACE_END
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.cpp b/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.cpp
new file mode 100644
index 00000000..66a5bb93
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.cpp
@@ -0,0 +1,117 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "blargg_errors.h"
+
+/* Copyright (C) 2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+BLARGG_NAMESPACE_BEGIN
+
+blargg_err_def_t blargg_err_generic = BLARGG_ERR_GENERIC;
+// blargg_err_memory is defined in blargg_common.cpp
+blargg_err_def_t blargg_err_caller = BLARGG_ERR_CALLER;
+blargg_err_def_t blargg_err_internal = BLARGG_ERR_INTERNAL;
+blargg_err_def_t blargg_err_limitation = BLARGG_ERR_LIMITATION;
+
+blargg_err_def_t blargg_err_file_missing = BLARGG_ERR_FILE_MISSING;
+blargg_err_def_t blargg_err_file_read = BLARGG_ERR_FILE_READ;
+blargg_err_def_t blargg_err_file_write = BLARGG_ERR_FILE_WRITE;
+blargg_err_def_t blargg_err_file_io = BLARGG_ERR_FILE_IO;
+blargg_err_def_t blargg_err_file_full = BLARGG_ERR_FILE_FULL;
+blargg_err_def_t blargg_err_file_eof = BLARGG_ERR_FILE_EOF;
+
+blargg_err_def_t blargg_err_file_type = BLARGG_ERR_FILE_TYPE;
+blargg_err_def_t blargg_err_file_feature = BLARGG_ERR_FILE_FEATURE;
+blargg_err_def_t blargg_err_file_corrupt = BLARGG_ERR_FILE_CORRUPT;
+
+const char* blargg_err_str( blargg_err_t err )
+{
+ if ( !err )
+ return "";
+
+ if ( *err == BLARGG_ERR_TYPE("")[0] )
+ return err + 1;
+
+ return err;
+}
+
+bool blargg_is_err_type( blargg_err_t err, const char type [] )
+{
+ if ( err )
+ {
+ // True if first strlen(type) characters of err match type
+ char const* p = err;
+ while ( *type && *type == *p )
+ {
+ type++;
+ p++;
+ }
+
+ if ( !*type )
+ return true;
+ }
+
+ return false;
+}
+
+const char* blargg_err_details( blargg_err_t err )
+{
+ const char* p = err;
+ if ( !p )
+ {
+ p = "";
+ }
+ else if ( *p == BLARGG_ERR_TYPE("")[0] )
+ {
+ while ( *p && *p != ';' )
+ p++;
+
+ // Skip ; and space after it
+ if ( *p )
+ {
+ p++;
+
+ check( *p == ' ' );
+ if ( *p )
+ p++;
+ }
+ }
+ return p;
+}
+
+int blargg_err_to_code( blargg_err_t err, blargg_err_to_code_t const codes [] )
+{
+ if ( !err )
+ return 0;
+
+ while ( codes->str && !blargg_is_err_type( err, codes->str ) )
+ codes++;
+
+ return codes->code;
+}
+
+blargg_err_t blargg_code_to_err( int code, blargg_err_to_code_t const codes [] )
+{
+ if ( !code )
+ return blargg_ok;
+
+ while ( codes->str && codes->code != code )
+ codes++;
+
+ if ( !codes->str )
+ return blargg_err_generic;
+
+ return codes->str;
+}
+
+BLARGG_NAMESPACE_END
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.h b/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.h
new file mode 100644
index 00000000..e913bd5a
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_errors.h
@@ -0,0 +1,84 @@
+// Error strings and conversion functions
+
+// Game_Music_Emu 0.6-pre
+#ifndef BLARGG_ERRORS_H
+#define BLARGG_ERRORS_H
+
+#ifndef BLARGG_COMMON_H
+ #include "blargg_common.h"
+#endif
+
+BLARGG_NAMESPACE_BEGIN
+
+typedef const char blargg_err_def_t [];
+
+// Basic errors
+extern blargg_err_def_t blargg_err_generic;
+extern blargg_err_def_t blargg_err_memory;
+extern blargg_err_def_t blargg_err_caller;
+extern blargg_err_def_t blargg_err_internal;
+extern blargg_err_def_t blargg_err_limitation;
+
+// File low-level
+extern blargg_err_def_t blargg_err_file_missing; // not found
+extern blargg_err_def_t blargg_err_file_read;
+extern blargg_err_def_t blargg_err_file_write;
+extern blargg_err_def_t blargg_err_file_io;
+extern blargg_err_def_t blargg_err_file_full;
+extern blargg_err_def_t blargg_err_file_eof;
+
+// File high-level
+extern blargg_err_def_t blargg_err_file_type; // wrong file type
+extern blargg_err_def_t blargg_err_file_feature;
+extern blargg_err_def_t blargg_err_file_corrupt;
+
+// C string describing error, or "" if err == NULL
+const char* blargg_err_str( blargg_err_t err );
+
+// True iff error is of given type, or false if err == NULL
+bool blargg_is_err_type( blargg_err_t, const char type [] );
+
+// Details of error without describing main cause, or "" if err == NULL
+const char* blargg_err_details( blargg_err_t err );
+
+// Converts error string to integer code using mapping table. Calls blargg_is_err_type()
+// for each str and returns code on first match. Returns 0 if err == NULL.
+struct blargg_err_to_code_t {
+ const char* str;
+ int code;
+};
+int blargg_err_to_code( blargg_err_t err, blargg_err_to_code_t const [] );
+
+// Converts error code back to string. If code == 0, returns NULL. If not in table,
+// returns blargg_err_generic.
+blargg_err_t blargg_code_to_err( int code, blargg_err_to_code_t const [] );
+
+// Generates error string literal with details of cause
+#define BLARGG_ERR( type, str ) (type "; " str)
+
+// Extra space to make it clear when blargg_err_str() isn't called to get
+// printable version of error. At some point, I might prefix error strings
+// with a code, to speed conversion to a code.
+#define BLARGG_ERR_TYPE( str ) " " str
+
+// Error types to pass to BLARGG_ERR macro
+#define BLARGG_ERR_GENERIC BLARGG_ERR_TYPE( "operation failed" )
+#define BLARGG_ERR_MEMORY BLARGG_ERR_TYPE( "out of memory" )
+#define BLARGG_ERR_CALLER BLARGG_ERR_TYPE( "internal usage bug" )
+#define BLARGG_ERR_INTERNAL BLARGG_ERR_TYPE( "internal bug" )
+#define BLARGG_ERR_LIMITATION BLARGG_ERR_TYPE( "exceeded limitation" )
+
+#define BLARGG_ERR_FILE_MISSING BLARGG_ERR_TYPE( "file not found" )
+#define BLARGG_ERR_FILE_READ BLARGG_ERR_TYPE( "couldn't open file" )
+#define BLARGG_ERR_FILE_WRITE BLARGG_ERR_TYPE( "couldn't modify file" )
+#define BLARGG_ERR_FILE_IO BLARGG_ERR_TYPE( "read/write error" )
+#define BLARGG_ERR_FILE_FULL BLARGG_ERR_TYPE( "disk full" )
+#define BLARGG_ERR_FILE_EOF BLARGG_ERR_TYPE( "truncated file" )
+
+#define BLARGG_ERR_FILE_TYPE BLARGG_ERR_TYPE( "wrong file type" )
+#define BLARGG_ERR_FILE_FEATURE BLARGG_ERR_TYPE( "unsupported file feature" )
+#define BLARGG_ERR_FILE_CORRUPT BLARGG_ERR_TYPE( "corrupt file" )
+
+BLARGG_NAMESPACE_END
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/blargg_source.h b/plugins/gme/game-music-emu-0.6pre/gme/blargg_source.h
new file mode 100644
index 00000000..a195b9d7
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/blargg_source.h
@@ -0,0 +1,135 @@
+/* Included at the beginning of library source files, AFTER all other #include
+lines. Sets up helpful macros and services used in my source code. Since this
+is only "active" in my source code, I don't have to worry about polluting the
+global namespace with unprefixed names. */
+
+// Game_Music_Emu 0.6-pre
+#ifndef BLARGG_SOURCE_H
+#define BLARGG_SOURCE_H
+
+#ifndef BLARGG_COMMON_H // optimization only
+ #include "blargg_common.h"
+#endif
+#include "blargg_errors.h"
+
+#include <string.h> /* memcpy(), memset(), memmove() */
+#include <stddef.h> /* offsetof() */
+
+/* The following four macros are for debugging only. Some or all might be
+defined to do nothing, depending on the circumstances. Described is what
+happens when a particular macro is defined to do something. When defined to
+do nothing, the macros do NOT evaluate their argument(s). */
+
+/* If expr is false, prints file and line number, then aborts program. Meant
+for checking internal state and consistency. A failed assertion indicates a bug
+in MY code.
+
+void assert( bool expr ); */
+#include <assert.h>
+
+/* If expr is false, prints file and line number, then aborts program. Meant
+for checking caller-supplied parameters and operations that are outside the
+control of the module. A failed requirement probably indicates a bug in YOUR
+code.
+
+void require( bool expr ); */
+#undef require
+#define require( expr ) assert( expr )
+
+/* Like printf() except output goes to debugging console/file.
+
+void dprintf( const char format [], ... ); */
+#ifdef NDEBUG
+static inline void blargg_dprintf_( const char [], ... ) { }
+#undef dprintf
+#define dprintf (1) ? (void) 0 : blargg_dprintf_
+#else
+#include <stdarg.h>
+#include <stdio.h>
+static inline void blargg_dprintf_( const char * fmt, ... )
+{
+}
+#undef dprintf
+#define dprintf blargg_dprintf_
+#endif
+
+/* If expr is false, prints file and line number to debug console/log, then
+continues execution normally. Meant for flagging potential problems or things
+that should be looked into, but that aren't serious problems.
+
+void check( bool expr ); */
+#undef check
+#define check( expr ) ((void) 0)
+
+/* If expr yields non-NULL error string, returns it from current function,
+otherwise continues normally. */
+#undef RETURN_ERR
+#define RETURN_ERR( expr ) \
+ do {\
+ blargg_err_t blargg_return_err_ = (expr);\
+ if ( blargg_return_err_ )\
+ return blargg_return_err_;\
+ } while ( 0 )
+
+/* If ptr is NULL, returns out-of-memory error, otherwise continues normally. */
+#undef CHECK_ALLOC
+#define CHECK_ALLOC( ptr ) \
+ do {\
+ if ( !(ptr) )\
+ return blargg_err_memory;\
+ } while ( 0 )
+
+/* The usual min/max functions for built-in types.
+
+template<typename T> T min( T x, T y ) { return x < y ? x : y; }
+template<typename T> T max( T x, T y ) { return x > y ? x : y; } */
+#define BLARGG_DEF_MIN_MAX( type ) \
+ static inline type blargg_min( type x, type y ) { if ( y < x ) x = y; return x; }\
+ static inline type blargg_max( type x, type y ) { if ( x < y ) x = y; return x; }
+
+BLARGG_DEF_MIN_MAX( int )
+BLARGG_DEF_MIN_MAX( unsigned )
+BLARGG_DEF_MIN_MAX( long )
+BLARGG_DEF_MIN_MAX( unsigned long )
+BLARGG_DEF_MIN_MAX( float )
+BLARGG_DEF_MIN_MAX( double )
+
+#undef min
+#define min blargg_min
+
+#undef max
+#define max blargg_max
+
+// typedef unsigned char byte;
+typedef unsigned char blargg_byte;
+#undef byte
+#define byte blargg_byte
+
+#ifndef BLARGG_EXPORT
+ #if defined (_WIN32) && BLARGG_BUILD_DLL
+ #define BLARGG_EXPORT __declspec(dllexport)
+ #elif defined (__GNUC__)
+ // can always set visibility, even when not building DLL
+ #define BLARGG_EXPORT __attribute__ ((visibility ("default")))
+ #else
+ #define BLARGG_EXPORT
+ #endif
+#endif
+
+#if BLARGG_LEGACY
+ #define BLARGG_CHECK_ALLOC CHECK_ALLOC
+ #define BLARGG_RETURN_ERR RETURN_ERR
+#endif
+
+// Called after failed operation when overall operation may still complete OK.
+// Only used by unit testing framework.
+#undef ACK_FAILURE
+#define ACK_FAILURE() ((void)0)
+
+/* BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf etc.
+and check */
+#ifdef BLARGG_SOURCE_BEGIN
+ #include BLARGG_SOURCE_BEGIN
+#endif
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/divfix.h b/plugins/gme/game-music-emu-0.6pre/gme/divfix.h
new file mode 100644
index 00000000..21212df3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/divfix.h
@@ -0,0 +1,18 @@
+
+static Uint32 DivFix(Uint32 p1, Uint32 p2, Uint32 fix)
+{
+ Uint32 ret;
+ ret = p1 / p2;
+ p1 = p1 % p2;/* p1 = p1 - p2 * ret; */
+ while (fix--)
+ {
+ p1 += p1;
+ ret += ret;
+ if (p1 >= p2)
+ {
+ p1 -= p2;
+ ret++;
+ }
+ }
+ return ret;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/emu2413.cpp b/plugins/gme/game-music-emu-0.6pre/gme/emu2413.cpp
new file mode 100644
index 00000000..8ab07be6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/emu2413.cpp
@@ -0,0 +1,742 @@
+// Permission is granted to anyone to use this software for any purpose,
+// including commercial applications. To alter this software and redistribute it freely,
+// if the origin of this software is not misrepresented.
+
+// written by Mitsutaka Okazaki 2001
+// Modified by xodnizel to remove code not needed for the VRC7, among other things.
+// Optimized performance and code size - Shay Green
+
+// References:
+// fmopl.c -- 1999,2000 written by Tatsuyuki Satoh (MAME development).
+// fmopl.c(fixed) -- (C) 2002 Jarek Burczynski.
+// s_opl.c -- 2001 written by Mamiya (NEZplug development).
+// fmgen.cpp -- 1999,2000 written by cisc.
+// fmpac.ill -- 2000 created by NARUTO.
+// MSX-Datapack
+// YMU757 data sheet
+// YM2143 data sheet
+
+#include <assert.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "emu2413.h"
+
+#undef PI
+#define PI 3.14159265358979323846
+
+static const unsigned char default_inst[15][8] =
+{
+// VRC7 instruments, January 17, 2004 update -Xodnizel
+ {0x03, 0x21, 0x04, 0x06, 0x8D, 0xF2, 0x42, 0x17},
+ {0x13, 0x41, 0x05, 0x0E, 0x99, 0x96, 0x63, 0x12},
+ {0x31, 0x11, 0x10, 0x0A, 0xF0, 0x9C, 0x32, 0x02},
+ {0x21, 0x61, 0x1D, 0x07, 0x9F, 0x64, 0x20, 0x27},
+ {0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28},
+ {0x02, 0x01, 0x06, 0x00, 0xF0, 0xF2, 0x03, 0x95},
+ {0x21, 0x61, 0x1C, 0x07, 0x82, 0x81, 0x16, 0x07},
+ {0x23, 0x21, 0x1A, 0x17, 0xEF, 0x82, 0x25, 0x15},
+ {0x25, 0x11, 0x1F, 0x00, 0x86, 0x41, 0x20, 0x11},
+ {0x85, 0x01, 0x1F, 0x0F, 0xE4, 0xA2, 0x11, 0x12},
+ {0x07, 0xC1, 0x2B, 0x45, 0xB4, 0xF1, 0x24, 0xF4},
+ {0x61, 0x23, 0x11, 0x06, 0x96, 0x96, 0x13, 0x16},
+ {0x01, 0x02, 0xD3, 0x05, 0x82, 0xA2, 0x31, 0x51},
+ {0x61, 0x22, 0x0D, 0x02, 0xC3, 0x7F, 0x24, 0x05},
+ {0x21, 0x62, 0x0E, 0x00, 0xA1, 0xA0, 0x44, 0x17},
+
+};
+
+#define EG2DB(d) ((d)*(e_int32)(EG_STEP/DB_STEP))
+#define TL2EG(d) ((d)*(e_int32)(TL_STEP/EG_STEP))
+#define SL2EG(d) ((d)*(e_int32)(SL_STEP/EG_STEP))
+
+// Bits for liner value
+#define DB2LIN_AMP_BITS 11
+#define SLOT_AMP_BITS (DB2LIN_AMP_BITS)
+
+// Bits for envelope phase incremental counter
+#define EG_DP_BITS 22
+#define EG_DP_WIDTH (1<<EG_DP_BITS)
+
+// PM table is calcurated by PM_AMP * pow(2,PM_DEPTH*sin(x)/1200)
+#define PM_AMP_BITS 8
+#define PM_AMP (1<<PM_AMP_BITS)
+
+// PM speed(Hz) and depth(cent)
+#define PM_SPEED 6.4
+#define PM_DEPTH 13.75
+
+// AM speed(Hz) and depth(dB)
+#define AM_SPEED 3.7
+//#define AM_DEPTH 4.8
+#define AM_DEPTH 2.4
+
+// Cut the lower b bit(s) off.
+#define HIGHBITS(c,b) ((c)>>(b))
+
+// Expand x which is s bits to d bits.
+#define EXPAND_BITS(x,s,d) ((x)<<((d)-(s)))
+
+#define CAR_OFFSET 1
+#define MOD_CAR( o, x, sel ) (&((o)->slot + (sel)) [(x) << 1])
+#define MOD(o,x) MOD_CAR( o, x, 0 )
+#define CAR(o,x) MOD_CAR( o, x, 1 )
+
+// Definition of envelope mode
+enum { SUSHOLD, SETTLE, ATTACK, DECAY, SUSTINE, RELEASE, FINISH };
+
+inline static void update_eg_dphase_inl ( OPLL* opll, OPLL_SLOT* slot, e_int32 slot_eg_mode )
+{
+ e_uint32 result = 0;
+ int index = slot->patch.RR;
+ switch ( slot_eg_mode )
+ {
+ case ATTACK:
+ result = opll->dphaseARTable[slot->patch.AR][slot->rks];
+ break;
+
+ case DECAY:
+ index = slot->patch.DR;
+ goto common;
+
+ case RELEASE:
+ if (slot->sustine)
+ index = 5;
+ else if (!slot->patch.EG)
+ index = 7;
+ case SUSTINE:
+ common:
+ result = opll->dphaseDRTable [index] [slot->rks];
+ case SUSHOLD:
+ case FINISH:
+ default:
+ break;
+ }
+
+ slot->eg_dphase = result;
+}
+
+// out = in, then verify that value wasn't truncated
+#define ASSIGN( out, in )\
+ ((out = in), assert( out == in ))
+
+static void maketables ( OPLL* opll )
+{
+ e_int32 i;
+
+ // Table for Pitch Modulator
+ for (i = 0; i < PM_PG_WIDTH; i++)
+ ASSIGN( opll->pmtable[i],
+ (e_int32) ((double) PM_AMP * pow (2, (double) PM_DEPTH * sin (2.0 * PI * i / PM_PG_WIDTH) / 1200)) );
+
+ // Table for Amp Modulator
+ for ( i = 0; i < AM_PG_WIDTH; i++)
+ ASSIGN( opll->amtable[i],
+ (e_int32) ((double) AM_DEPTH / 2 / DB_STEP * (1.0 + sin (2.0 * PI * i / PM_PG_WIDTH))) );
+
+ // Table for dB(0 -- (1<<DB_BITS)-1) to Liner(0 -- DB2LIN_AMP_WIDTH)
+ for (i = 0; i < DB_MUTE; i++)
+ ASSIGN( opll->DB2LIN_TABLE[i],
+ (e_int16) ((double) ((1 << DB2LIN_AMP_BITS) - 1) * pow (10, -(double) i * DB_STEP / 20)) );
+
+ // TODO: remove (calloc already ensures zero fill)
+ //for (i = DB_MUTE; i < 2 * DB_MUTE; i++)
+ // opll->DB2LIN_TABLE[i] = 0;
+
+ for (i = 0; i < 2 * DB_MUTE; i++)
+ ASSIGN( opll->DB2LIN_TABLE[i + DB_MUTE + DB_MUTE],
+ (e_int16) (-opll->DB2LIN_TABLE[i]) );
+
+ // Table for AR to LogCurve.
+ {
+ ASSIGN( opll->AR_ADJUST_TABLE[0], (1 << EG_BITS) );
+ for (int i = 1; i < 128; i++)
+ ASSIGN( opll->AR_ADJUST_TABLE[i],
+ (e_uint16) ((double) (1 << EG_BITS) - 1 - (1 << EG_BITS) * log ((double)i) / log (128.)) );
+ }
+
+ {
+ #define dB2(x) ((x)*2)
+ static const double kltable[16] = {
+ dB2 (0.000), dB2 (9.000), dB2 (12.000), dB2 (13.875), dB2 (15.000), dB2 (16.125), dB2 (16.875), dB2 (17.625),
+ dB2 (18.000), dB2 (18.750), dB2 (19.125), dB2 (19.500), dB2 (19.875), dB2 (20.250), dB2 (20.625), dB2 (21.000)
+ };
+
+ for (int fnum = 0; fnum < 16; fnum++)
+ {
+ for (int block = 0; block < 8; block++)
+ {
+ for (int TL = 0; TL < 64; TL++)
+ {
+ e_uint32 eg = TL2EG( TL );
+ ASSIGN( opll->tllTable[fnum][block][TL][0], eg );
+ for (int KL = 1; KL < 4; KL++)
+ {
+ e_int32 tmp = (e_int32) (kltable[fnum] - dB2 (3.000) * (7 - block));
+ e_uint32 n = eg;
+ if ( tmp > 0 )
+ n += (e_uint32) ((tmp >> (3 - KL)) / EG_STEP);
+ ASSIGN( opll->tllTable[fnum][block][TL][KL], n );
+ }
+ }
+ }
+ }
+ }
+
+ {
+ for (int fnum8 = 0; fnum8 < 2; fnum8++)
+ {
+ for (int block = 0; block < 8; block++)
+ {
+ ASSIGN( opll->rksTable[fnum8][block][0], block >> 1 );
+ for (int KR = 1; KR < 2; KR++)
+ ASSIGN( opll->rksTable[fnum8][block][KR], (block << 1) + fnum8 );
+ }
+ }
+ }
+
+ // Sin Table
+ for (i = 0; i < PG_WIDTH / 4; i++)
+ {
+ double d = sin (2.0 * PI / PG_WIDTH * i);
+
+ // Liner(+0.0 - +1.0) to dB((1<<DB_BITS) - 1 -- 0)
+ e_int32 x = DB_MUTE - 1;
+ if ( d )
+ {
+ e_int32 y = -(e_int32) (20.0 / DB_STEP * log10 (d));
+ if ( x > y )
+ x = y;
+ }
+
+ ASSIGN( opll->sintable [0] [i], (e_uint32) x );
+ }
+
+ for (i = 0; i < PG_WIDTH / 4; i++)
+ ASSIGN( opll->sintable [0] [PG_WIDTH / 2 - 1 - i], opll->sintable [0] [i] );
+
+ for (i = 0; i < PG_WIDTH / 2; i++)
+ ASSIGN( opll->sintable [0] [PG_WIDTH / 2 + i], (e_uint32) (DB_MUTE + DB_MUTE + opll->sintable [0] [i]) );
+
+ for (i = 0; i < PG_WIDTH / 2; i++)
+ ASSIGN( opll->sintable [1] [i], opll->sintable [0] [i] );
+
+ for (i = PG_WIDTH / 2; i < PG_WIDTH; i++)
+ ASSIGN( opll->sintable [1] [i], opll->sintable [0] [0] );
+
+ //makeDefaultPatch ();
+
+ // internal refresh
+
+ // Phase increment counter table
+ {
+ static int const mltable[16] = {
+ 1, 1 * 2, 2 * 2, 3 * 2, 4 * 2, 5 * 2, 6 * 2, 7 * 2, 8 * 2,
+ 9 * 2, 10 * 2, 10 * 2, 12 * 2, 12 * 2, 15 * 2, 15 * 2
+ };
+ for (int fnum = 0; fnum < 512; fnum++)
+ for (int block = 0; block < 8; block++)
+ for (int ML = 0; ML < 16; ML++)
+ ASSIGN( opll->dphaseTable[fnum][block][ML],
+ (((fnum * mltable[ML]) << block) >> (20 - DP_BITS)) );
+ }
+
+ // Rate Table for Attack
+ {
+ for (int Rks = 0; Rks < 16; Rks++)
+ {
+ // TODO: remove (calloc already ensures zero fill)
+ //opll->dphaseARTable[ 0][Rks] = 0;
+ //opll->dphaseARTable[15][Rks] = 0;
+ int RL = (Rks & 3) * 3 + 12;
+ for (int AR = 1; AR < 15; AR++)
+ {
+ int RM = AR + (Rks >> 2);
+ if (RM > 15)
+ RM = 15;
+ ASSIGN( opll->dphaseARTable[AR][Rks], RL << (RM + 1) );
+ }
+ }
+ }
+
+ // Rate Table for Decay and Release
+ {
+ for (int Rks = 0; Rks < 16; Rks++)
+ {
+ // TODO: remove (calloc already ensures zero fill)
+ //opll->dphaseDRTable[0][Rks] = 0;
+ int RL = (Rks & 3) + 4;
+ for (int DR = 1; DR < 16; DR++)
+ {
+ int RM = DR + (Rks >> 2);
+ if (RM > 15)
+ RM = 15;
+ ASSIGN( opll->dphaseDRTable[DR][Rks], RL << (RM - 1) );
+ }
+ }
+ }
+}
+
+OPLL* VRC7_new( long clock_rate )
+{
+ OPLL* opll = (OPLL*) calloc( sizeof *opll, 1 );
+ if ( opll )
+ {
+ maketables( opll );
+ ASSIGN( opll->pm_dphase, (e_uint32) (PM_SPEED * PM_DP_WIDTH / (clock_rate / 72)) );
+ ASSIGN( opll->am_dphase, (e_uint32) (AM_SPEED * AM_DP_WIDTH / (clock_rate / 72)) );
+
+ VRC7_reset (opll);
+ }
+ return opll;
+}
+
+void VRC7_delete( OPLL* opll )
+{
+ free (opll);
+}
+
+// Reset whole of OPLL except patch datas.
+void VRC7_reset( OPLL* opll )
+{
+ opll->pm_phase = opll->pm_dphase;
+ opll->am_phase = opll->am_dphase;
+
+ int i;
+ for ( i = 0; i < 12; i++)
+ {
+ OPLL_SLOT* slot = &opll->slot[i];
+ memset( slot, 0, offsetof (OPLL_SLOT,patch) );
+ slot->sintbl = opll->sintable [0];
+ slot->eg_mode = SETTLE;
+ slot->eg_phase = EG_DP_WIDTH;
+ }
+
+ for (i = 0; i < 0x40; i++)
+ VRC7_writeReg (opll, i, 0);
+}
+
+// Force Refresh (When external program changes some parameters).
+/*
+void VRC7_forceRefresh( OPLL* opll )
+{
+ for (e_int32 i = 0; i < 12; i++)
+ UPDATE_ALL( opll, &opll->slot[i], i & 1 );
+}
+*/
+
+// Convert Amp(0 to EG_HEIGHT) to Phase(0 to 2PI).
+#if ( SLOT_AMP_BITS - PG_BITS ) > 0
+#define wave2_2pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS ))
+#else
+#define wave2_2pi(e) ( (e) << ( PG_BITS - SLOT_AMP_BITS ))
+#endif
+
+// Convert Amp(0 to EG_HEIGHT) to Phase(0 to 4PI).
+#if ( SLOT_AMP_BITS - PG_BITS - 1 ) == 0
+#define wave2_4pi(e) (e)
+#elif ( SLOT_AMP_BITS - PG_BITS - 1 ) > 0
+#define wave2_4pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 1 ))
+#else
+#define wave2_4pi(e) ( (e) << ( 1 + PG_BITS - SLOT_AMP_BITS ))
+#endif
+
+// Convert Amp(0 to EG_HEIGHT) to Phase(0 to 8PI).
+#if ( SLOT_AMP_BITS - PG_BITS - 2 ) == 0
+#define wave2_8pi(e) (e)
+#elif ( SLOT_AMP_BITS - PG_BITS - 2 ) > 0
+#define wave2_8pi(e) ( (e) >> ( SLOT_AMP_BITS - PG_BITS - 2 ))
+#else
+#define wave2_8pi(e) ( (e) << ( 2 + PG_BITS - SLOT_AMP_BITS ))
+#endif
+
+void VRC7_run( OPLL* opll )
+{
+ // PM
+ int const opll_lfo_pm = opll->pmtable [HIGHBITS( opll->pm_phase, PM_DP_BITS - PM_PG_BITS )];
+ opll->pm_phase = (opll->pm_phase + opll->pm_dphase) & (PM_DP_WIDTH - 1);
+
+ {
+ int n = 12;
+ OPLL_SLOT* slot = opll->slot;
+ do
+ {
+ // phase
+ int step = slot->dphase;
+ if ( slot->patch.PM ) // 36%
+ step = (step * opll_lfo_pm) >> PM_AMP_BITS;
+
+ e_uint32 slot_phase = (slot->phase + step) & (DP_WIDTH - 1);
+ slot->phase = slot_phase;
+ slot->pgout = HIGHBITS( slot_phase, DP_BASE_BITS );
+
+ slot++;
+ }
+ while ( --n );
+ }
+
+ // AM
+ int const opll_lfo_am = opll->amtable [HIGHBITS( opll->am_phase, AM_DP_BITS - AM_PG_BITS )];
+ opll->am_phase = (opll->am_phase + opll->am_dphase) & (AM_DP_WIDTH - 1);
+
+ int n = 12;
+ OPLL_SLOT* slot = opll->slot;
+ do
+ {
+ // envelope
+ e_uint32 egout = HIGHBITS( slot->eg_phase, EG_DP_BITS - EG_BITS );
+
+ switch ( slot->eg_mode )
+ {
+ case SUSHOLD: // 54%
+ if ( slot->patch.EG ) // 99%
+ break;
+ slot->eg_mode = SUSTINE;
+ update_eg_dphase_inl( opll, slot, SUSTINE );
+ break;
+
+ case DECAY:{// 23%
+ #define S2E(x) (SL2EG((e_int32)(x/SL_STEP))<<(EG_DP_BITS-EG_BITS))
+ static const e_uint32 SL[16] = {
+ S2E (0.0), S2E (3.0), S2E (6.0), S2E (9.0), S2E (12.0), S2E (15.0), S2E (18.0), S2E (21.0),
+ S2E (24.0), S2E (27.0), S2E (30.0), S2E (33.0), S2E (36.0), S2E (39.0), S2E (42.0), S2E (48.0)
+ };
+ slot->eg_phase += slot->eg_dphase;
+ if ( slot->eg_phase >= SL [slot->patch.SL] )
+ {
+ slot->eg_phase = SL [slot->patch.SL];
+ if ( slot->patch.EG )
+ {
+ slot->eg_mode = SUSHOLD;
+ update_eg_dphase_inl( opll, slot, SUSHOLD );
+ }
+ else
+ {
+ slot->eg_mode = SUSTINE;
+ update_eg_dphase_inl( opll, slot, SUSTINE );
+ }
+ }
+ break;
+ }
+
+ case ATTACK: // 3%
+ egout = opll->AR_ADJUST_TABLE[egout];
+ slot->eg_phase += slot->eg_dphase;
+ if((EG_DP_WIDTH & slot->eg_phase)||(slot->patch.AR==15))
+ {
+ egout = 0;
+ slot->eg_phase = 0;
+ slot->eg_mode = DECAY;
+ update_eg_dphase_inl( opll, slot, DECAY );
+ }
+ break;
+
+ case SUSTINE:
+ case RELEASE: // 18%
+ slot->eg_phase += slot->eg_dphase;
+ if ( egout < (1 << EG_BITS) )
+ break;
+ slot->eg_mode = FINISH;
+ case FINISH: // 2%
+ default:
+ egout = (1 << EG_BITS) - 1;
+ break;
+ }
+
+ egout = EG2DB( egout + slot->tll );
+ if ( slot->patch.AM )
+ egout += opll_lfo_am;
+
+ if ( egout > DB_MUTE - 1 )
+ egout = DB_MUTE;
+
+ slot->egout = egout;
+
+ slot++;
+ }
+ while ( --n );
+}
+
+e_uint32 VRC7_calcCh( OPLL* opll, e_uint32 ch )
+{
+ OPLL_SLOT* slot = MOD( opll, ch );
+
+ // modulator
+ e_int32 feedback;
+ {
+ e_int32 fm = wave2_4pi( slot->feedback ) >> slot->patch.FB_shift;
+ int index = (slot->pgout + fm) & (PG_WIDTH - 1);
+ feedback = opll->DB2LIN_TABLE [slot->sintbl [index] + slot->egout];
+ assert( slot->egout < DB_MUTE || feedback == 0 ); // was DB_MUTE - 1 in original
+
+ e_int32 slot_output_1 = slot->output [0];
+
+ if ( slot [CAR_OFFSET].eg_mode == FINISH ) // 3%
+ return 0;
+
+ slot->output [0] = feedback;
+ slot->output [1] = slot_output_1;
+
+ feedback = (feedback + slot_output_1) >> 1;
+ slot->feedback = feedback;
+ }
+ slot += CAR_OFFSET;
+
+ // carrier
+ e_int32 output = opll->DB2LIN_TABLE [
+ slot->sintbl [(slot->pgout + wave2_8pi( feedback )) & (PG_WIDTH-1)] + slot->egout];
+ assert( slot->egout < DB_MUTE || output == 0 ); // was DB_MUTE - 1 in original
+
+ e_int32 slot_output_1 = slot->output [0];
+ slot->output [0] = output;
+ slot->output [1] = slot_output_1;
+
+ return (output + slot_output_1) >> 1;
+}
+
+static void setInstrument( OPLL* opll, unsigned i, unsigned inst )
+{
+ opll->patch_number[i]=inst;
+
+ const e_uint8* src = opll->CustInst;
+ if(inst)
+ src=default_inst[inst-1];
+
+ OPLL_PATCH* modp=&MOD(opll,i)->patch;
+ OPLL_PATCH* carp=&CAR(opll,i)->patch;
+
+ int src_0 = src [0];
+ modp->AM=(src_0>>7)&1;
+ modp->PM=(src_0>>6)&1;
+ modp->EG=(src_0>>5&1);
+ modp->KR=(src_0>>4)&1;
+ modp->ML=(src_0&0xF);
+
+ int src_1 = src [1];
+ carp->AM=(src_1>>7)&1;
+ carp->PM=(src_1>>6)&1;
+ carp->EG=(src_1>>5&1);
+ carp->KR=(src_1>>4)&1;
+ carp->ML=(src_1&0xF);
+
+ int src_2 = src [2];
+ modp->KL=(src_2>>6)&3;
+ modp->TL=(src_2&0x3F);
+
+ int src_3 = src [3];
+ carp->KL = (src_3 >> 6) & 3;
+ carp->WF = (src_3 >> 4) & 1;
+
+ modp->WF = (src_3 >> 3) & 1;
+
+ int FB = (src_3) & 7;
+ modp->FB_shift = (FB ? 7 - FB : 31);
+
+ int src_4 = src [4];
+ modp->AR = (src_4>>4)&0xF;
+ modp->DR = (src_4&0xF);
+
+ int src_5 = src [5];
+ carp->AR = (src_5>>4)&0xF;
+ carp->DR = (src_5&0xF);
+
+ int src_6 = src [6];
+ modp->SL = (src_6>>4)&0xF;
+ modp->RR = (src_6&0xF);
+
+ int src_7 = src [7];
+ carp->SL = (src_7>>4)&0xF;
+ carp->RR = (src_7&0xF);
+}
+
+static void update_eg_dphase( OPLL* opll, OPLL_SLOT* slot )
+{
+ update_eg_dphase_inl( opll, slot, slot->eg_mode );
+}
+
+#define UPDATE_PG(S) (S)->dphase = opll->dphaseTable[(S)->fnum][(S)->block][(S)->patch.ML]
+#define UPDATE_RKS(S) (S)->rks = opll->rksTable[((S)->fnum)>>8][(S)->block][(S)->patch.KR]
+#define UPDATE_WF(S) (S)->sintbl = opll->sintable [(S)->patch.WF]
+#define UPDATE_EG(S) update_eg_dphase( opll, S )
+
+inline static void UPDATE_TLL( OPLL* opll, OPLL_SLOT* S, int type )
+{
+ int index = (type ? (S)->volume : (S)->patch.TL);
+ (S)->tll = opll->tllTable [(S)->fnum >> 5] [(S)->block] [index] [(S)->patch.KL];
+}
+
+static void UPDATE_ALL( OPLL* opll, OPLL_SLOT* S, int type )
+{
+ UPDATE_PG(S);
+ UPDATE_TLL(opll, S, type);
+ UPDATE_RKS(S);
+ UPDATE_WF(S);
+ UPDATE_EG(S); // must be done last
+}
+
+static void UPDATE_ALL_BOTH( OPLL* opll, OPLL_SLOT* slot )
+{
+ UPDATE_ALL( opll, slot, 0 );
+ UPDATE_ALL( opll, slot + CAR_OFFSET, 1 );
+}
+
+inline static void slotOn( OPLL_SLOT* slot )
+{
+ slot->eg_mode = ATTACK;
+ slot->eg_phase = 0;
+ slot->phase = 0;
+}
+
+inline static void setFnumber( OPLL_SLOT* slot, e_int32 fnum )
+{
+ slot [ 0].fnum = fnum;
+ slot [CAR_OFFSET].fnum = fnum;
+}
+
+inline static void setBlock( OPLL_SLOT* slot, e_int32 block )
+{
+ slot [ 0].block = block;
+ slot [CAR_OFFSET].block = block;
+}
+
+void VRC7_writeReg( OPLL* opll, int addr, e_uint32 data )
+{
+ e_int32 i;
+
+ data &= 0xFF;
+ addr &= 0x3F;
+
+ switch ( addr )
+ {
+ case 0x00:
+ case 0x01:
+ opll->CustInst[addr]=data;
+ for (i = 0; i < 6; i++)
+ {
+ if (opll->patch_number[i] == 0)
+ {
+ setInstrument(opll, i, 0);
+ OPLL_SLOT* slot = MOD_CAR( opll, i, addr & 1 );
+ UPDATE_PG ( slot );
+ UPDATE_RKS( slot );
+ UPDATE_EG ( slot );
+ }
+ }
+ break;
+
+ case 0x02:
+ opll->CustInst[2]=data;
+ for (i = 0; i < 6; i++)
+ {
+ if (opll->patch_number[i] == 0)
+ {
+ setInstrument(opll, i, 0);
+ UPDATE_TLL(opll, MOD(opll,i), 0 );
+ }
+ }
+ break;
+
+ case 0x03:
+ opll->CustInst[3]=data;
+ for (i = 0; i < 6; i++)
+ {
+ if (opll->patch_number[i] == 0)
+ {
+ setInstrument(opll, i, 0);
+ UPDATE_WF(MOD(opll,i));
+ UPDATE_WF(CAR(opll,i));
+ }
+ }
+ break;
+
+ case 0x04:
+ case 0x05:
+ case 0x06:
+ case 0x07:
+ opll->CustInst[addr]=data;
+ for ( i = 0; i < 6; i++ )
+ {
+ if ( opll->patch_number [i] == 0 )
+ {
+ setInstrument( opll, i, 0 );
+ UPDATE_EG( MOD_CAR( opll, i, addr & 1 ) );
+ }
+ }
+ break;
+
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ case 0x15: {
+ int ch = addr - 0x10;
+ opll->LowFreq [ch] = data;
+ OPLL_SLOT* slot = MOD( opll, ch );
+
+ setFnumber( slot, data + ((opll->HiFreq[ch] & 1) << 8));
+ UPDATE_ALL_BOTH( opll, slot );
+ break;
+ }
+
+ case 0x20:
+ case 0x21:
+ case 0x22:
+ case 0x23:
+ case 0x24:
+ case 0x25: {
+ int ch = addr - 0x20;
+ opll->HiFreq [ch] = data;
+ OPLL_SLOT* slot = MOD( opll, ch );
+
+ setFnumber( slot, ((data & 1) << 8) + opll->LowFreq[ch]);
+ setBlock( slot, (data >> 1) & 7);
+ slot [CAR_OFFSET].sustine = (data >> 5) & 1;
+ if (data & 0x10)
+ {
+ if ( !slot->slot_on_flag )
+ slotOn( slot );
+
+ if ( !slot [CAR_OFFSET].slot_on_flag )
+ slotOn( slot + CAR_OFFSET );
+ }
+ else if ( slot [CAR_OFFSET].slot_on_flag )
+ {
+ if (slot [CAR_OFFSET].eg_mode == ATTACK)
+ slot [CAR_OFFSET].eg_phase = EXPAND_BITS (opll->AR_ADJUST_TABLE[HIGHBITS (slot [CAR_OFFSET].eg_phase, EG_DP_BITS - EG_BITS)], EG_BITS, EG_DP_BITS);
+ slot [CAR_OFFSET].eg_mode = RELEASE;
+ }
+ UPDATE_ALL_BOTH( opll, slot );
+
+ //inline static void update_key_status (OPLL * opll)
+ for (ch = 0; ch < 6; ch++)
+ {
+ int flag = (opll->HiFreq [ch]) & 0x10;
+ OPLL_SLOT* slot = MOD( opll, ch );
+ slot [ 0].slot_on_flag = flag;
+ slot [CAR_OFFSET].slot_on_flag = flag;
+ }
+ break;
+ }
+
+ case 0x30:
+ case 0x31:
+ case 0x32:
+ case 0x33:
+ case 0x34:
+ case 0x35: {
+ int ch = addr - 0x30;
+ opll->InstVol [ch] = data;
+
+ setInstrument( opll, ch, data >> 4 & 0x0F );
+ OPLL_SLOT* slot = MOD( opll, ch );
+ slot [CAR_OFFSET].volume = (data & 0x0F) << 2;
+ UPDATE_ALL_BOTH( opll, slot );
+ break;
+ }
+
+ default:
+ break;
+ }
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/emu2413.h b/plugins/gme/game-music-emu-0.6pre/gme/emu2413.h
new file mode 100644
index 00000000..f479dbeb
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/emu2413.h
@@ -0,0 +1,143 @@
+#ifndef EMU2413_H
+#define EMU2413_H
+
+typedef unsigned char e_uint8;
+typedef signed short e_int16;
+typedef unsigned short e_uint16;
+typedef signed int e_int32;
+typedef unsigned int e_uint32;
+
+// Size of Sintable ( 8 -- 18 can be used. 9 recommended.)
+#define PG_BITS 9
+#define PG_WIDTH (1<<PG_BITS)
+
+// Phase increment counter
+#define DP_BITS 18
+#define DP_WIDTH (1<<DP_BITS)
+#define DP_BASE_BITS (DP_BITS - PG_BITS)
+
+// Dynamic range (Accuracy of sin table)
+#define DB_BITS 8
+#define DB_STEP (48.0/(1<<DB_BITS))
+#define DB_MUTE (1<<DB_BITS)
+
+// Dynamic range of envelope
+#define EG_STEP 0.375
+#define EG_BITS 7
+#define EG_MUTE (1<<EG_BITS)
+
+// Dynamic range of total level
+#define TL_STEP 0.75
+#define TL_BITS 6
+#define TL_MUTE (1<<TL_BITS)
+
+// Dynamic range of sustine level
+#define SL_STEP 3.0
+#define SL_BITS 4
+#define SL_MUTE (1<<SL_BITS)
+
+// Bits for Pitch and Amp modulator
+#define PM_PG_BITS 8
+#define PM_PG_WIDTH (1<<PM_PG_BITS)
+#define PM_DP_BITS 16
+#define PM_DP_WIDTH (1<<PM_DP_BITS)
+#define AM_PG_BITS 8
+#define AM_PG_WIDTH (1<<AM_PG_BITS)
+#define AM_DP_BITS 16
+#define AM_DP_WIDTH (1<<AM_DP_BITS)
+
+struct OPLL_PATCH
+{
+ e_uint32 TL,FB_shift,EG,ML,AR,DR,SL,RR,KR,KL,AM,PM,WF;
+};
+
+struct OPLL_SLOT
+{
+ // OUTPUT
+ e_int32 feedback;
+ e_int32 output[2]; // Output value of slot
+
+ // for Phase Generator (PG)
+ e_uint16 const* sintbl; // Wavetable
+ e_uint32 phase; // Phase
+ e_uint32 dphase; // Phase increment amount
+ e_uint32 pgout; // output
+
+ // for Envelope Generator (EG)
+ e_int32 fnum; // F-Number
+ e_int32 block; // Block
+ e_int32 volume; // Current volume
+ e_int32 sustine; // Sustine 1 = ON, 0 = OFF
+ e_uint32 tll; // Total Level + Key scale level
+ e_uint32 rks; // Key scale offset (Rks)
+ e_int32 eg_mode; // Current state
+ e_uint32 eg_phase; // Phase
+ e_uint32 eg_dphase; // Phase increment amount
+ e_uint32 egout; // output
+
+ OPLL_PATCH patch;
+ e_uint8 slot_on_flag;
+ e_uint8 filler [7];
+};
+
+#define OPLL_MASK_CH(x) (1<<(x))
+
+struct OPLL
+{
+ OPLL_SLOT slot [6 * 2];
+
+ // Register
+ e_uint8 LowFreq [6];
+ e_uint8 HiFreq [6];
+ e_uint8 InstVol [6];
+
+ // Channel Data
+ e_uint8 patch_number [6];
+
+ e_uint8 CustInst [8];
+
+ // LFO
+ e_uint32 pm_phase;
+ e_uint32 am_phase;
+
+ e_uint32 pm_dphase;
+ e_uint32 am_dphase;
+
+ e_int16 pmtable [PM_PG_WIDTH];
+ e_uint8 amtable [AM_PG_WIDTH];
+
+ e_uint16 sintable [2] [PG_WIDTH]; // [0] = full, [1] = half
+
+ // dB to Liner table
+ e_int16 DB2LIN_TABLE [4 * DB_MUTE];
+
+ // Liner to Log curve conversion table (for Attack rate).
+ e_uint8 AR_ADJUST_TABLE [1 << EG_BITS];
+
+ // Phase incr table for Attack
+ e_uint32 dphaseARTable [16] [16];
+
+ // Phase incr table for Decay and Release
+ e_uint32 dphaseDRTable [16] [16];
+
+ // KSL + TL Table
+ e_uint8 tllTable [16] [8] [1 << TL_BITS] [4];
+ e_uint8 rksTable [2] [8] [2];
+
+ // Phase incr table for PG
+ e_uint32 dphaseTable [512] [8] [16];
+};
+
+OPLL* VRC7_new( long clock_rate );
+void VRC7_delete( OPLL* );
+void VRC7_reset( OPLL* );
+
+void VRC7_writeReg( OPLL*, int addr, e_uint32 data );
+
+// Run for one clock
+void VRC7_run( OPLL* );
+
+// Generate sample for a channel
+e_uint32 VRC7_calcCh( OPLL*, e_uint32 channel );
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/fmopl.cpp b/plugins/gme/game-music-emu-0.6pre/gme/fmopl.cpp
new file mode 100644
index 00000000..9ec1dd46
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/fmopl.cpp
@@ -0,0 +1,2617 @@
+/*
+**
+** File: fmopl.c - software implementation of FM sound generator
+** types OPL and OPL2
+**
+** Copyright Jarek Burczynski (bujar at mame dot net)
+** Copyright Tatsuyuki Satoh , MultiArcadeMachineEmulator development
+**
+** Version 0.72
+**
+
+Revision History:
+
+04-08-2003 Jarek Burczynski:
+ - removed BFRDY hack. BFRDY is busy flag, and it should be 0 only when the chip
+ handles memory read/write or during the adpcm synthesis when the chip
+ requests another byte of ADPCM data.
+
+24-07-2003 Jarek Burczynski:
+ - added a small hack for Y8950 status BFRDY flag (bit 3 should be set after
+ some (unknown) delay). Right now it's always set.
+
+14-06-2003 Jarek Burczynski:
+ - implemented all of the status register flags in Y8950 emulation
+ - renamed y8950_set_delta_t_memory() parameters from _rom_ to _mem_ since
+ they can be either RAM or ROM
+
+08-10-2002 Jarek Burczynski (thanks to Dox for the YM3526 chip)
+ - corrected ym3526_read() to always set bit 2 and bit 1
+ to HIGH state - identical to ym3812_read (verified on real YM3526)
+
+04-28-2002 Jarek Burczynski:
+ - binary exact Envelope Generator (verified on real YM3812);
+ compared to YM2151: the EG clock is equal to internal_clock,
+ rates are 2 times slower and volume resolution is one bit less
+ - modified interface functions (they no longer return pointer -
+ that's internal to the emulator now):
+ - new wrapper functions for OPLCreate: ym3526_init(), ym3812_init() and y8950_init()
+ - corrected 'off by one' error in feedback calculations (when feedback is off)
+ - enabled waveform usage (credit goes to Vlad Romascanu and zazzal22)
+ - speeded up noise generator calculations (Nicola Salmoria)
+
+03-24-2002 Jarek Burczynski (thanks to Dox for the YM3812 chip)
+ Complete rewrite (all verified on real YM3812):
+ - corrected sin_tab and tl_tab data
+ - corrected operator output calculations
+ - corrected waveform_select_enable register;
+ simply: ignore all writes to waveform_select register when
+ waveform_select_enable == 0 and do not change the waveform previously selected.
+ - corrected KSR handling
+ - corrected Envelope Generator: attack shape, Sustain mode and
+ Percussive/Non-percussive modes handling
+ - Envelope Generator rates are two times slower now
+ - LFO amplitude (tremolo) and phase modulation (vibrato)
+ - rhythm sounds phase generation
+ - white noise generator (big thanks to Olivier Galibert for mentioning Berlekamp-Massey algorithm)
+ - corrected key on/off handling (the 'key' signal is ORed from three sources: FM, rhythm and CSM)
+ - funky details (like ignoring output of operator 1 in BD rhythm sound when connect == 1)
+
+12-28-2001 Acho A. Tang
+ - reflected Delta-T EOS status on Y8950 status port.
+ - fixed subscription range of attack/decay tables
+
+
+ To do:
+ add delay before key off in CSM mode (see CSMKeyControll)
+ verify volume of the FM part on the Y8950
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include "fmopl.h"
+#include "ymdeltat.h"
+
+#define INLINE __inline
+#ifndef NULL
+ #define NULL ((void *)0)
+#endif
+#define logerror (void)
+
+#ifndef M_PI
+ #define M_PI 3.14159265358979323846
+#endif
+
+/* output final shift */
+#if (OPL_SAMPLE_BITS==16)
+ #define FINAL_SH (0)
+ #define MAXOUT (+32767)
+ #define MINOUT (-32768)
+#else
+ #define FINAL_SH (8)
+ #define MAXOUT (+127)
+ #define MINOUT (-128)
+#endif
+
+
+#define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */
+#define EG_SH 16 /* 16.16 fixed point (EG timing) */
+#define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */
+#define TIMER_SH 16 /* 16.16 fixed point (timers calculations) */
+
+#define FREQ_MASK ((1<<FREQ_SH)-1)
+
+/* envelope output entries */
+#define ENV_BITS 10
+#define ENV_LEN (1<<ENV_BITS)
+#define ENV_STEP (128.0/ENV_LEN)
+
+#define MAX_ATT_INDEX ((1<<(ENV_BITS-1))-1) /*511*/
+#define MIN_ATT_INDEX (0)
+
+/* sinwave entries */
+#define SIN_BITS 10
+#define SIN_LEN (1<<SIN_BITS)
+#define SIN_MASK (SIN_LEN-1)
+
+#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
+
+
+
+/* register number to channel number , slot offset */
+#define SLOT1 0
+#define SLOT2 1
+
+/* Envelope Generator phases */
+
+#define EG_ATT 4
+#define EG_DEC 3
+#define EG_SUS 2
+#define EG_REL 1
+#define EG_OFF 0
+
+
+/* save output as raw 16-bit sample */
+
+/*#define SAVE_SAMPLE*/
+
+#ifdef SAVE_SAMPLE
+INLINE signed int acc_calc(signed int value)
+{
+ if (value>=0)
+ {
+ if (value < 0x0200)
+ return (value & ~0);
+ if (value < 0x0400)
+ return (value & ~1);
+ if (value < 0x0800)
+ return (value & ~3);
+ if (value < 0x1000)
+ return (value & ~7);
+ if (value < 0x2000)
+ return (value & ~15);
+ if (value < 0x4000)
+ return (value & ~31);
+ return (value & ~63);
+ }
+ /*else value < 0*/
+ if (value > -0x0200)
+ return (~abs(value) & ~0);
+ if (value > -0x0400)
+ return (~abs(value) & ~1);
+ if (value > -0x0800)
+ return (~abs(value) & ~3);
+ if (value > -0x1000)
+ return (~abs(value) & ~7);
+ if (value > -0x2000)
+ return (~abs(value) & ~15);
+ if (value > -0x4000)
+ return (~abs(value) & ~31);
+ return (~abs(value) & ~63);
+}
+
+
+static FILE *sample[1];
+ #if 1 /*save to MONO file */
+ #define SAVE_ALL_CHANNELS \
+ { signed int pom = acc_calc(lt); \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ }
+ #else /*save to STEREO file */
+ #define SAVE_ALL_CHANNELS \
+ { signed int pom = lt; \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ pom = rt; \
+ fputc((unsigned short)pom&0xff,sample[0]); \
+ fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
+ }
+ #endif
+#endif
+
+#define LOG_CYM_FILE 0
+//static FILE * cymfile = NULL;
+
+
+
+#define OPL_TYPE_WAVESEL 0x01 /* waveform select */
+#define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
+#define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
+#define OPL_TYPE_IO 0x08 /* I/O port */
+
+/* ---------- Generic interface section ---------- */
+#define OPL_TYPE_YM3526 (0)
+#define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
+#define OPL_TYPE_Y8950 (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
+
+
+
+typedef struct{
+ UINT32 ar; /* attack rate: AR<<2 */
+ UINT32 dr; /* decay rate: DR<<2 */
+ UINT32 rr; /* release rate:RR<<2 */
+ UINT8 KSR; /* key scale rate */
+ UINT8 ksl; /* keyscale level */
+ UINT8 ksr; /* key scale rate: kcode>>KSR */
+ UINT8 mul; /* multiple: mul_tab[ML] */
+
+ /* Phase Generator */
+ UINT32 Cnt; /* frequency counter */
+ UINT32 Incr; /* frequency counter step */
+ UINT8 FB; /* feedback shift value */
+ INT32 *connect1; /* slot1 output pointer */
+ INT32 op1_out[2]; /* slot1 output for feedback */
+ UINT8 CON; /* connection (algorithm) type */
+
+ /* Envelope Generator */
+ UINT8 eg_type; /* percussive/non-percussive mode */
+ UINT8 state; /* phase type */
+ UINT32 TL; /* total level: TL << 2 */
+ INT32 TLL; /* adjusted now TL */
+ INT32 volume; /* envelope counter */
+ UINT32 sl; /* sustain level: sl_tab[SL] */
+ UINT8 eg_sh_ar; /* (attack state) */
+ UINT8 eg_sel_ar; /* (attack state) */
+ UINT8 eg_sh_dr; /* (decay state) */
+ UINT8 eg_sel_dr; /* (decay state) */
+ UINT8 eg_sh_rr; /* (release state) */
+ UINT8 eg_sel_rr; /* (release state) */
+ UINT32 key; /* 0 = KEY OFF, >0 = KEY ON */
+
+ /* LFO */
+ UINT32 AMmask; /* LFO Amplitude Modulation enable mask */
+ UINT8 vib; /* LFO Phase Modulation enable flag (active high)*/
+
+ /* waveform select */
+ UINT16 wavetable;
+} OPL_SLOT;
+
+typedef struct{
+ OPL_SLOT SLOT[2];
+ /* phase generator state */
+ UINT32 block_fnum; /* block+fnum */
+ UINT32 fc; /* Freq. Increment base */
+ UINT32 ksl_base; /* KeyScaleLevel Base step */
+ UINT8 kcode; /* key code (for key scaling) */
+} OPL_CH;
+
+/* OPL state */
+typedef struct fm_opl_f {
+ /* FM channel slots */
+ OPL_CH P_CH[9]; /* OPL/OPL2 chips have 9 channels*/
+
+ UINT32 eg_cnt; /* global envelope generator counter */
+ UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/72 */
+ UINT32 eg_timer_add; /* step of eg_timer */
+ UINT32 eg_timer_overflow; /* envelope generator timer overlfows every 1 sample (on real chip) */
+
+ UINT8 rhythm; /* Rhythm mode */
+
+ UINT32 fn_tab[1024]; /* fnumber->increment counter */
+
+ /* LFO */
+ UINT8 lfo_am_depth;
+ UINT8 lfo_pm_depth_range;
+ UINT32 lfo_am_cnt;
+ UINT32 lfo_am_inc;
+ UINT32 lfo_pm_cnt;
+ UINT32 lfo_pm_inc;
+
+ UINT32 noise_rng; /* 23 bit noise shift register */
+ UINT32 noise_p; /* current noise 'phase' */
+ UINT32 noise_f; /* current noise period */
+
+ UINT8 wavesel; /* waveform select enable flag */
+
+ UINT32 T[2]; /* timer counters */
+ UINT8 st[2]; /* timer enable */
+
+#if BUILD_Y8950
+ /* Delta-T ADPCM unit (Y8950) */
+
+ YM_DELTAT *deltat;
+
+ /* Keyboard and I/O ports interface */
+ UINT8 portDirection;
+ UINT8 portLatch;
+ OPL_PORTHANDLER_R porthandler_r;
+ OPL_PORTHANDLER_W porthandler_w;
+ void * port_param;
+ OPL_PORTHANDLER_R keyboardhandler_r;
+ OPL_PORTHANDLER_W keyboardhandler_w;
+ void * keyboard_param;
+#endif
+
+ /* external event callback handlers */
+ //OPL_TIMERHANDLER timer_handler; /* TIMER handler */
+ void *TimerParam; /* TIMER parameter */
+ OPL_IRQHANDLER IRQHandler; /* IRQ handler */
+ void *IRQParam; /* IRQ parameter */
+ OPL_UPDATEHANDLER UpdateHandler;/* stream update handler */
+ void *UpdateParam; /* stream update parameter */
+
+ UINT8 type; /* chip type */
+ UINT8 address; /* address register */
+ UINT8 status; /* status flag */
+ UINT8 statusmask; /* status mask */
+ UINT8 mode; /* Reg.08 : CSM,notesel,etc. */
+
+ UINT32 clock; /* master clock (Hz) */
+ UINT32 rate; /* sampling rate (Hz) */
+ double freqbase; /* frequency base */
+ //attotime TimerBase; /* Timer base time (==sampling time)*/
+
+ OPL_SLOT *SLOT7_1, *SLOT7_2, *SLOT8_1, *SLOT8_2;
+
+ signed int phase_modulation; /* phase modulation input (SLOT 2) */
+ signed int output[1];
+
+#if BUILD_Y8950
+ INT32 output_deltat[4]; /* for Y8950 DELTA-T, chip is mono, that 4 here is just for safety */
+#endif
+
+ UINT32 LFO_AM;
+ INT32 LFO_PM;
+} FM_OPL;
+
+
+
+/* mapping of register number (offset) to slot number used by the emulator */
+static const int slot_array[32]=
+{
+ 0, 2, 4, 1, 3, 5,-1,-1,
+ 6, 8,10, 7, 9,11,-1,-1,
+ 12,14,16,13,15,17,-1,-1,
+ -1,-1,-1,-1,-1,-1,-1,-1
+};
+
+/* key scale level */
+/* table is 3dB/octave , DV converts this into 6dB/octave */
+/* 0.1875 is bit 0 weight of the envelope counter (volume) expressed in the 'decibel' scale */
+#define DV (0.1875/2.0)
+static const UINT32 ksl_tab[8*16]=
+{
+ /* OCT 0 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ /* OCT 1 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV,
+ 1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV,
+ /* OCT 2 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV,
+ 3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV,
+ 4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV,
+ /* OCT 3 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV,
+ 3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV,
+ 6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV,
+ 7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV,
+ /* OCT 4 */
+ 0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV,
+ 6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV,
+ 9.000/DV, 9.750/DV,10.125/DV,10.500/DV,
+ 10.875/DV,11.250/DV,11.625/DV,12.000/DV,
+ /* OCT 5 */
+ 0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV,
+ 9.000/DV,10.125/DV,10.875/DV,11.625/DV,
+ 12.000/DV,12.750/DV,13.125/DV,13.500/DV,
+ 13.875/DV,14.250/DV,14.625/DV,15.000/DV,
+ /* OCT 6 */
+ 0.000/DV, 6.000/DV, 9.000/DV,10.875/DV,
+ 12.000/DV,13.125/DV,13.875/DV,14.625/DV,
+ 15.000/DV,15.750/DV,16.125/DV,16.500/DV,
+ 16.875/DV,17.250/DV,17.625/DV,18.000/DV,
+ /* OCT 7 */
+ 0.000/DV, 9.000/DV,12.000/DV,13.875/DV,
+ 15.000/DV,16.125/DV,16.875/DV,17.625/DV,
+ 18.000/DV,18.750/DV,19.125/DV,19.500/DV,
+ 19.875/DV,20.250/DV,20.625/DV,21.000/DV
+};
+#undef DV
+
+/* sustain level table (3dB per step) */
+/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
+#define SC(db) (UINT32) ( db * (2.0/ENV_STEP) )
+static const UINT32 sl_tab[16]={
+ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
+ SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
+};
+#undef SC
+
+
+#define RATE_STEPS (8)
+static const unsigned char eg_inc[15*RATE_STEPS]={
+
+/*cycle:0 1 2 3 4 5 6 7*/
+
+/* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..12 0 (increment by 0 or 1) */
+/* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..12 1 */
+/* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..12 2 */
+/* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..12 3 */
+
+/* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 13 0 (increment by 1) */
+/* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 13 1 */
+/* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 13 2 */
+/* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 13 3 */
+
+/* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 14 0 (increment by 2) */
+/* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 14 1 */
+/*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 14 2 */
+/*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 14 3 */
+
+/*12 */ 4,4, 4,4, 4,4, 4,4, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 4) */
+/*13 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 2, 15 3 for attack */
+/*14 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */
+};
+
+
+#define O(a) (a*RATE_STEPS)
+
+/*note that there is no O(13) in this table - it's directly in the code */
+static const unsigned char eg_rate_select[16+64+16]={ /* Envelope Generator rates (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+
+/* rates 00-12 */
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+
+/* rate 13 */
+O( 4),O( 5),O( 6),O( 7),
+
+/* rate 14 */
+O( 8),O( 9),O(10),O(11),
+
+/* rate 15 */
+O(12),O(12),O(12),O(12),
+
+/* 16 dummy rates (same as 15 3) */
+O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+
+};
+#undef O
+
+/*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */
+/*shift 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0 */
+/*mask 4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0, 0 */
+
+#define O(a) (a*1)
+static const unsigned char eg_rate_shift[16+64+16]={ /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+
+/* rates 00-12 */
+O(12),O(12),O(12),O(12),
+O(11),O(11),O(11),O(11),
+O(10),O(10),O(10),O(10),
+O( 9),O( 9),O( 9),O( 9),
+O( 8),O( 8),O( 8),O( 8),
+O( 7),O( 7),O( 7),O( 7),
+O( 6),O( 6),O( 6),O( 6),
+O( 5),O( 5),O( 5),O( 5),
+O( 4),O( 4),O( 4),O( 4),
+O( 3),O( 3),O( 3),O( 3),
+O( 2),O( 2),O( 2),O( 2),
+O( 1),O( 1),O( 1),O( 1),
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 13 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 14 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 15 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* 16 dummy rates (same as 15 3) */
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+
+};
+#undef O
+
+
+/* multiple table */
+#define ML 2
+static const UINT8 mul_tab[16]= {
+/* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,10,12,12,15,15 */
+ 0.50*ML, 1.00*ML, 2.00*ML, 3.00*ML, 4.00*ML, 5.00*ML, 6.00*ML, 7.00*ML,
+ 8.00*ML, 9.00*ML,10.00*ML,10.00*ML,12.00*ML,12.00*ML,15.00*ML,15.00*ML
+};
+#undef ML
+
+/* TL_TAB_LEN is calculated as:
+* 12 - sinus amplitude bits (Y axis)
+* 2 - sinus sign bit (Y axis)
+* TL_RES_LEN - sinus resolution (X axis)
+*/
+#define TL_TAB_LEN (12*2*TL_RES_LEN)
+static signed int tl_tab[TL_TAB_LEN];
+
+#define ENV_QUIET (TL_TAB_LEN>>4)
+
+/* sin waveform table in 'decibel' scale */
+/* four waveforms on OPL2 type chips */
+static unsigned int sin_tab[SIN_LEN * 4];
+
+
+/* LFO Amplitude Modulation table (verified on real YM3812)
+ 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples
+
+ Length: 210 elements.
+
+ Each of the elements has to be repeated
+ exactly 64 times (on 64 consecutive samples).
+ The whole table takes: 64 * 210 = 13440 samples.
+
+ When AM = 1 data is used directly
+ When AM = 0 data is divided by 4 before being used (loosing precision is important)
+*/
+
+#define LFO_AM_TAB_ELEMENTS 210
+
+static const UINT8 lfo_am_table[LFO_AM_TAB_ELEMENTS] = {
+0,0,0,0,0,0,0,
+1,1,1,1,
+2,2,2,2,
+3,3,3,3,
+4,4,4,4,
+5,5,5,5,
+6,6,6,6,
+7,7,7,7,
+8,8,8,8,
+9,9,9,9,
+10,10,10,10,
+11,11,11,11,
+12,12,12,12,
+13,13,13,13,
+14,14,14,14,
+15,15,15,15,
+16,16,16,16,
+17,17,17,17,
+18,18,18,18,
+19,19,19,19,
+20,20,20,20,
+21,21,21,21,
+22,22,22,22,
+23,23,23,23,
+24,24,24,24,
+25,25,25,25,
+26,26,26,
+25,25,25,25,
+24,24,24,24,
+23,23,23,23,
+22,22,22,22,
+21,21,21,21,
+20,20,20,20,
+19,19,19,19,
+18,18,18,18,
+17,17,17,17,
+16,16,16,16,
+15,15,15,15,
+14,14,14,14,
+13,13,13,13,
+12,12,12,12,
+11,11,11,11,
+10,10,10,10,
+9,9,9,9,
+8,8,8,8,
+7,7,7,7,
+6,6,6,6,
+5,5,5,5,
+4,4,4,4,
+3,3,3,3,
+2,2,2,2,
+1,1,1,1
+};
+
+/* LFO Phase Modulation table (verified on real YM3812) */
+static const INT8 lfo_pm_table[8*8*2] = {
+
+/* FNUM2/FNUM = 00 0xxxxxxx (0x0000) */
+0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 0*/
+0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 00 1xxxxxxx (0x0080) */
+0, 0, 0, 0, 0, 0, 0, 0, /*LFO PM depth = 0*/
+1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 01 0xxxxxxx (0x0100) */
+1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 0*/
+2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 01 1xxxxxxx (0x0180) */
+1, 0, 0, 0,-1, 0, 0, 0, /*LFO PM depth = 0*/
+3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 10 0xxxxxxx (0x0200) */
+2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 0*/
+4, 2, 0,-2,-4,-2, 0, 2, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 10 1xxxxxxx (0x0280) */
+2, 1, 0,-1,-2,-1, 0, 1, /*LFO PM depth = 0*/
+5, 2, 0,-2,-5,-2, 0, 2, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 11 0xxxxxxx (0x0300) */
+3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 0*/
+6, 3, 0,-3,-6,-3, 0, 3, /*LFO PM depth = 1*/
+
+/* FNUM2/FNUM = 11 1xxxxxxx (0x0380) */
+3, 1, 0,-1,-3,-1, 0, 1, /*LFO PM depth = 0*/
+7, 3, 0,-3,-7,-3, 0, 3 /*LFO PM depth = 1*/
+};
+
+
+/* lock level of common table */
+//static int num_lock = 0;
+
+
+//static void *cur_chip = NULL; /* current chip pointer */
+
+INLINE int limit( int val, int max, int min ) {
+ if ( val > max )
+ val = max;
+ else if ( val < min )
+ val = min;
+
+ return val;
+}
+
+
+/* status set and IRQ handling */
+INLINE void OPL_STATUS_SET(FM_OPL *OPL,int flag)
+{
+ /* set status flag */
+ OPL->status |= flag;
+ if(!(OPL->status & 0x80))
+ {
+ if(OPL->status & OPL->statusmask)
+ { /* IRQ on */
+ OPL->status |= 0x80;
+ /* callback user interrupt handler (IRQ is OFF to ON) */
+ if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,1);
+ }
+ }
+}
+
+/* status reset and IRQ handling */
+INLINE void OPL_STATUS_RESET(FM_OPL *OPL,int flag)
+{
+ /* reset status flag */
+ OPL->status &=~flag;
+ if((OPL->status & 0x80))
+ {
+ if (!(OPL->status & OPL->statusmask) )
+ {
+ OPL->status &= 0x7f;
+ /* callback user interrupt handler (IRQ is ON to OFF) */
+ if(OPL->IRQHandler) (OPL->IRQHandler)(OPL->IRQParam,0);
+ }
+ }
+}
+
+/* IRQ mask set */
+INLINE void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag)
+{
+ OPL->statusmask = flag;
+ /* IRQ handling check */
+ OPL_STATUS_SET(OPL,0);
+ OPL_STATUS_RESET(OPL,0);
+}
+
+
+/* advance LFO to next sample */
+INLINE void advance_lfo(FM_OPL *OPL)
+{
+ UINT8 tmp;
+
+ /* LFO */
+ OPL->lfo_am_cnt += OPL->lfo_am_inc;
+ if (OPL->lfo_am_cnt >= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH) ) /* lfo_am_table is 210 elements long */
+ OPL->lfo_am_cnt -= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH);
+
+ tmp = lfo_am_table[ OPL->lfo_am_cnt >> LFO_SH ];
+
+ if (OPL->lfo_am_depth)
+ OPL->LFO_AM = tmp;
+ else
+ OPL->LFO_AM = tmp>>2;
+
+ OPL->lfo_pm_cnt += OPL->lfo_pm_inc;
+ OPL->LFO_PM = ((OPL->lfo_pm_cnt>>LFO_SH) & 7) | OPL->lfo_pm_depth_range;
+}
+
+/* advance to next sample */
+INLINE void advance(FM_OPL *OPL)
+{
+ OPL_CH *CH;
+ OPL_SLOT *op;
+ int i;
+
+ OPL->eg_timer += OPL->eg_timer_add;
+
+ while (OPL->eg_timer >= OPL->eg_timer_overflow)
+ {
+ OPL->eg_timer -= OPL->eg_timer_overflow;
+
+ OPL->eg_cnt++;
+
+ for (i=0; i<9*2; i++)
+ {
+ CH = &OPL->P_CH[i/2];
+ op = &CH->SLOT[i&1];
+
+ /* Envelope Generator */
+ switch(op->state)
+ {
+ case EG_ATT: /* attack phase */
+ if ( !(OPL->eg_cnt & ((1<<op->eg_sh_ar)-1) ) )
+ {
+ op->volume += (~op->volume *
+ (eg_inc[op->eg_sel_ar + ((OPL->eg_cnt>>op->eg_sh_ar)&7)])
+ ) >>3;
+
+ if (op->volume <= MIN_ATT_INDEX)
+ {
+ op->volume = MIN_ATT_INDEX;
+ op->state = EG_DEC;
+ }
+
+ }
+ break;
+
+ case EG_DEC: /* decay phase */
+ if ( !(OPL->eg_cnt & ((1<<op->eg_sh_dr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_dr + ((OPL->eg_cnt>>op->eg_sh_dr)&7)];
+
+ if ( op->volume >= op->sl )
+ op->state = EG_SUS;
+
+ }
+ break;
+
+ case EG_SUS: /* sustain phase */
+
+ /* this is important behaviour:
+ one can change percusive/non-percussive modes on the fly and
+ the chip will remain in sustain phase - verified on real YM3812 */
+
+ if(op->eg_type) /* non-percussive mode */
+ {
+ /* do nothing */
+ }
+ else /* percussive mode */
+ {
+ /* during sustain phase chip adds Release Rate (in percussive mode) */
+ if ( !(OPL->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rr + ((OPL->eg_cnt>>op->eg_sh_rr)&7)];
+
+ if ( op->volume >= MAX_ATT_INDEX )
+ op->volume = MAX_ATT_INDEX;
+ }
+ /* else do nothing in sustain phase */
+ }
+ break;
+
+ case EG_REL: /* release phase */
+ if ( !(OPL->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rr + ((OPL->eg_cnt>>op->eg_sh_rr)&7)];
+
+ if ( op->volume >= MAX_ATT_INDEX )
+ {
+ op->volume = MAX_ATT_INDEX;
+ op->state = EG_OFF;
+ }
+
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ for (i=0; i<9*2; i++)
+ {
+ CH = &OPL->P_CH[i/2];
+ op = &CH->SLOT[i&1];
+
+ /* Phase Generator */
+ if(op->vib)
+ {
+ UINT8 block;
+ unsigned int block_fnum = CH->block_fnum;
+
+ unsigned int fnum_lfo = (block_fnum&0x0380) >> 7;
+
+ signed int lfo_fn_table_index_offset = lfo_pm_table[OPL->LFO_PM + 16*fnum_lfo ];
+
+ if (lfo_fn_table_index_offset) /* LFO phase modulation active */
+ {
+ block_fnum += lfo_fn_table_index_offset;
+ block = (block_fnum&0x1c00) >> 10;
+ op->Cnt += (OPL->fn_tab[block_fnum&0x03ff] >> (7-block)) * op->mul;
+ }
+ else /* LFO phase modulation = zero */
+ {
+ op->Cnt += op->Incr;
+ }
+ }
+ else /* LFO phase modulation disabled for this operator */
+ {
+ op->Cnt += op->Incr;
+ }
+ }
+
+ /* The Noise Generator of the YM3812 is 23-bit shift register.
+ * Period is equal to 2^23-2 samples.
+ * Register works at sampling frequency of the chip, so output
+ * can change on every sample.
+ *
+ * Output of the register and input to the bit 22 is:
+ * bit0 XOR bit14 XOR bit15 XOR bit22
+ *
+ * Simply use bit 22 as the noise output.
+ */
+
+ OPL->noise_p += OPL->noise_f;
+ i = OPL->noise_p >> FREQ_SH; /* number of events (shifts of the shift register) */
+ OPL->noise_p &= FREQ_MASK;
+ while (i)
+ {
+ /*
+ UINT32 j;
+ j = ( (OPL->noise_rng) ^ (OPL->noise_rng>>14) ^ (OPL->noise_rng>>15) ^ (OPL->noise_rng>>22) ) & 1;
+ OPL->noise_rng = (j<<22) | (OPL->noise_rng>>1);
+ */
+
+ /*
+ Instead of doing all the logic operations above, we
+ use a trick here (and use bit 0 as the noise output).
+ The difference is only that the noise bit changes one
+ step ahead. This doesn't matter since we don't know
+ what is real state of the noise_rng after the reset.
+ */
+
+ if (OPL->noise_rng & 1) OPL->noise_rng ^= 0x800302;
+ OPL->noise_rng >>= 1;
+
+ i--;
+ }
+}
+
+
+INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+ UINT32 p;
+
+ p = (env<<4) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + (pm<<16))) >> FREQ_SH ) & SIN_MASK) ];
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+ UINT32 p;
+
+ p = (env<<4) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + pm )) >> FREQ_SH ) & SIN_MASK) ];
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+
+#define volume_calc(OP) ((OP)->TLL + ((UINT32)(OP)->volume) + (OPL->LFO_AM & (OP)->AMmask))
+
+/* calculate output */
+INLINE void OPL_CALC_CH( FM_OPL *OPL, OPL_CH *CH )
+{
+ OPL_SLOT *SLOT;
+ unsigned int env;
+ signed int out;
+
+ OPL->phase_modulation = 0;
+
+ /* SLOT 1 */
+ SLOT = &CH->SLOT[SLOT1];
+ env = volume_calc(SLOT);
+ out = SLOT->op1_out[0] + SLOT->op1_out[1];
+ SLOT->op1_out[0] = SLOT->op1_out[1];
+ *SLOT->connect1 += SLOT->op1_out[0];
+ SLOT->op1_out[1] = 0;
+ if( env < ENV_QUIET )
+ {
+ if (!SLOT->FB)
+ out = 0;
+ SLOT->op1_out[1] = op_calc1(SLOT->Cnt, env, (out<<SLOT->FB), SLOT->wavetable );
+ }
+
+ /* SLOT 2 */
+ SLOT++;
+ env = volume_calc(SLOT);
+ if( env < ENV_QUIET )
+ OPL->output[0] += op_calc(SLOT->Cnt, env, OPL->phase_modulation, SLOT->wavetable);
+}
+
+/*
+ operators used in the rhythm sounds generation process:
+
+ Envelope Generator:
+
+channel operator register number Bass High Snare Tom Top
+/ slot number TL ARDR SLRR Wave Drum Hat Drum Tom Cymbal
+ 6 / 0 12 50 70 90 f0 +
+ 6 / 1 15 53 73 93 f3 +
+ 7 / 0 13 51 71 91 f1 +
+ 7 / 1 16 54 74 94 f4 +
+ 8 / 0 14 52 72 92 f2 +
+ 8 / 1 17 55 75 95 f5 +
+
+ Phase Generator:
+
+channel operator register number Bass High Snare Tom Top
+/ slot number MULTIPLE Drum Hat Drum Tom Cymbal
+ 6 / 0 12 30 +
+ 6 / 1 15 33 +
+ 7 / 0 13 31 + + +
+ 7 / 1 16 34 ----- n o t u s e d -----
+ 8 / 0 14 32 +
+ 8 / 1 17 35 + +
+
+channel operator register number Bass High Snare Tom Top
+number number BLK/FNUM2 FNUM Drum Hat Drum Tom Cymbal
+ 6 12,15 B6 A6 +
+
+ 7 13,16 B7 A7 + + +
+
+ 8 14,17 B8 A8 + + +
+
+*/
+
+/* calculate rhythm */
+
+INLINE void OPL_CALC_RH( FM_OPL *OPL, OPL_CH *CH, unsigned int noise )
+{
+ OPL_SLOT *SLOT;
+ signed int out;
+ unsigned int env;
+
+
+ /* Bass Drum (verified on real YM3812):
+ - depends on the channel 6 'connect' register:
+ when connect = 0 it works the same as in normal (non-rhythm) mode (op1->op2->out)
+ when connect = 1 _only_ operator 2 is present on output (op2->out), operator 1 is ignored
+ - output sample always is multiplied by 2
+ */
+
+ OPL->phase_modulation = 0;
+ /* SLOT 1 */
+ SLOT = &CH[6].SLOT[SLOT1];
+ env = volume_calc(SLOT);
+
+ out = SLOT->op1_out[0] + SLOT->op1_out[1];
+ SLOT->op1_out[0] = SLOT->op1_out[1];
+
+ if (!SLOT->CON)
+ OPL->phase_modulation = SLOT->op1_out[0];
+ /* else ignore output of operator 1 */
+
+ SLOT->op1_out[1] = 0;
+ if( env < ENV_QUIET )
+ {
+ if (!SLOT->FB)
+ out = 0;
+ SLOT->op1_out[1] = op_calc1(SLOT->Cnt, env, (out<<SLOT->FB), SLOT->wavetable );
+ }
+
+ /* SLOT 2 */
+ SLOT++;
+ env = volume_calc(SLOT);
+ if( env < ENV_QUIET )
+ OPL->output[0] += op_calc(SLOT->Cnt, env, OPL->phase_modulation, SLOT->wavetable) * 2;
+
+
+ /* Phase generation is based on: */
+ /* HH (13) channel 7->slot 1 combined with channel 8->slot 2 (same combination as TOP CYMBAL but different output phases) */
+ /* SD (16) channel 7->slot 1 */
+ /* TOM (14) channel 8->slot 1 */
+ /* TOP (17) channel 7->slot 1 combined with channel 8->slot 2 (same combination as HIGH HAT but different output phases) */
+
+ /* Envelope generation based on: */
+ /* HH channel 7->slot1 */
+ /* SD channel 7->slot2 */
+ /* TOM channel 8->slot1 */
+ /* TOP channel 8->slot2 */
+
+
+ /* The following formulas can be well optimized.
+ I leave them in direct form for now (in case I've missed something).
+ */
+
+ /* High Hat (verified on real YM3812) */
+ env = volume_calc(OPL->SLOT7_1);
+ if( env < ENV_QUIET )
+ {
+
+ /* high hat phase generation:
+ phase = d0 or 234 (based on frequency only)
+ phase = 34 or 2d0 (based on noise)
+ */
+
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit7 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>7)&1;
+ unsigned char bit3 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>3)&1;
+ unsigned char bit2 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>2)&1;
+
+ unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+ /* when res1 = 0 phase = 0x000 | 0xd0; */
+ /* when res1 = 1 phase = 0x200 | (0xd0>>2); */
+ UINT32 phase = res1 ? (0x200|(0xd0>>2)) : 0xd0;
+
+ /* enable gate based on frequency of operator 2 in channel 8 */
+ unsigned char bit5e= ((OPL->SLOT8_2->Cnt>>FREQ_SH)>>5)&1;
+ unsigned char bit3e= ((OPL->SLOT8_2->Cnt>>FREQ_SH)>>3)&1;
+
+ unsigned char res2 = (bit3e ^ bit5e);
+
+ /* when res2 = 0 pass the phase from calculation above (res1); */
+ /* when res2 = 1 phase = 0x200 | (0xd0>>2); */
+ if (res2)
+ phase = (0x200|(0xd0>>2));
+
+
+ /* when phase & 0x200 is set and noise=1 then phase = 0x200|0xd0 */
+ /* when phase & 0x200 is set and noise=0 then phase = 0x200|(0xd0>>2), ie no change */
+ if (phase&0x200)
+ {
+ if (noise)
+ phase = 0x200|0xd0;
+ }
+ else
+ /* when phase & 0x200 is clear and noise=1 then phase = 0xd0>>2 */
+ /* when phase & 0x200 is clear and noise=0 then phase = 0xd0, ie no change */
+ {
+ if (noise)
+ phase = 0xd0>>2;
+ }
+
+ OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, OPL->SLOT7_1->wavetable) * 2;
+ }
+
+ /* Snare Drum (verified on real YM3812) */
+ env = volume_calc(OPL->SLOT7_2);
+ if( env < ENV_QUIET )
+ {
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit8 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>8)&1;
+
+ /* when bit8 = 0 phase = 0x100; */
+ /* when bit8 = 1 phase = 0x200; */
+ UINT32 phase = bit8 ? 0x200 : 0x100;
+
+ /* Noise bit XOR'es phase by 0x100 */
+ /* when noisebit = 0 pass the phase from calculation above */
+ /* when noisebit = 1 phase ^= 0x100; */
+ /* in other words: phase ^= (noisebit<<8); */
+ if (noise)
+ phase ^= 0x100;
+
+ OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, OPL->SLOT7_2->wavetable) * 2;
+ }
+
+ /* Tom Tom (verified on real YM3812) */
+ env = volume_calc(OPL->SLOT8_1);
+ if( env < ENV_QUIET )
+ OPL->output[0] += op_calc(OPL->SLOT8_1->Cnt, env, 0, OPL->SLOT8_1->wavetable) * 2;
+
+ /* Top Cymbal (verified on real YM3812) */
+ env = volume_calc(OPL->SLOT8_2);
+ if( env < ENV_QUIET )
+ {
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit7 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>7)&1;
+ unsigned char bit3 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>3)&1;
+ unsigned char bit2 = ((OPL->SLOT7_1->Cnt>>FREQ_SH)>>2)&1;
+
+ unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+ /* when res1 = 0 phase = 0x000 | 0x100; */
+ /* when res1 = 1 phase = 0x200 | 0x100; */
+ UINT32 phase = res1 ? 0x300 : 0x100;
+
+ /* enable gate based on frequency of operator 2 in channel 8 */
+ unsigned char bit5e= ((OPL->SLOT8_2->Cnt>>FREQ_SH)>>5)&1;
+ unsigned char bit3e= ((OPL->SLOT8_2->Cnt>>FREQ_SH)>>3)&1;
+
+ unsigned char res2 = (bit3e ^ bit5e);
+ /* when res2 = 0 pass the phase from calculation above (res1); */
+ /* when res2 = 1 phase = 0x200 | 0x100; */
+ if (res2)
+ phase = 0x300;
+
+ OPL->output[0] += op_calc(phase<<FREQ_SH, env, 0, OPL->SLOT8_2->wavetable) * 2;
+ }
+
+}
+
+
+/* generic table initialize */
+static int init_tables(void)
+{
+ signed int i,x;
+ signed int n;
+ double o,m;
+
+
+ for (x=0; x<TL_RES_LEN; x++)
+ {
+ m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
+ m = floor(m);
+
+ /* we never reach (1<<16) here due to the (x+1) */
+ /* result fits within 16 bits at maximum */
+
+ n = (int)m; /* 16 bits here */
+ n >>= 4; /* 12 bits here */
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+ /* 11 bits here (rounded) */
+ n <<= 1; /* 12 bits here (as in real chip) */
+ tl_tab[ x*2 + 0 ] = n;
+ tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ];
+
+ for (i=1; i<12; i++)
+ {
+ tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i;
+ tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ];
+ }
+ #if 0
+ logerror("tl %04i", x*2);
+ for (i=0; i<12; i++)
+ logerror(", [%02i] %5i", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ] );
+ logerror("\n");
+ #endif
+ }
+ /*logerror("FMOPL.C: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/
+
+
+ for (i=0; i<SIN_LEN; i++)
+ {
+ /* non-standard sinus */
+ m = sin( ((i*2)+1) * M_PI / SIN_LEN ); /* checked against the real chip */
+
+ /* we never reach zero here due to ((i*2)+1) */
+
+ if (m>0.0)
+ o = 8*log(1.0/m)/log(2.0); /* convert to 'decibels' */
+ else
+ o = 8*log(-1.0/m)/log(2.0); /* convert to 'decibels' */
+
+ o = o / (ENV_STEP/4);
+
+ n = (int)(2.0*o);
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+
+ sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 );
+
+ /*logerror("FMOPL.C: sin [%4i (hex=%03x)]= %4i (tl_tab value=%5i)\n", i, i, sin_tab[i], tl_tab[sin_tab[i]] );*/
+ }
+
+ for (i=0; i<SIN_LEN; i++)
+ {
+ /* waveform 1: __ __ */
+ /* / \____/ \____*/
+ /* output only first half of the sinus waveform (positive one) */
+
+ if (i & (1<<(SIN_BITS-1)) )
+ sin_tab[1*SIN_LEN+i] = TL_TAB_LEN;
+ else
+ sin_tab[1*SIN_LEN+i] = sin_tab[i];
+
+ /* waveform 2: __ __ __ __ */
+ /* / \/ \/ \/ \*/
+ /* abs(sin) */
+
+ sin_tab[2*SIN_LEN+i] = sin_tab[i & (SIN_MASK>>1) ];
+
+ /* waveform 3: _ _ _ _ */
+ /* / |_/ |_/ |_/ |_*/
+ /* abs(output only first quarter of the sinus waveform) */
+
+ if (i & (1<<(SIN_BITS-2)) )
+ sin_tab[3*SIN_LEN+i] = TL_TAB_LEN;
+ else
+ sin_tab[3*SIN_LEN+i] = sin_tab[i & (SIN_MASK>>2)];
+
+ /*logerror("FMOPL.C: sin1[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[1*SIN_LEN+i], tl_tab[sin_tab[1*SIN_LEN+i]] );
+ logerror("FMOPL.C: sin2[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[2*SIN_LEN+i], tl_tab[sin_tab[2*SIN_LEN+i]] );
+ logerror("FMOPL.C: sin3[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[3*SIN_LEN+i], tl_tab[sin_tab[3*SIN_LEN+i]] );*/
+ }
+ /*logerror("FMOPL.C: ENV_QUIET= %08x (dec*8=%i)\n", ENV_QUIET, ENV_QUIET*8 );*/
+
+
+#ifdef SAVE_SAMPLE
+ sample[0]=fopen("sampsum.pcm","wb");
+#endif
+
+ return 1;
+}
+
+static void OPLCloseTable( void )
+{
+#ifdef SAVE_SAMPLE
+ fclose(sample[0]);
+#endif
+}
+
+
+
+static void OPL_initalize(FM_OPL *OPL)
+{
+ int i;
+
+ /* frequency base */
+ OPL->freqbase = (OPL->rate) ? ((double)OPL->clock / 72.0) / OPL->rate : 0;
+#if 0
+ OPL->rate = (double)OPL->clock / 72.0;
+ OPL->freqbase = 1.0;
+#endif
+
+ /*logerror("freqbase=%f\n", OPL->freqbase);*/
+
+ /* Timer base time */
+ //OPL->TimerBase = attotime_mul(ATTOTIME_IN_HZ(OPL->clock), 72);
+
+ /* make fnumber -> increment counter table */
+ for( i=0 ; i < 1024 ; i++ )
+ {
+ /* opn phase increment counter = 20bit */
+ OPL->fn_tab[i] = (UINT32)( (double)i * 64 * OPL->freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
+#if 0
+ logerror("FMOPL.C: fn_tab[%4i] = %08x (dec=%8i)\n",
+ i, OPL->fn_tab[i]>>6, OPL->fn_tab[i]>>6 );
+#endif
+ }
+
+#if 0
+ for( i=0 ; i < 16 ; i++ )
+ {
+ logerror("FMOPL.C: sl_tab[%i] = %08x\n",
+ i, sl_tab[i] );
+ }
+ for( i=0 ; i < 8 ; i++ )
+ {
+ int j;
+ logerror("FMOPL.C: ksl_tab[oct=%2i] =",i);
+ for (j=0; j<16; j++)
+ {
+ logerror("%08x ", ksl_tab[i*16+j] );
+ }
+ logerror("\n");
+ }
+#endif
+
+
+ /* Amplitude modulation: 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples */
+ /* One entry from LFO_AM_TABLE lasts for 64 samples */
+ OPL->lfo_am_inc = (1.0 / 64.0 ) * (1<<LFO_SH) * OPL->freqbase;
+
+ /* Vibrato: 8 output levels (triangle waveform); 1 level takes 1024 samples */
+ OPL->lfo_pm_inc = (1.0 / 1024.0) * (1<<LFO_SH) * OPL->freqbase;
+
+ /*logerror ("OPL->lfo_am_inc = %8x ; OPL->lfo_pm_inc = %8x\n", OPL->lfo_am_inc, OPL->lfo_pm_inc);*/
+
+ /* Noise generator: a step takes 1 sample */
+ OPL->noise_f = (1.0 / 1.0) * (1<<FREQ_SH) * OPL->freqbase;
+
+ OPL->eg_timer_add = (1<<EG_SH) * OPL->freqbase;
+ OPL->eg_timer_overflow = ( 1 ) * (1<<EG_SH);
+ /*logerror("OPLinit eg_timer_add=%8x eg_timer_overflow=%8x\n", OPL->eg_timer_add, OPL->eg_timer_overflow);*/
+
+}
+
+INLINE void FM_KEYON(OPL_SLOT *SLOT, UINT32 key_set)
+{
+ if( !SLOT->key )
+ {
+ /* restart Phase Generator */
+ SLOT->Cnt = 0;
+ /* phase -> Attack */
+ SLOT->state = EG_ATT;
+ }
+ SLOT->key |= key_set;
+}
+
+INLINE void FM_KEYOFF(OPL_SLOT *SLOT, UINT32 key_clr)
+{
+ if( SLOT->key )
+ {
+ SLOT->key &= key_clr;
+
+ if( !SLOT->key )
+ {
+ /* phase -> Release */
+ if (SLOT->state>EG_REL)
+ SLOT->state = EG_REL;
+ }
+ }
+}
+
+/* update phase increment counter of operator (also update the EG rates if necessary) */
+INLINE void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT)
+{
+ int ksr;
+
+ /* (frequency) phase increment counter */
+ SLOT->Incr = CH->fc * SLOT->mul;
+ ksr = CH->kcode >> SLOT->KSR;
+
+ if( SLOT->ksr != ksr )
+ {
+ SLOT->ksr = ksr;
+
+ /* calculate envelope generator rates */
+ if ((SLOT->ar + SLOT->ksr) < 16+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 13*RATE_STEPS;
+ }
+ SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+ }
+}
+
+/* set multi,am,vib,EG-TYP,KSR,mul */
+INLINE void set_mul(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->mul = mul_tab[v&0x0f];
+ SLOT->KSR = (v&0x10) ? 0 : 2;
+ SLOT->eg_type = (v&0x20);
+ SLOT->vib = (v&0x40);
+ SLOT->AMmask = (v&0x80) ? ~0 : 0;
+ CALC_FCSLOT(CH,SLOT);
+}
+
+/* set ksl & tl */
+INLINE void set_ksl_tl(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+ int ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */
+
+ SLOT->ksl = ksl ? 3-ksl : 31;
+ SLOT->TL = (v&0x3f)<<(ENV_BITS-1-7); /* 7 bits TL (bit 6 = always 0) */
+
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+}
+
+/* set attack rate & decay rate */
+INLINE void set_ar_dr(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->ar = (v>>4) ? 16 + ((v>>4) <<2) : 0;
+
+ if ((SLOT->ar + SLOT->ksr) < 16+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 13*RATE_STEPS;
+ }
+
+ SLOT->dr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+ SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+}
+
+/* set sustain level & release rate */
+INLINE void set_sl_rr(FM_OPL *OPL,int slot,int v)
+{
+ OPL_CH *CH = &OPL->P_CH[slot/2];
+ OPL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->sl = sl_tab[ v>>4 ];
+
+ SLOT->rr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+}
+
+
+/* write a value v to register r on OPL chip */
+static void OPLWriteReg(FM_OPL *OPL, int r, int v)
+{
+ OPL_CH *CH;
+ int slot;
+ int block_fnum;
+
+
+ /* adjust bus to 8 bits */
+ r &= 0xff;
+ v &= 0xff;
+
+ /*if (LOG_CYM_FILE && (cymfile) && (r!=0) )
+ {
+ fputc( (unsigned char)r, cymfile );
+ fputc( (unsigned char)v, cymfile );
+ }*/
+
+
+ switch(r&0xe0)
+ {
+ case 0x00: /* 00-1f:control */
+ switch(r&0x1f)
+ {
+ case 0x01: /* waveform select enable */
+ if(OPL->type&OPL_TYPE_WAVESEL)
+ {
+ OPL->wavesel = v&0x20;
+ /* do not change the waveform previously selected */
+ }
+ break;
+ case 0x02: /* Timer 1 */
+ OPL->T[0] = (256-v)*4;
+ break;
+ case 0x03: /* Timer 2 */
+ OPL->T[1] = (256-v)*16;
+ break;
+ case 0x04: /* IRQ clear / mask and Timer enable */
+ if(v&0x80)
+ { /* IRQ flag clear */
+ OPL_STATUS_RESET(OPL,0x7f-0x08); /* don't reset BFRDY flag or we will have to call deltat module to set the flag */
+ }
+ else
+ { /* set IRQ mask ,timer enable*/
+ UINT8 st1 = v&1;
+ UINT8 st2 = (v>>1)&1;
+
+ /* IRQRST,T1MSK,t2MSK,EOSMSK,BRMSK,x,ST2,ST1 */
+ OPL_STATUS_RESET(OPL, v & (0x78-0x08) );
+ OPL_STATUSMASK_SET(OPL, (~v) & 0x78 );
+
+ /* timer 2 */
+ /*if(OPL->st[1] != st2)
+ {
+ attotime period = st2 ? attotime_mul(OPL->TimerBase, OPL->T[1]) : attotime_zero;
+ OPL->st[1] = st2;
+ if (OPL->timer_handler) (OPL->timer_handler)(OPL->TimerParam,1,period);
+ }*/
+ /* timer 1 */
+ /*if(OPL->st[0] != st1)
+ {
+ attotime period = st1 ? attotime_mul(OPL->TimerBase, OPL->T[0]) : attotime_zero;
+ OPL->st[0] = st1;
+ if (OPL->timer_handler) (OPL->timer_handler)(OPL->TimerParam,0,period);
+ }*/
+ }
+ break;
+#if BUILD_Y8950
+ case 0x06: /* Key Board OUT */
+ if(OPL->type&OPL_TYPE_KEYBOARD)
+ {
+ if(OPL->keyboardhandler_w)
+ OPL->keyboardhandler_w(OPL->keyboard_param,v);
+ else
+ logerror("Y8950: write unmapped KEYBOARD port\n");
+ }
+ break;
+ case 0x07: /* DELTA-T control 1 : START,REC,MEMDATA,REPT,SPOFF,x,x,RST */
+ if(OPL->type&OPL_TYPE_ADPCM)
+ YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
+ break;
+#endif
+ case 0x08: /* MODE,DELTA-T control 2 : CSM,NOTESEL,x,x,smpl,da/ad,64k,rom */
+ OPL->mode = v;
+#if BUILD_Y8950
+ if(OPL->type&OPL_TYPE_ADPCM)
+ YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v&0x0f); /* mask 4 LSBs in register 08 for DELTA-T unit */
+#endif
+ break;
+
+#if BUILD_Y8950
+ case 0x09: /* START ADD */
+ case 0x0a:
+ case 0x0b: /* STOP ADD */
+ case 0x0c:
+ case 0x0d: /* PRESCALE */
+ case 0x0e:
+ case 0x0f: /* ADPCM data write */
+ case 0x10: /* DELTA-N */
+ case 0x11: /* DELTA-N */
+ case 0x12: /* ADPCM volume */
+ if(OPL->type&OPL_TYPE_ADPCM)
+ YM_DELTAT_ADPCM_Write(OPL->deltat,r-0x07,v);
+ break;
+
+ case 0x15: /* DAC data high 8 bits (F7,F6...F2) */
+ case 0x16: /* DAC data low 2 bits (F1, F0 in bits 7,6) */
+ case 0x17: /* DAC data shift (S2,S1,S0 in bits 2,1,0) */
+ logerror("FMOPL.C: DAC data register written, but not implemented reg=%02x val=%02x\n",r,v);
+ break;
+
+ case 0x18: /* I/O CTRL (Direction) */
+ if(OPL->type&OPL_TYPE_IO)
+ OPL->portDirection = v&0x0f;
+ break;
+ case 0x19: /* I/O DATA */
+ if(OPL->type&OPL_TYPE_IO)
+ {
+ OPL->portLatch = v;
+ if(OPL->porthandler_w)
+ OPL->porthandler_w(OPL->port_param,v&OPL->portDirection);
+ }
+ break;
+#endif
+ default:
+ logerror("FMOPL.C: write to unknown register: %02x\n",r);
+ break;
+ }
+ break;
+ case 0x20: /* am ON, vib ON, ksr, eg_type, mul */
+ slot = slot_array[r&0x1f];
+ if(slot < 0) return;
+ set_mul(OPL,slot,v);
+ break;
+ case 0x40:
+ slot = slot_array[r&0x1f];
+ if(slot < 0) return;
+ set_ksl_tl(OPL,slot,v);
+ break;
+ case 0x60:
+ slot = slot_array[r&0x1f];
+ if(slot < 0) return;
+ set_ar_dr(OPL,slot,v);
+ break;
+ case 0x80:
+ slot = slot_array[r&0x1f];
+ if(slot < 0) return;
+ set_sl_rr(OPL,slot,v);
+ break;
+ case 0xa0:
+ if (r == 0xbd) /* am depth, vibrato depth, r,bd,sd,tom,tc,hh */
+ {
+ OPL->lfo_am_depth = v & 0x80;
+ OPL->lfo_pm_depth_range = (v&0x40) ? 8 : 0;
+
+ OPL->rhythm = v&0x3f;
+
+ if(OPL->rhythm&0x20)
+ {
+ /* BD key on/off */
+ if(v&0x10)
+ {
+ FM_KEYON (&OPL->P_CH[6].SLOT[SLOT1], 2);
+ FM_KEYON (&OPL->P_CH[6].SLOT[SLOT2], 2);
+ }
+ else
+ {
+ FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1],~2);
+ FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2],~2);
+ }
+ /* HH key on/off */
+ if(v&0x01) FM_KEYON (&OPL->P_CH[7].SLOT[SLOT1], 2);
+ else FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1],~2);
+ /* SD key on/off */
+ if(v&0x08) FM_KEYON (&OPL->P_CH[7].SLOT[SLOT2], 2);
+ else FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2],~2);
+ /* TOM key on/off */
+ if(v&0x04) FM_KEYON (&OPL->P_CH[8].SLOT[SLOT1], 2);
+ else FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1],~2);
+ /* TOP-CY key on/off */
+ if(v&0x02) FM_KEYON (&OPL->P_CH[8].SLOT[SLOT2], 2);
+ else FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2],~2);
+ }
+ else
+ {
+ /* BD key off */
+ FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT1],~2);
+ FM_KEYOFF(&OPL->P_CH[6].SLOT[SLOT2],~2);
+ /* HH key off */
+ FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT1],~2);
+ /* SD key off */
+ FM_KEYOFF(&OPL->P_CH[7].SLOT[SLOT2],~2);
+ /* TOM key off */
+ FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT1],~2);
+ /* TOP-CY off */
+ FM_KEYOFF(&OPL->P_CH[8].SLOT[SLOT2],~2);
+ }
+ return;
+ }
+ /* keyon,block,fnum */
+ if( (r&0x0f) > 8) return;
+ CH = &OPL->P_CH[r&0x0f];
+ if(!(r&0x10))
+ { /* a0-a8 */
+ block_fnum = (CH->block_fnum&0x1f00) | v;
+ }
+ else
+ { /* b0-b8 */
+ block_fnum = ((v&0x1f)<<8) | (CH->block_fnum&0xff);
+
+ if(v&0x20)
+ {
+ FM_KEYON (&CH->SLOT[SLOT1], 1);
+ FM_KEYON (&CH->SLOT[SLOT2], 1);
+ }
+ else
+ {
+ FM_KEYOFF(&CH->SLOT[SLOT1],~1);
+ FM_KEYOFF(&CH->SLOT[SLOT2],~1);
+ }
+ }
+ /* update */
+ if(CH->block_fnum != block_fnum)
+ {
+ UINT8 block = block_fnum >> 10;
+
+ CH->block_fnum = block_fnum;
+
+ CH->ksl_base = ksl_tab[block_fnum>>6];
+ CH->fc = OPL->fn_tab[block_fnum&0x03ff] >> (7-block);
+
+ /* BLK 2,1,0 bits -> bits 3,2,1 of kcode */
+ CH->kcode = (CH->block_fnum&0x1c00)>>9;
+
+ /* the info below is actually opposite to what is stated in the Manuals (verifed on real YM3812) */
+ /* if notesel == 0 -> lsb of kcode is bit 10 (MSB) of fnum */
+ /* if notesel == 1 -> lsb of kcode is bit 9 (MSB-1) of fnum */
+ if (OPL->mode&0x40)
+ CH->kcode |= (CH->block_fnum&0x100)>>8; /* notesel == 1 */
+ else
+ CH->kcode |= (CH->block_fnum&0x200)>>9; /* notesel == 0 */
+
+ /* refresh Total Level in both SLOTs of this channel */
+ CH->SLOT[SLOT1].TLL = CH->SLOT[SLOT1].TL + (CH->ksl_base>>CH->SLOT[SLOT1].ksl);
+ CH->SLOT[SLOT2].TLL = CH->SLOT[SLOT2].TL + (CH->ksl_base>>CH->SLOT[SLOT2].ksl);
+
+ /* refresh frequency counter in both SLOTs of this channel */
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT1]);
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT2]);
+ }
+ break;
+ case 0xc0:
+ /* FB,C */
+ if( (r&0x0f) > 8) return;
+ CH = &OPL->P_CH[r&0x0f];
+ CH->SLOT[SLOT1].FB = (v>>1)&7 ? ((v>>1)&7) + 7 : 0;
+ CH->SLOT[SLOT1].CON = v&1;
+ CH->SLOT[SLOT1].connect1 = CH->SLOT[SLOT1].CON ? &OPL->output[0] : &OPL->phase_modulation;
+ break;
+ case 0xe0: /* waveform select */
+ /* simply ignore write to the waveform select register if selecting not enabled in test register */
+ if(OPL->wavesel)
+ {
+ slot = slot_array[r&0x1f];
+ if(slot < 0) return;
+ CH = &OPL->P_CH[slot/2];
+
+ CH->SLOT[slot&1].wavetable = (v&0x03)*SIN_LEN;
+ }
+ break;
+ }
+}
+
+/*static TIMER_CALLBACK( cymfile_callback )
+{
+ if (cymfile)
+ {
+ fputc( (unsigned char)0, cymfile );
+ }
+}*/
+
+/* lock/unlock for common table */
+#if 0
+static int OPL_LockTable(/*const device_config *device*/)
+{
+ num_lock++;
+ if(num_lock>1) return 0;
+
+ /* first time */
+
+ cur_chip = NULL;
+ /* allocate total level table (128kb space) */
+ if( !init_tables() )
+ {
+ num_lock--;
+ return -1;
+ }
+
+#if 0
+ if (LOG_CYM_FILE)
+ {
+ cymfile = fopen("3812_.cym","wb");
+ if (cymfile)
+ timer_pulse ( device->machine, ATTOTIME_IN_HZ(110), NULL, 0, cymfile_callback); /*110 Hz pulse timer*/
+ else
+ logerror("Could not create file 3812_.cym\n");
+ }
+#endif
+
+ return 0;
+}
+
+static void OPL_UnLockTable(void)
+{
+ if(num_lock) num_lock--;
+ if(num_lock) return;
+
+ /* last time */
+
+ cur_chip = NULL;
+ OPLCloseTable();
+
+ /*if (cymfile)
+ fclose (cymfile);
+ cymfile = NULL;*/
+}
+#endif
+
+static void OPLResetChip(FM_OPL *OPL)
+{
+ int c,s;
+ int i;
+
+ OPL->eg_timer = 0;
+ OPL->eg_cnt = 0;
+
+ OPL->noise_rng = 1; /* noise shift register */
+ OPL->mode = 0; /* normal mode */
+ OPL_STATUS_RESET(OPL,0x7f);
+
+ /* reset with register write */
+ OPLWriteReg(OPL,0x01,0); /* wavesel disable */
+ OPLWriteReg(OPL,0x02,0); /* Timer1 */
+ OPLWriteReg(OPL,0x03,0); /* Timer2 */
+ OPLWriteReg(OPL,0x04,0); /* IRQ mask clear */
+ for(i = 0xff ; i >= 0x20 ; i-- ) OPLWriteReg(OPL,i,0);
+
+ /* reset operator parameters */
+ for( c = 0 ; c < 9 ; c++ )
+ {
+ OPL_CH *CH = &OPL->P_CH[c];
+ for(s = 0 ; s < 2 ; s++ )
+ {
+ /* wave table */
+ CH->SLOT[s].wavetable = 0;
+ CH->SLOT[s].state = EG_OFF;
+ CH->SLOT[s].volume = MAX_ATT_INDEX;
+ }
+ }
+#if BUILD_Y8950
+ if(OPL->type&OPL_TYPE_ADPCM)
+ {
+ YM_DELTAT *DELTAT = OPL->deltat;
+
+ DELTAT->freqbase = OPL->freqbase;
+ DELTAT->output_pointer = &OPL->output_deltat[0];
+ DELTAT->portshift = 5;
+ DELTAT->output_range = 1<<23;
+ YM_DELTAT_ADPCM_Reset(DELTAT,0,YM_DELTAT_EMULATION_MODE_NORMAL);
+ }
+#endif
+}
+
+
+#if 0
+static STATE_POSTLOAD( OPL_postload )
+{
+ FM_OPL *OPL = (FM_OPL *)param;
+ int slot, ch;
+
+ for( ch=0 ; ch < 9 ; ch++ )
+ {
+ OPL_CH *CH = &OPL->P_CH[ch];
+
+ /* Look up key scale level */
+ UINT32 block_fnum = CH->block_fnum;
+ CH->ksl_base = ksl_tab[block_fnum >> 6];
+ CH->fc = OPL->fn_tab[block_fnum & 0x03ff] >> (7 - (block_fnum >> 10));
+
+ for( slot=0 ; slot < 2 ; slot++ )
+ {
+ OPL_SLOT *SLOT = &CH->SLOT[slot];
+
+ /* Calculate key scale rate */
+ SLOT->ksr = CH->kcode >> SLOT->KSR;
+
+ /* Calculate attack, decay and release rates */
+ if ((SLOT->ar + SLOT->ksr) < 16+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 13*RATE_STEPS;
+ }
+ SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+
+ /* Calculate phase increment */
+ SLOT->Incr = CH->fc * SLOT->mul;
+
+ /* Total level */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base >> SLOT->ksl);
+
+ /* Connect output */
+ SLOT->connect1 = SLOT->CON ? &OPL->output[0] : &OPL->phase_modulation;
+ }
+ }
+#if BUILD_Y8950
+ if ( (OPL->type & OPL_TYPE_ADPCM) && (OPL->deltat) )
+ {
+ // We really should call the postlod function for the YM_DELTAT, but it's hard without registers
+ // (see the way the YM2610 does it)
+ //YM_DELTAT_postload(OPL->deltat, REGS);
+ }
+#endif
+}
+
+
+static void OPLsave_state_channel(const device_config *device, OPL_CH *CH)
+{
+ int slot, ch;
+
+ for( ch=0 ; ch < 9 ; ch++, CH++ )
+ {
+ /* channel */
+ state_save_register_device_item(device, ch, CH->block_fnum);
+ state_save_register_device_item(device, ch, CH->kcode);
+ /* slots */
+ for( slot=0 ; slot < 2 ; slot++ )
+ {
+ OPL_SLOT *SLOT = &CH->SLOT[slot];
+
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->ar);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->dr);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->rr);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->KSR);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->ksl);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->mul);
+
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->Cnt);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->FB);
+ state_save_register_device_item_array(device, ch * 2 + slot, SLOT->op1_out);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->CON);
+
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->eg_type);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->state);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->TL);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->volume);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->sl);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->key);
+
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->AMmask);
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->vib);
+
+ state_save_register_device_item(device, ch * 2 + slot, SLOT->wavetable);
+ }
+ }
+}
+
+
+/* Register savestate for a virtual YM3812/YM3526Y8950 */
+
+static void OPL_save_state(FM_OPL *OPL, const device_config *device)
+{
+ OPLsave_state_channel(device, OPL->P_CH);
+
+ state_save_register_device_item(device, 0, OPL->eg_cnt);
+ state_save_register_device_item(device, 0, OPL->eg_timer);
+
+ state_save_register_device_item(device, 0, OPL->rhythm);
+
+ state_save_register_device_item(device, 0, OPL->lfo_am_depth);
+ state_save_register_device_item(device, 0, OPL->lfo_pm_depth_range);
+ state_save_register_device_item(device, 0, OPL->lfo_am_cnt);
+ state_save_register_device_item(device, 0, OPL->lfo_pm_cnt);
+
+ state_save_register_device_item(device, 0, OPL->noise_rng);
+ state_save_register_device_item(device, 0, OPL->noise_p);
+
+ if( OPL->type & OPL_TYPE_WAVESEL )
+ {
+ state_save_register_device_item(device, 0, OPL->wavesel);
+ }
+
+ state_save_register_device_item_array(device, 0, OPL->T);
+ state_save_register_device_item_array(device, 0, OPL->st);
+
+#if BUILD_Y8950
+ if ( (OPL->type & OPL_TYPE_ADPCM) && (OPL->deltat) )
+ {
+ YM_DELTAT_savestate(device, OPL->deltat);
+ }
+
+ if ( OPL->type & OPL_TYPE_IO )
+ {
+ state_save_register_device_item(device, 0, OPL->portDirection);
+ state_save_register_device_item(device, 0, OPL->portLatch);
+ }
+#endif
+
+ state_save_register_device_item(device, 0, OPL->address);
+ state_save_register_device_item(device, 0, OPL->status);
+ state_save_register_device_item(device, 0, OPL->statusmask);
+ state_save_register_device_item(device, 0, OPL->mode);
+
+ state_save_register_postload(device->machine, OPL_postload, OPL);
+}
+#endif
+
+
+/* Create one of virtual YM3812/YM3526/Y8950 */
+/* 'clock' is chip clock in Hz */
+/* 'rate' is sampling rate */
+static FM_OPL *OPLCreate(UINT32 clock, UINT32 rate, int type)
+{
+ char *ptr;
+ FM_OPL *OPL;
+ int state_size;
+
+ //if (OPL_LockTable(device) == -1) return NULL;
+ init_tables();
+
+ /* calculate OPL state size */
+ state_size = sizeof(FM_OPL);
+
+#if BUILD_Y8950
+ if (type&OPL_TYPE_ADPCM) state_size+= sizeof(YM_DELTAT);
+#endif
+
+ /* allocate memory block */
+ ptr = (char *)malloc(state_size);
+
+ if (ptr==NULL)
+ return 0;
+
+ /* clear */
+ memset(ptr,0,state_size);
+
+ OPL = (FM_OPL *)ptr;
+
+ ptr += sizeof(FM_OPL);
+
+#if BUILD_Y8950
+ if (type&OPL_TYPE_ADPCM)
+ {
+ OPL->deltat = (YM_DELTAT *)ptr;
+ }
+ ptr += sizeof(YM_DELTAT);
+#endif
+
+ OPL->type = type;
+ OPL->clock = clock;
+ OPL->rate = rate;
+
+ /* init global tables */
+ OPL_initalize(OPL);
+
+ return OPL;
+}
+
+/* Destroy one of virtual YM3812 */
+static void OPLDestroy(FM_OPL *OPL)
+{
+ //OPL_UnLockTable();
+ free(OPL);
+}
+
+/* Optional handlers */
+
+/*static void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER timer_handler,void *param)
+{
+ OPL->timer_handler = timer_handler;
+ OPL->TimerParam = param;
+}*/
+static void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,void *param)
+{
+ OPL->IRQHandler = IRQHandler;
+ OPL->IRQParam = param;
+}
+static void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+ OPL->UpdateHandler = UpdateHandler;
+ OPL->UpdateParam = param;
+}
+
+static int OPLWrite(FM_OPL *OPL,int a,int v)
+{
+ if( !(a&1) )
+ { /* address port */
+ OPL->address = v & 0xff;
+ }
+ else
+ { /* data port */
+ if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
+ OPLWriteReg(OPL,OPL->address,v);
+ }
+ return OPL->status>>7;
+}
+
+static unsigned char OPLRead(FM_OPL *OPL,int a)
+{
+ if( !(a&1) )
+ {
+ /* status port */
+
+ #if BUILD_Y8950
+
+ if(OPL->type&OPL_TYPE_ADPCM) /* Y8950 */
+ {
+ return (OPL->status & (OPL->statusmask|0x80)) | (OPL->deltat->PCM_BSY&1);
+ }
+
+ #endif
+
+ /* OPL and OPL2 */
+ return OPL->status & (OPL->statusmask|0x80);
+ }
+
+#if BUILD_Y8950
+ /* data port */
+ switch(OPL->address)
+ {
+ case 0x05: /* KeyBoard IN */
+ if(OPL->type&OPL_TYPE_KEYBOARD)
+ {
+ if(OPL->keyboardhandler_r)
+ return OPL->keyboardhandler_r(OPL->keyboard_param);
+ else
+ logerror("Y8950: read unmapped KEYBOARD port\n");
+ }
+ return 0;
+
+ case 0x0f: /* ADPCM-DATA */
+ if(OPL->type&OPL_TYPE_ADPCM)
+ {
+ UINT8 val;
+
+ val = YM_DELTAT_ADPCM_Read(OPL->deltat);
+ /*logerror("Y8950: read ADPCM value read=%02x\n",val);*/
+ return val;
+ }
+ return 0;
+
+ case 0x19: /* I/O DATA */
+ if(OPL->type&OPL_TYPE_IO)
+ {
+ if(OPL->porthandler_r)
+ return OPL->porthandler_r(OPL->port_param);
+ else
+ logerror("Y8950:read unmapped I/O port\n");
+ }
+ return 0;
+ case 0x1a: /* PCM-DATA */
+ if(OPL->type&OPL_TYPE_ADPCM)
+ {
+ logerror("Y8950 A/D convertion is accessed but not implemented !\n");
+ return 0x80; /* 2's complement PCM data - result from A/D convertion */
+ }
+ return 0;
+ }
+#endif
+
+ return 0xff;
+}
+
+/* CSM Key Controll */
+INLINE void CSMKeyControll(OPL_CH *CH)
+{
+ FM_KEYON (&CH->SLOT[SLOT1], 4);
+ FM_KEYON (&CH->SLOT[SLOT2], 4);
+
+ /* The key off should happen exactly one sample later - not implemented correctly yet */
+
+ FM_KEYOFF(&CH->SLOT[SLOT1], ~4);
+ FM_KEYOFF(&CH->SLOT[SLOT2], ~4);
+}
+
+
+static int OPLTimerOver(FM_OPL *OPL,int c)
+{
+ if( c )
+ { /* Timer B */
+ OPL_STATUS_SET(OPL,0x20);
+ }
+ else
+ { /* Timer A */
+ OPL_STATUS_SET(OPL,0x40);
+ /* CSM mode key,TL controll */
+ if( OPL->mode & 0x80 )
+ { /* CSM mode total level latch and auto key on */
+ int ch;
+ if(OPL->UpdateHandler) OPL->UpdateHandler(OPL->UpdateParam,0);
+ for(ch=0; ch<9; ch++)
+ CSMKeyControll( &OPL->P_CH[ch] );
+ }
+ }
+ /* reload timer */
+ //if (OPL->timer_handler) (OPL->timer_handler)(OPL->TimerParam,c,attotime_mul(OPL->TimerBase, OPL->T[c]));
+ return OPL->status>>7;
+}
+
+
+#define MAX_OPL_CHIPS 2
+
+
+#if (BUILD_YM3812)
+
+void * ym3812_init(UINT32 clock, UINT32 rate)
+{
+ /* emulator create */
+ FM_OPL *YM3812 = OPLCreate(clock,rate,OPL_TYPE_YM3812);
+ if (YM3812)
+ {
+ //OPL_save_state(YM3812);
+ ym3812_reset_chip(YM3812);
+ }
+ return YM3812;
+}
+
+void ym3812_shutdown(void *chip)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+
+ /* emulator shutdown */
+ OPLDestroy(YM3812);
+}
+void ym3812_reset_chip(void *chip)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ OPLResetChip(YM3812);
+}
+
+int ym3812_write(void *chip, int a, int v)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ return OPLWrite(YM3812, a, v);
+}
+
+unsigned char ym3812_read(void *chip, int a)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ /* YM3812 always returns bit2 and bit1 in HIGH state */
+ return OPLRead(YM3812, a) | 0x06 ;
+}
+int ym3812_timer_over(void *chip, int c)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ return OPLTimerOver(YM3812, c);
+}
+
+/*void ym3812_set_timer_handler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ OPLSetTimerHandler(YM3812, timer_handler, param);
+}*/
+void ym3812_set_irq_handler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ OPLSetIRQHandler(YM3812, IRQHandler, param);
+}
+void ym3812_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+ FM_OPL *YM3812 = (FM_OPL *)chip;
+ OPLSetUpdateHandler(YM3812, UpdateHandler, param);
+}
+
+
+/*
+** Generate samples for one of the YM3812's
+**
+** 'which' is the virtual YM3812 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void ym3812_update_one(void *chip, OPLSAMPLE *buffer, int length)
+{
+ FM_OPL *OPL = (FM_OPL *)chip;
+ UINT8 rhythm = OPL->rhythm&0x20;
+ OPLSAMPLE *buf = buffer;
+ int i;
+
+ /* rhythm slots */
+ OPL->SLOT7_1 = &OPL->P_CH[7].SLOT[SLOT1];
+ OPL->SLOT7_2 = &OPL->P_CH[7].SLOT[SLOT2];
+ OPL->SLOT8_1 = &OPL->P_CH[8].SLOT[SLOT1];
+ OPL->SLOT8_2 = &OPL->P_CH[8].SLOT[SLOT2];
+ for( i=0; i < length ; i++ )
+ {
+ int lt;
+
+ OPL->output[0] = 0;
+
+ advance_lfo(OPL);
+
+ /* FM part */
+ OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+ if(!rhythm)
+ {
+ OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+ }
+ else /* Rhythm part */
+ {
+ OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+ }
+
+ lt = OPL->output[0];
+
+ lt >>= FINAL_SH;
+
+ /* limit check */
+ lt = limit( lt , MAXOUT, MINOUT );
+
+ #ifdef SAVE_SAMPLE
+ if (which==0)
+ {
+ SAVE_ALL_CHANNELS
+ }
+ #endif
+
+ /* store to sound buffer */
+ buf[i] = lt;
+
+ advance(OPL);
+ }
+
+}
+#endif /* BUILD_YM3812 */
+
+
+
+#if (BUILD_YM3526)
+
+void *ym3526_init(UINT32 clock, UINT32 rate)
+{
+ /* emulator create */
+ FM_OPL *YM3526 = OPLCreate(clock,rate,OPL_TYPE_YM3526);
+ if (YM3526)
+ {
+ /*OPL_save_state(YM3526);*/
+ ym3526_reset_chip(YM3526);
+ }
+ return YM3526;
+}
+
+void ym3526_shutdown(void *chip)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ /* emulator shutdown */
+ OPLDestroy(YM3526);
+}
+void ym3526_reset_chip(void *chip)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ OPLResetChip(YM3526);
+}
+
+int ym3526_write(void *chip, int a, int v)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ return OPLWrite(YM3526, a, v);
+}
+
+unsigned char ym3526_read(void *chip, int a)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ /* YM3526 always returns bit2 and bit1 in HIGH state */
+ return OPLRead(YM3526, a) | 0x06 ;
+}
+int ym3526_timer_over(void *chip, int c)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ return OPLTimerOver(YM3526, c);
+}
+
+/*void ym3526_set_timer_handler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ OPLSetTimerHandler(YM3526, timer_handler, param);
+}*/
+void ym3526_set_irq_handler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ OPLSetIRQHandler(YM3526, IRQHandler, param);
+}
+void ym3526_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+ FM_OPL *YM3526 = (FM_OPL *)chip;
+ OPLSetUpdateHandler(YM3526, UpdateHandler, param);
+}
+
+
+/*
+** Generate samples for one of the YM3526's
+**
+** 'which' is the virtual YM3526 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void ym3526_update_one(void *chip, OPLSAMPLE *buffer, int length)
+{
+ FM_OPL *OPL = (FM_OPL *)chip;
+ UINT8 rhythm = OPL->rhythm&0x20;
+ OPLSAMPLE *buf = buffer;
+ int i;
+
+ /* rhythm slots */
+ OPL->SLOT7_1 = &OPL->P_CH[7].SLOT[SLOT1];
+ OPL->SLOT7_2 = &OPL->P_CH[7].SLOT[SLOT2];
+ OPL->SLOT8_1 = &OPL->P_CH[8].SLOT[SLOT1];
+ OPL->SLOT8_2 = &OPL->P_CH[8].SLOT[SLOT2];
+ for( i=0; i < length ; i++ )
+ {
+ int lt;
+
+ OPL->output[0] = 0;
+
+ advance_lfo(OPL);
+
+ /* FM part */
+ OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+ if(!rhythm)
+ {
+ OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+ }
+ else /* Rhythm part */
+ {
+ OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+ }
+
+ lt = OPL->output[0];
+
+ lt >>= FINAL_SH;
+
+ /* limit check */
+ lt = limit( lt , MAXOUT, MINOUT );
+
+ #ifdef SAVE_SAMPLE
+ if (which==0)
+ {
+ SAVE_ALL_CHANNELS
+ }
+ #endif
+
+ /* store to sound buffer */
+ buf[i] = lt;
+
+ advance(OPL);
+ }
+
+}
+#endif /* BUILD_YM3526 */
+
+
+
+
+#if BUILD_Y8950
+
+static void Y8950_deltat_status_set(void *chip, UINT8 changebits)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPL_STATUS_SET(Y8950, changebits);
+}
+static void Y8950_deltat_status_reset(void *chip, UINT8 changebits)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPL_STATUS_RESET(Y8950, changebits);
+}
+
+void *y8950_init(UINT32 clock, UINT32 rate)
+{
+ /* emulator create */
+ FM_OPL *Y8950 = OPLCreate(clock,rate,OPL_TYPE_Y8950);
+ if (Y8950)
+ {
+ Y8950->deltat->status_set_handler = Y8950_deltat_status_set;
+ Y8950->deltat->status_reset_handler = Y8950_deltat_status_reset;
+ Y8950->deltat->status_change_which_chip = Y8950;
+ Y8950->deltat->status_change_EOS_bit = 0x10; /* status flag: set bit4 on End Of Sample */
+ Y8950->deltat->status_change_BRDY_bit = 0x08; /* status flag: set bit3 on BRDY (End Of: ADPCM analysis/synthesis, memory reading/writing) */
+
+ /*Y8950->deltat->write_time = 10.0 / clock;*/ /* a single byte write takes 10 cycles of main clock */
+ /*Y8950->deltat->read_time = 8.0 / clock;*/ /* a single byte read takes 8 cycles of main clock */
+ /* reset */
+ /*OPL_save_state(Y8950);*/
+ y8950_reset_chip(Y8950);
+ }
+
+ return Y8950;
+}
+
+void y8950_shutdown(void *chip)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ /* emulator shutdown */
+ OPLDestroy(Y8950);
+}
+void y8950_reset_chip(void *chip)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPLResetChip(Y8950);
+}
+
+int y8950_write(void *chip, int a, int v)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ return OPLWrite(Y8950, a, v);
+}
+
+unsigned char y8950_read(void *chip, int a)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ return OPLRead(Y8950, a);
+}
+int y8950_timer_over(void *chip, int c)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ return OPLTimerOver(Y8950, c);
+}
+
+/*void y8950_set_timer_handler(void *chip, OPL_TIMERHANDLER timer_handler, void *param)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPLSetTimerHandler(Y8950, timer_handler, param);
+}*/
+void y8950_set_irq_handler(void *chip,OPL_IRQHANDLER IRQHandler,void *param)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPLSetIRQHandler(Y8950, IRQHandler, param);
+}
+void y8950_set_update_handler(void *chip,OPL_UPDATEHANDLER UpdateHandler,void *param)
+{
+ FM_OPL *Y8950 = (FM_OPL *)chip;
+ OPLSetUpdateHandler(Y8950, UpdateHandler, param);
+}
+
+void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size )
+{
+ FM_OPL *OPL = (FM_OPL *)chip;
+ OPL->deltat->memory = (UINT8 *)(deltat_mem_ptr);
+ OPL->deltat->memory_size = deltat_mem_size;
+}
+
+/*
+** Generate samples for one of the Y8950's
+**
+** 'which' is the virtual Y8950 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void y8950_update_one(void *chip, OPLSAMPLE *buffer, int length)
+{
+ int i;
+ FM_OPL *OPL = (FM_OPL *)chip;
+ UINT8 rhythm = OPL->rhythm&0x20;
+ YM_DELTAT *DELTAT = OPL->deltat;
+ OPLSAMPLE *buf = buffer;
+
+ /* rhythm slots */
+ OPL->SLOT7_1 = &OPL->P_CH[7].SLOT[SLOT1];
+ OPL->SLOT7_2 = &OPL->P_CH[7].SLOT[SLOT2];
+ OPL->SLOT8_1 = &OPL->P_CH[8].SLOT[SLOT1];
+ OPL->SLOT8_2 = &OPL->P_CH[8].SLOT[SLOT2];
+
+ for( i=0; i < length ; i++ )
+ {
+ int lt;
+
+ OPL->output[0] = 0;
+ OPL->output_deltat[0] = 0;
+
+ advance_lfo(OPL);
+
+ /* deltaT ADPCM */
+ if( DELTAT->portstate&0x80 )
+ YM_DELTAT_ADPCM_CALC(DELTAT);
+
+ /* FM part */
+ OPL_CALC_CH(OPL, &OPL->P_CH[0]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[1]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[2]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[3]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[4]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[5]);
+
+ if(!rhythm)
+ {
+ OPL_CALC_CH(OPL, &OPL->P_CH[6]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[7]);
+ OPL_CALC_CH(OPL, &OPL->P_CH[8]);
+ }
+ else /* Rhythm part */
+ {
+ OPL_CALC_RH(OPL, &OPL->P_CH[0], (OPL->noise_rng>>0)&1 );
+ }
+
+ lt = OPL->output[0] + (OPL->output_deltat[0]>>11);
+
+ lt >>= FINAL_SH;
+
+ /* limit check */
+ lt = limit( lt , MAXOUT, MINOUT );
+
+ #ifdef SAVE_SAMPLE
+ if (which==0)
+ {
+ SAVE_ALL_CHANNELS
+ }
+ #endif
+
+ /* store to sound buffer */
+ buf[i] = lt;
+
+ advance(OPL);
+ }
+
+}
+
+void y8950_set_port_handler(void *chip,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,void * param)
+{
+ FM_OPL *OPL = (FM_OPL *)chip;
+ OPL->porthandler_w = PortHandler_w;
+ OPL->porthandler_r = PortHandler_r;
+ OPL->port_param = param;
+}
+
+void y8950_set_keyboard_handler(void *chip,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,void * param)
+{
+ FM_OPL *OPL = (FM_OPL *)chip;
+ OPL->keyboardhandler_w = KeyboardHandler_w;
+ OPL->keyboardhandler_r = KeyboardHandler_r;
+ OPL->keyboard_param = param;
+}
+
+#endif
+
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/fmopl.h b/plugins/gme/game-music-emu-0.6pre/gme/fmopl.h
new file mode 100644
index 00000000..868d38be
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/fmopl.h
@@ -0,0 +1,116 @@
+#pragma once
+
+#ifndef __FMOPL_H__
+#define __FMOPL_H__
+
+/* --- select emulation chips --- */
+#define BUILD_YM3812 (1)
+#define BUILD_YM3526 (1)
+#define BUILD_Y8950 (1)
+
+/* select output bits size of output : 8 or 16 */
+#define OPL_SAMPLE_BITS 16
+
+/* compiler dependence */
+#ifndef __OSDCOMM_H__
+#define __OSDCOMM_H__
+typedef unsigned char UINT8; /* unsigned 8bit */
+typedef unsigned short UINT16; /* unsigned 16bit */
+typedef unsigned int UINT32; /* unsigned 32bit */
+typedef signed char INT8; /* signed 8bit */
+typedef signed short INT16; /* signed 16bit */
+typedef signed int INT32; /* signed 32bit */
+
+typedef INT32 stream_sample_t;
+
+#endif /* __OSDCOMM_H__ */
+
+typedef stream_sample_t OPLSAMPLE;
+/*
+#if (OPL_SAMPLE_BITS==16)
+typedef INT16 OPLSAMPLE;
+#endif
+#if (OPL_SAMPLE_BITS==8)
+typedef INT8 OPLSAMPLE;
+#endif
+*/
+
+//typedef void (*OPL_TIMERHANDLER)(void *param,int timer,attotime period);
+typedef void (*OPL_IRQHANDLER)(void *param,int irq);
+typedef void (*OPL_UPDATEHANDLER)(void *param,int min_interval_us);
+typedef void (*OPL_PORTHANDLER_W)(void *param,unsigned char data);
+typedef unsigned char (*OPL_PORTHANDLER_R)(void *param);
+
+
+#if BUILD_YM3812
+
+void *ym3812_init(UINT32 clock, UINT32 rate);
+void ym3812_shutdown(void *chip);
+void ym3812_reset_chip(void *chip);
+int ym3812_write(void *chip, int a, int v);
+unsigned char ym3812_read(void *chip, int a);
+int ym3812_timer_over(void *chip, int c);
+void ym3812_update_one(void *chip, OPLSAMPLE *buffer, int length);
+
+//void ym3812_set_timer_handler(void *chip, OPL_TIMERHANDLER TimerHandler, void *param);
+void ym3812_set_irq_handler(void *chip, OPL_IRQHANDLER IRQHandler, void *param);
+void ym3812_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void *param);
+
+#endif /* BUILD_YM3812 */
+
+
+#if BUILD_YM3526
+
+/*
+** Initialize YM3526 emulator(s).
+**
+** 'num' is the number of virtual YM3526's to allocate
+** 'clock' is the chip clock in Hz
+** 'rate' is sampling rate
+*/
+void *ym3526_init(UINT32 clock, UINT32 rate);
+/* shutdown the YM3526 emulators*/
+void ym3526_shutdown(void *chip);
+void ym3526_reset_chip(void *chip);
+int ym3526_write(void *chip, int a, int v);
+unsigned char ym3526_read(void *chip, int a);
+int ym3526_timer_over(void *chip, int c);
+/*
+** Generate samples for one of the YM3526's
+**
+** 'which' is the virtual YM3526 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void ym3526_update_one(void *chip, OPLSAMPLE *buffer, int length);
+
+//void ym3526_set_timer_handler(void *chip, OPL_TIMERHANDLER TimerHandler, void *param);
+void ym3526_set_irq_handler(void *chip, OPL_IRQHANDLER IRQHandler, void *param);
+void ym3526_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void *param);
+
+#endif /* BUILD_YM3526 */
+
+
+#if BUILD_Y8950
+
+/* Y8950 port handlers */
+void y8950_set_port_handler(void *chip, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHANDLER_R PortHandler_r, void *param);
+void y8950_set_keyboard_handler(void *chip, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, void *param);
+void y8950_set_delta_t_memory(void *chip, void * deltat_mem_ptr, int deltat_mem_size );
+
+void * y8950_init(UINT32 clock, UINT32 rate);
+void y8950_shutdown(void *chip);
+void y8950_reset_chip(void *chip);
+int y8950_write(void *chip, int a, int v);
+unsigned char y8950_read (void *chip, int a);
+int y8950_timer_over(void *chip, int c);
+void y8950_update_one(void *chip, OPLSAMPLE *buffer, int length);
+
+//void y8950_set_timer_handler(void *chip, OPL_TIMERHANDLER TimerHandler, void *param);
+void y8950_set_irq_handler(void *chip, OPL_IRQHANDLER IRQHandler, void *param);
+void y8950_set_update_handler(void *chip, OPL_UPDATEHANDLER UpdateHandler, void *param);
+
+#endif /* BUILD_Y8950 */
+
+
+#endif /* __FMOPL_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/gme.cpp b/plugins/gme/game-music-emu-0.6pre/gme/gme.cpp
new file mode 100644
index 00000000..1b584961
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/gme.cpp
@@ -0,0 +1,431 @@
+// Game_Music_Emu 0.6-pre. http://www.slack.net/~ant/
+
+#include "Music_Emu.h"
+
+#if !GME_DISABLE_EFFECTS
+#include "Effects_Buffer.h"
+#endif
+#include "blargg_endian.h"
+#include <string.h>
+#include <ctype.h>
+
+/* Copyright (C) 2003-2009 Shay Green. This module is free software; you
+can redistribute it and/or modify it under the terms of the GNU Lesser
+General Public License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version. This
+module 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 Lesser General Public License for more
+details. You should have received a copy of the GNU Lesser General Public
+License along with this module; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include "blargg_source.h"
+
+#ifndef GME_TYPE_LIST
+
+// Default list of all supported game music types (copy this to blargg_config.h
+// if you want to modify it)
+#define GME_TYPE_LIST \
+ gme_ay_type,\
+ gme_gbs_type,\
+ gme_gym_type,\
+ gme_hes_type,\
+ gme_kss_type,\
+ gme_nsf_type,\
+ gme_nsfe_type,\
+ gme_sap_type,\
+ gme_sgc_type,\
+ gme_spc_type,\
+ gme_vgm_type,\
+ gme_vgz_type
+
+#endif
+
+static gme_type_t const gme_type_list_ [] = { GME_TYPE_LIST, 0 };
+
+gme_type_t const* gme_type_list()
+{
+ return gme_type_list_;
+}
+
+const char* gme_identify_header( void const* header )
+{
+ switch ( get_be32( header ) )
+ {
+ case BLARGG_4CHAR('Z','X','A','Y'): return "AY";
+ case BLARGG_4CHAR('G','B','S',0x01): return "GBS";
+ case BLARGG_4CHAR('G','Y','M','X'): return "GYM";
+ case BLARGG_4CHAR('H','E','S','M'): return "HES";
+ case BLARGG_4CHAR('K','S','C','C'):
+ case BLARGG_4CHAR('K','S','S','X'): return "KSS";
+ case BLARGG_4CHAR('N','E','S','M'): return "NSF";
+ case BLARGG_4CHAR('N','S','F','E'): return "NSFE";
+ case BLARGG_4CHAR('S','A','P',0x0D): return "SAP";
+ case BLARGG_4CHAR('S','G','C',0x1A): return "SGC";
+ case BLARGG_4CHAR('S','N','E','S'): return "SPC";
+ case BLARGG_4CHAR('V','g','m',' '): return "VGM";
+ }
+ return "";
+}
+
+static void to_uppercase( const char in [], int len, char out [] )
+{
+ for ( int i = 0; i < len; i++ )
+ {
+ if ( !(out [i] = toupper( in [i] )) )
+ return;
+ }
+ *out = 0; // extension too long
+}
+
+gme_type_t gme_identify_extension( const char extension_ [] )
+{
+ char const* end = strrchr( extension_, '.' );
+ if ( end )
+ extension_ = end + 1;
+
+ char extension [6];
+ to_uppercase( extension_, sizeof extension, extension );
+
+ gme_type_t const* types = gme_type_list_;
+ for ( ; *types; types++ )
+ if ( !strcmp( extension, (*types)->extension_ ) )
+ break;
+ return *types;
+}
+
+gme_err_t gme_identify_file( const char path [], gme_type_t* type_out )
+{
+ *type_out = gme_identify_extension( path );
+ // TODO: don't examine header if file has extension?
+ if ( !*type_out )
+ {
+ char header [4];
+ GME_FILE_READER in;
+ RETURN_ERR( in.open( path ) );
+ RETURN_ERR( in.read( header, sizeof header ) );
+ *type_out = gme_identify_extension( gme_identify_header( header ) );
+ }
+ return blargg_ok;
+}
+
+gme_err_t gme_open_data( const char *path, void const* data, long size, Music_Emu** out, int sample_rate )
+{
+ require( (data || !size) && out );
+ *out = NULL;
+
+ gme_type_t file_type = 0;
+ if ( size >= 4 )
+ file_type = gme_identify_extension( path );
+ if ( !file_type )
+ return blargg_err_file_type;
+
+ Music_Emu* emu = gme_new_emu( file_type, sample_rate );
+ CHECK_ALLOC( emu );
+
+ gme_err_t err = gme_load_data( emu, data, size );
+
+ if ( err )
+ delete emu;
+ else
+ *out = emu;
+
+ return err;
+}
+
+gme_err_t gme_open_file( const char path [], Music_Emu** out, int sample_rate )
+{
+ require( path && out );
+ *out = NULL;
+
+ GME_FILE_READER in;
+ RETURN_ERR( in.open( path ) );
+
+ char header [4];
+ int header_size = 0;
+
+ gme_type_t file_type = gme_identify_extension( path );
+ if ( !file_type )
+ {
+ header_size = sizeof header;
+ RETURN_ERR( in.read( header, sizeof header ) );
+ file_type = gme_identify_extension( gme_identify_header( header ) );
+ }
+ if ( !file_type )
+ return blargg_err_file_type;
+
+ Music_Emu* emu = gme_new_emu( file_type, sample_rate );
+ CHECK_ALLOC( emu );
+
+ // optimization: avoids seeking/re-reading header
+ Remaining_Reader rem( header, header_size, &in );
+ gme_err_t err = emu->load( rem );
+ in.close();
+
+ if ( err )
+ delete emu;
+ else
+ *out = emu;
+
+ return err;
+}
+
+Music_Emu* gme_new_emu( gme_type_t type, int rate )
+{
+ if ( type )
+ {
+ if ( rate == gme_info_only )
+ return type->new_info();
+
+ Music_Emu* gme = type->new_emu();
+ if ( gme )
+ {
+ #if !GME_DISABLE_EFFECTS
+ if ( type->flags_ & 1 )
+ {
+ gme->effects_buffer_ = BLARGG_NEW Simple_Effects_Buffer;
+ if ( gme->effects_buffer_ )
+ gme->set_buffer( gme->effects_buffer_ );
+ }
+
+ if ( !(type->flags_ & 1) || gme->effects_buffer_ )
+ #endif
+ {
+ if ( !gme->set_sample_rate( rate ) )
+ {
+ check( gme->type() == type );
+ return gme;
+ }
+ }
+ delete gme;
+ }
+ }
+ return NULL;
+}
+
+gme_err_t gme_load_file( Music_Emu* gme, const char path [] ) { return gme->load_file( path ); }
+
+gme_err_t gme_load_data( Music_Emu* gme, void const* data, long size )
+{
+ Mem_File_Reader in( data, size );
+ return gme->load( in );
+}
+
+gme_err_t gme_load_custom( Music_Emu* gme, gme_reader_t func, long size, void* data )
+{
+ Callback_Reader in( func, size, data );
+ return gme->load( in );
+}
+
+void gme_delete( Music_Emu* gme ) { delete gme; }
+
+gme_type_t gme_type( Music_Emu const* gme ) { return gme->type(); }
+
+const char* gme_warning( Music_Emu* gme ) { return gme->warning(); }
+
+int gme_track_count( Music_Emu const* gme ) { return gme->track_count(); }
+
+struct gme_info_t_ : gme_info_t
+{
+ track_info_t info;
+
+ BLARGG_DISABLE_NOTHROW
+};
+
+gme_err_t gme_track_info( Music_Emu const* me, gme_info_t** out, int track )
+{
+ *out = NULL;
+
+ gme_info_t_* info = BLARGG_NEW gme_info_t_;
+ CHECK_ALLOC( info );
+
+ gme_err_t err = me->track_info( &info->info, track );
+ if ( err )
+ {
+ gme_free_info( info );
+ return err;
+ }
+
+ #define COPY(name) info->name = info->info.name;
+
+ COPY( length );
+ COPY( intro_length );
+ COPY( loop_length );
+
+ info->i4 = -1;
+ info->i5 = -1;
+ info->i6 = -1;
+ info->i7 = -1;
+ info->i8 = -1;
+ info->i9 = -1;
+ info->i10 = -1;
+ info->i11 = -1;
+ info->i12 = -1;
+ info->i13 = -1;
+ info->i14 = -1;
+ info->i15 = -1;
+
+ info->s7 = "";
+ info->s8 = "";
+ info->s9 = "";
+ info->s10 = "";
+ info->s11 = "";
+ info->s12 = "";
+ info->s13 = "";
+ info->s14 = "";
+ info->s15 = "";
+
+ COPY( system );
+ COPY( game );
+ COPY( song );
+ COPY( author );
+ COPY( copyright );
+ COPY( comment );
+ COPY( dumper );
+
+ #undef COPY
+
+ info->play_length = info->length;
+ if ( info->play_length <= 0 )
+ {
+ info->play_length = info->intro_length + 2 * info->loop_length; // intro + 2 loops
+ if ( info->play_length <= 0 )
+ info->play_length = 150 * 1000; // 2.5 minutes
+ }
+
+ *out = info;
+
+ return blargg_ok;
+}
+
+void gme_free_info( gme_info_t* info )
+{
+ delete STATIC_CAST(gme_info_t_*,info);
+}
+
+void* gme_user_data ( Music_Emu const* gme ) { return gme->user_data(); }
+void gme_set_user_data ( Music_Emu* gme, void* new_user_data ) { gme->set_user_data( new_user_data ); }
+void gme_set_user_cleanup(Music_Emu* gme, gme_user_cleanup_t func ){ gme->set_user_cleanup( func ); }
+
+gme_err_t gme_start_track ( Music_Emu* gme, int index ) { return gme->start_track( index ); }
+gme_err_t gme_play ( Music_Emu* gme, int n, short p [] ) { return gme->play( n, p ); }
+void gme_set_fade ( Music_Emu* gme, int start_msec ) { gme->set_fade( start_msec ); }
+gme_bool gme_track_ended ( Music_Emu const* gme ) { return gme->track_ended(); }
+int gme_tell ( Music_Emu const* gme ) { return gme->tell(); }
+gme_err_t gme_seek ( Music_Emu* gme, int msec ) { return gme->seek( msec ); }
+int gme_voice_count ( Music_Emu const* gme ) { return gme->voice_count(); }
+void gme_ignore_silence ( Music_Emu* gme, gme_bool disable ) { gme->ignore_silence( disable != 0 ); }
+void gme_set_tempo ( Music_Emu* gme, double t ) { gme->set_tempo( t ); }
+void gme_mute_voice ( Music_Emu* gme, int index, gme_bool mute ){ gme->mute_voice( index, mute != 0 ); }
+void gme_mute_voices ( Music_Emu* gme, int mask ) { gme->mute_voices( mask ); }
+void gme_set_equalizer ( Music_Emu* gme, gme_equalizer_t const* eq ) { gme->set_equalizer( *eq ); }
+void gme_equalizer ( Music_Emu const* gme, gme_equalizer_t* o ) { *o = gme->equalizer(); }
+const char* gme_voice_name ( Music_Emu const* gme, int i ) { return gme->voice_name( i ); }
+
+void gme_effects( Music_Emu const* gme, gme_effects_t* out )
+{
+ static gme_effects_t const zero = { 0 };
+ *out = zero;
+
+ #if !GME_DISABLE_EFFECTS
+ {
+ Simple_Effects_Buffer* b = STATIC_CAST(Simple_Effects_Buffer*,gme->effects_buffer_);
+ if ( b )
+ {
+ out->enabled = b->config().enabled;
+ out->echo = b->config().echo;
+ out->stereo = b->config().stereo;
+ out->surround = b->config().surround;
+ }
+ }
+ #endif
+}
+
+void gme_set_effects( Music_Emu* gme, gme_effects_t const* in )
+{
+ #if !GME_DISABLE_EFFECTS
+ {
+ Simple_Effects_Buffer* b = STATIC_CAST(Simple_Effects_Buffer*,gme->effects_buffer_);
+ if ( b )
+ {
+ b->config().enabled = false;
+ if ( in )
+ {
+ b->config().enabled = in->enabled;
+ b->config().echo = in->echo;
+ b->config().stereo = in->stereo;
+ b->config().surround = in->surround;
+ }
+ b->apply_config();
+ }
+ }
+ #endif
+}
+
+void gme_set_stereo_depth( Music_Emu* gme, double depth )
+{
+ #if !GME_DISABLE_EFFECTS
+ {
+ if ( gme->effects_buffer_ )
+ {
+ gme_effects_t cfg;
+ gme_effects( gme, &cfg );
+ cfg.enabled = (depth > 0.0);
+ cfg.echo = depth;
+ cfg.stereo = depth;
+ cfg.surround = true;
+ gme_set_effects( gme, &cfg );
+ }
+ }
+ #endif
+}
+
+#define ENTRY( name ) { blargg_err_##name, gme_err_##name }
+static blargg_err_to_code_t const gme_codes [] =
+{
+ ENTRY( generic ),
+ ENTRY( memory ),
+ ENTRY( caller ),
+ ENTRY( internal ),
+ ENTRY( limitation ),
+
+ ENTRY( file_missing ),
+ ENTRY( file_read ),
+ ENTRY( file_io ),
+ ENTRY( file_eof ),
+
+ ENTRY( file_type ),
+ ENTRY( file_feature ),
+ ENTRY( file_corrupt ),
+
+ { 0, -1 }
+};
+#undef ENTRY
+
+static int err_code( gme_err_t err )
+{
+ return blargg_err_to_code( err, gme_codes );
+}
+
+int gme_err_code( gme_err_t err )
+{
+ int code = err_code( err );
+ return (code >= 0 ? code : gme_err_generic);
+}
+
+gme_err_t gme_code_to_err( int code )
+{
+ return blargg_code_to_err( code, gme_codes );
+}
+
+const char* gme_err_details( gme_err_t err )
+{
+ // If we don't have error code assigned, return entire string
+ return (err_code( err ) >= 0 ? blargg_err_details( err ) : blargg_err_str( err ));
+}
+
+const char* gme_err_str( gme_err_t err )
+{
+ return blargg_err_str( err );
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/gme.h b/plugins/gme/game-music-emu-0.6pre/gme/gme.h
new file mode 100644
index 00000000..edd5b5d6
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/gme.h
@@ -0,0 +1,298 @@
+/* Loads and plays video game music files into sample buffer */
+
+/* Game_Music_Emu 0.6-pre */
+#ifndef GME_H
+#define GME_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Pointer to error, or NULL if function was successful. See Errors below. */
+#ifndef gme_err_t /* (#ifndef allows better testing of library) */
+ typedef const char* gme_err_t;
+#endif
+
+/* First parameter of most functions is gme_t*, or const gme_t* if nothing is
+changed. */
+typedef struct gme_t gme_t;
+
+/* Boolean; false = 0, true = 1 */
+typedef int gme_bool;
+
+
+/******** Basic operations ********/
+
+/* Opens game music file and points *out at it. If error, sets *out to NULL. */
+gme_err_t gme_open_file( const char path [], gme_t** out, int sample_rate );
+
+/* Number of tracks */
+int gme_track_count( const gme_t* );
+
+/* Starts a track, where 0 is the first track. Requires that 0 <= index < gme_track_count(). */
+gme_err_t gme_start_track( gme_t*, int index );
+
+/* Generates 'count' 16-bit signed samples info 'out'. Output is in stereo, so count
+must be even. */
+gme_err_t gme_play( gme_t*, int count, short out [] );
+
+/* Closes file and frees memory. OK to pass NULL. */
+void gme_delete( gme_t* );
+
+
+/******** Track position/length ********/
+
+/* Sets time to start fading track out. Once fade ends track_ended() returns true.
+Fade time can be changed while track is playing. */
+void gme_set_fade( gme_t*, int start_msec );
+
+/* True if a track has reached its end */
+gme_bool gme_track_ended( const gme_t* );
+
+/* Number of milliseconds played since beginning of track (1000 = one second) */
+int gme_tell( const gme_t* );
+
+/* Seeks to new time in track. Seeking backwards or far forward can take a while. */
+gme_err_t gme_seek( gme_t*, int msec );
+
+
+/******** Informational ********/
+
+/* Use in place of sample rate for open/load if you only need to get track
+information from a music file */
+enum { gme_info_only = -1 };
+
+/* Most recent warning string, or NULL if none. Clears current warning after returning.
+Warning is also cleared when loading a file and starting a track. */
+const char* gme_warning( gme_t* );
+
+/* Loads m3u playlist file (must be done after loading music) */
+gme_err_t gme_load_m3u( gme_t*, const char path [] );
+
+/* Clears any loaded m3u playlist and any internal playlist that the music format
+supports (NSFE for example). */
+void gme_clear_playlist( gme_t* );
+
+/* Passes back pointer to information for a particular track (length, name, author, etc.).
+Must be freed after use. */
+typedef struct gme_info_t gme_info_t;
+gme_err_t gme_track_info( const gme_t*, gme_info_t** out, int track );
+
+/* Frees track information */
+void gme_free_info( gme_info_t* );
+
+struct gme_info_t
+{
+ /* times in milliseconds; -1 if unknown */
+ int length; /* total length, if file specifies it */
+ int intro_length; /* length of song up to looping section */
+ int loop_length; /* length of looping section */
+
+ /* Length if available, otherwise intro_length+loop_length*2 if available,
+ otherwise a default of 150000 (2.5 minutes). */
+ int play_length;
+
+ int i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15; /* reserved */
+
+ /* empty string ("") if not available */
+ const char* system;
+ const char* game;
+ const char* song;
+ const char* author;
+ const char* copyright;
+ const char* comment;
+ const char* dumper;
+
+ const char *s7,*s8,*s9,*s10,*s11,*s12,*s13,*s14,*s15; /* reserved */
+};
+
+
+/******** Advanced playback ********/
+
+/* Disables automatic end-of-track detection and skipping of silence at beginning
+if ignore is true */
+void gme_ignore_silence( gme_t*, gme_bool ignore );
+
+/* Adjusts song tempo, where 1.0 = normal, 0.5 = half speed, 2.0 = double speed, etc.
+Track length as returned by track_info() ignores tempo (assumes it's 1.0). */
+void gme_set_tempo( gme_t*, double tempo );
+
+/* Number of voices used by currently loaded file */
+int gme_voice_count( const gme_t* );
+
+/* Name of voice i, from 0 to gme_voice_count() - 1 */
+const char* gme_voice_name( const gme_t*, int i );
+
+/* Mutes/unmutes single voice i, where voice 0 is first voice */
+void gme_mute_voice( gme_t*, int index, gme_bool mute );
+
+/* Sets muting state of ALL voices at once using a bit mask, where -1 mutes all
+voices, 0 unmutes them all, 0x01 mutes just the first voice, etc. */
+void gme_mute_voices( gme_t*, int muting_mask );
+
+/* Frequency equalizer parameters (see gme.txt) */
+typedef struct gme_equalizer_t
+{
+ double treble; /* -50.0 = muffled, 0 = flat, +5.0 = extra-crisp */
+ double bass; /* 1 = full bass, 90 = average, 16000 = almost no bass */
+
+ double d2,d3,d4,d5,d6,d7,d8,d9; /* reserved */
+} gme_equalizer_t;
+
+/* Gets current frequency equalizer parameters */
+void gme_equalizer( const gme_t*, gme_equalizer_t* out );
+
+/* Changes frequency equalizer parameters */
+void gme_set_equalizer( gme_t*, gme_equalizer_t const* eq );
+
+
+
+/******** Effects processor ********/
+
+/* Adds stereo surround and echo to music that's usually mono or has little
+stereo. Has no effect on GYM, SPC, and Sega Genesis VGM music. */
+
+/* Simplified control using a single value, where 0.0 = off and 1.0 = maximum */
+void gme_set_stereo_depth( gme_t*, double depth );
+
+struct gme_effects_t
+{
+ double echo; /* Amount of echo, where 0.0 = none, 1.0 = lots */
+ double stereo; /* Separation, where 0.0 = mono, 1.0 = hard left and right */
+
+ double d2,d3,d4,d5,d6,d7; /* reserved */
+
+ gme_bool enabled; /* If 0, no effects are added */
+ gme_bool surround;/* If 1, some channels are put in "back", using phase inversion */
+
+ int i1,i3,i4,i5,i6,i7; /* reserved */
+};
+typedef struct gme_effects_t gme_effects_t;
+
+/* Sets effects configuration, or disables effects if NULL */
+void gme_set_effects( gme_t*, gme_effects_t const* );
+
+/* Passes back current effects configuration */
+void gme_effects( const gme_t*, gme_effects_t* out );
+
+
+/******** Game music types ********/
+
+/* Music file type identifier. Can also hold NULL. */
+typedef const struct gme_type_t_* gme_type_t;
+
+/* Type of this emulator */
+gme_type_t gme_type( const gme_t* );
+
+/* Pointer to array of all music types, with NULL entry at end. Allows a player linked
+to this library to support new music types without having to be updated. */
+gme_type_t const* gme_type_list();
+
+/* Name of game system for this music file type */
+const char* gme_type_system( gme_type_t );
+
+/* True if this music file type supports multiple tracks */
+gme_bool gme_type_multitrack( gme_type_t );
+
+
+/******** Advanced file loading ********/
+
+/* Same as gme_open_file(), but uses file data already in memory. Makes copy of data. */
+gme_err_t gme_open_data( const char *path, void const* data, long size, gme_t** emu_out, int sample_rate );
+
+/* Determines likely game music type based on first four bytes of file. Returns
+string containing proper file suffix ("NSF", "SPC", etc.) or "" if file header
+is not recognized. */
+const char* gme_identify_header( void const* header );
+
+/* Gets corresponding music type for file path or extension passed in. */
+gme_type_t gme_identify_extension( const char path_or_extension [] );
+
+/* Determines file type based on file's extension or header (if extension isn't recognized).
+Sets *type_out to type, or 0 if unrecognized or error. */
+gme_err_t gme_identify_file( const char path [], gme_type_t* type_out );
+
+/* Creates new emulator and sets sample rate. Returns NULL if out of memory. If you only need
+track information, pass gme_info_only for sample_rate. */
+gme_t* gme_new_emu( gme_type_t, int sample_rate );
+
+/* Loads music file into emulator */
+gme_err_t gme_load_file( gme_t*, const char path [] );
+
+/* Loads music file from memory into emulator. Makes a copy of data passed. */
+gme_err_t gme_load_data( gme_t*, void const* data, long size );
+
+/* Loads music file using custom data reader function that will be called to
+read file data. Most emulators load the entire file in one read call. */
+typedef gme_err_t (*gme_reader_t)( void* your_data, void* out, int count );
+gme_err_t gme_load_custom( gme_t*, gme_reader_t, long file_size, void* your_data );
+
+/* Loads m3u playlist file from memory (must be done after loading music) */
+gme_err_t gme_load_m3u_data( gme_t*, void const* data, long size );
+
+
+/******** User data ********/
+
+/* Sets/gets pointer to data you want to associate with this emulator.
+You can use this for whatever you want. */
+void gme_set_user_data( gme_t*, void* new_user_data );
+void* gme_user_data( const gme_t* );
+
+/* Registers cleanup function to be called when deleting emulator, or NULL to
+clear it. Passes user_data when calling cleanup function. */
+typedef void (*gme_user_cleanup_t)( void* user_data );
+void gme_set_user_cleanup( gme_t*, gme_user_cleanup_t func );
+
+
+/******** Errors ********/
+
+/* Internally, a gme_err_t is a const char* that points to a normal C string.
+This means that other strings can be passed to the following functions. In the
+descriptions below, these other strings are referred to as being not gme_err_t
+strings. */
+
+/* Error string associated with err. Returns "" if err is NULL. Returns err
+unchanged if it isn't a gme_err_t string. */
+const char* gme_err_str( gme_err_t err );
+
+/* Details of error beyond main cause, or "" if none or err is NULL. Returns
+err unchanged if it isn't a gme_err_t string. */
+const char* gme_err_details( gme_err_t err );
+
+/* Numeric code corresponding to err. Returns gme_ok if err is NULL. Returns
+gme_err_generic if err isn't a gme_err_t string. */
+int gme_err_code( gme_err_t err );
+
+enum {
+ gme_ok = 0,/* Successful call. Guaranteed to be zero. */
+ gme_err_generic = 0x01,/* Error of unspecified type */
+ gme_err_memory = 0x02,/* Out of memory */
+ gme_err_caller = 0x03,/* Caller violated requirements of function */
+ gme_err_internal = 0x04,/* Internal problem, corruption, etc. */
+ gme_err_limitation = 0x05,/* Exceeded program limit */
+
+ gme_err_file_missing = 0x20,/* File not found at specified path */
+ gme_err_file_read = 0x21,/* Couldn't open file for reading */
+ gme_err_file_io = 0x23,/* Read/write error */
+ gme_err_file_eof = 0x25,/* Tried to read past end of file */
+
+ gme_err_file_type = 0x30,/* File is of wrong type */
+ gme_err_file_feature = 0x32,/* File requires unsupported feature */
+ gme_err_file_corrupt = 0x33 /* File is corrupt */
+};
+
+/* gme_err_t corresponding to numeric code. Note that this might not recover
+the original gme_err_t before it was converted to a numeric code; in
+particular, gme_err_details(gme_code_to_err(code)) will be "" in most cases. */
+gme_err_t gme_code_to_err( int code );
+
+
+
+/* Deprecated */
+typedef gme_t Music_Emu;
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/i_fmpac.h b/plugins/gme/game-music-emu-0.6pre/gme/i_fmpac.h
new file mode 100644
index 00000000..fecba35d
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/i_fmpac.h
@@ -0,0 +1,38 @@
+ 0x49, 0x4C, 0x4C, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x33, 0x21, 0x09, 0x0E, 0x94, 0x90, 0x48, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x13, 0x41, 0x0F, 0x0D, 0xCE, 0xD3, 0x43, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x12, 0x1B, 0x06, 0xFF, 0xD2, 0x00, 0x32,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x61, 0x1B, 0x07, 0xAF, 0x63, 0x20, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x66, 0x21, 0x15, 0x00, 0x93, 0x94, 0x20, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x61, 0x1C, 0x07, 0x82, 0x81, 0x10, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x21, 0x20, 0x1F, 0xC0, 0x71, 0x07, 0x47,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x25, 0x31, 0x26, 0x05, 0x64, 0x41, 0x18, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x17, 0x21, 0x28, 0x07, 0xFF, 0x83, 0x02, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x97, 0x81, 0x25, 0x07, 0xCF, 0xC8, 0x02, 0x14,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x21, 0x54, 0x0F, 0x80, 0x7F, 0x07, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x56, 0x03, 0xD3, 0xB2, 0x43, 0x58,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x21, 0x0C, 0x03, 0x82, 0xC0, 0x40, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x01, 0x0C, 0x03, 0xD4, 0xD3, 0x40, 0x84,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x21, 0x28, 0x00, 0xDF, 0xF8, 0xFF, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x22, 0x00, 0x00, 0xA8, 0xF8, 0xF8, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x25, 0x18, 0x00, 0x00, 0xF8, 0xA9, 0xF8, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/i_fmunit.h b/plugins/gme/game-music-emu-0.6pre/gme/i_fmunit.h
new file mode 100644
index 00000000..3030810e
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/i_fmunit.h
@@ -0,0 +1,38 @@
+ 0x49, 0x4C, 0x4C, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x61, 0x1E, 0x07, 0xF0, 0x7E, 0x07, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x13, 0x41, 0x0F, 0x1D, 0xCE, 0xD2, 0x43, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x01, 0x99, 0x04, 0xFF, 0xC3, 0x03, 0x73,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x61, 0x1B, 0x07, 0xAF, 0x63, 0x40, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x22, 0x16, 0x05, 0x90, 0x71, 0x00, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x61, 0x1D, 0x07, 0x32, 0x81, 0x10, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x21, 0x2D, 0x16, 0xC0, 0x70, 0x07, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x21, 0x1B, 0x06, 0x64, 0x65, 0x18, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x61, 0x0C, 0x18, 0x85, 0xA0, 0x79, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x21, 0x87, 0x11, 0xF0, 0xA4, 0x00, 0xF7,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x97, 0xE1, 0x28, 0x07, 0xFF, 0xF3, 0x02, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x10, 0x0C, 0x05, 0xF2, 0xC4, 0x40, 0xC8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x56, 0x03, 0xB4, 0xB2, 0x23, 0x58,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x41, 0x89, 0x03, 0xF1, 0xF4, 0xF0, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x21, 0x28, 0x00, 0xDF, 0xF8, 0xFF, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0F, 0x02, 0x00, 0x00, 0xA7, 0xF7, 0x07, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x1F, 0x00, 0x00, 0xF8, 0xA9, 0x08, 0x05,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/i_vrc7.h b/plugins/gme/game-music-emu-0.6pre/gme/i_vrc7.h
new file mode 100644
index 00000000..56bbfa9d
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/i_vrc7.h
@@ -0,0 +1,38 @@
+ 0x49, 0x4C, 0x4C, 0x32, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x61, 0x1E, 0x07, 0xF0, 0x7E, 0x07, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x13, 0x41, 0x0F, 0x1D, 0xCE, 0xD2, 0x43, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x01, 0x99, 0x04, 0xFF, 0xC3, 0x03, 0x73,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x61, 0x1B, 0x07, 0xAF, 0x63, 0x40, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x22, 0x16, 0x05, 0x90, 0x71, 0x00, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x31, 0x61, 0x1D, 0x07, 0x32, 0x81, 0x10, 0x17,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x21, 0x2D, 0x16, 0xC0, 0x70, 0x07, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x21, 0x1B, 0x06, 0x64, 0x65, 0x18, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x61, 0x0C, 0x18, 0x85, 0xA0, 0x79, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x23, 0x21, 0x87, 0x11, 0xF0, 0xA4, 0x00, 0xF7,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x97, 0xE1, 0x28, 0x07, 0xFF, 0xF3, 0x02, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x10, 0x0C, 0x05, 0xF2, 0xC4, 0x40, 0xC8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x56, 0x03, 0xB4, 0xB2, 0x23, 0x58,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x61, 0x41, 0x89, 0x03, 0xF1, 0xF4, 0xF0, 0x13,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x21, 0x28, 0x00, 0xDF, 0xF8, 0xFF, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x28, 0x21, 0x00, 0x00, 0xA8, 0xF8, 0xF8, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x25, 0x18, 0x00, 0x00, 0xF8, 0xA9, 0xF8, 0x55,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/kmsnddev.h b/plugins/gme/game-music-emu-0.6pre/gme/kmsnddev.h
new file mode 100644
index 00000000..ec7552b1
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/kmsnddev.h
@@ -0,0 +1,31 @@
+/* libnezp by Mamiya */
+
+#ifndef KMSNDDEV_H__
+#define KMSNDDEV_H__
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "nestypes.h"
+
+typedef struct KMIF_SOUND_DEVICE {
+ void *ctx;
+ void (*release)(void *ctx);
+ void (*reset)(void *ctx, Uint32 clock, Uint32 freq);
+ int (*synth)(void *ctx);
+ void (*volume)(void *ctx, Int32 v);
+ void (*write)(void *ctx, Uint32 a, Uint32 v);
+ Uint32 (*read)(void *ctx, Uint32 a);
+ void (*setinst)(void *ctx, Uint32 n, void *p, Uint32 l);
+#if 0
+ void (*setrate)(void *ctx, Uint32 clock, Uint32 freq);
+ void (*getinfo)(void *ctx, KMCH_INFO *cip, );
+ void (*volume2)(void *ctx, Uint8 *volp, Uint32 numch);
+ /* 0x00(mute),0x70(x1/2),0x80(x1),0x90(x2) */
+#endif
+} KMIF_SOUND_DEVICE;
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* KMSNDDEV_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/nestypes.h b/plugins/gme/game-music-emu-0.6pre/gme/nestypes.h
new file mode 100644
index 00000000..1fd3582b
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/nestypes.h
@@ -0,0 +1,39 @@
+#ifndef NESTYPES_H__
+#define NESTYPES_H__
+
+#if defined(_MSC_VER)
+#define NEVER_REACH __assume(0);
+#define inline __inline
+#elif defined(__BORLANDC__)
+#define __fastcall __msfastcall
+#elif defined(__GNUC__)
+#define __inline __inline__
+#define __fastcall
+#else
+#define __inline
+#define __fastcall
+#endif
+#ifndef NEVER_REACH
+#define NEVER_REACH
+#endif
+
+typedef int Int;
+typedef unsigned int Uint;
+typedef signed int Int32;
+typedef unsigned int Uint32;
+typedef signed short Int16;
+typedef unsigned short Uint16;
+typedef signed char Int8;
+typedef unsigned char Uint8;
+typedef char Char;
+
+#include <stdlib.h>
+
+#define XSLEEP(n) ((void)0)
+#define XMALLOC(s) malloc(s)
+#define XREALLOC(p,s) realloc(p,s)
+#define XFREE(p) free(p)
+#define XMEMCPY(d,s,n) memcpy(d,s,n)
+#define XMEMSET(d,c,n) memset(d,c,n)
+
+#endif /* NESTYPES_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.c b/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.c
new file mode 100644
index 00000000..5bf299a5
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.c
@@ -0,0 +1,281 @@
+#include "kmsnddev.h"
+#include "divfix.h"
+#include "s_logtbl.h"
+#include "s_deltat.h"
+#include <string.h>
+
+#define CPS_SHIFT 16
+#define PHASE_SHIFT 16 /* 16(fix) */
+
+typedef struct {
+ KMIF_SOUND_DEVICE kmif;
+ KMIF_LOGTABLE *logtbl;
+ struct YMDELTATPCMSOUND_COMMON_TAG {
+ Int32 mastervolume;
+ Int32 step;
+ Int32 output;
+ Uint32 cnt;
+ Uint32 cps;
+ Uint32 phase;
+ Uint32 deltan;
+ Uint32 scale;
+ Uint32 mem;
+ Uint32 play;
+ Uint32 start;
+ Uint32 stop;
+ Int32 level32;
+ Uint8 key;
+ Uint8 level;
+ Uint8 granuality;
+ Uint8 pad4_3;
+ Uint8 regs[0x10];
+ } common;
+ Uint8 *romrambuf;
+ Uint32 romrammask;
+ Uint8 *rambuf;
+ Uint32 rammask;
+ Uint8 *rombuf;
+ Uint32 rommask;
+ Uint8 ymdeltatpcm_type;
+ Uint8 memshift;
+} YMDELTATPCMSOUND;
+
+const static Uint8 table_step[8] =
+{
+ 1, 3, 5, 7, 9, 11, 13, 15,
+};
+const static Uint8 table_scale[16] =
+{
+ 57, 57, 57, 57, 77, 102, 128, 153,
+ 57, 57, 57, 57, 77, 102, 128, 153,
+};
+
+__inline static void writeram(YMDELTATPCMSOUND *sndp, Uint32 v)
+{
+ sndp->rambuf[(sndp->common.mem >> 1) & sndp->rammask] = v;
+ sndp->common.mem += 1 << 1;
+}
+
+__inline static Uint32 readram(YMDELTATPCMSOUND *sndp)
+{
+ Uint32 v;
+ v = sndp->romrambuf[(sndp->common.play >> 1) & sndp->romrammask];
+ if (sndp->common.play & 1)
+ v &= 0x0F;
+ else
+ v >>= 4;
+ sndp->common.play += 1;
+ if (sndp->common.play >= sndp->common.stop)
+ {
+ if (sndp->common.regs[0] & 0x10)
+ {
+ sndp->common.play = sndp->common.start;
+ sndp->common.step = 0;
+ sndp->common.scale = 127;
+ }
+ else
+ {
+ sndp->common.key = 0;
+ }
+ }
+ return v;
+}
+
+__inline static void DelrtatStep(YMDELTATPCMSOUND *sndp, Uint32 data)
+{
+ if (data & 8)
+ sndp->common.step -= (table_step[data & 7] * sndp->common.scale) >> 3;
+ else
+ sndp->common.step += (table_step[data & 7] * sndp->common.scale) >> 3;
+ if (sndp->common.step > ((1 << 15) - 1)) sndp->common.step = ((1 << 15) - 1);
+ if (sndp->common.step < -(1 << 15)) sndp->common.step = -(1 << 15);
+ sndp->common.scale = (sndp->common.scale * table_scale[data]) >> 6;
+ if (sndp->common.scale > 24576) sndp->common.scale = 24576;
+ if (sndp->common.scale < 127) sndp->common.scale = 127;
+}
+
+#if (((-1) >> 1) == -1)
+#define SSR(x, y) (((Int32)x) >> (y))
+#else
+#define SSR(x, y) (((x) >= 0) ? ((x) >> (y)) : (-((-(x) - 1) >> (y)) - 1))
+#endif
+
+static int sndsynth(YMDELTATPCMSOUND *sndp )
+{
+ if (!sndp->common.key)
+ return 0;
+ {
+ Uint32 step;
+ sndp->common.cnt += sndp->common.cps;
+ step = sndp->common.cnt >> CPS_SHIFT;
+ sndp->common.cnt &= (1 << CPS_SHIFT) - 1;
+ sndp->common.phase += step * sndp->common.deltan;
+ step = sndp->common.phase >> PHASE_SHIFT;
+ sndp->common.phase &= (1 << PHASE_SHIFT) - 1;
+ if (step)
+ {
+ do
+ {
+ DelrtatStep(sndp, readram(sndp));
+ } while (--step);
+ sndp->common.output = sndp->common.step * sndp->common.level32;
+ sndp->common.output = SSR(sndp->common.output, 8 + 2);
+ }
+ }
+ return sndp->common.output;
+}
+
+
+
+static void sndwrite(YMDELTATPCMSOUND *sndp, Uint32 a, Uint32 v)
+{
+ sndp->common.regs[a] = v;
+ switch (a)
+ {
+ /* START,REC,MEMDATA,REPEAT,SPOFF,--,--,RESET */
+ case 0x00: /* Control Register 1 */
+ if ((v & 0x80) && !sndp->common.key)
+ {
+ sndp->common.key = 1;
+ sndp->common.play = sndp->common.start;
+ sndp->common.step = 0;
+ sndp->common.scale = 127;
+ }
+ if (v & 1) sndp->common.key = 0;
+ break;
+ /* L,R,-,-,SAMPLE,DA/AD,RAMTYPE,ROM */
+ case 0x01: /* Control Register 2 */
+ sndp->romrambuf = (sndp->common.regs[1] & 1) ? sndp->rombuf : sndp->rambuf;
+ sndp->romrammask = (sndp->common.regs[1] & 1) ? sndp->rommask : sndp->rammask;
+ break;
+ case 0x02: /* Start Address L */
+ case 0x03: /* Start Address H */
+ sndp->common.granuality = (v & 2) ? 1 : 4;
+ sndp->common.start = ((sndp->common.regs[3] << 8) + sndp->common.regs[2]) << (sndp->memshift + 1);
+ sndp->common.mem = sndp->common.start;
+ break;
+ case 0x04: /* Stop Address L */
+ case 0x05: /* Stop Address H */
+ sndp->common.stop = ((sndp->common.regs[5] << 8) + sndp->common.regs[4]) << (sndp->memshift + 1);
+ break;
+ case 0x06: /* Prescale L */
+ case 0x07: /* Prescale H */
+ break;
+ case 0x08: /* Data */
+ if ((sndp->common.regs[0] & 0x60) == 0x60) writeram(sndp, v);
+ break;
+ case 0x09: /* Delta-N L */
+ case 0x0A: /* Delta-N H */
+ sndp->common.deltan = (sndp->common.regs[0xA] << 8) + sndp->common.regs[0x9];
+ if (sndp->common.deltan < 0x100) sndp->common.deltan = 0x100;
+ break;
+ case 0x0B: /* Level Control */
+ sndp->common.level = v;
+ sndp->common.level32 = ((Int32)(sndp->common.level * LogToLin(sndp->logtbl, sndp->common.mastervolume, LOG_LIN_BITS - 15))) >> 7;
+ sndp->common.output = sndp->common.step * sndp->common.level32;
+ sndp->common.output = SSR(sndp->common.output, 8 + 2);
+ break;
+ }
+}
+
+static Uint32 sndread(YMDELTATPCMSOUND *sndp, Uint32 a)
+{
+ return 0;
+}
+
+static void sndreset(YMDELTATPCMSOUND *sndp, Uint32 clock, Uint32 freq)
+{
+ XMEMSET(&sndp->common, 0, sizeof(sndp->common));
+ sndp->common.cps = DivFix(clock, 72 * freq, CPS_SHIFT);
+ sndp->romrambuf = (sndp->common.regs[1] & 1) ? sndp->rombuf : sndp->rambuf;
+ sndp->romrammask = (sndp->common.regs[1] & 1) ? sndp->rommask : sndp->rammask;
+ sndp->common.granuality = 4;
+}
+
+static void sndvolume(YMDELTATPCMSOUND *sndp, Int32 volume)
+{
+ volume = (volume << (LOG_BITS - 8)) << 1;
+ sndp->common.mastervolume = volume;
+ sndp->common.level32 = ((Int32)(sndp->common.level * LogToLin(sndp->logtbl, sndp->common.mastervolume, LOG_LIN_BITS - 15))) >> 7;
+ sndp->common.output = sndp->common.step * sndp->common.level32;
+ sndp->common.output = SSR(sndp->common.output, 8 + 2);
+}
+
+static void sndrelease(YMDELTATPCMSOUND *sndp)
+{
+ if (sndp->logtbl) sndp->logtbl->release(sndp->logtbl->ctx);
+ XFREE(sndp);
+}
+
+static void setinst(YMDELTATPCMSOUND *sndp, Uint32 n, void *p, Uint32 l)
+{
+ if (n) return;
+ if (p)
+ {
+ sndp->rombuf = (Uint8*) p;
+ sndp->rommask = l - 1;
+ sndp->romrambuf = (sndp->common.regs[1] & 1) ? sndp->rombuf : sndp->rambuf;
+ sndp->romrammask = (sndp->common.regs[1] & 1) ? sndp->rommask : sndp->rammask;
+ }
+ else
+ {
+ sndp->rombuf = 0;
+ sndp->rommask = 0;
+ }
+
+}
+
+KMIF_SOUND_DEVICE *YMDELTATPCMSoundAlloc(Uint32 ymdeltatpcm_type)
+{
+ Uint32 ram_size;
+ YMDELTATPCMSOUND *sndp;
+ switch (ymdeltatpcm_type)
+ {
+ case YMDELTATPCM_TYPE_Y8950:
+ ram_size = 32 * 1024;
+ break;
+ case YMDELTATPCM_TYPE_YM2608:
+ ram_size = 256 * 1024;
+ break;
+ default:
+ ram_size = 0;
+ break;
+ }
+ sndp = (YMDELTATPCMSOUND*) XMALLOC(sizeof(YMDELTATPCMSOUND) + ram_size);
+ if (!sndp) return 0;
+ sndp->ymdeltatpcm_type = ymdeltatpcm_type;
+ switch (ymdeltatpcm_type)
+ {
+ case YMDELTATPCM_TYPE_Y8950:
+ sndp->memshift = 2;
+ break;
+ case YMDELTATPCM_TYPE_YM2608:
+ /* OPNA */
+ sndp->memshift = 6;
+ break;
+ case YMDELTATPCM_TYPE_YM2610:
+ sndp->memshift = 9;
+ break;
+ }
+ sndp->kmif.ctx = sndp;
+ sndp->kmif.release = (void (*)( void* )) sndrelease;
+ sndp->kmif.synth = (int (*)( void* )) sndsynth;
+ sndp->kmif.volume = (void (*)( void*, int )) sndvolume;
+ sndp->kmif.reset = (void (*)( void*, Uint32, Uint32 )) sndreset;
+ sndp->kmif.write = (void (*)( void*, Uint32, Uint32 )) sndwrite;
+ sndp->kmif.read = (Uint32 (*)( void*, Uint32 )) sndread;
+ sndp->kmif.setinst = (void (*)( void*, Uint32, void*, Uint32 )) setinst;
+ /* RAM */
+ sndp->rambuf = ram_size ? (Uint8 *)(sndp + 1) : 0;
+ sndp->rammask = ram_size ? (ram_size - 1) : 0;
+ /* ROM */
+ sndp->rombuf = 0;
+ sndp->rommask = 0;
+ sndp->logtbl = LogTableAddRef();
+ if (!sndp->logtbl)
+ {
+ sndrelease(sndp);
+ return 0;
+ }
+ return &sndp->kmif;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.h b/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.h
new file mode 100644
index 00000000..89c9242c
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_deltat.h
@@ -0,0 +1,23 @@
+#ifndef S_DELTAT_H__
+#define S_DELTAT_H__
+
+#include "kmsnddev.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ /* MSX-AUDIO */ YMDELTATPCM_TYPE_Y8950,
+ /* OPNA ADPCM */ YMDELTATPCM_TYPE_YM2608,
+ /* OPNB ADPCMB */ YMDELTATPCM_TYPE_YM2610
+};
+
+KMIF_SOUND_DEVICE *YMDELTATPCMSoundAlloc(Uint32 ymdeltatpcm_type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_DELTAT_H__ */
+
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.c b/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.c
new file mode 100644
index 00000000..0f455f2b
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.c
@@ -0,0 +1,88 @@
+#include "nestypes.h"
+#include "s_logtbl.h"
+
+#if STATIC_TABLES
+
+static void LogTableRelease(void *ctx)
+{
+}
+
+static KMIF_LOGTABLE log_static_tables = {
+ &log_static_tables;
+ LogTableRelease,
+#include "s_logt.h"
+};
+
+
+KMIF_LOGTABLE *LogTableAddRef(void)
+{
+ log_static_tables.release = LogTableRelease;
+ return &log_static_tables;
+}
+
+#else
+
+#include <math.h>
+
+static volatile Uint32 log_tables_mutex = 0;
+static Uint32 log_tables_refcount = 0;
+static KMIF_LOGTABLE *log_tables = 0;
+
+static void LogTableRelease(void *ctx)
+{
+ ++log_tables_mutex;
+ while (log_tables_mutex != 1)
+ {
+ XSLEEP(0);
+ }
+ log_tables_refcount--;
+ if (!log_tables_refcount)
+ {
+ XFREE(ctx);
+ log_tables = 0;
+ }
+ --log_tables_mutex;
+}
+
+static void LogTableCalc(KMIF_LOGTABLE *kmif_lt)
+{
+ Uint32 i;
+ double a;
+ for (i = 0; i < (1 << LOG_BITS); i++)
+ {
+ a = (1 << LOG_LIN_BITS) / pow(2, i / (double)(1 << LOG_BITS));
+ kmif_lt->logtbl[i] = (Uint32)a;
+ }
+ kmif_lt->lineartbl[0] = LOG_LIN_BITS << LOG_BITS;
+ for (i = 1; i < (1 << LIN_BITS) + 1; i++)
+ {
+ Uint32 ua;
+ a = i << (LOG_LIN_BITS - LIN_BITS);
+ ua = (Uint32)((LOG_LIN_BITS - (log(a) / log(2))) * (1 << LOG_BITS));
+ kmif_lt->lineartbl[i] = ua << 1;
+ }
+}
+
+KMIF_LOGTABLE *LogTableAddRef(void)
+{
+ ++log_tables_mutex;
+ while (log_tables_mutex != 1)
+ {
+ XSLEEP(0);
+ }
+ if (!log_tables_refcount)
+ {
+ log_tables = (KMIF_LOGTABLE*) XMALLOC(sizeof(KMIF_LOGTABLE));
+ if (log_tables)
+ {
+ log_tables->ctx = log_tables;
+ log_tables->release = LogTableRelease;
+ LogTableCalc(log_tables);
+ }
+ }
+ if (log_tables) log_tables_refcount++;
+ --log_tables_mutex;
+ return log_tables;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.h b/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.h
new file mode 100644
index 00000000..3abc79c1
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_logtbl.h
@@ -0,0 +1,43 @@
+#ifndef S_LOGTBL_H__
+#define S_LOGTBL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LOG_BITS 12
+#define LIN_BITS 7
+#define LOG_LIN_BITS 30
+
+typedef struct
+{
+ void *ctx;
+ void (*release)(void *ctx);
+ Uint32 lineartbl[(1 << LIN_BITS) + 1];
+ Uint32 logtbl[1 << LOG_BITS];
+} KMIF_LOGTABLE;
+
+KMIF_LOGTABLE *LogTableAddRef(void);
+
+__inline static Uint32 LinToLog(KMIF_LOGTABLE *kmif_lt, Int32 l)
+{
+ return (l < 0) ? (kmif_lt->lineartbl[-l] + 1) : kmif_lt->lineartbl[l];
+}
+
+__inline static Int32 LogToLin(KMIF_LOGTABLE *kmif_lt, Int32 l, Uint32 sft)
+{
+ Int32 ret;
+ Uint32 ofs;
+ ofs = l + (sft << (LOG_BITS + 1));
+ sft = ofs >> (LOG_BITS + 1);
+ if (sft >= LOG_LIN_BITS) return 0;
+ ofs = (ofs >> 1) & ((1 << LOG_BITS) - 1);
+ ret = kmif_lt->logtbl[ofs] >> sft;
+ return (l & 1) ? -ret : ret;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_LOGTBL_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_opl.c b/plugins/gme/game-music-emu-0.6pre/gme/s_opl.c
new file mode 100644
index 00000000..b2da8056
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_opl.c
@@ -0,0 +1,1244 @@
+/*
+ s_opl.c -- YM2413/Y8950/YM3526/YM3812 emulator by Mamiya, 2001.
+
+ References:
+ fmopl.c -- 1999,2000 written by Tatsuyuki Satoh (MAME development).
+ fmopl.c(fixed) -- 2000 modified by mamiya (NEZplug development).
+ fmgen.cpp -- 1999-2001 written by cisc.
+ emu2413.c -- a YM2413 emulator : written by Mitsutaka Okazaki 2001
+ fmpac.ill -- 2000 created by sama.
+ fmpac.ill -- 2000 created by NARUTO.
+ fmpac.ill -- 2001 created by Okazaki.
+ YM2413 application manual
+*/
+
+#include "kmsnddev.h"
+#include "divfix.h"
+#include "s_logtbl.h"
+#include "s_opltbl.h"
+#include "s_opl.h"
+#include "s_deltat.h"
+#include <string.h>
+
+#define PG_SHIFT 10 /* fix */
+#define CPS_SHIFTE 20
+#define CPS_SHIFTP 14
+#define LFO_SHIFT 16
+
+#define OPLL_INST_WORK 0x40
+#define OPLL_INST_WORK2 (OPLL_INST_WORK + 8 * 0x13)
+
+#define AR_BITS 6 /* fix */
+#define AR_SHIFT 14 /* fix */
+#define EG_SHIFT 15 /* fix */
+
+#define AR_PHASEMAX (((1 << AR_BITS) - 1) << AR_SHIFT)
+#define EG_PHASEMAX (127 << EG_SHIFT)
+#define EG_KEYOFF (128 << EG_SHIFT)
+#define LOG_KEYOFF (31 << (LOG_BITS + 1))
+
+#if 0
+ 0-48dB
+ AR_BITS=6
+ AR_SHIFT=14
+ x = FC000h(20.7618(sec) * 3579545 / 72)cycles 63 * 4000h
+ x / 3 * 4 1730.15(ms)
+ x / 3 * 256 27.03(ms)
+
+ EG_BITS=7
+ EG_SHIFT=15
+ x = 3F8000h(83.7064(sec) * 3579545 / 72)cycles 127 * 8000h
+ x / 4 = 20926.6(ms)
+#endif
+
+
+#define TESTING_OPTIMIZE_AME 1
+#define USE_FBBUF 1
+
+typedef struct
+{
+ Uint32 phase;
+ Uint32 spd;
+ Uint32 rng;
+} OPL_PG;
+
+enum {
+ EG_MODE_ATTACK,
+ EG_MODE_DECAY,
+ EG_MODE_SUSTINE,
+ EG_MODE_RELEASE,
+ EG_MODE_NUM,
+ EG_MODE_SUSHOLD,
+ EG_MODE_OFF = EG_MODE_NUM
+};
+
+typedef struct
+{
+ Uint32 phasear;
+ Uint32 phase;
+ Uint32 spd [EG_MODE_NUM];
+ Uint32 dr_phasemax;
+ Uint8 mode;
+ Uint8 pad4_1;
+ Uint8 pad4_2;
+ Uint8 pad4_3;
+} OPL_EG;
+
+enum
+{
+ FLAG_AME = (1 << 0),
+ FLAG_PME = (1 << 1),
+ FLAG_EGT = (1 << 2),
+ FLAG_KSR = (1 << 3)
+};
+
+typedef struct
+{
+ OPL_PG pg;
+ OPL_EG eg;
+ Int32 input;
+#if USE_FBBUF
+ Int32 fbbuf;
+#endif
+#if TESTING_OPTIMIZE_AME
+ Uint32* amin;
+#endif
+ Uint32 tl_ofs;
+ Uint32* sintable;
+
+ Uint8 modcar; /* 1:m 0:c */
+ Uint8 fb;
+ Uint8 lvl;
+ Uint8 nst;
+
+ Uint8 tll;
+ Uint8 key;
+ Uint8 rkey;
+ Uint8 prevkey;
+
+ Uint8 enable;
+ Uint8 __enablehold__;
+ Uint8 flag;
+ Uint8 ksr;
+
+ Uint8 mul;
+ Uint8 ksl;
+ Uint8 ar;
+ Uint8 dr;
+ Uint8 sl;
+ Uint8 rr;
+ Uint8 tl;
+ Uint8 wf;
+} OPL_OP;
+
+typedef struct
+{
+ OPL_OP op [2];
+ Uint8 con;
+ Uint8 freql;
+ Uint8 freqh;
+ Uint8 blk;
+ Uint8 kcode;
+ Uint8 sus;
+ Uint8 ksb;
+ Uint8 pad4_3;
+} OPL_CH;
+
+enum
+{
+ LFO_UNIT_AM,
+ LFO_UNIT_PM,
+ LFO_UNIT_NUM
+};
+
+typedef struct
+{
+ Uint32 output;
+ Uint32 cnt;
+ Uint32 sps; /* step per sample */
+ Uint32 adr;
+ Uint32 adrmask;
+ Uint32* table;
+} OPL_LFO;
+
+typedef struct
+{
+ KMIF_SOUND_DEVICE kmif;
+ KMIF_SOUND_DEVICE* deltatpcm;
+ KMIF_LOGTABLE* logtbl;
+ KMIF_OPLTABLE* opltbl;
+ OPL_CH ch [9];
+ OPL_LFO lfo [LFO_UNIT_NUM];
+ struct OPLSOUND_COMMON_TAG
+ {
+ Uint32 cpsp;
+ Uint32 cnt;
+ Uint32* ar_table;
+ Uint32* tll2logtbl;
+#if TESTING_OPTIMIZE_AME
+ Uint32 amzero;
+#endif
+ Int32 mastervolume;
+ Uint32 sintablemask;
+ Uint32 ratetbla [4];
+ Uint32 ratetbl [4];
+ Uint8 adr;
+ Uint8 wfe;
+ Uint8 rc;
+ Uint8 rmode;
+ Uint8 enable;
+ } common;
+ Uint8 regs [0x100];
+ Uint8 opl_type;
+} OPLSOUND;
+
+static Uint8 romtone [3] [16 * 19] =
+{
+ {
+#include "i_fmpac.h"
+ },
+ {
+#include "i_fmunit.h"
+ },
+ {
+#include "i_vrc7.h"
+ },
+};
+
+static void SetOpOff(OPL_OP* opp )
+{
+ opp->eg.mode = EG_MODE_OFF;
+ opp->eg.phase = EG_KEYOFF;
+ opp->enable = 0;
+}
+
+inline static void EgStep( OPLSOUND* sndp, OPL_OP* opp )
+{
+ switch ( opp->eg.mode )
+ {
+ default:
+ NEVER_REACH
+
+ case EG_MODE_ATTACK:
+ opp->eg.phase = sndp->common.ar_table [opp->eg.phasear >> (AR_SHIFT + AR_BITS - ARTBL_BITS)] >> (ARTBL_SHIFT - EG_SHIFT);
+ opp->eg.phasear += opp->eg.spd [EG_MODE_ATTACK];
+ if ( opp->eg.phasear >= AR_PHASEMAX )
+ {
+ opp->eg.mode = EG_MODE_DECAY;
+ opp->eg.phase = 0;
+ }
+ break;
+
+ case EG_MODE_DECAY:
+ opp->eg.phase += opp->eg.spd [EG_MODE_DECAY];
+ if ( opp->eg.phase >= opp->eg.dr_phasemax )
+ {
+ opp->eg.phase = opp->eg.dr_phasemax;
+ opp->eg.mode = (opp->flag & FLAG_EGT) ? EG_MODE_SUSHOLD : EG_MODE_SUSTINE;
+ }
+ break;
+
+ case EG_MODE_SUSTINE:
+ case EG_MODE_RELEASE:
+ opp->eg.phase += opp->eg.spd [opp->eg.mode];
+ if ( opp->eg.phase >= EG_PHASEMAX )
+ SetOpOff(opp);
+ break;
+
+ case EG_MODE_SUSHOLD:
+ case EG_MODE_OFF:
+ break;
+ }
+}
+
+static void OpStep( OPLSOUND* sndp, OPL_OP* opp )
+{
+ int step;
+ EgStep(sndp, opp);
+ step = opp->pg.spd;
+ if ( opp->flag & FLAG_PME )
+ step = (step * sndp->lfo [LFO_UNIT_PM].output) >> PM_SHIFT;
+ opp->pg.phase += step;
+}
+
+__inline static void OpStepNG( OPLSOUND* sndp, OPL_OP* opp )
+{
+ Uint32 step;
+ EgStep(sndp, opp);
+ opp->pg.phase += opp->pg.spd;
+ step = opp->pg.phase >> opp->nst/*(PG_SHIFT + 5)*/;
+ opp->pg.phase &= (1 << opp->nst/*(PG_SHIFT + 5)*/) - 1;
+ while ( step-- )
+ {
+ opp->pg.rng ^= ((opp->pg.rng & 1) << 16) + ((opp->pg.rng & 1) << 13);
+ opp->pg.rng >>= 1;
+ }
+}
+
+#if -1 >> 1 == -1
+/* RIGHT SHIFT IS SIGNED */
+#define SSR(x, y) ((Int32)(x) >> (y))
+#else
+/* RIGHT SHIFT IS UNSIGNED */
+#define SSR(x, y) (((x) >= 0) ? ((x) >> (y)) : (-((-(x) - 1) >> (y)) - 1))
+#endif
+
+
+inline static void OpSynthMod( OPLSOUND* sndp, OPL_OP* opp )
+{
+ if ( opp->enable )
+ {
+ Uint32 tll;
+ Int32 output;
+ OpStep(sndp, opp);
+ tll = opp->tll + (opp->eg.phase >> EG_SHIFT);
+ tll = (tll >= (1 << TLLTBL_BITS)) ? LOG_KEYOFF : sndp->common.tll2logtbl [tll];
+ tll += opp->tl_ofs;
+#if TESTING_OPTIMIZE_AME
+ tll += *opp->amin;
+#else
+ if ( opp->flag & FLAG_AME )
+ tll += sndp->lfo [LFO_UNIT_AM].output;
+#endif
+ tll += opp->sintable [sndp->common.sintablemask & (opp->input + (opp->pg.phase >> PG_SHIFT))];
+ output = LogToLin(sndp->logtbl, tll, -8 + ((LOG_LIN_BITS + 1) - (SINTBL_BITS + 2)));
+ if ( opp->fb )
+ {
+#if USE_FBBUF
+ Int32 fbtmp;
+ fbtmp = opp->fbbuf + output;
+ opp->fbbuf = output;
+ opp->input = SSR(fbtmp, (9 - opp->fb));
+#else
+ opp->input = SSR(output, (8 - opp->fb));
+#endif
+ }
+ opp [1].input = output;
+ }
+}
+
+inline static Int32 OpSynthCarFb( OPLSOUND* sndp, OPL_OP* opp )
+{
+ if ( opp->enable )
+ {
+ Uint32 tll;
+ OpStep(sndp, opp);
+ tll = opp->tll + (opp->eg.phase >> EG_SHIFT);
+ tll = (tll >= (1 << TLLTBL_BITS)) ? LOG_KEYOFF : sndp->common.tll2logtbl [tll];
+ tll += opp->tl_ofs;
+#if TESTING_OPTIMIZE_AME
+ tll +=* opp->amin;
+#else
+ if ( opp->flag & FLAG_AME) tll += sndp->lfo [LFO_UNIT_AM].output;
+#endif
+ tll += opp->sintable [sndp->common.sintablemask & (opp->input + (opp->pg.phase >> PG_SHIFT))];
+ if ( opp->fb )
+ {
+#if USE_FBBUF
+ Int32 output, fbtmp;
+ output = LogToLin(sndp->logtbl, tll, -8 + ((LOG_LIN_BITS + 1) - (SINTBL_BITS + 2)));
+ fbtmp = opp->fbbuf + output;
+ opp->fbbuf = output;
+ opp->input = SSR(fbtmp, (9 - opp->fb));
+#else
+ Int32 output;
+ output = LogToLin(sndp->logtbl, tll, -8 + ((LOG_LIN_BITS + 1) - (SINTBL_BITS + 2)));
+ opp->input = SSR(output, (8 - opp->fb));
+#endif
+ }
+ return LogToLin(sndp->logtbl, tll + sndp->common.mastervolume, -8 + LOG_LIN_BITS - 19 - opp->lvl);
+ }
+ return 0;
+}
+
+inline static Int32 OpSynthCar( OPLSOUND* sndp, OPL_OP* opp )
+{
+ if ( opp->enable )
+ {
+ Uint32 tll;
+ OpStep(sndp, opp);
+ tll = opp->tll + (opp->eg.phase >> EG_SHIFT);
+ tll = (tll >= (1 << TLLTBL_BITS)) ? LOG_KEYOFF : sndp->common.tll2logtbl [tll];
+ tll += opp->tl_ofs;
+#if TESTING_OPTIMIZE_AME
+ tll += *opp->amin;
+#else
+ if ( opp->flag & FLAG_AME )
+ tll += sndp->lfo [LFO_UNIT_AM].output;
+#endif
+ tll += opp->sintable [sndp->common.sintablemask & (opp->input + (opp->pg.phase >> PG_SHIFT))];
+ return LogToLin(sndp->logtbl, tll + sndp->common.mastervolume, -8 + LOG_LIN_BITS - 19 - opp->lvl);
+ }
+ return 0;
+}
+
+inline static Int32 OpSynthTom( OPLSOUND* sndp, OPL_OP* opp )
+{
+ if ( opp->enable )
+ {
+ Uint32 tll;
+ OpStep(sndp, opp);
+ tll = opp->tll + (opp->eg.phase >> EG_SHIFT);
+ tll = (tll >= 128 - 16) ? LOG_KEYOFF : sndp->common.tll2logtbl [tll];
+ tll += opp->tl_ofs;
+ tll += opp->sintable [sndp->common.sintablemask & (opp->pg.phase >> PG_SHIFT)];
+ return LogToLin(sndp->logtbl, tll + sndp->common.mastervolume, -8 + LOG_LIN_BITS - 19 - opp->lvl);
+ }
+ return 0;
+}
+
+
+static Int32 OpSynthRym( OPLSOUND* sndp, OPL_OP* opp )
+{
+ if ( opp->enable )
+ {
+ Uint32 tll;
+ OpStepNG(sndp, opp);
+ tll = opp->tll + (opp->eg.phase >> EG_SHIFT) + 0x10/* +6dB */;
+ tll = (tll >= (1 << TLLTBL_BITS)) ? LOG_KEYOFF : sndp->common.tll2logtbl [tll];
+ tll += opp->tl_ofs;
+ tll += (opp->pg.rng & 1);
+ return LogToLin(sndp->logtbl, tll + sndp->common.mastervolume, -8 + LOG_LIN_BITS - 19 - opp->lvl);
+ }
+ return 0;
+}
+
+inline static void LfoStep(OPL_LFO* lfop )
+{
+ lfop->cnt += lfop->sps;
+ lfop->adr += lfop->cnt >> LFO_SHIFT;
+ lfop->cnt &= (1 << LFO_SHIFT) - 1;
+ lfop->output = lfop->table [lfop->adr & lfop->adrmask];
+}
+
+static int sndsynth( OPLSOUND* sndp )
+{
+ Int32 accum = 0;
+ if ( sndp->common.enable )
+ {
+ Uint32 i, rch;
+ for ( i = 0; i < LFO_UNIT_NUM; i++ )
+ LfoStep(&sndp->lfo [i]);
+
+ rch = sndp->common.rmode ? 7 : 9;
+ for ( i = 0; i < rch; i++ )
+ {
+ if ( sndp->ch [i].op [0].modcar )
+ OpSynthMod(sndp, &sndp->ch [i].op [0]);
+ else
+ accum += OpSynthCarFb(sndp, &sndp->ch [i].op [0]);
+ accum += OpSynthCar(sndp, &sndp->ch [i].op [1]);
+ }
+ if ( sndp->common.rmode )
+ {
+ accum += OpSynthRym(sndp, &sndp->ch [7].op [0]);
+ accum += OpSynthRym(sndp, &sndp->ch [7].op [1]);
+ accum += OpSynthTom(sndp, &sndp->ch [8].op [0]);
+ accum += OpSynthRym(sndp, &sndp->ch [8].op [1]);
+ }
+ }
+ if ( sndp->deltatpcm )
+ {
+ accum += sndp->deltatpcm->synth(sndp->deltatpcm->ctx);
+ }
+#if 0
+ /* NISE DAC */
+ if ( accum >= 0 )
+ accum = (Int32)(((Uint32) accum) & (((1 << 8) - 1) << (23 - 8)));
+ else
+ accum = -(Int32)(((Uint32)-accum) & (((1 << 8) - 1) << (23 - 8)));
+#endif
+ return accum;
+}
+
+static void sndvolume( OPLSOUND* sndp, Int32 volume )
+{
+ if ( sndp->deltatpcm) sndp->deltatpcm->volume(sndp->deltatpcm->ctx, volume);
+ volume = (volume << (LOG_BITS - 8)) << 1;
+ sndp->common.mastervolume = volume;
+}
+
+const static Uint8 op_table [0x20]=
+{
+ 0, 2, 4, 1, 3, 5,0xFF,0xFF,
+ 6, 8, 10, 7, 9, 11,0xFF,0xFF,
+ 12, 14, 16, 13, 15, 17,0xFF,0xFF,
+ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
+};
+
+const static Uint8 mul_table [0x10]=
+{
+ 1+0, 2+0, 4+0, 2+4, 8+0, 8+2, 8+4,16-2,
+ 16+0,16+2,16+4,16+4,16+8,16+8,32-2,32-2,
+};
+
+#define DB2TLL(x) (x * 2 / 375 )
+const static Uint8 ksl_table [8] [16]=
+{
+ {
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ },{
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 750), DB2TLL( 1125), DB2TLL( 1500),
+ DB2TLL( 1875), DB2TLL( 2250), DB2TLL( 2625), DB2TLL( 3000),
+ },{
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 0),
+ DB2TLL( 0), DB2TLL( 1125), DB2TLL( 1875), DB2TLL( 2625),
+ DB2TLL( 3000), DB2TLL( 3750), DB2TLL( 4125), DB2TLL( 4500),
+ DB2TLL( 4875), DB2TLL( 5250), DB2TLL( 5625), DB2TLL( 6000),
+ },{
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 0), DB2TLL( 1875),
+ DB2TLL( 3000), DB2TLL( 4125), DB2TLL( 4875), DB2TLL( 5625),
+ DB2TLL( 6000), DB2TLL( 6750), DB2TLL( 7125), DB2TLL( 7500),
+ DB2TLL( 7875), DB2TLL( 8250), DB2TLL( 8625), DB2TLL( 9000),
+ },{
+ DB2TLL( 0), DB2TLL( 0), DB2TLL( 3000), DB2TLL( 4875),
+ DB2TLL( 6000), DB2TLL( 7125), DB2TLL( 7875), DB2TLL( 8625),
+ DB2TLL( 9000), DB2TLL( 9750), DB2TLL(10125), DB2TLL(10500),
+ DB2TLL(10875), DB2TLL(11250), DB2TLL(11625), DB2TLL(12000),
+ },{
+ DB2TLL( 0), DB2TLL( 3000), DB2TLL( 6000), DB2TLL( 7875),
+ DB2TLL( 9000), DB2TLL(10125), DB2TLL(10875), DB2TLL(11625),
+ DB2TLL(12000), DB2TLL(12750), DB2TLL(13125), DB2TLL(13500),
+ DB2TLL(13875), DB2TLL(14250), DB2TLL(14625), DB2TLL(15000),
+ },{
+ DB2TLL( 0), DB2TLL( 6000), DB2TLL( 9000), DB2TLL(10875),
+ DB2TLL(12000), DB2TLL(13125), DB2TLL(13875), DB2TLL(14625),
+ DB2TLL(15000), DB2TLL(15750), DB2TLL(16125), DB2TLL(16500),
+ DB2TLL(16875), DB2TLL(17250), DB2TLL(17625), DB2TLL(18000),
+ },{
+ DB2TLL( 0), DB2TLL( 9000), DB2TLL(12000), DB2TLL(13875),
+ DB2TLL(15000), DB2TLL(16125), DB2TLL(16875), DB2TLL(17625),
+ DB2TLL(18000), DB2TLL(18750), DB2TLL(19125), DB2TLL(19500),
+ DB2TLL(19875), DB2TLL(20250), DB2TLL(20625), DB2TLL(21000),
+ }
+};
+#undef DB2TLL
+
+static Uint32 rateconvAR( OPLSOUND* sndp, Uint32 rrr, Uint32 ksr )
+{
+ if ( !rrr )
+ return 0;
+ rrr = rrr + (ksr >> 2);
+ if ( rrr >= 15)
+ return AR_PHASEMAX;
+ return sndp->common.ratetbla [ksr & 3] >> (CPS_SHIFTE + 1 - rrr);
+}
+
+static Uint32 rateconv( OPLSOUND* sndp, Uint32 rrr, Uint32 ksr )
+{
+ if ( !rrr )
+ return 0;
+ rrr = rrr + (ksr >> 2);
+ if ( rrr > 15 )
+ rrr = 15;
+ return sndp->common.ratetbl [ksr & 3] >> (CPS_SHIFTE + 1 - rrr);
+}
+
+static void OpUpdateWF( OPLSOUND* sndp, OPL_OP* opp )
+{
+ opp->sintable = sndp->opltbl->sin_table [opp->wf & sndp->common.wfe];
+}
+
+static void OpUpdatePG( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp )
+{
+ opp->pg.spd = (((chp->freqh << 8) + chp->freql) * opp->mul * sndp->common.cpsp) >> (CPS_SHIFTP - chp->blk);
+}
+
+static void OpUpdateEG( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp )
+{
+ Uint32 sr, rr;
+ opp->ksr = chp->kcode >> ((opp->flag & FLAG_KSR) ? 0 : 2);
+ opp->eg.dr_phasemax = opp->sl << (1 + 2 + EG_SHIFT); /* 3dB->eg */
+ opp->eg.spd [EG_MODE_ATTACK] = rateconvAR(sndp, opp->ar, opp->ksr);
+ opp->eg.spd [EG_MODE_DECAY] = rateconv(sndp, opp->dr, opp->ksr);
+ if ( opp->flag & FLAG_EGT )
+ {
+ if ( opp->eg.mode == EG_MODE_SUSTINE )
+ opp->eg.mode = EG_MODE_SUSHOLD;
+ sr = 0;
+ rr = opp->rr;
+ }
+ else
+ {
+ if ( opp->eg.mode == EG_MODE_SUSHOLD )
+ opp->eg.mode = EG_MODE_SUSTINE;
+ sr = opp->rr;
+ rr = 7;
+ }
+ if ( chp->sus )
+ {
+ rr = 5;
+ }
+ opp->eg.spd [EG_MODE_SUSTINE] = rateconv(sndp, sr, opp->ksr);
+ opp->eg.spd [EG_MODE_RELEASE] = rateconv(sndp, rr, opp->ksr);
+}
+
+static void OpUpdateTLL( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp )
+{
+ opp->tll = (opp->tl + (chp->ksb >> opp->ksl)) << 1;
+}
+
+
+
+static void oplsetopmul( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->flag &= ~(FLAG_AME | FLAG_PME | FLAG_EGT | FLAG_KSR);
+#if TESTING_OPTIMIZE_AME
+ if ( v & 0x80 )
+ opp->amin = &sndp->lfo [LFO_UNIT_AM].output; else opp->amin = &sndp->common.amzero;
+#else
+ if ( v & 0x80 )
+ opp->flag |= FLAG_AME;
+#endif
+ if ( v & 0x40 ) opp->flag |= FLAG_PME;
+ if ( v & 0x20 ) opp->flag |= FLAG_EGT;
+ if ( v & 0x10 ) opp->flag |= FLAG_KSR;
+ opp->mul = mul_table [v & 0x0F];
+ OpUpdateEG(sndp, chp, opp);
+ OpUpdatePG(sndp, chp, opp);
+}
+
+static void oplsetopkstl( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->ksl = (v >> 6) ? (3 - (v >> 6)) : 15; /* 0 / 1.5 / 3 / 6 db/OCT */
+ opp->tl = v & 0x3F; /* 0.75 db */
+ OpUpdateTLL(sndp, chp, opp);
+}
+
+static void oplsetopardr( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->ar = v >> 4;
+ opp->dr = v & 0xF;
+ OpUpdateEG(sndp, chp, opp);
+}
+
+static void oplsetopslrr( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->sl = v >> 4;
+ opp->rr = v & 0xF;
+ OpUpdateEG(sndp, chp, opp);
+}
+
+static void oplsetopwf( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->wf = v & 0x3;
+ OpUpdateWF(sndp, opp);
+}
+
+static void oplsetopkey( OPLSOUND* sndp, OPL_OP* opp )
+{
+ Uint8 nextkey = ((sndp->common.rmode) && opp->rkey) || opp->key;
+ if ( opp->prevkey ^ nextkey )
+ {
+ opp->prevkey = nextkey;
+ if ( nextkey )
+ {
+ sndp->common.enable = 1;
+ opp->eg.mode = EG_MODE_ATTACK;
+ opp->eg.phase = EG_KEYOFF;
+ opp->enable = 1;
+ opp->eg.phasear = 0;
+ }
+ else if ( !opp->modcar && opp->eg.mode != EG_MODE_OFF )
+ opp->eg.mode = EG_MODE_RELEASE;
+ }
+}
+
+static void oplsetchfreql( OPLSOUND* sndp, OPL_CH* chp, Uint32 v )
+{
+ chp->freql = v & 0xFF;
+ chp->ksb = ksl_table [chp->blk] [(chp->freqh << 2) + (chp->freql >> 6)];
+ OpUpdatePG(sndp, chp, &chp->op [0]);
+ OpUpdatePG(sndp, chp, &chp->op [1]);
+ OpUpdateTLL(sndp, chp, &chp->op [0]);
+ OpUpdateTLL(sndp, chp, &chp->op [1]);
+}
+
+static void oplsetchfreqh( OPLSOUND* sndp, OPL_CH* chp, Uint32 v )
+{
+ Uint32 key = v & 0x20;
+ chp->kcode = (v >> 1) & 15;
+ chp->freqh = v & 3;
+ chp->blk = (v >> 2) & 7;
+ chp->op [0].key = chp->op [1].key = key;
+ oplsetopkey(sndp, &chp->op [0]);
+ oplsetopkey(sndp, &chp->op [1]);
+ chp->sus = 0;
+ chp->ksb = ksl_table [chp->blk] [(chp->freqh << 2) + (chp->freql >> 6)];
+ OpUpdateEG(sndp, chp, &chp->op [0]);
+ OpUpdateEG(sndp, chp, &chp->op [1]);
+ OpUpdatePG(sndp, chp, &chp->op [0]);
+ OpUpdatePG(sndp, chp, &chp->op [1]);
+ OpUpdateTLL(sndp, chp, &chp->op [0]);
+ OpUpdateTLL(sndp, chp, &chp->op [1]);
+}
+
+static void oplsetchfbcon( OPLSOUND* sndp, OPL_CH* chp, Uint32 v )
+{
+ chp->op [0].fb = (v >> 1) & 7;
+#if USE_FBBUF
+ chp->op [0].fbbuf = 0;
+#endif
+ chp->con = v & 1;
+ chp->op [0].modcar = (chp->con) ? 0 : 1;
+ OpUpdateEG(sndp, chp, &chp->op [0]);
+ chp->op [1].input = 0;
+}
+
+static void opllsetopvolume( OPLSOUND* sndp, OPL_CH* chp, OPL_OP* opp, Uint32 v )
+{
+ opp->tl = v;
+ OpUpdateTLL(sndp, chp, opp);
+}
+
+static void opllsetchfreql( OPLSOUND* sndp, OPL_CH* chp, Uint32 v )
+{
+ chp->freql = v & 0xFF;
+ chp->ksb = ksl_table [chp->blk] [(chp->freqh << 3) + (chp->freql >> 5)];
+ OpUpdatePG(sndp, chp, &chp->op [0]);
+ OpUpdatePG(sndp, chp, &chp->op [1]);
+ OpUpdateTLL(sndp, chp, &chp->op [0]);
+ OpUpdateTLL(sndp, chp, &chp->op [1]);
+}
+
+static void opllsetchfreqh( OPLSOUND* sndp, OPL_CH* chp, Uint32 v )
+{
+ Uint32 key = v & 0x10;
+ chp->kcode = v & 15;
+ chp->freqh = v & 1;
+ chp->blk = (v >> 1) & 7;
+ chp->op [0].key = chp->op [1].key = key;
+ oplsetopkey(sndp, &chp->op [0]);
+ oplsetopkey(sndp, &chp->op [1]);
+ chp->sus = v & 0x20;
+ chp->ksb = ksl_table [chp->blk] [(chp->freqh << 3) + (chp->freql >> 5)];
+ OpUpdateEG(sndp, chp, &chp->op [0]);
+ OpUpdateEG(sndp, chp, &chp->op [1]);
+ OpUpdatePG(sndp, chp, &chp->op [0]);
+ OpUpdatePG(sndp, chp, &chp->op [1]);
+ OpUpdateTLL(sndp, chp, &chp->op [0]);
+ OpUpdateTLL(sndp, chp, &chp->op [1]);
+}
+
+static void SetOpTone( OPLSOUND* sndp, OPL_OP* opp, Uint8* tonep )
+{
+ opp->flag &= ~(FLAG_AME | FLAG_PME | FLAG_EGT | FLAG_KSR);
+#if TESTING_OPTIMIZE_AME
+ if ( tonep [0] & 0x80 ) opp->amin = &sndp->lfo [LFO_UNIT_AM].output; else opp->amin = &sndp->common.amzero;
+#else
+ if ( tonep [0] & 0x80 ) opp->flag |= FLAG_AME;
+#endif
+ if ( tonep [0] & 0x40 ) opp->flag |= FLAG_PME;
+ if ( tonep [0] & 0x20 ) opp->flag |= FLAG_EGT;
+ if ( tonep [0] & 0x10 ) opp->flag |= FLAG_KSR;
+ opp->mul = mul_table [tonep [0] & 0x0F] << 1;
+ opp->ksl = (tonep [2] >> 6) ? (3 - (tonep [2] >> 6)) : 15;
+ opp->ar = tonep [4] >> 4;
+ opp->dr = tonep [4] & 0xF;
+ opp->sl = tonep [6] >> 4;
+ opp->rr = tonep [6] & 0xF;
+}
+static void SetChTone( OPLSOUND* sndp, OPL_CH* chp, Uint8* tonep, Uint8* tlofsp )
+{
+ Uint32 op;
+ for ( op = 0; op < 2; op++ )
+ SetOpTone(sndp, &chp->op [op], &tonep [op]);
+ chp->op [0].tl_ofs = (tlofsp [0] ^ 0x80) << (LOG_BITS - 4 + 1);
+ chp->op [1].tl_ofs = (tlofsp [1] ^ 0x80) << (LOG_BITS - 4 + 1);
+ chp->op [0].tl = tonep [2] & 0x3F;
+ chp->op [0].fb = tonep [3] & 0x7;
+ chp->op [0].wf = (tonep [3] >> 3) & 1;
+ chp->op [1].wf = (tonep [3] >> 4) & 1;
+#if USE_FBBUF
+ chp->op [0].fbbuf = 0;
+#endif
+ chp->op [1].input = 0;
+ OpUpdateWF(sndp, &chp->op [0]);
+ OpUpdateWF(sndp, &chp->op [1]);
+ OpUpdateEG(sndp, chp, &chp->op [0]);
+ OpUpdateEG(sndp, chp, &chp->op [1]);
+ OpUpdatePG(sndp, chp, &chp->op [0]);
+ OpUpdatePG(sndp, chp, &chp->op [1]);
+ OpUpdateTLL(sndp, chp, &chp->op [0]);
+ OpUpdateTLL(sndp, chp, &chp->op [1]);
+}
+
+static void opllsetchtone( OPLSOUND* sndp, OPL_CH* chp, Uint32 tone )
+{
+ SetChTone(sndp, chp, &sndp->regs [OPLL_INST_WORK + (tone << 3)], &sndp->regs [OPLL_INST_WORK2 + (tone << 1) + 0]);
+}
+
+static void recovercon( OPLSOUND* sndp, OPL_CH* chp )
+{
+ chp->op [0].modcar = (chp->con) ? 0 : 1;
+ chp->op [0].lvl = chp->con ? 1 : 0;
+ chp->op [1].lvl = 1;
+ OpUpdateEG(sndp, chp, &chp->op [0]);
+ chp->op [1].input = 0;
+}
+
+static void initrc_common( OPLSOUND* sndp, Uint32 rmode )
+{
+ if ( rmode )
+ {
+ /* BD */
+ sndp->ch [6].op [0].modcar = 1;
+ sndp->ch [6].op [0].lvl = 0;
+ OpUpdateEG(sndp, &sndp->ch [6], &sndp->ch [6].op [0]);
+ sndp->ch [6].op [1].input = 0;
+ sndp->ch [6].op [1].lvl = 2;
+ /* CYM */
+ sndp->ch [7].op [0].modcar = 0;
+ sndp->ch [7].op [0].lvl = 1;
+ OpUpdateEG(sndp, &sndp->ch [7], &sndp->ch [7].op [0]);
+ /* SD */
+ sndp->ch [7].op [1].input = 0;
+ sndp->ch [7].op [1].lvl = 2;
+ /* TOM */
+ sndp->ch [8].op [0].modcar = 0;
+ sndp->ch [8].op [0].lvl = 2;
+ OpUpdateEG(sndp, &sndp->ch [8], &sndp->ch [8].op [0]);
+ /* HH */
+ sndp->ch [8].op [1].input = 0;
+ sndp->ch [8].op [1].lvl = 1;
+ }
+ else
+ {
+ recovercon(sndp, &sndp->ch [6]);
+ if ( !sndp->ch [6].op [0].key ) SetOpOff(&sndp->ch [6].op [0]);
+ if ( !sndp->ch [6].op [1].key ) SetOpOff(&sndp->ch [6].op [1]);
+ recovercon(sndp, &sndp->ch [7]);
+ if ( !sndp->ch [7].op [0].key ) SetOpOff(&sndp->ch [7].op [0]);
+ if ( !sndp->ch [7].op [1].key ) SetOpOff(&sndp->ch [7].op [1]);
+ recovercon(sndp, &sndp->ch [8]);
+ if ( !sndp->ch [8].op [0].key ) SetOpOff(&sndp->ch [8].op [0]);
+ if ( !sndp->ch [8].op [1].key ) SetOpOff(&sndp->ch [8].op [1]);
+ }
+}
+
+static void oplsetrc( OPLSOUND* sndp, Uint32 rc )
+{
+ sndp->lfo [LFO_UNIT_AM].table = (rc & 0x80) ? sndp->opltbl->am_table1 : sndp->opltbl->am_table2;
+ sndp->lfo [LFO_UNIT_PM].table = (rc & 0x40) ? sndp->opltbl->pm_table1 : sndp->opltbl->pm_table2;
+ if ( (sndp->common.rmode ^ rc) & 0x20 )
+ {
+ if ( rc & 0x20 )
+ {
+#if 0
+ static Uint8 volini [2] = { 0, 0 };
+ static Uint8 bdtone [8] = { 0x04, 0x20, 0x28, 0x00, 0xDF, 0xF8, 0xFF, 0xF8 };
+ SetChTone(sndp, &sndp->ch [6], bdtone, volini);
+ SetChTone(sndp, &sndp->ch [7], &romtone [0] [0x11 << 4], volini);
+ SetChTone(sndp, &sndp->ch [8], &romtone [0] [0x12 << 4], volini);
+#endif
+ sndp->ch [7].op [0].nst = PG_SHIFT + 4;
+ sndp->ch [7].op [1].nst = PG_SHIFT + 6;
+ sndp->ch [8].op [1].nst = PG_SHIFT + 5;
+ }
+ initrc_common(sndp, rc & 0x20);
+ }
+ sndp->common.rmode = rc & 0x20;
+ sndp->common.rc = rc & 0x1F;
+ /* BD */
+ sndp->ch [6].op [0].rkey = sndp->ch [6].op [1].rkey = rc & 0x10;
+ oplsetopkey(sndp, &sndp->ch [6].op [0]);
+ oplsetopkey(sndp, &sndp->ch [6].op [1]);
+ /* CYM */
+ sndp->ch [7].op [0].rkey = rc & 0x01;
+ oplsetopkey(sndp, &sndp->ch [7].op [0]);
+ /* SD */
+ sndp->ch [7].op [1].rkey = rc & 0x08;
+ oplsetopkey(sndp, &sndp->ch [7].op [1]);
+ /* TOM */
+ sndp->ch [8].op [0].rkey = rc & 0x04;
+ oplsetopkey(sndp, &sndp->ch [8].op [0]);
+ /* HH */
+ sndp->ch [8].op [1].rkey = rc & 0x02;
+ oplsetopkey(sndp, &sndp->ch [8].op [1]);
+}
+
+static void opllsetrc( OPLSOUND* sndp, Uint32 rc )
+{
+ if ( (sndp->common.rmode ^ rc) & 0x20 )
+ {
+ if ( rc & 0x20 )
+ {
+ opllsetchtone(sndp, &sndp->ch [6], 0x10);
+ opllsetchtone(sndp, &sndp->ch [7], 0x11);
+ opllsetchtone(sndp, &sndp->ch [8], 0x12);
+ opllsetopvolume(sndp, &sndp->ch [7], &sndp->ch [7].op [0], (sndp->regs [0x37] & 0xF0) >> 2);
+ opllsetopvolume(sndp, &sndp->ch [8], &sndp->ch [8].op [0], (sndp->regs [0x38] & 0xF0) >> 2);
+ sndp->ch [7].op [0].nst = PG_SHIFT + 5;
+ sndp->ch [7].op [1].nst = PG_SHIFT + 5;
+ sndp->ch [8].op [1].nst = PG_SHIFT + 5;
+ }
+ else
+ {
+ opllsetchtone(sndp, &sndp->ch [6], sndp->regs [0x36]>>4);
+ opllsetchtone(sndp, &sndp->ch [7], sndp->regs [0x37]>>4);
+ opllsetchtone(sndp, &sndp->ch [8], sndp->regs [0x38]>>4);
+ }
+ initrc_common(sndp, rc & 0x20);
+ }
+ sndp->common.rmode = rc & 0x20;
+ sndp->common.rc = rc & 0x1F;
+ /* BD */
+ sndp->ch [6].op [0].rkey = sndp->ch [6].op [1].rkey = rc & 0x10;
+ oplsetopkey(sndp, &sndp->ch [6].op [0]);
+ oplsetopkey(sndp, &sndp->ch [6].op [1]);
+ /* CYM */
+ sndp->ch [7].op [0].rkey = rc & 0x01;
+ oplsetopkey(sndp, &sndp->ch [7].op [0]);
+ /* SD */
+ sndp->ch [7].op [1].rkey = rc & 0x08;
+ oplsetopkey(sndp, &sndp->ch [7].op [1]);
+ /* TOM */
+ sndp->ch [8].op [0].rkey = rc & 0x04;
+ oplsetopkey(sndp, &sndp->ch [8].op [0]);
+ /* HH */
+ sndp->ch [8].op [1].rkey = rc & 0x02;
+ oplsetopkey(sndp, &sndp->ch [8].op [1]);
+}
+
+#define OPLSETOP(func) { \
+ Uint32 op = op_table [a & 0x1F]; \
+ if ( op != 0xFF) func(sndp, &sndp->ch [op >> 1], &sndp->ch [op >> 1].op [op & 1], v); \
+}
+
+__inline static void oplwritereg( OPLSOUND* sndp, Uint32 a, Uint32 v )
+{
+ switch ( a >> 5 )
+ {
+ default:
+ NEVER_REACH
+
+ case 0:
+ switch ( a & 0x1F )
+ {
+ case 0x01:
+ if ( sndp->opl_type == OPL_TYPE_OPL2 )
+ {
+ Uint32 i;
+ sndp->common.wfe = (v & 0x20) ? 3 : 0;
+ for ( i = 0; i < 9; i++ )
+ {
+ OpUpdateWF(sndp, &sndp->ch [i].op [0]);
+ OpUpdateWF(sndp, &sndp->ch [i].op [1]);
+ }
+ }
+ break;
+
+ case 0x08:
+ /* CSM mode */
+ case 0x07: case 0x09: case 0x0A: case 0x0B: case 0x0C:
+ case 0x0D: case 0x0E: case 0x0F: case 0x10: case 0x11: case 0x12:
+ if ( sndp->deltatpcm )
+ sndp->deltatpcm->write(sndp->deltatpcm->ctx, a - 0x07, v);
+ break;
+ }
+ break;
+
+ case 1: OPLSETOP(oplsetopmul); break;
+ case 2: OPLSETOP(oplsetopkstl); break;
+ case 3: OPLSETOP(oplsetopardr); break;
+ case 4: OPLSETOP(oplsetopslrr); break;
+ case 7: OPLSETOP(oplsetopwf); break;
+ case 5:
+ if ( (a & 0x1F) == (0xBD & 0x1F) )
+ oplsetrc(sndp, v);
+ else if ( (a & 0x1F) < 9 )
+ oplsetchfreql(sndp, &sndp->ch [a & 0xF], v);
+ else if ( (a & 0xF) < 9 )
+ oplsetchfreqh(sndp, &sndp->ch [a & 0xF], v);
+ break;
+
+ case 6:
+ if ( (a & 0x1F) < 9) oplsetchfbcon(sndp, &sndp->ch [a & 0xF], v);
+ break;
+ }
+}
+
+static void oplwrite( OPLSOUND* sndp, Uint32 a, Uint32 v )
+{
+ if ( a & 1 )
+ {
+ sndp->regs [sndp->common.adr] = v;
+ oplwritereg(sndp, sndp->common.adr, v);
+ }
+ else
+ sndp->common.adr = v;
+}
+
+static Uint32 oplread( OPLSOUND* sndp, Uint32 a )
+{
+ if ( a & 1 )
+ return sndp->regs [sndp->common.adr];
+ else
+ return 0x80;
+}
+
+__inline static void opllwritereg( OPLSOUND* sndp, Uint32 a, Uint32 v )
+{
+ switch ( a >> 3 )
+ {
+ default:
+ NEVER_REACH
+ case 0:
+ sndp->regs [OPLL_INST_WORK + (a & 7)] = v;
+ break;
+
+ case 1:
+ if ( a == 0xE) opllsetrc(sndp, v & 0x3F);
+ break;
+
+ case 2:
+ case 3:
+ a &= 0xF;
+ if ( a < 9) opllsetchfreql(sndp, &sndp->ch [a], v);
+ break;
+
+ case 4:
+ case 5:
+ a &= 0xF;
+ if ( a < 9) opllsetchfreqh(sndp, &sndp->ch [a], v);
+ break;
+
+ case 6:
+ case 7:
+ a &= 0xF;
+ if ( a < 9 )
+ {
+ if ( (sndp->common.rmode) && (a >= 6) )
+ {
+ if ( a != 6) opllsetopvolume(sndp, &sndp->ch [a], &sndp->ch [a].op [0], (v & 0xF0) >> 2);
+ }
+ else
+ {
+ opllsetchtone(sndp, &sndp->ch [a], (v & 0xF0) >> 4);
+ }
+ opllsetopvolume(sndp, &sndp->ch [a], &sndp->ch [a].op [1], (v & 0xF) << 2);
+ }
+ break;
+ }
+}
+
+static void opllwrite( OPLSOUND* sndp, Uint32 a, Uint32 v )
+{
+ if ( a & 1 )
+ {
+ if ( sndp->common.adr < 0x40 )
+ {
+ sndp->regs [sndp->common.adr] = v;
+ opllwritereg(sndp, sndp->common.adr, v);
+ }
+ }
+ else
+ sndp->common.adr = v;
+}
+
+static Uint32 opllread( OPLSOUND* sndp, Uint32 a )
+{
+ return 0xFF;
+}
+
+static void opreset( OPLSOUND* sndp, OPL_OP* opp )
+{
+ /* XMEMSET(opp, 0, sizeof(OPL_OP)); */
+ SetOpOff(opp);
+ opp->tl_ofs = 0x80 << (LOG_BITS - 4 + 1);
+#if TESTING_OPTIMIZE_AME
+ opp->amin = &sndp->common.amzero;
+#endif
+ opp->pg.rng = 0xFFFF;
+}
+
+static void chreset( OPLSOUND* sndp, OPL_CH* chp, Uint32 clock, Uint32 freq )
+{
+ Uint32 op;
+ XMEMSET(chp, 0, sizeof(OPL_CH));
+ for ( op = 0; op < 2; op++ )
+ {
+ opreset(sndp, &chp->op [op]);
+ }
+ recovercon(sndp, chp);
+}
+
+static void sndreset( OPLSOUND* sndp, Uint32 clock, Uint32 freq )
+{
+ Uint32 i, cpse;
+ XMEMSET(&sndp->common, 0, sizeof(sndp->common));
+ XMEMSET(&sndp->lfo [LFO_UNIT_AM], 0, sizeof(OPL_LFO));
+ sndp->lfo [LFO_UNIT_AM].sps = DivFix(37 * (1 << AMTBL_BITS), freq * 10, LFO_SHIFT);
+ sndp->lfo [LFO_UNIT_AM].adrmask = (1 << AMTBL_BITS) - 1;
+ sndp->lfo [LFO_UNIT_AM].table = sndp->opltbl->am_table1;
+ XMEMSET(&sndp->lfo [LFO_UNIT_PM], 0, sizeof(OPL_LFO));
+ sndp->lfo [LFO_UNIT_PM].sps = DivFix(64 * (1 << PMTBL_BITS), freq * 10, LFO_SHIFT);
+ sndp->lfo [LFO_UNIT_PM].adrmask = (1 << PMTBL_BITS) - 1;
+ sndp->lfo [LFO_UNIT_PM].table = sndp->opltbl->pm_table1;
+ sndp->common.cpsp = DivFix(clock, 72 * freq, CPS_SHIFTP);
+ cpse = DivFix(clock, 72 * freq, CPS_SHIFTE);
+ for ( i = 0; i < 4; i++ )
+ {
+ sndp->common.ratetbl [i] = (i + 4) * cpse;
+ sndp->common.ratetbla [i] = 3 * sndp->common.ratetbl [i];
+ }
+ sndp->common.tll2logtbl = sndp->opltbl->tll2log_table;
+ sndp->common.sintablemask = (1 << SINTBL_BITS) - 1;
+
+ for ( i = 0; i < 9; i++ )
+ chreset(sndp, &sndp->ch [i], clock, freq);
+
+ if ( sndp->deltatpcm )
+ sndp->deltatpcm->reset(sndp->deltatpcm->ctx, clock, freq);
+
+ if ( sndp->opl_type & OPL_TYPE_OPL )
+ {
+ XMEMSET(&sndp->regs, 0, 0x100);
+ sndp->common.ar_table = sndp->opltbl->ar_tablepow;
+ sndp->common.sintablemask -= (1 << (SINTBL_BITS - 11)) - 1;
+ for ( i = 0x0; i < 0x100; i++ )
+ {
+ oplwrite(sndp, 0, i);
+ oplwrite(sndp, 1, 0x00);
+ }
+ for ( i = 0xA0; i < 0xA9; i++ )
+ {
+ oplwrite(sndp, 0, 0xA0 + i);
+ oplwrite(sndp, 1, 0x40);
+ oplwrite(sndp, 0, 0xB0 + i);
+ oplwrite(sndp, 1, 0x0E);
+ }
+ }
+ else
+ {
+ const static Uint8 fmbios_initdata [9] = "\x30\x10\x20\x20\xfb\xb2\xf3\xf3";
+ XMEMSET(&sndp->regs, 0, 0x40);
+ sndp->common.ar_table = sndp->opltbl->ar_tablelog;
+ sndp->common.wfe = 1;
+ sndp->common.sintablemask -= (1 << (SINTBL_BITS - 8)) - 1;
+ for ( i = 0; i < sizeof(fmbios_initdata)-1; i++ )
+ {
+ opllwrite(sndp, 0, i);
+ opllwrite(sndp, 1, fmbios_initdata [i]);
+ }
+ opllwrite(sndp, 0, 0x0E);
+ opllwrite(sndp, 1, 0x00);
+ opllwrite(sndp, 0, 0x0F);
+ opllwrite(sndp, 1, 0x00);
+ for ( i = 0; i < 9; i++ )
+ {
+ opllwrite(sndp, 0, 0x10 + i);
+ opllwrite(sndp, 1, 0x20);
+ opllwrite(sndp, 0, 0x20 + i);
+ opllwrite(sndp, 1, 0x07);
+ opllwrite(sndp, 0, 0x30 + i);
+ opllwrite(sndp, 1, 0xB3);
+ }
+ }
+}
+
+static void oplsetinst( OPLSOUND* sndp, Uint32 n, void* p, Uint32 l )
+{
+ if ( sndp->deltatpcm) sndp->deltatpcm->setinst(sndp->deltatpcm->ctx, n, p, l);
+}
+
+__inline static Uint32 GetDwordLE(Uint8* p )
+{
+ return p [0] | (p [1] << 8) | (p [2] << 16) | (p [3] << 24);
+}
+#define GetDwordLEM(p) (Uint32)((((Uint8* )p) [0] | (((Uint8* )p) [1] << 8) | (((Uint8* )p) [2] << 16) | (((Uint8* )p) [3] << 24)) )
+
+static void opllsetinst( OPLSOUND* sndp, Uint32 n, Uint8* p, Uint32 l )
+{
+ Int32 i, j, sb = 9;
+ if ( n )
+ return;
+ if ( (GetDwordLE(p) & 0xF0FFFFFF) == GetDwordLEM("ILL0") )
+ {
+ if ( 0 < p [4] && p [4] <= SINTBL_BITS) sb = p [4];
+ for ( j = 1; j < 16 + 3; j++ )
+ for ( i = 0; i < 8; i++ )
+ sndp->regs [OPLL_INST_WORK + (j << 3) + i] = p [(j << 4) + i];
+ for ( j = 0; j < 16 + 3; j++ )
+ {
+ sndp->regs [OPLL_INST_WORK2 + (j << 1) + 0] = p [(j << 4) + 8];
+ sndp->regs [OPLL_INST_WORK2 + (j << 1) + 1] = p [(j << 4) + 9];
+ }
+ }
+ else
+ {
+ for ( j = 1; j < 16; j++ )
+ for ( i = 0; i < 8; i++ )
+ sndp->regs [OPLL_INST_WORK + (j << 3) + i] = p [((j - 1) << 3) + i];
+ }
+ sndp->common.sintablemask = (1 << SINTBL_BITS) - 1;
+ sndp->common.sintablemask -= (1 << (SINTBL_BITS - sb)) - 1;
+}
+
+static void sndrelease( OPLSOUND* sndp )
+{
+ if ( sndp->logtbl) sndp->logtbl->release(sndp->logtbl->ctx);
+ if ( sndp->opltbl) sndp->opltbl->release(sndp->opltbl->ctx);
+ if ( sndp->deltatpcm) sndp->deltatpcm->release(sndp->deltatpcm->ctx);
+ XFREE(sndp);
+}
+
+KMIF_SOUND_DEVICE* OPLSoundAlloc(Uint32 opl_type )
+{
+ OPLSOUND* sndp;
+ sndp = (OPLSOUND*) XMALLOC(sizeof(OPLSOUND));
+ if ( !sndp) return 0;
+ sndp->opl_type = opl_type;
+ sndp->kmif.ctx = sndp;
+ sndp->kmif.release = (void (*)( void* )) sndrelease;
+ sndp->kmif.volume = (void (*)( void*, int )) sndvolume;
+ sndp->kmif.reset = (void (*)( void*, Uint32, Uint32 )) sndreset;
+ sndp->kmif.synth = (int (*)( void* )) sndsynth;
+ if ( sndp->opl_type == OPL_TYPE_MSXAUDIO )
+ {
+ sndp->deltatpcm = YMDELTATPCMSoundAlloc(YMDELTATPCM_TYPE_Y8950);
+ }
+ else
+ sndp->deltatpcm = 0;
+ if ( sndp->opl_type & OPL_TYPE_OPL )
+ {
+ sndp->kmif.write = (void (*)( void*, Uint32, Uint32 )) oplwrite;
+ sndp->kmif.read = (Uint32 (*)( void*, Uint32 )) oplread;
+ sndp->kmif.setinst = (void (*)( void*, Uint32, void*, Uint32 )) oplsetinst;
+ }
+ else
+ {
+ sndp->kmif.write = (void (*)( void*, Uint32, Uint32 )) opllwrite;
+ sndp->kmif.read = (Uint32 (*)( void*, Uint32 )) opllread;
+ sndp->kmif.setinst = (void (*)( void*, Uint32, void*, Uint32 )) opllsetinst;
+ switch ( sndp->opl_type )
+ {
+ case OPL_TYPE_OPLL:
+ case OPL_TYPE_MSXMUSIC:
+ opllsetinst(sndp, 0, romtone [0], 16 * 19);
+ break;
+
+ case OPL_TYPE_SMSFMUNIT:
+ opllsetinst(sndp, 0, romtone [1], 16 * 19);
+ break;
+
+ case OPL_TYPE_VRC7:
+ opllsetinst(sndp, 0, romtone [2], 16 * 19);
+ break;
+ }
+ }
+ sndp->logtbl = LogTableAddRef();
+ sndp->opltbl = OplTableAddRef();
+ if ( !sndp->logtbl || !sndp->opltbl )
+ {
+ sndrelease(sndp);
+ return 0;
+ }
+
+ return &sndp->kmif;
+}
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_opl.h b/plugins/gme/game-music-emu-0.6pre/gme/s_opl.h
new file mode 100644
index 00000000..227c03c3
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_opl.h
@@ -0,0 +1,26 @@
+#ifndef S_OPL_H__
+#define S_OPL_H__
+
+#include "kmsnddev.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ OPL_TYPE_OPLL = 0x10, /* YAMAHA YM2413 */
+ OPL_TYPE_MSXMUSIC = 0x11, /* YAMAHA YM2413 */
+ OPL_TYPE_SMSFMUNIT = 0x12, /* YAMAHA YM2413? */
+ OPL_TYPE_VRC7 = 0x13, /* KONAMI 053982 VRV VII */
+ OPL_TYPE_OPL = 0x20, /* YAMAHA YM3526 */
+ OPL_TYPE_MSXAUDIO = 0x21, /* YAMAHA Y8950 */
+ OPL_TYPE_OPL2 = 0x22 /* YAMAHA YM3812 */
+};
+
+KMIF_SOUND_DEVICE *OPLSoundAlloc(Uint32 opl_type);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_OPL_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.c b/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.c
new file mode 100644
index 00000000..35e54edb
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.c
@@ -0,0 +1,136 @@
+#include "nestypes.h"
+#include "s_logtbl.h"
+#include "s_opltbl.h"
+
+#if STATIC_TABLES
+
+static void OplTableRelease(void *ctx)
+{
+}
+
+static KMIF_OPLTABLE opl_static_tables = {
+ &opl_static_tables;
+ OplTableRelease,
+#include "s_oplt.h"
+};
+
+KMIF_OPLTABLE *OplTableAddRef(void)
+{
+ opl_static_tables.release = OplTableRelease;
+ return &opl_static_tables;
+}
+
+#else
+
+#include <math.h>
+#ifndef M_PI
+#ifdef PI
+#define M_PI PI
+#else
+#define M_PI 3.14159265358979323846
+#endif
+#endif
+
+#define AM_DEPTH1 4.8 /* dB */
+#define AM_DEPTH2 1.0 /* dB */
+#define PM_DEPTH1 14.0 /* cent */
+#define PM_DEPTH2 7.0 /* cent */
+#define LOG_KEYOFF (15 << (LOG_BITS + 1))
+
+#define DB0375_TO_LOG(x) ((Uint32)(0.375 * (1 << (LOG_BITS + x)) / 10))
+
+#define AR_OFF (128 << ARTBL_SHIFT)
+#define AR_MAX (127 << ARTBL_SHIFT)
+
+
+static volatile Uint32 opl_tables_mutex = 0;
+static Uint32 opl_tables_refcount = 0;
+static KMIF_OPLTABLE *opl_tables = 0;
+
+static void OplTableRelease(void *ctx)
+{
+ ++opl_tables_mutex;
+ while (opl_tables_mutex != 1)
+ {
+ XSLEEP(0);
+ }
+ opl_tables_refcount--;
+ if (!opl_tables_refcount)
+ {
+ XFREE(ctx);
+ opl_tables = 0;
+ }
+ --opl_tables_mutex;
+}
+
+static void OplTableCalc(KMIF_OPLTABLE *tbl)
+{
+ Uint32 u, u2, i;
+ tbl->sin_table[0][0] = tbl->sin_table[0][1 << (SINTBL_BITS - 1)] = LOG_KEYOFF;
+ for (i = 1 ;i < (1 << (SINTBL_BITS - 1)); i++)
+ {
+ double d;
+ d = (1 << LOG_BITS) * -(log(sin(2.0 * M_PI * ((double)i) / (1 << SINTBL_BITS))) / log(2));
+ if (d > (LOG_KEYOFF >> 1)) d = (LOG_KEYOFF >> 1);
+ tbl->sin_table[0][i] = ((Uint32)d) << 1;
+ tbl->sin_table[0][i + (1 << (SINTBL_BITS - 1))] = (((Uint32)d) << 1) + 1;
+ }
+ for (i = 0 ;i < (1 << SINTBL_BITS); i++)
+ {
+ tbl->sin_table[1][i] = (tbl->sin_table[0][i] & 1) ? tbl->sin_table[0][0] : tbl->sin_table[0][i];
+ tbl->sin_table[2][i] = tbl->sin_table[0][i] & ~1;
+ tbl->sin_table[3][i] = (i & (1 << (SINTBL_BITS - 2))) ? LOG_KEYOFF : tbl->sin_table[2][i];
+ }
+ for (i = 0; i < (1 << TLLTBL_BITS); i++)
+ {
+ tbl->tll2log_table[i] = (i * DB0375_TO_LOG(0)) << 1;
+ }
+ for (i = 0; i < (1 << AMTBL_BITS); i++)
+ {
+ u = (Uint32)((1 + sin(2 * M_PI * ((double)i) / (1 << AMTBL_BITS))) * ((1 << LOG_BITS) * AM_DEPTH1 / 20.0));
+ u2 = (Uint32)((1 + sin(2 * M_PI * ((double)i) / (1 << AMTBL_BITS))) * ((1 << LOG_BITS) * AM_DEPTH2 / 20.0));
+ tbl->am_table1[i] = u << 1;
+ tbl->am_table2[i] = u2 << 1;
+ }
+ for (i = 0; i < (1 << PMTBL_BITS); i++)
+ {
+ u = (Uint32)((1 << PM_SHIFT) * pow(2, sin(2 * M_PI * ((double)i) / (1 << PMTBL_BITS)) * PM_DEPTH1 / 1200.0));
+ u2 = (Uint32)((1 << PM_SHIFT) * pow(2, sin(2 * M_PI * ((double)i) / (1 << PMTBL_BITS)) * PM_DEPTH2 / 1200.0));
+ tbl->pm_table1[i] = u;
+ tbl->pm_table2[i] = u2;
+ }
+
+ for (i = 0; i < (1 << ARTBL_BITS); i++)
+ {
+ u = (Uint32)(((double)AR_MAX) * (1 - log(1 + i) / log(1 << ARTBL_BITS)));
+ tbl->ar_tablelog[i] = u;
+#if 1
+ u = (Uint32)(((double)AR_MAX) * (pow(1 - i / (double)(1 << ARTBL_BITS), 8)));
+ tbl->ar_tablepow[i] = u;
+#endif
+ }
+}
+
+KMIF_OPLTABLE *OplTableAddRef(void)
+{
+ ++opl_tables_mutex;
+ while (opl_tables_mutex != 1)
+ {
+ XSLEEP(0);
+ }
+ if (!opl_tables_refcount)
+ {
+ opl_tables = (KMIF_OPLTABLE*) XMALLOC(sizeof(KMIF_OPLTABLE));
+ if (opl_tables)
+ {
+ opl_tables->ctx = opl_tables;
+ opl_tables->release = OplTableRelease;
+ OplTableCalc(opl_tables);
+ }
+ }
+ if (opl_tables) opl_tables_refcount++;
+ --opl_tables_mutex;
+ return opl_tables;
+}
+
+#endif
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.h b/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.h
new file mode 100644
index 00000000..7a3f805f
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/s_opltbl.h
@@ -0,0 +1,38 @@
+#ifndef S_OPLTBL_H__
+#define S_OPLTBL_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SINTBL_BITS 11
+#define AMTBL_BITS 8
+#define PMTBL_BITS 8
+#define PM_SHIFT 9
+#define ARTBL_BITS 7
+#define ARTBL_SHIFT 20
+#define TLLTBL_BITS 7
+
+typedef struct
+{
+ void *ctx;
+ void (*release)(void *ctx);
+ Uint32 sin_table[4][1 << SINTBL_BITS];
+ Uint32 tll2log_table[1 << TLLTBL_BITS];
+ Uint32 ar_tablelog[1 << ARTBL_BITS];
+ Uint32 am_table1[1 << AMTBL_BITS];
+ Uint32 pm_table1[1 << PMTBL_BITS];
+#if 1
+ Uint32 ar_tablepow[1 << ARTBL_BITS];
+#endif
+ Uint32 am_table2[1 << AMTBL_BITS];
+ Uint32 pm_table2[1 << PMTBL_BITS];
+} KMIF_OPLTABLE;
+
+KMIF_OPLTABLE *OplTableAddRef(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_OPLTBL_H__ */
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/ym2413.c b/plugins/gme/game-music-emu-0.6pre/gme/ym2413.c
new file mode 100644
index 00000000..edb7354b
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/ym2413.c
@@ -0,0 +1,2106 @@
+/*
+**
+** File: ym2413.c - software implementation of YM2413
+** FM sound generator type OPLL
+**
+** Copyright Jarek Burczynski
+**
+** Version 1.0
+**
+
+ Features as listed in LSI-212413A2 data sheet:
+ 1. FM Sound Generator for real sound creation.
+ 2. Two Selectable modes: 9 simultaneous sounds or 6 melody sounds plus 5 rhythm sounds
+ (different tones can be used together in either case).
+ 3. Built-in Instruments data (15 melody tones, 5 rhythm tones, "CAPTAIN and TELETEXT applicalbe tones).
+ 4. Built-in DA Converter.
+ 5. Built-in Quartz Oscillator.
+ 6. Built-in Vibrato Oscillator/AM Oscillator
+ 7. TTL Compatible Input.
+ 8. Si-Gate NMOS LSI
+ 9. A single 5V power source.
+
+to do:
+
+- make sure of the sinus amplitude bits
+
+- make sure of the EG resolution bits (looks like the biggest
+ modulation index generated by the modulator is 123, 124 = no modulation)
+- find proper algorithm for attack phase of EG
+
+- tune up instruments ROM
+
+- support sample replay in test mode (it is NOT as simple as setting bit 0
+ in register 0x0f and using register 0x10 for sample data).
+ Which games use this feature ?
+
+
+*/
+
+#define _USE_MATH_DEFINES
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "ym2413.h"
+
+#define INLINE __inline
+#ifndef NULL
+ #define NULL ((void *)0)
+#endif
+#define logerror (void)
+
+#ifndef M_PI
+ #define M_PI 3.14159265358979323846
+#endif
+
+/* output final shift */
+#if (SAMPLE_BITS==16)
+ #define FINAL_SH (0)
+ #define MAXOUT (+32767)
+ #define MINOUT (-32768)
+#else
+ #define FINAL_SH (8)
+ #define MAXOUT (+127)
+ #define MINOUT (-128)
+#endif
+
+
+#define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */
+#define EG_SH 16 /* 16.16 fixed point (EG timing) */
+#define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */
+
+#define FREQ_MASK ((1<<FREQ_SH)-1)
+
+/* envelope output entries */
+#define ENV_BITS 10
+#define ENV_LEN (1<<ENV_BITS)
+#define ENV_STEP (128.0/ENV_LEN)
+
+#define MAX_ATT_INDEX ((1<<(ENV_BITS-2))-1) /*255*/
+#define MIN_ATT_INDEX (0)
+
+/* sinwave entries */
+#define SIN_BITS 10
+#define SIN_LEN (1<<SIN_BITS)
+#define SIN_MASK (SIN_LEN-1)
+
+#define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
+
+
+
+/* register number to channel number , slot offset */
+#define SLOT1 0
+#define SLOT2 1
+
+/* Envelope Generator phases */
+
+#define EG_DMP 5
+#define EG_ATT 4
+#define EG_DEC 3
+#define EG_SUS 2
+#define EG_REL 1
+#define EG_OFF 0
+
+
+typedef struct{
+ UINT32 ar; /* attack rate: AR<<2 */
+ UINT32 dr; /* decay rate: DR<<2 */
+ UINT32 rr; /* release rate:RR<<2 */
+ UINT8 KSR; /* key scale rate */
+ UINT8 ksl; /* keyscale level */
+ UINT8 ksr; /* key scale rate: kcode>>KSR */
+ UINT8 mul; /* multiple: mul_tab[ML] */
+
+ /* Phase Generator */
+ UINT32 phase; /* frequency counter */
+ UINT32 freq; /* frequency counter step */
+ UINT8 fb_shift; /* feedback shift value */
+ INT32 op1_out[2]; /* slot1 output for feedback */
+
+ /* Envelope Generator */
+ UINT8 eg_type; /* percussive/nonpercussive mode*/
+ UINT8 state; /* phase type */
+ UINT32 TL; /* total level: TL << 2 */
+ INT32 TLL; /* adjusted now TL */
+ INT32 volume; /* envelope counter */
+ UINT32 sl; /* sustain level: sl_tab[SL] */
+
+ UINT8 eg_sh_dp; /* (dump state) */
+ UINT8 eg_sel_dp; /* (dump state) */
+ UINT8 eg_sh_ar; /* (attack state) */
+ UINT8 eg_sel_ar; /* (attack state) */
+ UINT8 eg_sh_dr; /* (decay state) */
+ UINT8 eg_sel_dr; /* (decay state) */
+ UINT8 eg_sh_rr; /* (release state for non-perc.)*/
+ UINT8 eg_sel_rr; /* (release state for non-perc.)*/
+ UINT8 eg_sh_rs; /* (release state for perc.mode)*/
+ UINT8 eg_sel_rs; /* (release state for perc.mode)*/
+
+ UINT32 key; /* 0 = KEY OFF, >0 = KEY ON */
+
+ /* LFO */
+ UINT32 AMmask; /* LFO Amplitude Modulation enable mask */
+ UINT8 vib; /* LFO Phase Modulation enable flag (active high)*/
+
+ /* waveform select */
+ unsigned int wavetable;
+} OPLL_SLOT;
+
+#define OPLL_MASK_CH(x) (1<<(x))
+#define OPLL_MASK_HH (1<<(9))
+#define OPLL_MASK_CYM (1<<(10))
+#define OPLL_MASK_TOM (1<<(11))
+#define OPLL_MASK_SD (1<<(12))
+#define OPLL_MASK_BD (1<<(13))
+#define OPLL_MASK_RHYTHM ( OPLL_MASK_HH | OPLL_MASK_CYM | OPLL_MASK_TOM | OPLL_MASK_SD | OPLL_MASK_BD )
+
+typedef struct{
+ OPLL_SLOT SLOT[2];
+ /* phase generator state */
+ UINT32 block_fnum; /* block+fnum */
+ UINT32 fc; /* Freq. freqement base */
+ UINT32 ksl_base; /* KeyScaleLevel Base step */
+ UINT8 kcode; /* key code (for key scaling) */
+ UINT8 sus; /* sus on/off (release speed in percussive mode)*/
+} OPLL_CH;
+
+/* chip state */
+typedef struct {
+ OPLL_CH P_CH[9]; /* OPLL chips have 9 channels*/
+ UINT8 instvol_r[9]; /* instrument/volume (or volume/volume in percussive mode)*/
+
+ UINT32 eg_cnt; /* global envelope generator counter */
+ UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/72 */
+ UINT32 eg_timer_add; /* step of eg_timer */
+ UINT32 eg_timer_overflow; /* envelope generator timer overlfows every 1 sample (on real chip) */
+
+ UINT8 rhythm; /* Rhythm mode */
+
+ /* LFO */
+ UINT32 lfo_am_cnt;
+ UINT32 lfo_am_inc;
+ UINT32 lfo_pm_cnt;
+ UINT32 lfo_pm_inc;
+
+ UINT32 noise_rng; /* 23 bit noise shift register */
+ UINT32 noise_p; /* current noise 'phase' */
+ UINT32 noise_f; /* current noise period */
+
+
+/* instrument settings */
+/*
+ 0-user instrument
+ 1-15 - fixed instruments
+ 16 -bass drum settings
+ 17,18 - other percussion instruments
+*/
+ UINT8 inst_tab[19][8];
+
+ /* external event callback handlers */
+ OPLL_UPDATEHANDLER UpdateHandler; /* stream update handler */
+ void * UpdateParam; /* stream update parameter */
+
+ UINT32 fn_tab[1024]; /* fnumber->increment counter */
+
+ UINT8 address; /* address register */
+ UINT8 status; /* status flag */
+
+ int clock; /* master clock (Hz) */
+ int rate; /* sampling rate (Hz) */
+ double freqbase; /* frequency base */
+
+ /* work table */
+ OPLL_SLOT *SLOT7_1,*SLOT7_2,*SLOT8_1,*SLOT8_2;
+
+ signed int output[2];
+
+ UINT32 LFO_AM;
+ INT32 LFO_PM;
+
+ int chip_type;
+ UINT32 mask;
+} YM2413;
+
+/* key scale level */
+/* table is 3dB/octave, DV converts this into 6dB/octave */
+/* 0.1875 is bit 0 weight of the envelope counter (volume) expressed in the 'decibel' scale */
+#define DV (0.1875/1.0)
+static const UINT32 ksl_tab[8*16]=
+{
+ /* OCT 0 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ /* OCT 1 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 0.750/DV, 1.125/DV, 1.500/DV,
+ 1.875/DV, 2.250/DV, 2.625/DV, 3.000/DV,
+ /* OCT 2 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 0.000/DV,
+ 0.000/DV, 1.125/DV, 1.875/DV, 2.625/DV,
+ 3.000/DV, 3.750/DV, 4.125/DV, 4.500/DV,
+ 4.875/DV, 5.250/DV, 5.625/DV, 6.000/DV,
+ /* OCT 3 */
+ 0.000/DV, 0.000/DV, 0.000/DV, 1.875/DV,
+ 3.000/DV, 4.125/DV, 4.875/DV, 5.625/DV,
+ 6.000/DV, 6.750/DV, 7.125/DV, 7.500/DV,
+ 7.875/DV, 8.250/DV, 8.625/DV, 9.000/DV,
+ /* OCT 4 */
+ 0.000/DV, 0.000/DV, 3.000/DV, 4.875/DV,
+ 6.000/DV, 7.125/DV, 7.875/DV, 8.625/DV,
+ 9.000/DV, 9.750/DV,10.125/DV,10.500/DV,
+ 10.875/DV,11.250/DV,11.625/DV,12.000/DV,
+ /* OCT 5 */
+ 0.000/DV, 3.000/DV, 6.000/DV, 7.875/DV,
+ 9.000/DV,10.125/DV,10.875/DV,11.625/DV,
+ 12.000/DV,12.750/DV,13.125/DV,13.500/DV,
+ 13.875/DV,14.250/DV,14.625/DV,15.000/DV,
+ /* OCT 6 */
+ 0.000/DV, 6.000/DV, 9.000/DV,10.875/DV,
+ 12.000/DV,13.125/DV,13.875/DV,14.625/DV,
+ 15.000/DV,15.750/DV,16.125/DV,16.500/DV,
+ 16.875/DV,17.250/DV,17.625/DV,18.000/DV,
+ /* OCT 7 */
+ 0.000/DV, 9.000/DV,12.000/DV,13.875/DV,
+ 15.000/DV,16.125/DV,16.875/DV,17.625/DV,
+ 18.000/DV,18.750/DV,19.125/DV,19.500/DV,
+ 19.875/DV,20.250/DV,20.625/DV,21.000/DV
+};
+#undef DV
+
+/* sustain level table (3dB per step) */
+/* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,45 (dB)*/
+#define SC(db) (UINT32) ( db * (1.0/ENV_STEP) )
+static const UINT32 sl_tab[16]={
+ SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
+ SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(15)
+};
+#undef SC
+
+
+#define RATE_STEPS (8)
+static const unsigned char eg_inc[15*RATE_STEPS]={
+
+/*cycle:0 1 2 3 4 5 6 7*/
+
+/* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..12 0 (increment by 0 or 1) */
+/* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..12 1 */
+/* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..12 2 */
+/* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..12 3 */
+
+/* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 13 0 (increment by 1) */
+/* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 13 1 */
+/* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 13 2 */
+/* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 13 3 */
+
+/* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 14 0 (increment by 2) */
+/* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 14 1 */
+/*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 14 2 */
+/*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 14 3 */
+
+/*12 */ 4,4, 4,4, 4,4, 4,4, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 4) */
+/*13 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 2, 15 3 for attack */
+/*14 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */
+};
+
+
+#define O(a) (a*RATE_STEPS)
+
+/*note that there is no O(13) in this table - it's directly in the code */
+static const unsigned char eg_rate_select[16+64+16]={ /* Envelope Generator rates (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+O(14),O(14),O(14),O(14),O(14),O(14),O(14),O(14),
+
+/* rates 00-12 */
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+O( 0),O( 1),O( 2),O( 3),
+
+/* rate 13 */
+O( 4),O( 5),O( 6),O( 7),
+
+/* rate 14 */
+O( 8),O( 9),O(10),O(11),
+
+/* rate 15 */
+O(12),O(12),O(12),O(12),
+
+/* 16 dummy rates (same as 15 3) */
+O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+O(12),O(12),O(12),O(12),O(12),O(12),O(12),O(12),
+
+};
+#undef O
+
+/*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 */
+/*shift 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0 */
+/*mask 8191, 4095, 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0 */
+
+#define O(a) (a*1)
+static const unsigned char eg_rate_shift[16+64+16]={ /* Envelope Generator counter shifts (16 + 64 rates + 16 RKS) */
+/* 16 infinite time rates */
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
+
+/* rates 00-12 */
+O(13),O(13),O(13),O(13),
+O(12),O(12),O(12),O(12),
+O(11),O(11),O(11),O(11),
+O(10),O(10),O(10),O(10),
+O( 9),O( 9),O( 9),O( 9),
+O( 8),O( 8),O( 8),O( 8),
+O( 7),O( 7),O( 7),O( 7),
+O( 6),O( 6),O( 6),O( 6),
+O( 5),O( 5),O( 5),O( 5),
+O( 4),O( 4),O( 4),O( 4),
+O( 3),O( 3),O( 3),O( 3),
+O( 2),O( 2),O( 2),O( 2),
+O( 1),O( 1),O( 1),O( 1),
+
+/* rate 13 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 14 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* rate 15 */
+O( 0),O( 0),O( 0),O( 0),
+
+/* 16 dummy rates (same as 15 3) */
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
+
+};
+#undef O
+
+
+/* multiple table */
+#define ML 2
+static const UINT8 mul_tab[16]= {
+/* 1/2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,10,12,12,15,15 */
+ 0.50*ML, 1.00*ML, 2.00*ML, 3.00*ML, 4.00*ML, 5.00*ML, 6.00*ML, 7.00*ML,
+ 8.00*ML, 9.00*ML,10.00*ML,10.00*ML,12.00*ML,12.00*ML,15.00*ML,15.00*ML
+};
+#undef ML
+
+/* TL_TAB_LEN is calculated as:
+* 11 - sinus amplitude bits (Y axis)
+* 2 - sinus sign bit (Y axis)
+* TL_RES_LEN - sinus resolution (X axis)
+*/
+#define TL_TAB_LEN (11*2*TL_RES_LEN)
+static signed int tl_tab[TL_TAB_LEN];
+
+#define ENV_QUIET (TL_TAB_LEN>>5)
+
+/* sin waveform table in 'decibel' scale */
+/* two waveforms on OPLL type chips */
+static unsigned int sin_tab[SIN_LEN * 2];
+
+
+/* LFO Amplitude Modulation table (verified on real YM3812)
+ 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples
+
+ Length: 210 elements.
+
+ Each of the elements has to be repeated
+ exactly 64 times (on 64 consecutive samples).
+ The whole table takes: 64 * 210 = 13440 samples.
+
+We use data>>1, until we find what it really is on real chip...
+
+*/
+
+#define LFO_AM_TAB_ELEMENTS 210
+
+static const UINT8 lfo_am_table[LFO_AM_TAB_ELEMENTS] = {
+0,0,0,0,0,0,0,
+1,1,1,1,
+2,2,2,2,
+3,3,3,3,
+4,4,4,4,
+5,5,5,5,
+6,6,6,6,
+7,7,7,7,
+8,8,8,8,
+9,9,9,9,
+10,10,10,10,
+11,11,11,11,
+12,12,12,12,
+13,13,13,13,
+14,14,14,14,
+15,15,15,15,
+16,16,16,16,
+17,17,17,17,
+18,18,18,18,
+19,19,19,19,
+20,20,20,20,
+21,21,21,21,
+22,22,22,22,
+23,23,23,23,
+24,24,24,24,
+25,25,25,25,
+26,26,26,
+25,25,25,25,
+24,24,24,24,
+23,23,23,23,
+22,22,22,22,
+21,21,21,21,
+20,20,20,20,
+19,19,19,19,
+18,18,18,18,
+17,17,17,17,
+16,16,16,16,
+15,15,15,15,
+14,14,14,14,
+13,13,13,13,
+12,12,12,12,
+11,11,11,11,
+10,10,10,10,
+9,9,9,9,
+8,8,8,8,
+7,7,7,7,
+6,6,6,6,
+5,5,5,5,
+4,4,4,4,
+3,3,3,3,
+2,2,2,2,
+1,1,1,1
+};
+
+/* LFO Phase Modulation table (verified on real YM2413) */
+static const INT8 lfo_pm_table[8*8] = {
+
+/* FNUM2/FNUM = 0 00xxxxxx (0x0000) */
+0, 0, 0, 0, 0, 0, 0, 0,
+
+/* FNUM2/FNUM = 0 01xxxxxx (0x0040) */
+1, 0, 0, 0,-1, 0, 0, 0,
+
+/* FNUM2/FNUM = 0 10xxxxxx (0x0080) */
+2, 1, 0,-1,-2,-1, 0, 1,
+
+/* FNUM2/FNUM = 0 11xxxxxx (0x00C0) */
+3, 1, 0,-1,-3,-1, 0, 1,
+
+/* FNUM2/FNUM = 1 00xxxxxx (0x0100) */
+4, 2, 0,-2,-4,-2, 0, 2,
+
+/* FNUM2/FNUM = 1 01xxxxxx (0x0140) */
+5, 2, 0,-2,-5,-2, 0, 2,
+
+/* FNUM2/FNUM = 1 10xxxxxx (0x0180) */
+6, 3, 0,-3,-6,-3, 0, 3,
+
+/* FNUM2/FNUM = 1 11xxxxxx (0x01C0) */
+7, 3, 0,-3,-7,-3, 0, 3,
+};
+
+
+
+
+
+
+/* This is not 100% perfect yet but very close */
+/*
+ - multi parameters are 100% correct (instruments and drums)
+ - LFO PM and AM enable are 100% correct
+ - waveform DC and DM select are 100% correct
+*/
+
+static const unsigned char table[19][8] = {
+/* MULT MULT modTL DcDmFb AR/DR AR/DR SL/RR SL/RR */
+/* 0 1 2 3 4 5 6 7 */
+ {0x49, 0x4c, 0x4c, 0x12, 0x00, 0x00, 0x00, 0x00 }, /* 0 */
+
+ {0x61, 0x61, 0x1e, 0x17, 0xf0, 0x78, 0x00, 0x17 }, /* 1 */
+ {0x13, 0x41, 0x1e, 0x0d, 0xd7, 0xf7, 0x13, 0x13 }, /* 2 */
+ {0x13, 0x01, 0x99, 0x04, 0xf2, 0xf4, 0x11, 0x23 }, /* 3 */
+ {0x21, 0x61, 0x1b, 0x07, 0xaf, 0x64, 0x40, 0x27 }, /* 4 */
+
+/* {0x22, 0x21, 0x1e, 0x09, 0xf0, 0x76, 0x08, 0x28 }, //5 */
+ {0x22, 0x21, 0x1e, 0x06, 0xf0, 0x75, 0x08, 0x18 }, /* 5 */
+
+/* {0x31, 0x22, 0x16, 0x09, 0x90, 0x7f, 0x00, 0x08 }, //6 */
+ {0x31, 0x22, 0x16, 0x05, 0x90, 0x71, 0x00, 0x13 }, /* 6 */
+
+ {0x21, 0x61, 0x1d, 0x07, 0x82, 0x80, 0x10, 0x17 }, /* 7 */
+ {0x23, 0x21, 0x2d, 0x16, 0xc0, 0x70, 0x07, 0x07 }, /* 8 */
+ {0x61, 0x61, 0x1b, 0x06, 0x64, 0x65, 0x10, 0x17 }, /* 9 */
+
+/* {0x61, 0x61, 0x0c, 0x08, 0x85, 0xa0, 0x79, 0x07 }, //A */
+ {0x61, 0x61, 0x0c, 0x18, 0x85, 0xf0, 0x70, 0x07 }, /* A */
+
+ {0x23, 0x01, 0x07, 0x11, 0xf0, 0xa4, 0x00, 0x22 }, /* B */
+ {0x97, 0xc1, 0x24, 0x07, 0xff, 0xf8, 0x22, 0x12 }, /* C */
+
+/* {0x61, 0x10, 0x0c, 0x08, 0xf2, 0xc4, 0x40, 0xc8 }, //D */
+ {0x61, 0x10, 0x0c, 0x05, 0xf2, 0xf4, 0x40, 0x44 }, /* D */
+
+ {0x01, 0x01, 0x55, 0x03, 0xf3, 0x92, 0xf3, 0xf3 }, /* E */
+ {0x61, 0x41, 0x89, 0x03, 0xf1, 0xf4, 0xf0, 0x13 }, /* F */
+
+/* drum instruments definitions */
+/* MULTI MULTI modTL xxx AR/DR AR/DR SL/RR SL/RR */
+/* 0 1 2 3 4 5 6 7 */
+ {0x01, 0x01, 0x16, 0x00, 0xfd, 0xf8, 0x2f, 0x6d },/* BD(multi verified, modTL verified, mod env - verified(close), carr. env verifed) */
+ {0x01, 0x01, 0x00, 0x00, 0xd8, 0xd8, 0xf9, 0xf8 },/* HH(multi verified), SD(multi not used) */
+ {0x05, 0x01, 0x00, 0x00, 0xf8, 0xba, 0x49, 0x55 },/* TOM(multi,env verified), TOP CYM(multi verified, env verified) */
+};
+
+static const unsigned char table_vrc7[15][8] =
+{
+/* VRC7 instruments, January 17, 2004 update -Xodnizel */
+ {0x03, 0x21, 0x04, 0x06, 0x8D, 0xF2, 0x42, 0x17},
+ {0x13, 0x41, 0x05, 0x0E, 0x99, 0x96, 0x63, 0x12},
+ {0x31, 0x11, 0x10, 0x0A, 0xF0, 0x9C, 0x32, 0x02},
+ {0x21, 0x61, 0x1D, 0x07, 0x9F, 0x64, 0x20, 0x27},
+ {0x22, 0x21, 0x1E, 0x06, 0xF0, 0x76, 0x08, 0x28},
+ {0x02, 0x01, 0x06, 0x00, 0xF0, 0xF2, 0x03, 0x95},
+ {0x21, 0x61, 0x1C, 0x07, 0x82, 0x81, 0x16, 0x07},
+ {0x23, 0x21, 0x1A, 0x17, 0xEF, 0x82, 0x25, 0x15},
+ {0x25, 0x11, 0x1F, 0x00, 0x86, 0x41, 0x20, 0x11},
+ {0x85, 0x01, 0x1F, 0x0F, 0xE4, 0xA2, 0x11, 0x12},
+ {0x07, 0xC1, 0x2B, 0x45, 0xB4, 0xF1, 0x24, 0xF4},
+ {0x61, 0x23, 0x11, 0x06, 0x96, 0x96, 0x13, 0x16},
+ {0x01, 0x02, 0xD3, 0x05, 0x82, 0xA2, 0x31, 0x51},
+ {0x61, 0x22, 0x0D, 0x02, 0xC3, 0x7F, 0x24, 0x05},
+ {0x21, 0x62, 0x0E, 0x00, 0xA1, 0xA0, 0x44, 0x17},
+
+};
+
+INLINE int limit( int val, int max, int min ) {
+ if ( val > max )
+ val = max;
+ else if ( val < min )
+ val = min;
+
+ return val;
+}
+
+
+/* advance LFO to next sample */
+INLINE void advance_lfo(YM2413 *chip)
+{
+ /* LFO */
+ chip->lfo_am_cnt += chip->lfo_am_inc;
+ if (chip->lfo_am_cnt >= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH) ) /* lfo_am_table is 210 elements long */
+ chip->lfo_am_cnt -= ((UINT32)LFO_AM_TAB_ELEMENTS<<LFO_SH);
+
+ chip->LFO_AM = lfo_am_table[ chip->lfo_am_cnt >> LFO_SH ] >> 1;
+
+ chip->lfo_pm_cnt += chip->lfo_pm_inc;
+ chip->LFO_PM = (chip->lfo_pm_cnt>>LFO_SH) & 7;
+}
+
+/* advance to next sample */
+INLINE void advance(YM2413 *chip)
+{
+ OPLL_CH *CH;
+ OPLL_SLOT *op;
+ unsigned int i;
+
+ /* Envelope Generator */
+ chip->eg_timer += chip->eg_timer_add;
+
+ while (chip->eg_timer >= chip->eg_timer_overflow)
+ {
+ chip->eg_timer -= chip->eg_timer_overflow;
+
+ chip->eg_cnt++;
+
+ for (i=0; i<9*2; i++)
+ {
+ CH = &chip->P_CH[i/2];
+
+ op = &CH->SLOT[i&1];
+
+ switch(op->state)
+ {
+
+ case EG_DMP: /* dump phase */
+ /*dump phase is performed by both operators in each channel*/
+ /*when CARRIER envelope gets down to zero level,
+ ** phases in BOTH opearators are reset (at the same time ?)
+ */
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_dp)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_dp + ((chip->eg_cnt>>op->eg_sh_dp)&7)];
+
+ if ( op->volume >= MAX_ATT_INDEX )
+ {
+ op->volume = MAX_ATT_INDEX;
+ op->state = EG_ATT;
+ /* restart Phase Generator */
+ op->phase = 0;
+ }
+ }
+ break;
+
+ case EG_ATT: /* attack phase */
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_ar)-1) ) )
+ {
+ op->volume += (~op->volume *
+ (eg_inc[op->eg_sel_ar + ((chip->eg_cnt>>op->eg_sh_ar)&7)])
+ ) >>2;
+
+ if (op->volume <= MIN_ATT_INDEX)
+ {
+ op->volume = MIN_ATT_INDEX;
+ op->state = EG_DEC;
+ }
+ }
+ break;
+
+ case EG_DEC: /* decay phase */
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_dr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_dr + ((chip->eg_cnt>>op->eg_sh_dr)&7)];
+
+ if ( op->volume >= op->sl )
+ op->state = EG_SUS;
+ }
+ break;
+
+ case EG_SUS: /* sustain phase */
+ /* this is important behaviour:
+ one can change percusive/non-percussive modes on the fly and
+ the chip will remain in sustain phase - verified on real YM3812 */
+
+ if(op->eg_type) /* non-percussive mode (sustained tone) */
+ {
+ /* do nothing */
+ }
+ else /* percussive mode */
+ {
+ /* during sustain phase chip adds Release Rate (in percussive mode) */
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rr + ((chip->eg_cnt>>op->eg_sh_rr)&7)];
+
+ if ( op->volume >= MAX_ATT_INDEX )
+ op->volume = MAX_ATT_INDEX;
+ }
+ /* else do nothing in sustain phase */
+ }
+ break;
+
+ case EG_REL: /* release phase */
+ /* exclude modulators in melody channels from performing anything in this mode*/
+ /* allowed are only carriers in melody mode and rhythm slots in rhythm mode */
+
+ /*This table shows which operators and on what conditions are allowed to perform EG_REL:
+ (a) - always perform EG_REL
+ (n) - never perform EG_REL
+ (r) - perform EG_REL in Rhythm mode ONLY
+ 0: 0 (n), 1 (a)
+ 1: 2 (n), 3 (a)
+ 2: 4 (n), 5 (a)
+ 3: 6 (n), 7 (a)
+ 4: 8 (n), 9 (a)
+ 5: 10(n), 11(a)
+ 6: 12(r), 13(a)
+ 7: 14(r), 15(a)
+ 8: 16(r), 17(a)
+ */
+ if ( (i&1) || ((chip->rhythm&0x20) && (i>=12)) )/* exclude modulators */
+ {
+ if(op->eg_type) /* non-percussive mode (sustained tone) */
+ /*this is correct: use RR when SUS = OFF*/
+ /*and use RS when SUS = ON*/
+ {
+ if (CH->sus)
+ {
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_rs)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rs + ((chip->eg_cnt>>op->eg_sh_rs)&7)];
+ if ( op->volume >= MAX_ATT_INDEX )
+ {
+ op->volume = MAX_ATT_INDEX;
+ op->state = EG_OFF;
+ }
+ }
+ }
+ else
+ {
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_rr)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rr + ((chip->eg_cnt>>op->eg_sh_rr)&7)];
+ if ( op->volume >= MAX_ATT_INDEX )
+ {
+ op->volume = MAX_ATT_INDEX;
+ op->state = EG_OFF;
+ }
+ }
+ }
+ }
+ else /* percussive mode */
+ {
+ if ( !(chip->eg_cnt & ((1<<op->eg_sh_rs)-1) ) )
+ {
+ op->volume += eg_inc[op->eg_sel_rs + ((chip->eg_cnt>>op->eg_sh_rs)&7)];
+ if ( op->volume >= MAX_ATT_INDEX )
+ {
+ op->volume = MAX_ATT_INDEX;
+ op->state = EG_OFF;
+ }
+ }
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ for (i=0; i<9*2; i++)
+ {
+ CH = &chip->P_CH[i/2];
+ op = &CH->SLOT[i&1];
+
+ /* Phase Generator */
+ if(op->vib)
+ {
+ UINT8 block;
+
+ unsigned int fnum_lfo = 8*((CH->block_fnum&0x01c0) >> 6);
+ unsigned int block_fnum = CH->block_fnum * 2;
+ signed int lfo_fn_table_index_offset = lfo_pm_table[chip->LFO_PM + fnum_lfo ];
+
+ if (lfo_fn_table_index_offset) /* LFO phase modulation active */
+ {
+ block_fnum += lfo_fn_table_index_offset;
+ block = (block_fnum&0x1c00) >> 10;
+ op->phase += (chip->fn_tab[block_fnum&0x03ff] >> (7-block)) * op->mul;
+ }
+ else /* LFO phase modulation = zero */
+ {
+ op->phase += op->freq;
+ }
+ }
+ else /* LFO phase modulation disabled for this operator */
+ {
+ op->phase += op->freq;
+ }
+ }
+
+ /* The Noise Generator of the YM3812 is 23-bit shift register.
+ * Period is equal to 2^23-2 samples.
+ * Register works at sampling frequency of the chip, so output
+ * can change on every sample.
+ *
+ * Output of the register and input to the bit 22 is:
+ * bit0 XOR bit14 XOR bit15 XOR bit22
+ *
+ * Simply use bit 22 as the noise output.
+ */
+
+ chip->noise_p += chip->noise_f;
+ i = chip->noise_p >> FREQ_SH; /* number of events (shifts of the shift register) */
+ chip->noise_p &= FREQ_MASK;
+ while (i)
+ {
+ /*
+ UINT32 j;
+ j = ( (chip->noise_rng) ^ (chip->noise_rng>>14) ^ (chip->noise_rng>>15) ^ (chip->noise_rng>>22) ) & 1;
+ chip->noise_rng = (j<<22) | (chip->noise_rng>>1);
+ */
+
+ /*
+ Instead of doing all the logic operations above, we
+ use a trick here (and use bit 0 as the noise output).
+ The difference is only that the noise bit changes one
+ step ahead. This doesn't matter since we don't know
+ what is real state of the noise_rng after the reset.
+ */
+
+ if (chip->noise_rng & 1) chip->noise_rng ^= 0x800302;
+ chip->noise_rng >>= 1;
+
+ i--;
+ }
+}
+
+
+INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+ UINT32 p;
+
+ p = (env<<5) + sin_tab[wave_tab + ((((signed int)((phase & ~FREQ_MASK) + (pm<<17))) >> FREQ_SH ) & SIN_MASK) ];
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab)
+{
+ UINT32 p;
+ INT32 i;
+
+ i = (phase & ~FREQ_MASK) + pm;
+
+/*logerror("i=%08x (i>>16)&511=%8i phase=%i [pm=%08x] ",i, (i>>16)&511, phase>>FREQ_SH, pm);*/
+
+ p = (env<<5) + sin_tab[ wave_tab + ((i>>FREQ_SH) & SIN_MASK)];
+
+/*logerror("(p&255=%i p>>8=%i) out= %i\n", p&255,p>>8, tl_tab[p&255]>>(p>>8) );*/
+
+ if (p >= TL_TAB_LEN)
+ return 0;
+ return tl_tab[p];
+}
+
+
+#define volume_calc(OP) ((OP)->TLL + ((UINT32)(OP)->volume) + (chip->LFO_AM & (OP)->AMmask))
+
+/* calculate output */
+INLINE void chan_calc( YM2413 *chip, OPLL_CH *CH )
+{
+ OPLL_SLOT *SLOT;
+ unsigned int env;
+ signed int out;
+ signed int phase_modulation; /* phase modulation input (SLOT 2) */
+
+
+ /* SLOT 1 */
+ SLOT = &CH->SLOT[SLOT1];
+ env = volume_calc(SLOT);
+ out = SLOT->op1_out[0] + SLOT->op1_out[1];
+
+ SLOT->op1_out[0] = SLOT->op1_out[1];
+ phase_modulation = SLOT->op1_out[0];
+
+ SLOT->op1_out[1] = 0;
+
+ if( env < ENV_QUIET )
+ {
+ if (!SLOT->fb_shift)
+ out = 0;
+ SLOT->op1_out[1] = op_calc1(SLOT->phase, env, (out<<SLOT->fb_shift), SLOT->wavetable );
+ }
+
+ /* SLOT 2 */
+
+ SLOT++;
+ env = volume_calc(SLOT);
+ if( env < ENV_QUIET )
+ {
+ signed int outp = op_calc(SLOT->phase, env, phase_modulation, SLOT->wavetable);
+ chip->output[0] += outp;
+ /* output[0] += op_calc(SLOT->phase, env, phase_modulation, SLOT->wavetable); */
+ }
+}
+
+/*
+ operators used in the rhythm sounds generation process:
+
+ Envelope Generator:
+
+channel operator register number Bass High Snare Tom Top
+/ slot number TL ARDR SLRR Wave Drum Hat Drum Tom Cymbal
+ 6 / 0 12 50 70 90 f0 +
+ 6 / 1 15 53 73 93 f3 +
+ 7 / 0 13 51 71 91 f1 +
+ 7 / 1 16 54 74 94 f4 +
+ 8 / 0 14 52 72 92 f2 +
+ 8 / 1 17 55 75 95 f5 +
+
+ Phase Generator:
+
+channel operator register number Bass High Snare Tom Top
+/ slot number MULTIPLE Drum Hat Drum Tom Cymbal
+ 6 / 0 12 30 +
+ 6 / 1 15 33 +
+ 7 / 0 13 31 + + +
+ 7 / 1 16 34 ----- n o t u s e d -----
+ 8 / 0 14 32 +
+ 8 / 1 17 35 + +
+
+channel operator register number Bass High Snare Tom Top
+number number BLK/FNUM2 FNUM Drum Hat Drum Tom Cymbal
+ 6 12,15 B6 A6 +
+
+ 7 13,16 B7 A7 + + +
+
+ 8 14,17 B8 A8 + + +
+
+*/
+
+/* calculate rhythm */
+
+INLINE void rhythm_calc( YM2413 *chip, OPLL_CH *CH, unsigned int noise )
+{
+ OPLL_SLOT *SLOT;
+ signed int out;
+ unsigned int env;
+ signed int phase_modulation; /* phase modulation input (SLOT 2) */
+
+
+ /* Bass Drum (verified on real YM3812):
+ - depends on the channel 6 'connect' register:
+ when connect = 0 it works the same as in normal (non-rhythm) mode (op1->op2->out)
+ when connect = 1 _only_ operator 2 is present on output (op2->out), operator 1 is ignored
+ - output sample always is multiplied by 2
+ */
+
+
+ /* SLOT 1 */
+ if ( !(chip->mask & OPLL_MASK_BD) )
+ {
+ SLOT = &CH[6].SLOT[SLOT1];
+ env = volume_calc(SLOT);
+
+ out = SLOT->op1_out[0] + SLOT->op1_out[1];
+ SLOT->op1_out[0] = SLOT->op1_out[1];
+
+ phase_modulation = SLOT->op1_out[0];
+
+ SLOT->op1_out[1] = 0;
+ if( env < ENV_QUIET )
+ {
+ if (!SLOT->fb_shift)
+ out = 0;
+ SLOT->op1_out[1] = op_calc1(SLOT->phase, env, (out<<SLOT->fb_shift), SLOT->wavetable );
+ }
+
+ /* SLOT 2 */
+ SLOT++;
+ env = volume_calc(SLOT);
+ if( env < ENV_QUIET )
+ chip->output[1] += op_calc(SLOT->phase, env, phase_modulation, SLOT->wavetable) * 2;
+ }
+
+
+ /* Phase generation is based on:
+ HH (13) channel 7->slot 1 combined with channel 8->slot 2 (same combination as TOP CYMBAL but different output phases)
+ SD (16) channel 7->slot 1
+ TOM (14) channel 8->slot 1
+ TOP (17) channel 7->slot 1 combined with channel 8->slot 2 (same combination as HIGH HAT but different output phases) */
+
+ /* Envelope generation based on:
+ HH channel 7->slot1
+ SD channel 7->slot2
+ TOM channel 8->slot1
+ TOP channel 8->slot2 */
+
+
+ /* The following formulas can be well optimized.
+ I leave them in direct form for now (in case I've missed something).
+ */
+
+ /* High Hat (verified on real YM3812) */
+ if ( !(chip->mask & OPLL_MASK_HH) )
+ {
+ env = volume_calc(chip->SLOT7_1);
+ if( env < ENV_QUIET )
+ {
+
+ /* high hat phase generation:
+ phase = d0 or 234 (based on frequency only)
+ phase = 34 or 2d0 (based on noise)
+ */
+
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit7 = ((chip->SLOT7_1->phase>>FREQ_SH)>>7)&1;
+ unsigned char bit3 = ((chip->SLOT7_1->phase>>FREQ_SH)>>3)&1;
+ unsigned char bit2 = ((chip->SLOT7_1->phase>>FREQ_SH)>>2)&1;
+
+ unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+ /* when res1 = 0 phase = 0x000 | 0xd0; */
+ /* when res1 = 1 phase = 0x200 | (0xd0>>2); */
+ UINT32 phase = res1 ? (0x200|(0xd0>>2)) : 0xd0;
+
+ /* enable gate based on frequency of operator 2 in channel 8 */
+ unsigned char bit5e= ((chip->SLOT8_2->phase>>FREQ_SH)>>5)&1;
+ unsigned char bit3e= ((chip->SLOT8_2->phase>>FREQ_SH)>>3)&1;
+
+ unsigned char res2 = (bit3e | bit5e);
+
+ /* when res2 = 0 pass the phase from calculation above (res1); */
+ /* when res2 = 1 phase = 0x200 | (0xd0>>2); */
+ if (res2)
+ phase = (0x200|(0xd0>>2));
+
+
+ /* when phase & 0x200 is set and noise=1 then phase = 0x200|0xd0 */
+ /* when phase & 0x200 is set and noise=0 then phase = 0x200|(0xd0>>2), ie no change */
+ if (phase&0x200)
+ {
+ if (noise)
+ phase = 0x200|0xd0;
+ }
+ else
+ /* when phase & 0x200 is clear and noise=1 then phase = 0xd0>>2 */
+ /* when phase & 0x200 is clear and noise=0 then phase = 0xd0, ie no change */
+ {
+ if (noise)
+ phase = 0xd0>>2;
+ }
+
+ chip->output[1] += op_calc(phase<<FREQ_SH, env, 0, chip->SLOT7_1->wavetable) * 2;
+ }
+ }
+
+ /* Snare Drum (verified on real YM3812) */
+ if ( !(chip->mask & OPLL_MASK_SD) )
+ {
+ env = volume_calc(chip->SLOT7_2);
+ if( env < ENV_QUIET )
+ {
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit8 = ((chip->SLOT7_1->phase>>FREQ_SH)>>8)&1;
+
+ /* when bit8 = 0 phase = 0x100; */
+ /* when bit8 = 1 phase = 0x200; */
+ UINT32 phase = bit8 ? 0x200 : 0x100;
+
+ /* Noise bit XOR'es phase by 0x100 */
+ /* when noisebit = 0 pass the phase from calculation above */
+ /* when noisebit = 1 phase ^= 0x100; */
+ /* in other words: phase ^= (noisebit<<8); */
+ if (noise)
+ phase ^= 0x100;
+
+ chip->output[1] += op_calc(phase<<FREQ_SH, env, 0, chip->SLOT7_2->wavetable) * 2;
+ }
+ }
+
+ /* Tom Tom (verified on real YM3812) */
+ if ( !(chip->mask & OPLL_MASK_TOM) )
+ {
+ env = volume_calc(chip->SLOT8_1);
+ if( env < ENV_QUIET )
+ chip->output[1] += op_calc(chip->SLOT8_1->phase, env, 0, chip->SLOT8_1->wavetable) * 2;
+ }
+
+ /* Top Cymbal (verified on real YM2413) */
+ if ( !(chip->mask & OPLL_MASK_CYM) )
+ {
+ env = volume_calc(chip->SLOT8_2);
+ if( env < ENV_QUIET )
+ {
+ /* base frequency derived from operator 1 in channel 7 */
+ unsigned char bit7 = ((chip->SLOT7_1->phase>>FREQ_SH)>>7)&1;
+ unsigned char bit3 = ((chip->SLOT7_1->phase>>FREQ_SH)>>3)&1;
+ unsigned char bit2 = ((chip->SLOT7_1->phase>>FREQ_SH)>>2)&1;
+
+ unsigned char res1 = (bit2 ^ bit7) | bit3;
+
+ /* when res1 = 0 phase = 0x000 | 0x100; */
+ /* when res1 = 1 phase = 0x200 | 0x100; */
+ UINT32 phase = res1 ? 0x300 : 0x100;
+
+ /* enable gate based on frequency of operator 2 in channel 8 */
+ unsigned char bit5e= ((chip->SLOT8_2->phase>>FREQ_SH)>>5)&1;
+ unsigned char bit3e= ((chip->SLOT8_2->phase>>FREQ_SH)>>3)&1;
+
+ unsigned char res2 = (bit3e | bit5e);
+ /* when res2 = 0 pass the phase from calculation above (res1); */
+ /* when res2 = 1 phase = 0x200 | 0x100; */
+ if (res2)
+ phase = 0x300;
+
+ chip->output[1] += op_calc(phase<<FREQ_SH, env, 0, chip->SLOT8_2->wavetable) * 2;
+ }
+ }
+}
+
+
+/* generic table initialize */
+static int init_tables(void)
+{
+ signed int i,x;
+ signed int n;
+ double o,m;
+
+
+ for (x=0; x<TL_RES_LEN; x++)
+ {
+ m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
+ m = floor(m);
+
+ /* we never reach (1<<16) here due to the (x+1) */
+ /* result fits within 16 bits at maximum */
+
+ n = (int)m; /* 16 bits here */
+ n >>= 4; /* 12 bits here */
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+ /* 11 bits here (rounded) */
+ tl_tab[ x*2 + 0 ] = n;
+ tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ];
+
+ for (i=1; i<11; i++)
+ {
+ tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i;
+ tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ];
+ }
+ #if 0
+ logerror("tl %04i", x*2);
+ for (i=0; i<11; i++)
+ logerror(", [%02i] %5i", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ] );
+ logerror("\n");
+ #endif
+ }
+ /*logerror("ym2413.c: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/
+
+
+ for (i=0; i<SIN_LEN; i++)
+ {
+ /* non-standard sinus */
+ m = sin( ((i*2)+1) * M_PI / SIN_LEN ); /* checked against the real chip */
+
+ /* we never reach zero here due to ((i*2)+1) */
+
+ if (m>0.0)
+ o = 8*log(1.0/m)/log(2.0); /* convert to 'decibels' */
+ else
+ o = 8*log(-1.0/m)/log(2.0); /* convert to 'decibels' */
+
+ o = o / (ENV_STEP/4);
+
+ n = (int)(2.0*o);
+ if (n&1) /* round to nearest */
+ n = (n>>1)+1;
+ else
+ n = n>>1;
+
+ /* waveform 0: standard sinus */
+ sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 );
+
+ /*logerror("ym2413.c: sin [%4i (hex=%03x)]= %4i (tl_tab value=%5i)\n", i, i, sin_tab[i], tl_tab[sin_tab[i]] );*/
+
+
+ /* waveform 1: __ __ */
+ /* / \____/ \____*/
+ /* output only first half of the sinus waveform (positive one) */
+ if (i & (1<<(SIN_BITS-1)) )
+ sin_tab[1*SIN_LEN+i] = TL_TAB_LEN;
+ else
+ sin_tab[1*SIN_LEN+i] = sin_tab[i];
+
+ /*logerror("ym2413.c: sin1[%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[1*SIN_LEN+i], tl_tab[sin_tab[1*SIN_LEN+i]] );*/
+ }
+#if 0
+ logerror("YM2413.C: ENV_QUIET= %08x (*32=%08x)\n", ENV_QUIET, ENV_QUIET*32 );
+ for (i=0; i<ENV_QUIET; i++)
+ {
+ logerror("tl_tb[%4x(%4i)]=%8x\n", i<<5, i, tl_tab[i<<5] );
+ }
+#endif
+#ifdef SAVE_SAMPLE
+ sample[0]=fopen("sampsum.pcm","wb");
+#endif
+
+ return 1;
+}
+
+static void OPLL_initalize(YM2413 *chip)
+{
+ int i;
+
+ /* frequency base */
+ chip->freqbase = (chip->rate) ? ((double)chip->clock / 72.0) / chip->rate : 0;
+ if ( fabs( chip->freqbase - 1.0 ) < 0.0000001 )
+ chip->freqbase = 1.0;
+#if 0
+ chip->rate = (double)chip->clock / 72.0;
+ chip->freqbase = 1.0;
+ logerror("freqbase=%f\n", chip->freqbase);
+#endif
+
+
+
+ /* make fnumber -> increment counter table */
+ for( i = 0 ; i < 1024; i++ )
+ {
+ /* OPLL (YM2413) phase increment counter = 18bit */
+
+ chip->fn_tab[i] = (UINT32)( (double)i * 64 * chip->freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
+#if 0
+ logerror("ym2413.c: fn_tab[%4i] = %08x (dec=%8i)\n",
+ i, chip->fn_tab[i]>>6, chip->fn_tab[i]>>6 );
+#endif
+ }
+
+#if 0
+ for( i=0 ; i < 16 ; i++ )
+ {
+ logerror("ym2413.c: sl_tab[%i] = %08x\n", i, sl_tab[i] );
+ }
+ for( i=0 ; i < 8 ; i++ )
+ {
+ int j;
+ logerror("ym2413.c: ksl_tab[oct=%2i] =",i);
+ for (j=0; j<16; j++)
+ {
+ logerror("%08x ", ksl_tab[i*16+j] );
+ }
+ logerror("\n");
+ }
+#endif
+
+
+ /* Amplitude modulation: 27 output levels (triangle waveform); 1 level takes one of: 192, 256 or 448 samples */
+ /* One entry from LFO_AM_TABLE lasts for 64 samples */
+ chip->lfo_am_inc = (1.0 / 64.0 ) * (1<<LFO_SH) * chip->freqbase;
+
+ /* Vibrato: 8 output levels (triangle waveform); 1 level takes 1024 samples */
+ chip->lfo_pm_inc = (1.0 / 1024.0) * (1<<LFO_SH) * chip->freqbase;
+
+ /*logerror ("chip->lfo_am_inc = %8x ; chip->lfo_pm_inc = %8x\n", chip->lfo_am_inc, chip->lfo_pm_inc);*/
+
+ /* Noise generator: a step takes 1 sample */
+ chip->noise_f = (1.0 / 1.0) * (1<<FREQ_SH) * chip->freqbase;
+ /*logerror("YM2413init noise_f=%8x\n", chip->noise_f);*/
+
+ chip->eg_timer_add = (1<<EG_SH) * chip->freqbase;
+ chip->eg_timer_overflow = ( 1 ) * (1<<EG_SH);
+ /*logerror("YM2413init eg_timer_add=%8x eg_timer_overflow=%8x\n", chip->eg_timer_add, chip->eg_timer_overflow);*/
+}
+
+INLINE void KEY_ON(OPLL_SLOT *SLOT, UINT32 key_set)
+{
+ if( !SLOT->key )
+ {
+ /* do NOT restart Phase Generator (verified on real YM2413)*/
+ /* phase -> Dump */
+ SLOT->state = EG_DMP;
+ }
+ SLOT->key |= key_set;
+}
+
+INLINE void KEY_OFF(OPLL_SLOT *SLOT, UINT32 key_clr)
+{
+ if( SLOT->key )
+ {
+ SLOT->key &= key_clr;
+
+ if( !SLOT->key )
+ {
+ /* phase -> Release */
+ if (SLOT->state>EG_REL)
+ SLOT->state = EG_REL;
+ }
+ }
+}
+
+/* update phase increment counter of operator (also update the EG rates if necessary) */
+INLINE void CALC_FCSLOT(OPLL_CH *CH,OPLL_SLOT *SLOT)
+{
+ int ksr;
+ UINT32 SLOT_rs;
+ UINT32 SLOT_dp;
+
+ /* (frequency) phase increment counter */
+ SLOT->freq = CH->fc * SLOT->mul;
+ ksr = CH->kcode >> SLOT->KSR;
+
+ if( SLOT->ksr != ksr )
+ {
+ SLOT->ksr = ksr;
+
+ /* calculate envelope generator rates */
+ if ((SLOT->ar + SLOT->ksr) < 16+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 13*RATE_STEPS;
+ }
+ SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+
+ }
+
+ if (CH->sus)
+ SLOT_rs = 16 + (5<<2);
+ else
+ SLOT_rs = 16 + (7<<2);
+
+ SLOT->eg_sh_rs = eg_rate_shift [SLOT_rs + SLOT->ksr ];
+ SLOT->eg_sel_rs = eg_rate_select[SLOT_rs + SLOT->ksr ];
+
+ SLOT_dp = 16 + (13<<2);
+ SLOT->eg_sh_dp = eg_rate_shift [SLOT_dp + SLOT->ksr ];
+ SLOT->eg_sel_dp = eg_rate_select[SLOT_dp + SLOT->ksr ];
+}
+
+/* set multi,am,vib,EG-TYP,KSR,mul */
+INLINE void set_mul(YM2413 *chip,int slot,int v)
+{
+ OPLL_CH *CH = &chip->P_CH[slot/2];
+ OPLL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->mul = mul_tab[v&0x0f];
+ SLOT->KSR = (v&0x10) ? 0 : 2;
+ SLOT->eg_type = (v&0x20);
+ SLOT->vib = (v&0x40);
+ SLOT->AMmask = (v&0x80) ? ~0 : 0;
+ CALC_FCSLOT(CH,SLOT);
+}
+
+/* set ksl, tl */
+INLINE void set_ksl_tl(YM2413 *chip,int chan,int v)
+{
+ int ksl;
+ OPLL_CH *CH = &chip->P_CH[chan];
+/* modulator */
+ OPLL_SLOT *SLOT = &CH->SLOT[SLOT1];
+
+ ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */
+
+ SLOT->ksl = ksl ? 3-ksl : 31;
+ SLOT->TL = (v&0x3f)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+}
+
+/* set ksl , waveforms, feedback */
+INLINE void set_ksl_wave_fb(YM2413 *chip,int chan,int v)
+{
+ int ksl;
+ OPLL_CH *CH = &chip->P_CH[chan];
+/* modulator */
+ OPLL_SLOT *SLOT = &CH->SLOT[SLOT1];
+ SLOT->wavetable = ((v&0x08)>>3)*SIN_LEN;
+ SLOT->fb_shift = (v&7) ? (v&7) + 8 : 0;
+
+/*carrier*/
+ SLOT = &CH->SLOT[SLOT2];
+ ksl = v>>6; /* 0 / 1.5 / 3.0 / 6.0 dB/OCT */
+
+ SLOT->ksl = ksl ? 3-ksl : 31;
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+
+ SLOT->wavetable = ((v&0x10)>>4)*SIN_LEN;
+}
+
+/* set attack rate & decay rate */
+INLINE void set_ar_dr(YM2413 *chip,int slot,int v)
+{
+ OPLL_CH *CH = &chip->P_CH[slot/2];
+ OPLL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->ar = (v>>4) ? 16 + ((v>>4) <<2) : 0;
+
+ if ((SLOT->ar + SLOT->ksr) < 16+62)
+ {
+ SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
+ SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
+ }
+ else
+ {
+ SLOT->eg_sh_ar = 0;
+ SLOT->eg_sel_ar = 13*RATE_STEPS;
+ }
+
+ SLOT->dr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+ SLOT->eg_sh_dr = eg_rate_shift [SLOT->dr + SLOT->ksr ];
+ SLOT->eg_sel_dr = eg_rate_select[SLOT->dr + SLOT->ksr ];
+}
+
+/* set sustain level & release rate */
+INLINE void set_sl_rr(YM2413 *chip,int slot,int v)
+{
+ OPLL_CH *CH = &chip->P_CH[slot/2];
+ OPLL_SLOT *SLOT = &CH->SLOT[slot&1];
+
+ SLOT->sl = sl_tab[ v>>4 ];
+
+ SLOT->rr = (v&0x0f)? 16 + ((v&0x0f)<<2) : 0;
+ SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr ];
+ SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr ];
+}
+
+static void load_instrument(YM2413 *chip, UINT32 chan, UINT32 slot, UINT8* inst )
+{
+ set_mul (chip, slot, inst[0]);
+ set_mul (chip, slot+1, inst[1]);
+ set_ksl_tl (chip, chan, inst[2]);
+ set_ksl_wave_fb (chip, chan, inst[3]);
+ set_ar_dr (chip, slot, inst[4]);
+ set_ar_dr (chip, slot+1, inst[5]);
+ set_sl_rr (chip, slot, inst[6]);
+ set_sl_rr (chip, slot+1, inst[7]);
+}
+static void update_instrument_zero(YM2413 *chip, UINT8 r )
+{
+ UINT8* inst = &chip->inst_tab[0][0]; /* point to user instrument */
+ UINT32 chan;
+ UINT32 chan_max;
+
+ chan_max = 9;
+ if (chip->rhythm & 0x20)
+ chan_max=6;
+
+ switch(r)
+ {
+ case 0:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_mul (chip, chan*2, inst[0]);
+ }
+ }
+ break;
+ case 1:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_mul (chip, chan*2+1,inst[1]);
+ }
+ }
+ break;
+ case 2:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_ksl_tl (chip, chan, inst[2]);
+ }
+ }
+ break;
+ case 3:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_ksl_wave_fb (chip, chan, inst[3]);
+ }
+ }
+ break;
+ case 4:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_ar_dr (chip, chan*2, inst[4]);
+ }
+ }
+ break;
+ case 5:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_ar_dr (chip, chan*2+1,inst[5]);
+ }
+ }
+ break;
+ case 6:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_sl_rr (chip, chan*2, inst[6]);
+ }
+ }
+ break;
+ case 7:
+ for (chan=0; chan<chan_max; chan++)
+ {
+ if ((chip->instvol_r[chan]&0xf0)==0)
+ {
+ set_sl_rr (chip, chan*2+1,inst[7]);
+ }
+ }
+ break;
+ }
+}
+
+/* write a value v to register r on chip chip */
+static void OPLLWriteReg(YM2413 *chip, int r, int v)
+{
+ OPLL_CH *CH;
+ OPLL_SLOT *SLOT;
+ UINT8 *inst;
+ int chan;
+ int slot;
+
+ /* adjust bus to 8 bits */
+ r &= 0xff;
+ v &= 0xff;
+
+
+ switch(r&0xf0)
+ {
+ case 0x00: /* 00-0f:control */
+ {
+ switch(r&0x0f)
+ {
+ case 0x00: /* AM/VIB/EGTYP/KSR/MULTI (modulator) */
+ case 0x01: /* AM/VIB/EGTYP/KSR/MULTI (carrier) */
+ case 0x02: /* Key Scale Level, Total Level (modulator) */
+ case 0x03: /* Key Scale Level, carrier waveform, modulator waveform, Feedback */
+ case 0x04: /* Attack, Decay (modulator) */
+ case 0x05: /* Attack, Decay (carrier) */
+ case 0x06: /* Sustain, Release (modulator) */
+ case 0x07: /* Sustain, Release (carrier) */
+ chip->inst_tab[0][r & 0x07] = v;
+ update_instrument_zero(chip,r&7);
+ break;
+
+ case 0x0e: /* x, x, r,bd,sd,tom,tc,hh */
+ {
+ if(v&0x20)
+ {
+ if ((chip->rhythm&0x20)==0)
+ /*rhythm off to on*/
+ {
+ logerror("YM2413: Rhythm mode enable\n");
+
+ /* Load instrument settings for channel seven(chan=6 since we're zero based). (Bass drum) */
+ chan = 6;
+ inst = &chip->inst_tab[16][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ /* Load instrument settings for channel eight. (High hat and snare drum) */
+ chan = 7;
+ inst = &chip->inst_tab[17][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ CH = &chip->P_CH[chan];
+ SLOT = &CH->SLOT[SLOT1]; /* modulator envelope is HH */
+ SLOT->TL = ((chip->instvol_r[chan]>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+
+ /* Load instrument settings for channel nine. (Tom-tom and top cymbal) */
+ chan = 8;
+ inst = &chip->inst_tab[18][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ CH = &chip->P_CH[chan];
+ SLOT = &CH->SLOT[SLOT1]; /* modulator envelope is TOM */
+ SLOT->TL = ((chip->instvol_r[chan]>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+ }
+ /* BD key on/off */
+ if(v&0x10)
+ {
+ KEY_ON (&chip->P_CH[6].SLOT[SLOT1], 2);
+ KEY_ON (&chip->P_CH[6].SLOT[SLOT2], 2);
+ }
+ else
+ {
+ KEY_OFF(&chip->P_CH[6].SLOT[SLOT1],~2);
+ KEY_OFF(&chip->P_CH[6].SLOT[SLOT2],~2);
+ }
+ /* HH key on/off */
+ if(v&0x01) KEY_ON (&chip->P_CH[7].SLOT[SLOT1], 2);
+ else KEY_OFF(&chip->P_CH[7].SLOT[SLOT1],~2);
+ /* SD key on/off */
+ if(v&0x08) KEY_ON (&chip->P_CH[7].SLOT[SLOT2], 2);
+ else KEY_OFF(&chip->P_CH[7].SLOT[SLOT2],~2);
+ /* TOM key on/off */
+ if(v&0x04) KEY_ON (&chip->P_CH[8].SLOT[SLOT1], 2);
+ else KEY_OFF(&chip->P_CH[8].SLOT[SLOT1],~2);
+ /* TOP-CY key on/off */
+ if(v&0x02) KEY_ON (&chip->P_CH[8].SLOT[SLOT2], 2);
+ else KEY_OFF(&chip->P_CH[8].SLOT[SLOT2],~2);
+ }
+ else
+ {
+ if ((chip->rhythm&0x20)==1)
+ /*rhythm on to off*/
+ {
+ logerror("YM2413: Rhythm mode disable\n");
+ /* Load instrument settings for channel seven(chan=6 since we're zero based).*/
+ chan = 6;
+ inst = &chip->inst_tab[chip->instvol_r[chan]>>4][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ /* Load instrument settings for channel eight.*/
+ chan = 7;
+ inst = &chip->inst_tab[chip->instvol_r[chan]>>4][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ /* Load instrument settings for channel nine.*/
+ chan = 8;
+ inst = &chip->inst_tab[chip->instvol_r[chan]>>4][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+ }
+ /* BD key off */
+ KEY_OFF(&chip->P_CH[6].SLOT[SLOT1],~2);
+ KEY_OFF(&chip->P_CH[6].SLOT[SLOT2],~2);
+ /* HH key off */
+ KEY_OFF(&chip->P_CH[7].SLOT[SLOT1],~2);
+ /* SD key off */
+ KEY_OFF(&chip->P_CH[7].SLOT[SLOT2],~2);
+ /* TOM key off */
+ KEY_OFF(&chip->P_CH[8].SLOT[SLOT1],~2);
+ /* TOP-CY off */
+ KEY_OFF(&chip->P_CH[8].SLOT[SLOT2],~2);
+ }
+ chip->rhythm = v&0x3f;
+ }
+ break;
+ }
+ }
+ break;
+
+ case 0x10:
+ case 0x20:
+ {
+ int block_fnum;
+
+ chan = r&0x0f;
+
+ if (chan >= 9)
+ chan -= 9; /* verified on real YM2413 */
+
+ CH = &chip->P_CH[chan];
+
+ if(r&0x10)
+ { /* 10-18: FNUM 0-7 */
+ block_fnum = (CH->block_fnum&0x0f00) | v;
+ }
+ else
+ { /* 20-28: suson, keyon, block, FNUM 8 */
+ block_fnum = ((v&0x0f)<<8) | (CH->block_fnum&0xff);
+
+ if(v&0x10)
+ {
+ KEY_ON (&CH->SLOT[SLOT1], 1);
+ KEY_ON (&CH->SLOT[SLOT2], 1);
+ }
+ else
+ {
+ KEY_OFF(&CH->SLOT[SLOT1],~1);
+ KEY_OFF(&CH->SLOT[SLOT2],~1);
+ }
+
+
+ if (CH->sus!=(v&0x20))
+ logerror("chan=%i sus=%2x\n",chan,v&0x20);
+
+ CH->sus = v & 0x20;
+ }
+ /* update */
+ if(CH->block_fnum != block_fnum)
+ {
+ UINT8 block;
+
+ CH->block_fnum = block_fnum;
+
+ /* BLK 2,1,0 bits -> bits 3,2,1 of kcode, FNUM MSB -> kcode LSB */
+ CH->kcode = (block_fnum&0x0f00)>>8;
+
+ CH->ksl_base = ksl_tab[block_fnum>>5];
+
+ block_fnum = block_fnum * 2;
+ block = (block_fnum&0x1c00) >> 10;
+ CH->fc = chip->fn_tab[block_fnum&0x03ff] >> (7-block);
+
+ /* refresh Total Level in both SLOTs of this channel */
+ CH->SLOT[SLOT1].TLL = CH->SLOT[SLOT1].TL + (CH->ksl_base>>CH->SLOT[SLOT1].ksl);
+ CH->SLOT[SLOT2].TLL = CH->SLOT[SLOT2].TL + (CH->ksl_base>>CH->SLOT[SLOT2].ksl);
+
+ /* refresh frequency counter in both SLOTs of this channel */
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT1]);
+ CALC_FCSLOT(CH,&CH->SLOT[SLOT2]);
+ }
+ }
+ break;
+
+ case 0x30: /* inst 4 MSBs, VOL 4 LSBs */
+ {
+ UINT8 old_instvol;
+
+ chan = r&0x0f;
+
+ if (chan >= 9)
+ chan -= 9; /* verified on real YM2413 */
+
+ old_instvol = chip->instvol_r[chan];
+ chip->instvol_r[chan] = v; /* store for later use */
+
+ CH = &chip->P_CH[chan];
+ SLOT = &CH->SLOT[SLOT2]; /* carrier */
+ SLOT->TL = ((v&0x0f)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+
+
+ /*check wether we are in rhythm mode and handle instrument/volume register accordingly*/
+ if ((chan>=6) && (chip->rhythm&0x20))
+ {
+ /* we're in rhythm mode*/
+
+ if (chan>=7) /* only for channel 7 and 8 (channel 6 is handled in usual way)*/
+ {
+ SLOT = &CH->SLOT[SLOT1]; /* modulator envelope is HH(chan=7) or TOM(chan=8) */
+ SLOT->TL = ((chip->instvol_r[chan]>>4)<<2)<<(ENV_BITS-2-7); /* 7 bits TL (bit 6 = always 0) */
+ SLOT->TLL = SLOT->TL + (CH->ksl_base>>SLOT->ksl);
+ }
+ }
+ else
+ {
+ if ( (old_instvol&0xf0) == (v&0xf0) )
+ return;
+
+ inst = &chip->inst_tab[chip->instvol_r[chan]>>4][0];
+ slot = chan*2;
+
+ load_instrument(chip, chan, slot, inst);
+
+ #if 0
+ logerror("YM2413: chan#%02i inst=%02i: (r=%2x, v=%2x)\n",chan,v>>4,r,v);
+ logerror(" 0:%2x 1:%2x\n",inst[0],inst[1]); logerror(" 2:%2x 3:%2x\n",inst[2],inst[3]);
+ logerror(" 4:%2x 5:%2x\n",inst[4],inst[5]); logerror(" 6:%2x 7:%2x\n",inst[6],inst[7]);
+ #endif
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+}
+
+/* lock/unlock for common table */
+static void OPLLResetChip(YM2413 *chip)
+{
+ int c,s;
+ int i;
+
+ chip->eg_timer = 0;
+ chip->eg_cnt = 0;
+
+ chip->noise_rng = 1; /* noise shift register */
+
+ chip->mask = 0;
+
+ /* setup instruments table */
+ if (!chip->chip_type)
+ {
+ for (i=0; i<19; i++)
+ {
+ for (c=0; c<8; c++)
+ {
+ chip->inst_tab[i][c] = table[i][c];
+ }
+ }
+ }
+ else
+ {
+ memset( &chip->inst_tab, 0, sizeof(chip->inst_tab) );
+
+ for (i=0; i<15; i++)
+ {
+ for (c=0; c<8; c++)
+ {
+ chip->inst_tab[i+1][c] = table_vrc7[i][c];
+ }
+ }
+ }
+
+
+ /* reset with register write */
+ OPLLWriteReg(chip,0x0f,0); /*test reg*/
+ for(i = 0x3f ; i >= 0x10 ; i-- ) OPLLWriteReg(chip,i,0x00);
+
+ /* reset operator parameters */
+ for( c = 0 ; c < 9 ; c++ )
+ {
+ OPLL_CH *CH = &chip->P_CH[c];
+ for(s = 0 ; s < 2 ; s++ )
+ {
+ /* wave table */
+ CH->SLOT[s].wavetable = 0;
+ CH->SLOT[s].state = EG_OFF;
+ CH->SLOT[s].volume = MAX_ATT_INDEX;
+ }
+ }
+}
+
+/* Create one of virtual YM2413 */
+/* 'clock' is chip clock in Hz */
+/* 'rate' is sampling rate */
+static YM2413 *OPLLCreate(int clock, int rate, int type)
+{
+ char *ptr;
+ YM2413 *chip;
+ int state_size;
+
+ init_tables();
+
+ /* calculate chip state size */
+ state_size = sizeof(YM2413);
+
+ /* allocate memory block */
+ ptr = (char *)malloc(state_size);
+
+ if (ptr==NULL)
+ return NULL;
+
+ /* clear */
+ memset(ptr,0,state_size);
+
+ chip = (YM2413 *)ptr;
+
+ chip->clock = clock;
+ chip->rate = rate;
+
+ chip->chip_type = type;
+
+ chip->mask = 0;
+
+ /* init global tables */
+ OPLL_initalize(chip);
+
+ /* reset chip */
+ OPLLResetChip(chip);
+ return chip;
+}
+
+/* Destroy one of virtual YM3812 */
+static void OPLLDestroy(YM2413 *chip)
+{
+ free(chip);
+}
+
+/* Option handlers */
+
+static void OPLLSetUpdateHandler(YM2413 *chip,OPLL_UPDATEHANDLER UpdateHandler,void * param)
+{
+ chip->UpdateHandler = UpdateHandler;
+ chip->UpdateParam = param;
+}
+
+/* YM3812 I/O interface */
+static void OPLLWrite(YM2413 *chip,int a,int v)
+{
+ if( !(a&1) )
+ { /* address port */
+ chip->address = v & 0xff;
+ }
+ else
+ { /* data port */
+ if(chip->UpdateHandler) chip->UpdateHandler(chip->UpdateParam,0);
+ OPLLWriteReg(chip,chip->address,v);
+ }
+}
+
+static unsigned char OPLLRead(YM2413 *chip,int a)
+{
+ if( !(a&1) )
+ {
+ /* status port */
+ return chip->status;
+ }
+ return 0xff;
+}
+
+
+
+
+
+void * ym2413_init(int clock, int rate, int type)
+{
+ /* emulator create */
+ return OPLLCreate(clock, rate, type);
+}
+
+void ym2413_shutdown(void *chip)
+{
+ YM2413 *OPLL = (YM2413 *)chip;
+
+ /* emulator shutdown */
+ OPLLDestroy(OPLL);
+}
+
+void ym2413_reset_chip(void *chip)
+{
+ YM2413 *OPLL = (YM2413 *)chip;
+ OPLLResetChip(OPLL);
+}
+
+void ym2413_write(void *chip, int a, int v)
+{
+ YM2413 *OPLL = (YM2413 *)chip;
+ OPLLWrite(OPLL, a, v);
+}
+
+unsigned char ym2413_read(void *chip, int a)
+{
+ YM2413 *OPLL = (YM2413 *)chip;
+ return OPLLRead(OPLL, a) & 0x03 ;
+}
+
+void ym2413_set_update_handler(void *chip,OPLL_UPDATEHANDLER UpdateHandler,void *param)
+{
+ YM2413 *OPLL = (YM2413 *)chip;
+ OPLLSetUpdateHandler(OPLL, UpdateHandler, param);
+}
+
+
+/*
+** Generate samples for one of the YM2413's
+**
+** 'which' is the virtual YM2413 number
+** '*buffer' is the output buffer pointer
+** 'length' is the number of samples that should be generated
+*/
+void ym2413_update_one(void *_chip, SAMP **buffers, int length)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+ UINT8 rhythm = chip->rhythm&0x20;
+ SAMP *bufMO = buffers[0];
+ SAMP *bufRO = buffers[1];
+
+ int i,j;
+
+ chip->SLOT7_1 = &chip->P_CH[7].SLOT[SLOT1];
+ chip->SLOT7_2 = &chip->P_CH[7].SLOT[SLOT2];
+ chip->SLOT8_1 = &chip->P_CH[8].SLOT[SLOT1];
+ chip->SLOT8_2 = &chip->P_CH[8].SLOT[SLOT2];
+
+
+ for( i=0; i < length ; i++ )
+ {
+ int mo,ro;
+
+ chip->output[0] = 0;
+ chip->output[1] = 0;
+
+ advance_lfo(chip);
+
+#if 0
+ /* FM part */
+ chan_calc(chip,&chip->P_CH[0]);
+/* SAVE_SEPARATE_CHANNEL(0); */
+ chan_calc(chip,&chip->P_CH[1]);
+ chan_calc(chip,&chip->P_CH[2]);
+ chan_calc(chip,&chip->P_CH[3]);
+ chan_calc(chip,&chip->P_CH[4]);
+ chan_calc(chip,&chip->P_CH[5]);
+#else
+ for ( j=0; j < 6; j++ )
+ {
+ if (!(chip->mask & OPLL_MASK_CH(j))) chan_calc(chip, &chip->P_CH[j]);
+ }
+#endif
+
+ if(!rhythm)
+ {
+#if 0
+ chan_calc(chip,&chip->P_CH[6]);
+ chan_calc(chip,&chip->P_CH[7]);
+ chan_calc(chip,&chip->P_CH[8]);
+#else
+ for ( j=6; j < 9; j++ )
+ {
+ if (!(chip->mask & OPLL_MASK_CH(j))) chan_calc(chip, &chip->P_CH[j]);
+ }
+#endif
+ }
+ else /* Rhythm part */
+ {
+ if ( ( chip->mask & OPLL_MASK_RHYTHM ) != OPLL_MASK_RHYTHM )
+ rhythm_calc(chip,&chip->P_CH[0], (chip->noise_rng>>0)&1 );
+ }
+
+ mo = chip->output[0];
+ ro = chip->output[1];
+
+ mo >>= FINAL_SH;
+ ro >>= FINAL_SH;
+
+ /* limit check */
+ mo = limit( mo , MAXOUT, MINOUT );
+ ro = limit( ro , MAXOUT, MINOUT );
+
+ /* store to sound buffer */
+ bufMO[i] = mo;
+ bufRO[i] = ro;
+
+ advance(chip);
+ }
+
+}
+
+void ym2413_advance_lfo(void *_chip)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+ advance_lfo(chip);
+}
+
+void ym2413_advance(void *_chip)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+ advance(chip);
+}
+
+SAMP ym2413_calcch(void *_chip, int ch)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+
+ int output;
+
+ chip->output[0] = 0;
+ chip->output[1] = 0;
+
+ if (ch >= 0 && ch < 6) chan_calc( chip, &chip->P_CH[ch] );
+ else if (ch >= 6 && ch < 9)
+ {
+ UINT8 rhythm = chip->rhythm&0x20;
+ if (!rhythm) chan_calc( chip, &chip->P_CH[ch] );
+ else if (ch == 6) rhythm_calc(chip,&chip->P_CH[0], (chip->noise_rng>>0)&1 );
+ }
+
+ output = chip->output[0];
+ output += chip->output[1];
+
+ return output;
+}
+
+void * ym2413_get_inst0(void *_chip)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+
+ return &chip->inst_tab;
+}
+
+void ym2413_set_mask(void *_chip, UINT32 mask)
+{
+ YM2413 *chip = (YM2413 *)_chip;
+
+ chip->mask = mask;
+} \ No newline at end of file
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/ym2413.h b/plugins/gme/game-music-emu-0.6pre/gme/ym2413.h
new file mode 100644
index 00000000..679db352
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/ym2413.h
@@ -0,0 +1,61 @@
+#pragma once
+
+#ifndef __YM2413_H__
+#define __YM2413_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* select output bits size of output : 8 or 16 */
+#define SAMPLE_BITS 16
+
+/* compiler dependence */
+#ifndef __OSDCOMM_H__
+#define __OSDCOMM_H__
+typedef unsigned char UINT8; /* unsigned 8bit */
+typedef unsigned short UINT16; /* unsigned 16bit */
+typedef unsigned int UINT32; /* unsigned 32bit */
+typedef signed char INT8; /* signed 8bit */
+typedef signed short INT16; /* signed 16bit */
+typedef signed int INT32; /* signed 32bit */
+
+typedef INT32 stream_sample_t;
+#endif
+
+typedef stream_sample_t SAMP;
+/*
+#if (SAMPLE_BITS==16)
+typedef INT16 SAMP;
+#endif
+#if (SAMPLE_BITS==8)
+typedef INT8 SAMP;
+#endif
+*/
+
+
+
+void *ym2413_init(int clock, int rate, int type);
+void ym2413_shutdown(void *chip);
+void ym2413_reset_chip(void *chip);
+void ym2413_write(void *chip, int a, int v);
+unsigned char ym2413_read(void *chip, int a);
+void ym2413_update_one(void *chip, SAMP **buffers, int length);
+
+void ym2413_advance_lfo(void *chip); /* call this once */
+SAMP ym2413_calcch(void *chip, int ch); /* then call this for each channel */
+void ym2413_advance(void *chip); /* then call this */
+
+void * ym2413_get_inst0(void *chip);
+
+void ym2413_set_mask(void *chip, UINT32 mask);
+
+typedef void (*OPLL_UPDATEHANDLER)(void *param,int min_interval_us);
+
+void ym2413_set_update_handler(void *chip, OPLL_UPDATEHANDLER UpdateHandler, void *param);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*__YM2413_H__*/
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.cpp b/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.cpp
new file mode 100644
index 00000000..48167205
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.cpp
@@ -0,0 +1,655 @@
+/*
+**
+** File: ymdeltat.c
+**
+** YAMAHA DELTA-T adpcm sound emulation subroutine
+** used by fmopl.c (Y8950) and fm.c (YM2608 and YM2610/B)
+**
+** Base program is YM2610 emulator by Hiromitsu Shioya.
+** Written by Tatsuyuki Satoh
+** Improvements by Jarek Burczynski (bujar at mame dot net)
+**
+**
+** History:
+**
+** 03-08-2003 Jarek Burczynski:
+** - fixed BRDY flag implementation.
+**
+** 24-07-2003 Jarek Burczynski, Frits Hilderink:
+** - fixed delault value for control2 in YM_DELTAT_ADPCM_Reset
+**
+** 22-07-2003 Jarek Burczynski, Frits Hilderink:
+** - fixed external memory support
+**
+** 15-06-2003 Jarek Burczynski:
+** - implemented CPU -> AUDIO ADPCM synthesis (via writes to the ADPCM data reg $08)
+** - implemented support for the Limit address register
+** - supported two bits from the control register 2 ($01): RAM TYPE (x1 bit/x8 bit), ROM/RAM
+** - implemented external memory access (read/write) via the ADPCM data reg reads/writes
+** Thanks go to Frits Hilderink for the example code.
+**
+** 14-06-2003 Jarek Burczynski:
+** - various fixes to enable proper support for status register flags: BSRDY, PCM BSY, ZERO
+** - modified EOS handling
+**
+** 05-04-2003 Jarek Burczynski:
+** - implemented partial support for external/processor memory on sample replay
+**
+** 01-12-2002 Jarek Burczynski:
+** - fixed first missing sound in gigandes thanks to previous fix (interpolator) by ElSemi
+** - renamed/removed some YM_DELTAT struct fields
+**
+** 28-12-2001 Acho A. Tang
+** - added EOS status report on ADPCM playback.
+**
+** 05-08-2001 Jarek Burczynski:
+** - now_step is initialized with 0 at the start of play.
+**
+** 12-06-2001 Jarek Burczynski:
+** - corrected end of sample bug in YM_DELTAT_ADPCM_CALC.
+** Checked on real YM2610 chip - address register is 24 bits wide.
+** Thanks go to Stefan Jokisch (stefan.jokisch@gmx.de) for tracking down the problem.
+**
+** TO DO:
+** Check size of the address register on the other chips....
+**
+** Version 0.72
+**
+** sound chips that have this unit:
+** YM2608 OPNA
+** YM2610/B OPNB
+** Y8950 MSX AUDIO
+**
+*/
+
+#include "ymdeltat.h"
+#define INLINE __inline
+#define logerror (void)
+
+#define YM_DELTAT_DELTA_MAX (24576)
+#define YM_DELTAT_DELTA_MIN (127)
+#define YM_DELTAT_DELTA_DEF (127)
+
+#define YM_DELTAT_DECODE_RANGE 32768
+#define YM_DELTAT_DECODE_MIN (-(YM_DELTAT_DECODE_RANGE))
+#define YM_DELTAT_DECODE_MAX ((YM_DELTAT_DECODE_RANGE)-1)
+
+
+/* Forecast to next Forecast (rate = *8) */
+/* 1/8 , 3/8 , 5/8 , 7/8 , 9/8 , 11/8 , 13/8 , 15/8 */
+static const INT32 ym_deltat_decode_tableB1[16] = {
+ 1, 3, 5, 7, 9, 11, 13, 15,
+ -1, -3, -5, -7, -9, -11, -13, -15,
+};
+/* delta to next delta (rate= *64) */
+/* 0.9 , 0.9 , 0.9 , 0.9 , 1.2 , 1.6 , 2.0 , 2.4 */
+static const INT32 ym_deltat_decode_tableB2[16] = {
+ 57, 57, 57, 57, 77, 102, 128, 153,
+ 57, 57, 57, 57, 77, 102, 128, 153
+};
+
+#if 0
+void YM_DELTAT_BRDY_callback(YM_DELTAT *DELTAT)
+{
+ logerror("BRDY_callback reached (flag set) !\n");
+
+ /* set BRDY bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+}
+#endif
+
+UINT8 YM_DELTAT_ADPCM_Read(YM_DELTAT *DELTAT)
+{
+ UINT8 v = 0;
+
+ /* external memory read */
+ if ( (DELTAT->portstate & 0xe0)==0x20 )
+ {
+ /* two dummy reads */
+ if (DELTAT->memread)
+ {
+ DELTAT->now_addr = DELTAT->start << 1;
+ DELTAT->memread--;
+ return 0;
+ }
+
+
+ if ( DELTAT->now_addr != (DELTAT->end<<1) )
+ {
+ v = DELTAT->memory[DELTAT->now_addr>>1];
+
+ /*logerror("YM Delta-T memory read $%08x, v=$%02x\n", DELTAT->now_addr >> 1, v);*/
+
+ DELTAT->now_addr+=2; /* two nibbles at a time */
+
+ /* reset BRDY bit in status register, which means we are reading the memory now */
+ if(DELTAT->status_reset_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_reset_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+
+ /* setup a timer that will callback us in 10 master clock cycles for Y8950
+ * in the callback set the BRDY flag to 1 , which means we have another data ready.
+ * For now, we don't really do this; we simply reset and set the flag in zero time, so that the IRQ will work.
+ */
+ /* set BRDY bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+ }
+ else
+ {
+ /* set EOS bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_EOS_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_EOS_bit);
+ }
+ }
+
+ return v;
+}
+
+
+/* 0-DRAM x1, 1-ROM, 2-DRAM x8, 3-ROM (3 is bad setting - not allowed by the manual) */
+static const UINT8 dram_rightshift[4]={3,0,0,0};
+
+/* DELTA-T ADPCM write register */
+void YM_DELTAT_ADPCM_Write(YM_DELTAT *DELTAT,int r,int v)
+{
+ if(r>=0x10) return;
+ DELTAT->reg[r] = v; /* stock data */
+
+ switch( r )
+ {
+ case 0x00:
+/*
+START:
+ Accessing *external* memory is started when START bit (D7) is set to "1", so
+ you must set all conditions needed for recording/playback before starting.
+ If you access *CPU-managed* memory, recording/playback starts after
+ read/write of ADPCM data register $08.
+
+REC:
+ 0 = ADPCM synthesis (playback)
+ 1 = ADPCM analysis (record)
+
+MEMDATA:
+ 0 = processor (*CPU-managed*) memory (means: using register $08)
+ 1 = external memory (using start/end/limit registers to access memory: RAM or ROM)
+
+
+SPOFF:
+ controls output pin that should disable the speaker while ADPCM analysis
+
+RESET and REPEAT only work with external memory.
+
+
+some examples:
+value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
+ C8 1 1 0 0 1 0 0 0 Analysis (recording) from AUDIO to CPU (to reg $08), sample rate in PRESCALER register
+ E8 1 1 1 0 1 0 0 0 Analysis (recording) from AUDIO to EXT.MEMORY, sample rate in PRESCALER register
+ 80 1 0 0 0 0 0 0 0 Synthesis (playing) from CPU (from reg $08) to AUDIO,sample rate in DELTA-N register
+ a0 1 0 1 0 0 0 0 0 Synthesis (playing) from EXT.MEMORY to AUDIO, sample rate in DELTA-N register
+
+ 60 0 1 1 0 0 0 0 0 External memory write via ADPCM data register $08
+ 20 0 0 1 0 0 0 0 0 External memory read via ADPCM data register $08
+
+*/
+ /* handle emulation mode */
+ if(DELTAT->emulation_mode == YM_DELTAT_EMULATION_MODE_YM2610)
+ {
+ v |= 0x20; /* YM2610 always uses external memory and doesn't even have memory flag bit. */
+ }
+
+ DELTAT->portstate = v & (0x80|0x40|0x20|0x10|0x01); /* start, rec, memory mode, repeat flag copy, reset(bit0) */
+
+ if( DELTAT->portstate&0x80 )/* START,REC,MEMDATA,REPEAT,SPOFF,--,--,RESET */
+ {
+ /* set PCM BUSY bit */
+ DELTAT->PCM_BSY = 1;
+
+ /* start ADPCM */
+ DELTAT->now_step = 0;
+ DELTAT->acc = 0;
+ DELTAT->prev_acc = 0;
+ DELTAT->adpcml = 0;
+ DELTAT->adpcmd = YM_DELTAT_DELTA_DEF;
+ DELTAT->now_data = 0;
+
+ }
+
+ if( DELTAT->portstate&0x20 ) /* do we access external memory? */
+ {
+ DELTAT->now_addr = DELTAT->start << 1;
+ DELTAT->memread = 2; /* two dummy reads needed before accesing external memory via register $08*/
+
+ /* if yes, then let's check if ADPCM memory is mapped and big enough */
+ if(DELTAT->memory == 0)
+ {
+ logerror("YM Delta-T ADPCM rom not mapped\n");
+ DELTAT->portstate = 0x00;
+ DELTAT->PCM_BSY = 0;
+ }
+ else
+ {
+ if( DELTAT->end >= DELTAT->memory_size ) /* Check End in Range */
+ {
+ logerror("YM Delta-T ADPCM end out of range: $%08x\n", DELTAT->end);
+ DELTAT->end = DELTAT->memory_size - 1;
+ }
+ if( DELTAT->start >= DELTAT->memory_size ) /* Check Start in Range */
+ {
+ logerror("YM Delta-T ADPCM start out of range: $%08x\n", DELTAT->start);
+ DELTAT->portstate = 0x00;
+ DELTAT->PCM_BSY = 0;
+ }
+ }
+ }
+ else /* we access CPU memory (ADPCM data register $08) so we only reset now_addr here */
+ {
+ DELTAT->now_addr = 0;
+ }
+
+ if( DELTAT->portstate&0x01 )
+ {
+ DELTAT->portstate = 0x00;
+
+ /* clear PCM BUSY bit (in status register) */
+ DELTAT->PCM_BSY = 0;
+
+ /* set BRDY flag */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+ }
+ break;
+ case 0x01: /* L,R,-,-,SAMPLE,DA/AD,RAMTYPE,ROM */
+ /* handle emulation mode */
+ if(DELTAT->emulation_mode == YM_DELTAT_EMULATION_MODE_YM2610)
+ {
+ v |= 0x01; /* YM2610 always uses ROM as an external memory and doesn't tave ROM/RAM memory flag bit. */
+ }
+
+ DELTAT->pan = &DELTAT->output_pointer[(v>>6)&0x03];
+ if ((DELTAT->control2 & 3) != (v & 3))
+ {
+ /*0-DRAM x1, 1-ROM, 2-DRAM x8, 3-ROM (3 is bad setting - not allowed by the manual) */
+ if (DELTAT->DRAMportshift != dram_rightshift[v&3])
+ {
+ DELTAT->DRAMportshift = dram_rightshift[v&3];
+
+ /* final shift value depends on chip type and memory type selected:
+ 8 for YM2610 (ROM only),
+ 5 for ROM for Y8950 and YM2608,
+ 5 for x8bit DRAMs for Y8950 and YM2608,
+ 2 for x1bit DRAMs for Y8950 and YM2608.
+ */
+
+ /* refresh addresses */
+ DELTAT->start = (DELTAT->reg[0x3]*0x0100 | DELTAT->reg[0x2]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ DELTAT->end = (DELTAT->reg[0x5]*0x0100 | DELTAT->reg[0x4]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ DELTAT->end += (1 << (DELTAT->portshift-DELTAT->DRAMportshift) ) - 1;
+ DELTAT->limit = (DELTAT->reg[0xd]*0x0100 | DELTAT->reg[0xc]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ }
+ }
+ DELTAT->control2 = v;
+ break;
+ case 0x02: /* Start Address L */
+ case 0x03: /* Start Address H */
+ DELTAT->start = (DELTAT->reg[0x3]*0x0100 | DELTAT->reg[0x2]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ /*logerror("DELTAT start: 02=%2x 03=%2x addr=%8x\n",DELTAT->reg[0x2], DELTAT->reg[0x3],DELTAT->start );*/
+ break;
+ case 0x04: /* Stop Address L */
+ case 0x05: /* Stop Address H */
+ DELTAT->end = (DELTAT->reg[0x5]*0x0100 | DELTAT->reg[0x4]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ DELTAT->end += (1 << (DELTAT->portshift-DELTAT->DRAMportshift) ) - 1;
+ /*logerror("DELTAT end : 04=%2x 05=%2x addr=%8x\n",DELTAT->reg[0x4], DELTAT->reg[0x5],DELTAT->end );*/
+ break;
+ case 0x06: /* Prescale L (ADPCM and Record frq) */
+ case 0x07: /* Prescale H */
+ break;
+ case 0x08: /* ADPCM data */
+
+/*
+some examples:
+value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
+ C8 1 1 0 0 1 0 0 0 Analysis (recording) from AUDIO to CPU (to reg $08), sample rate in PRESCALER register
+ E8 1 1 1 0 1 0 0 0 Analysis (recording) from AUDIO to EXT.MEMORY, sample rate in PRESCALER register
+ 80 1 0 0 0 0 0 0 0 Synthesis (playing) from CPU (from reg $08) to AUDIO,sample rate in DELTA-N register
+ a0 1 0 1 0 0 0 0 0 Synthesis (playing) from EXT.MEMORY to AUDIO, sample rate in DELTA-N register
+
+ 60 0 1 1 0 0 0 0 0 External memory write via ADPCM data register $08
+ 20 0 0 1 0 0 0 0 0 External memory read via ADPCM data register $08
+
+*/
+
+ /* external memory write */
+ if ( (DELTAT->portstate & 0xe0)==0x60 )
+ {
+ if (DELTAT->memread)
+ {
+ DELTAT->now_addr = DELTAT->start << 1;
+ DELTAT->memread = 0;
+ }
+
+ /*logerror("YM Delta-T memory write $%08x, v=$%02x\n", DELTAT->now_addr >> 1, v);*/
+
+ if ( DELTAT->now_addr != (DELTAT->end<<1) )
+ {
+ DELTAT->memory[DELTAT->now_addr>>1] = v;
+ DELTAT->now_addr+=2; /* two nibbles at a time */
+
+ /* reset BRDY bit in status register, which means we are processing the write */
+ if(DELTAT->status_reset_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_reset_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+
+ /* setup a timer that will callback us in 10 master clock cycles for Y8950
+ * in the callback set the BRDY flag to 1 , which means we have written the data.
+ * For now, we don't really do this; we simply reset and set the flag in zero time, so that the IRQ will work.
+ */
+ /* set BRDY bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+
+ }
+ else
+ {
+ /* set EOS bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_EOS_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_EOS_bit);
+ }
+
+ return;
+ }
+
+ /* ADPCM synthesis from CPU */
+ if ( (DELTAT->portstate & 0xe0)==0x80 )
+ {
+ DELTAT->CPU_data = v;
+
+ /* Reset BRDY bit in status register, which means we are full of data */
+ if(DELTAT->status_reset_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_reset_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+ return;
+ }
+
+ break;
+ case 0x09: /* DELTA-N L (ADPCM Playback Prescaler) */
+ case 0x0a: /* DELTA-N H */
+ DELTAT->delta = (DELTAT->reg[0xa]*0x0100 | DELTAT->reg[0x9]);
+ DELTAT->step = (UINT32)( (double)(DELTAT->delta /* *(1<<(YM_DELTAT_SHIFT-16)) */ ) * (DELTAT->freqbase) );
+ /*logerror("DELTAT deltan:09=%2x 0a=%2x\n",DELTAT->reg[0x9], DELTAT->reg[0xa]);*/
+ break;
+ case 0x0b: /* Output level control (volume, linear) */
+ {
+ INT32 oldvol = DELTAT->volume;
+ DELTAT->volume = (v&0xff) * (DELTAT->output_range/256) / YM_DELTAT_DECODE_RANGE;
+/* v * ((1<<16)>>8) >> 15;
+* thus: v * (1<<8) >> 15;
+* thus: output_range must be (1 << (15+8)) at least
+* v * ((1<<23)>>8) >> 15;
+* v * (1<<15) >> 15;
+*/
+ /*logerror("DELTAT vol = %2x\n",v&0xff);*/
+ if( oldvol != 0 )
+ {
+ DELTAT->adpcml = (int)((double)DELTAT->adpcml / (double)oldvol * (double)DELTAT->volume);
+ }
+ }
+ break;
+ case 0x0c: /* Limit Address L */
+ case 0x0d: /* Limit Address H */
+ DELTAT->limit = (DELTAT->reg[0xd]*0x0100 | DELTAT->reg[0xc]) << (DELTAT->portshift - DELTAT->DRAMportshift);
+ /*logerror("DELTAT limit: 0c=%2x 0d=%2x addr=%8x\n",DELTAT->reg[0xc], DELTAT->reg[0xd],DELTAT->limit );*/
+ break;
+ }
+}
+
+void YM_DELTAT_ADPCM_Reset(YM_DELTAT *DELTAT,int pan,int emulation_mode)
+{
+ DELTAT->now_addr = 0;
+ DELTAT->now_step = 0;
+ DELTAT->step = 0;
+ DELTAT->start = 0;
+ DELTAT->end = 0;
+ DELTAT->limit = ~0; /* this way YM2610 and Y8950 (both of which don't have limit address reg) will still work */
+ DELTAT->volume = 0;
+ DELTAT->pan = &DELTAT->output_pointer[pan];
+ DELTAT->acc = 0;
+ DELTAT->prev_acc = 0;
+ DELTAT->adpcmd = 127;
+ DELTAT->adpcml = 0;
+ DELTAT->emulation_mode = (UINT8)emulation_mode;
+ DELTAT->portstate = (emulation_mode == YM_DELTAT_EMULATION_MODE_YM2610) ? 0x20 : 0;
+ DELTAT->control2 = (emulation_mode == YM_DELTAT_EMULATION_MODE_YM2610) ? 0x01 : 0; /* default setting depends on the emulation mode. MSX demo called "facdemo_4" doesn't setup control2 register at all and still works */
+ DELTAT->DRAMportshift = dram_rightshift[DELTAT->control2 & 3];
+
+ /* The flag mask register disables the BRDY after the reset, however
+ ** as soon as the mask is enabled the flag needs to be set. */
+
+ /* set BRDY bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+}
+
+#if 0
+void YM_DELTAT_postload(YM_DELTAT *DELTAT,UINT8 *regs)
+{
+ int r;
+
+ /* to keep adpcml */
+ DELTAT->volume = 0;
+ /* update */
+ for(r=1;r<16;r++)
+ YM_DELTAT_ADPCM_Write(DELTAT,r,regs[r]);
+ DELTAT->reg[0] = regs[0];
+
+ /* current rom data */
+ if (DELTAT->memory)
+ DELTAT->now_data = *(DELTAT->memory + (DELTAT->now_addr>>1) );
+
+}
+void YM_DELTAT_savestate(const device_config *device,YM_DELTAT *DELTAT)
+{
+#ifdef __STATE_H__
+ state_save_register_device_item(device, 0, DELTAT->portstate);
+ state_save_register_device_item(device, 0, DELTAT->now_addr);
+ state_save_register_device_item(device, 0, DELTAT->now_step);
+ state_save_register_device_item(device, 0, DELTAT->acc);
+ state_save_register_device_item(device, 0, DELTAT->prev_acc);
+ state_save_register_device_item(device, 0, DELTAT->adpcmd);
+ state_save_register_device_item(device, 0, DELTAT->adpcml);
+#endif
+}
+#endif
+
+
+#define YM_DELTAT_Limit(val,max,min) \
+{ \
+ if ( val > max ) val = max; \
+ else if ( val < min ) val = min; \
+}
+
+INLINE void YM_DELTAT_synthesis_from_external_memory(YM_DELTAT *DELTAT)
+{
+ UINT32 step;
+ int data;
+
+ DELTAT->now_step += DELTAT->step;
+ if ( DELTAT->now_step >= (1<<YM_DELTAT_SHIFT) )
+ {
+ step = DELTAT->now_step >> YM_DELTAT_SHIFT;
+ DELTAT->now_step &= (1<<YM_DELTAT_SHIFT)-1;
+ do{
+
+ if ( DELTAT->now_addr == (DELTAT->limit<<1) )
+ DELTAT->now_addr = 0;
+
+ if ( DELTAT->now_addr == (DELTAT->end<<1) ) { /* 12-06-2001 JB: corrected comparison. Was > instead of == */
+ if( DELTAT->portstate&0x10 ){
+ /* repeat start */
+ DELTAT->now_addr = DELTAT->start<<1;
+ DELTAT->acc = 0;
+ DELTAT->adpcmd = YM_DELTAT_DELTA_DEF;
+ DELTAT->prev_acc = 0;
+ }else{
+ /* set EOS bit in status register */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_EOS_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_EOS_bit);
+
+ /* clear PCM BUSY bit (reflected in status register) */
+ DELTAT->PCM_BSY = 0;
+
+ DELTAT->portstate = 0;
+ DELTAT->adpcml = 0;
+ DELTAT->prev_acc = 0;
+ return;
+ }
+ }
+
+ if( DELTAT->now_addr&1 ) data = DELTAT->now_data & 0x0f;
+ else
+ {
+ DELTAT->now_data = *(DELTAT->memory + (DELTAT->now_addr>>1));
+ data = DELTAT->now_data >> 4;
+ }
+
+ DELTAT->now_addr++;
+ /* 12-06-2001 JB: */
+ /* YM2610 address register is 24 bits wide.*/
+ /* The "+1" is there because we use 1 bit more for nibble calculations.*/
+ /* WARNING: */
+ /* Side effect: we should take the size of the mapped ROM into account */
+ DELTAT->now_addr &= ( (1<<(24+1))-1);
+
+ /* store accumulator value */
+ DELTAT->prev_acc = DELTAT->acc;
+
+ /* Forecast to next Forecast */
+ DELTAT->acc += (ym_deltat_decode_tableB1[data] * DELTAT->adpcmd / 8);
+ YM_DELTAT_Limit(DELTAT->acc,YM_DELTAT_DECODE_MAX, YM_DELTAT_DECODE_MIN);
+
+ /* delta to next delta */
+ DELTAT->adpcmd = (DELTAT->adpcmd * ym_deltat_decode_tableB2[data] ) / 64;
+ YM_DELTAT_Limit(DELTAT->adpcmd,YM_DELTAT_DELTA_MAX, YM_DELTAT_DELTA_MIN );
+
+ /* ElSemi: Fix interpolator. */
+ /*DELTAT->prev_acc = prev_acc + ((DELTAT->acc - prev_acc) / 2 );*/
+
+ }while(--step);
+
+ }
+
+ /* ElSemi: Fix interpolator. */
+ DELTAT->adpcml = DELTAT->prev_acc * (int)((1<<YM_DELTAT_SHIFT)-DELTAT->now_step);
+ DELTAT->adpcml += (DELTAT->acc * (int)DELTAT->now_step);
+ DELTAT->adpcml = (DELTAT->adpcml>>YM_DELTAT_SHIFT) * (int)DELTAT->volume;
+
+ /* output for work of output channels (outd[OPNxxxx])*/
+ *(DELTAT->pan) += DELTAT->adpcml;
+}
+
+
+
+INLINE void YM_DELTAT_synthesis_from_CPU_memory(YM_DELTAT *DELTAT)
+{
+ UINT32 step;
+ int data;
+
+ DELTAT->now_step += DELTAT->step;
+ if ( DELTAT->now_step >= (1<<YM_DELTAT_SHIFT) )
+ {
+ step = DELTAT->now_step >> YM_DELTAT_SHIFT;
+ DELTAT->now_step &= (1<<YM_DELTAT_SHIFT)-1;
+ do{
+
+ if( DELTAT->now_addr&1 )
+ {
+ data = DELTAT->now_data & 0x0f;
+
+ DELTAT->now_data = DELTAT->CPU_data;
+
+ /* after we used CPU_data, we set BRDY bit in status register,
+ * which means we are ready to accept another byte of data */
+ if(DELTAT->status_set_handler)
+ if(DELTAT->status_change_BRDY_bit)
+ (DELTAT->status_set_handler)(DELTAT->status_change_which_chip, DELTAT->status_change_BRDY_bit);
+ }
+ else
+ {
+ data = DELTAT->now_data >> 4;
+ }
+
+ DELTAT->now_addr++;
+
+ /* store accumulator value */
+ DELTAT->prev_acc = DELTAT->acc;
+
+ /* Forecast to next Forecast */
+ DELTAT->acc += (ym_deltat_decode_tableB1[data] * DELTAT->adpcmd / 8);
+ YM_DELTAT_Limit(DELTAT->acc,YM_DELTAT_DECODE_MAX, YM_DELTAT_DECODE_MIN);
+
+ /* delta to next delta */
+ DELTAT->adpcmd = (DELTAT->adpcmd * ym_deltat_decode_tableB2[data] ) / 64;
+ YM_DELTAT_Limit(DELTAT->adpcmd,YM_DELTAT_DELTA_MAX, YM_DELTAT_DELTA_MIN );
+
+
+ }while(--step);
+
+ }
+
+ /* ElSemi: Fix interpolator. */
+ DELTAT->adpcml = DELTAT->prev_acc * (int)((1<<YM_DELTAT_SHIFT)-DELTAT->now_step);
+ DELTAT->adpcml += (DELTAT->acc * (int)DELTAT->now_step);
+ DELTAT->adpcml = (DELTAT->adpcml>>YM_DELTAT_SHIFT) * (int)DELTAT->volume;
+
+ /* output for work of output channels (outd[OPNxxxx])*/
+ *(DELTAT->pan) += DELTAT->adpcml;
+}
+
+
+
+/* ADPCM B (Delta-T control type) */
+void YM_DELTAT_ADPCM_CALC(YM_DELTAT *DELTAT)
+{
+
+/*
+some examples:
+value: START, REC, MEMDAT, REPEAT, SPOFF, x,x,RESET meaning:
+ 80 1 0 0 0 0 0 0 0 Synthesis (playing) from CPU (from reg $08) to AUDIO,sample rate in DELTA-N register
+ a0 1 0 1 0 0 0 0 0 Synthesis (playing) from EXT.MEMORY to AUDIO, sample rate in DELTA-N register
+ C8 1 1 0 0 1 0 0 0 Analysis (recording) from AUDIO to CPU (to reg $08), sample rate in PRESCALER register
+ E8 1 1 1 0 1 0 0 0 Analysis (recording) from AUDIO to EXT.MEMORY, sample rate in PRESCALER register
+
+ 60 0 1 1 0 0 0 0 0 External memory write via ADPCM data register $08
+ 20 0 0 1 0 0 0 0 0 External memory read via ADPCM data register $08
+
+*/
+
+ if ( (DELTAT->portstate & 0xe0)==0xa0 )
+ {
+ YM_DELTAT_synthesis_from_external_memory(DELTAT);
+ return;
+ }
+
+ if ( (DELTAT->portstate & 0xe0)==0x80 )
+ {
+ /* ADPCM synthesis from CPU-managed memory (from reg $08) */
+ YM_DELTAT_synthesis_from_CPU_memory(DELTAT); /* change output based on data in ADPCM data reg ($08) */
+ return;
+ }
+
+//todo: ADPCM analysis
+// if ( (DELTAT->portstate & 0xe0)==0xc0 )
+// if ( (DELTAT->portstate & 0xe0)==0xe0 )
+
+ return;
+}
+
diff --git a/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.h b/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.h
new file mode 100644
index 00000000..33f13344
--- /dev/null
+++ b/plugins/gme/game-music-emu-0.6pre/gme/ymdeltat.h
@@ -0,0 +1,98 @@
+#pragma once
+
+#ifndef __YMDELTAT_H__
+#define __YMDELTAT_H__
+
+/* compiler dependence */
+#ifndef __OSDCOMM_H__
+#define __OSDCOMM_H__
+typedef unsigned char UINT8; /* unsigned 8bit */
+typedef unsigned short UINT16; /* unsigned 16bit */
+typedef unsigned int UINT32; /* unsigned 32bit */
+typedef signed char INT8; /* signed 8bit */
+typedef signed short INT16; /* signed 16bit */
+typedef signed int INT32; /* signed 32bit */
+
+typedef INT32 stream_sample_t;
+
+#endif /* __OSDCOMM_H__ */
+
+#define YM_DELTAT_SHIFT (16)
+
+#define YM_DELTAT_EMULATION_MODE_NORMAL 0
+#define YM_DELTAT_EMULATION_MODE_YM2610 1
+
+
+typedef void (*STATUS_CHANGE_HANDLER)(void *chip, UINT8 status_bits);
+
+
+/* DELTA-T (adpcm type B) struct */
+typedef struct deltat_adpcm_state { /* AT: rearranged and tigntened structure */
+ UINT8 *memory;
+ INT32 *output_pointer;/* pointer of output pointers */
+ INT32 *pan; /* pan : &output_pointer[pan] */
+ double freqbase;
+#if 0
+ double write_time; /* Y8950: 10 cycles of main clock; YM2608: 20 cycles of main clock */
+ double read_time; /* Y8950: 8 cycles of main clock; YM2608: 18 cycles of main clock */
+#endif
+ UINT32 memory_size;
+ int output_range;
+ UINT32 now_addr; /* current address */
+ UINT32 now_step; /* currect step */
+ UINT32 step; /* step */
+ UINT32 start; /* start address */
+ UINT32 limit; /* limit address */
+ UINT32 end; /* end address */
+ UINT32 delta; /* delta scale */
+ INT32 volume; /* current volume */
+ INT32 acc; /* shift Measurement value*/
+ INT32 adpcmd; /* next Forecast */
+ INT32 adpcml; /* current value */
+ INT32 prev_acc; /* leveling value */
+ UINT8 now_data; /* current rom data */
+ UINT8 CPU_data; /* current data from reg 08 */
+ UINT8 portstate; /* port status */
+ UINT8 control2; /* control reg: SAMPLE, DA/AD, RAM TYPE (x8bit / x1bit), ROM/RAM */
+ UINT8 portshift; /* address bits shift-left:
+ ** 8 for YM2610,
+ ** 5 for Y8950 and YM2608 */
+
+ UINT8 DRAMportshift; /* address bits shift-right:
+ ** 0 for ROM and x8bit DRAMs,
+ ** 3 for x1 DRAMs */
+
+ UINT8 memread; /* needed for reading/writing external memory */
+
+ /* handlers and parameters for the status flags support */
+ STATUS_CHANGE_HANDLER status_set_handler;
+ STATUS_CHANGE_HANDLER status_reset_handler;
+
+ /* note that different chips have these flags on different
+ ** bits of the status register
+ */
+ void * status_change_which_chip; /* this chip id */
+ UINT8 status_change_EOS_bit; /* 1 on End Of Sample (record/playback/cycle time of AD/DA converting has passed)*/
+ UINT8 status_change_BRDY_bit; /* 1 after recording 2 datas (2x4bits) or after reading/writing 1 data */
+ UINT8 status_change_ZERO_bit; /* 1 if silence lasts for more than 290 miliseconds on ADPCM recording */
+
+ /* neither Y8950 nor YM2608 can generate IRQ when PCMBSY bit changes, so instead of above,
+ ** the statusflag gets ORed with PCM_BSY (below) (on each read of statusflag of Y8950 and YM2608)
+ */
+ UINT8 PCM_BSY; /* 1 when ADPCM is playing; Y8950/YM2608 only */
+
+ UINT8 reg[16]; /* adpcm registers */
+ UINT8 emulation_mode; /* which chip we're emulating */
+}YM_DELTAT;
+
+/*void YM_DELTAT_BRDY_callback(YM_DELTAT *DELTAT);*/
+
+UINT8 YM_DELTAT_ADPCM_Read(YM_DELTAT *DELTAT);
+void YM_DELTAT_ADPCM_Write(YM_DELTAT *DELTAT,int r,int v);
+void YM_DELTAT_ADPCM_Reset(YM_DELTAT *DELTAT,int pan,int emulation_mode);
+void YM_DELTAT_ADPCM_CALC(YM_DELTAT *DELTAT);
+
+/*void YM_DELTAT_postload(YM_DELTAT *DELTAT,UINT8 *regs);
+void YM_DELTAT_savestate(const device_config *device,YM_DELTAT *DELTAT);*/
+
+#endif /* __YMDELTAT_H__ */
diff --git a/plugins/gme/Game_Music_Emu-0.5.2/license.txt b/plugins/gme/game-music-emu-0.6pre/license.txt
index 5faba9d4..5faba9d4 100644
--- a/plugins/gme/Game_Music_Emu-0.5.2/license.txt
+++ b/plugins/gme/game-music-emu-0.6pre/license.txt
diff --git a/plugins/gme/game-music-emu-0.5.5/readme.txt b/plugins/gme/game-music-emu-0.6pre/readme.txt
index 36213f6b..add10941 100644
--- a/plugins/gme/game-music-emu-0.5.5/readme.txt
+++ b/plugins/gme/game-music-emu-0.6pre/readme.txt
@@ -14,7 +14,7 @@ SPC Super Nintendo/Super Famicom
VGM/VGZ Sega Master System/Mark III, Sega Genesis/Mega Drive,BBC Micro
Features:
-* Can be used in C and C++ code
+* C interface for use in C, C++, and other compatible languages
* High emphasis has been placed on making the library very easy to use
* One set of common functions work with all emulators the same way
* Several code examples, including music player using SDL
@@ -42,14 +42,14 @@ License: GNU Lesser General Public License (LGPL)
Getting Started
---------------
Build a program consisting of demo/basics.c, demo/Wave_Writer.cpp, and
-all source files in gme/.
+all source files in gme/. If you have CMake 2.6 or later, execute
-If you have CMake 2.6 or higher you can use CMake to perform the build for
-you using standard CMake technique (i.e. cd to the source directory, run
-cmake, cd demo, run make)
+ run cmake
+ cd demo
+ run make
-Be sure "test.nsf" is in the same directory.
-Running the program should generate the recording "out.wav".
+Be sure "test.nsf" is in the same directory as the program. Running it
+should generate the recording "out.wav".
A slightly more extensive demo application is available in the player/
directory. It requires SDL to build.
@@ -71,7 +71,6 @@ test.m3u Test m3u playlist for features.c demo
demo/
basics.c Records NSF file to wave sound file
- cpp_basics.cpp C++ version of basics.c
features.c Demonstrates many additional features
Wave_Writer.h WAVE sound file writer used for demo output
Wave_Writer.cpp
@@ -88,19 +87,9 @@ player/ Player using the SDL multimedia library
gme/
blargg_config.h Library configuration (modify this file as needed)
- gme.h C interface (also usable in C++, and simpler too)
+ gme.h Library interface header file
gme.cpp
- Gme_File.h File loading and track information
- Music_Emu.h Track playback and adjustments
- Data_Reader.h Custom data readers
-
- Effects_Buffer.h Sound buffer with stereo echo and panning
- Effects_Buffer.cpp
-
- M3u_Playlist.h M3U playlist support
- M3u_Playlist.cpp
-
Ay_Emu.h ZX Spectrum AY emulator
Ay_Emu.cpp
Ay_Apu.cpp
@@ -193,25 +182,34 @@ gme/
Fir_Resampler.cpp
Fir_Resampler.h
+ M3u_Playlist.h M3U playlist support
+ M3u_Playlist.cpp
+
+ Effects_Buffer.h Sound buffer with stereo echo and panning
+ Effects_Buffer.cpp
+
blargg_common.h Common files needed by all emulators
blargg_endian.h
blargg_source.h
Blip_Buffer.cpp
Blip_Buffer.h
+ Gme_File.h
Gme_File.cpp
+ Music_Emu.h
Music_Emu.cpp
Classic_Emu.h
Classic_Emu.cpp
Multi_Buffer.h
Multi_Buffer.cpp
+ Data_Reader.h
Data_Reader.cpp
+
CMakeLists.txt CMake build rules
Legal
-----
-Game_Music_Emu library copyright (C) 2003-2006 Shay Green.
-SNES SPC DSP emulator based on OpenSPC, copyright (C) 2002 Brad Martin.
+Game_Music_Emu library copyright (C) 2003-2009 Shay Green.
Sega Genesis YM2612 emulator copyright (C) 2002 Stephane Dallongeville.
--
diff --git a/plugins/gtkui/Makefile.am b/plugins/gtkui/Makefile.am
index 69c36580..9cb86c04 100644
--- a/plugins/gtkui/Makefile.am
+++ b/plugins/gtkui/Makefile.am
@@ -1,6 +1,19 @@
if HAVE_GTKUI
gtkuidir = $(libdir)/$(PACKAGE)
+if HAVE_SM
+if HAVE_ICE
+SM_SOURCES = smclient/eggdesktopfile.h\
+ smclient/eggsmclient-private.h\
+ smclient/eggsmclient.h\
+ smclient/eggdesktopfile.c\
+ smclient/eggsmclient-xsmp.c\
+ smclient/eggsmclient.c
+SM_LIBADD = $(SM_LIBS) $(ICE_LIBS)
+SM_CFLAGS = -DEGG_SM_CLIENT_BACKEND_XSMP -DG_LOG_DOMAIN=\""deadbeef"\"
+endif
+endif
+
GTKUI_SOURCES = gtkui.c gtkui.h\
callbacks.c interface.c support.c callbacks.h interface.h support.h\
ddblistview.c ddblistview.h\
@@ -26,7 +39,8 @@ GTKUI_SOURCES = gtkui.c gtkui.h\
widgets.c widgets.h\
ddbseekbar.h ddbequalizer.h ddbcellrenderertextmultiline.h\
ddbseekbar.c ddbequalizer.c ddbcellrenderertextmultiline.c\
- gtkuigl.c gtkuigl.h
+ gtkuigl.c gtkuigl.h\
+ $(SM_SOURCES)
sdkdir = $(pkgincludedir)
sdk_HEADERS = gtkui_api.h
@@ -51,16 +65,27 @@ endif
# normal lib
if HAVE_GTK2
+
ddb_gui_GTK2_la_SOURCES = $(GTKUI_SOURCES)
ddb_gui_GTK2_la_LDFLAGS = -module
-ddb_gui_GTK2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS) -lGLU
-ddb_gui_GTK2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS)
+
+if STATICLINK
+GTK_ROOT_216=@top_srcdir@/$(LIB)/gtk-2.16.0
+
+ddb_gui_GTK2_la_LIBADD = $(LDADD) -L$(GTK_ROOT_216)/lib -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lpangocairo-1.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 $(SM_LIBADD)
+
+ddb_gui_GTK2_la_CFLAGS = -std=c99 -I$(GTK_ROOT_216)/include/gtk-2.0 -I$(GTK_ROOT_216)/lib/gtk-2.0/include -I$(GTK_ROOT_216)/include/atk-1.0 -I$(GTK_ROOT_216)/include/cairo -I$(GTK_ROOT_216)/include/pango-1.0 -I$(GTK_ROOT_216)/include -I$(GTK_ROOT_216)/include/glib-2.0 -I$(GTK_ROOT_216)/lib/glib-2.0/include $(SM_CFLAGS)
+else
+ddb_gui_GTK2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS) $(SM_LIBADD) -lGLU
+ddb_gui_GTK2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS) $(SM_CFLAGS)
+endif
+
endif
if HAVE_GTK3
ddb_gui_GTK3_la_SOURCES = $(GTKUI_SOURCES)
ddb_gui_GTK3_la_LDFLAGS = -module
-ddb_gui_GTK3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS)
-ddb_gui_GTK3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS)
+ddb_gui_GTK3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS) $(SM_LIBADD)
+ddb_gui_GTK3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS) $(SM_CFLAGS)
endif
# fallback lib
@@ -70,9 +95,9 @@ GTK_ROOT=@top_srcdir@/$(LIB)/gtk-2.12.12/usr
ddb_gui_GTK2_fallback_la_SOURCES = $(GTKUI_SOURCES)
ddb_gui_GTK2_fallback_la_LDFLAGS = -module
-ddb_gui_GTK2_fallback_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la
+ddb_gui_GTK2_fallback_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la $(SM_LIBADD)
-ddb_gui_GTK2_fallback_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 -DULTRA_COMPATIBLE=1
+ddb_gui_GTK2_fallback_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 $(SM_CFLAGS)
endif
diff --git a/plugins/gtkui/actions.c b/plugins/gtkui/actions.c
index 3b7bc5c8..751bdf23 100644
--- a/plugins/gtkui/actions.c
+++ b/plugins/gtkui/actions.c
@@ -28,6 +28,10 @@
#define trace(...) { fprintf(stderr, __VA_ARGS__); }
//#define trace(fmt,...)
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+ g_object_set_data_full (G_OBJECT (component), name, \
+ g_object_ref(G_OBJECT(widget)), (GDestroyNotify) g_object_unref)
+
static void
on_actionitem_activate (GtkMenuItem *menuitem,
DB_plugin_action_t *action)
@@ -36,8 +40,35 @@ on_actionitem_activate (GtkMenuItem *menuitem,
}
void
-add_mainmenu_actions (GtkWidget *mainwin)
+remove_actions (GtkWidget *widget, void *data) {
+ const char *name = g_object_get_data (G_OBJECT (widget), "plugaction");
+ if (name) {
+ gtk_container_remove (GTK_CONTAINER (data), widget);
+ }
+ if (GTK_IS_MENU_ITEM (widget)) {
+ GtkWidget *menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (widget));
+ if (menu) {
+ gtk_container_foreach (GTK_CONTAINER (menu), remove_actions, menu);
+ // if menu is empty -- remove parent menu item
+ GList *lst = gtk_container_get_children (GTK_CONTAINER (menu));
+ if (lst) {
+ g_list_free (lst);
+ }
+ else {
+ gtk_container_remove (data, widget);
+ }
+ }
+ }
+}
+
+void
+add_mainmenu_actions (void)
{
+ GtkWidget *menubar = lookup_widget (mainwin, "menubar1");
+ // remove all plugaction_*** menu items and empty submenus
+ gtk_container_foreach (GTK_CONTAINER (menubar), remove_actions, menubar);
+
+ // add new
DB_plugin_t **plugins = deadbeef->plug_get_list();
int i;
@@ -72,7 +103,7 @@ add_mainmenu_actions (GtkWidget *mainwin)
char *prev_title = NULL;
- GtkWidget *current = mainwin;
+ GtkWidget *current = menubar;
GtkWidget *previous;
while (1)
@@ -95,12 +126,14 @@ add_mainmenu_actions (GtkWidget *mainwin)
gtk_menu_shell_insert (GTK_MENU_SHELL (current), actionitem, 5);
else if (0 == strcmp ("Edit", prev_title))
gtk_menu_shell_insert (GTK_MENU_SHELL (current), actionitem, 7);
- else
+ else {
gtk_container_add (GTK_CONTAINER (current), actionitem);
+ }
g_signal_connect ((gpointer) actionitem, "activate",
G_CALLBACK (on_actionitem_activate),
action);
+ g_object_set_data_full (G_OBJECT (actionitem), "plugaction", strdup (action->name), free);
break;
}
*slash = 0;
@@ -109,7 +142,7 @@ add_mainmenu_actions (GtkWidget *mainwin)
snprintf (menuname, sizeof (menuname), "%s_menu", ptr);
previous = current;
- current = lookup_widget (current, menuname);
+ current = lookup_widget (mainwin, menuname);
if (!current)
{
GtkWidget *newitem;
@@ -125,6 +158,7 @@ add_mainmenu_actions (GtkWidget *mainwin)
current = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (newitem), current);
+ GLADE_HOOKUP_OBJECT (mainwin, current, menuname);
}
prev_title = ptr;
ptr = slash + 1;
diff --git a/plugins/gtkui/actions.h b/plugins/gtkui/actions.h
index 56dc3425..cbcce711 100644
--- a/plugins/gtkui/actions.h
+++ b/plugins/gtkui/actions.h
@@ -21,6 +21,6 @@
#ifndef __ACTIONS_H
#define __ACTIONS_H
-void add_mainmenu_actions (GtkWidget *mainwin);
+void add_mainmenu_actions (void);
#endif
diff --git a/plugins/gtkui/callbacks.c b/plugins/gtkui/callbacks.c
index b70b6a17..2ac935e8 100644
--- a/plugins/gtkui/callbacks.c
+++ b/plugins/gtkui/callbacks.c
@@ -798,6 +798,16 @@ on_helpwindow_key_press_event (GtkWidget *widget,
return FALSE;
}
+// defined in plcommon.c
+extern int editcolumn_title_changed;
+
+void
+on_editcolumn_title_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ editcolumn_title_changed = 1;
+}
+
void
on_column_id_changed (GtkComboBox *combobox,
gpointer user_data)
@@ -813,7 +823,15 @@ on_column_id_changed (GtkComboBox *combobox,
trace ("failed to get column format widget\n");
return;
}
- gtk_widget_set_sensitive (fmt, act >= DB_COLUMN_ID_MAX ? TRUE : FALSE);
+ gtk_widget_set_sensitive (fmt, act >= 10 ? TRUE : FALSE);
+
+ if (!editcolumn_title_changed) {
+ GtkWidget *title= lookup_widget (toplevel, "title");
+ if (title) {
+ gtk_entry_set_text (GTK_ENTRY (title), gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combobox)));
+ editcolumn_title_changed = 0;
+ }
+ }
}
diff --git a/plugins/gtkui/callbacks.h b/plugins/gtkui/callbacks.h
index 1e4e66e3..c0442b2e 100644
--- a/plugins/gtkui/callbacks.h
+++ b/plugins/gtkui/callbacks.h
@@ -1167,3 +1167,19 @@ on_design_mode1_activate (GtkMenuItem *menuitem,
void
on_reset_autostop_toggled (GtkToggleButton *togglebutton,
gpointer user_data);
+
+void
+on_editcolumn_title_changed (GtkEditable *editable,
+ gpointer user_data);
+
+void
+on_useragent_changed (GtkEditable *editable,
+ gpointer user_data);
+
+void
+on_enable_cp1251_recoding_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_enable_cp936_recoding_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
diff --git a/plugins/gtkui/ddbcellrenderertextmultiline.c b/plugins/gtkui/ddbcellrenderertextmultiline.c
index 5bd97a9a..81f77fce 100644
--- a/plugins/gtkui/ddbcellrenderertextmultiline.c
+++ b/plugins/gtkui/ddbcellrenderertextmultiline.c
@@ -24,58 +24,22 @@
#include <string.h>
#include <gdk/gdk.h>
#include "support.h"
+#include "ddbcellrenderertextmultiline.h"
-#define DDB_TYPE_CELL_EDITABLE_TEXT_VIEW (ddb_cell_editable_text_view_get_type ())
-#define DDB_CELL_EDITABLE_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW, DdbCellEditableTextView))
-#define DDB_CELL_EDITABLE_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW, DdbCellEditableTextViewClass))
-#define DDB_IS_CELL_EDITABLE_TEXT_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW))
-#define DDB_IS_CELL_EDITABLE_TEXT_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW))
-#define DDB_CELL_EDITABLE_TEXT_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW, DdbCellEditableTextViewClass))
-
-typedef struct _DdbCellEditableTextView DdbCellEditableTextView;
-typedef struct _DdbCellEditableTextViewClass DdbCellEditableTextViewClass;
-typedef struct _DdbCellEditableTextViewPrivate DdbCellEditableTextViewPrivate;
#define _g_free0(var) (var = (g_free (var), NULL))
-#define DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE (ddb_cell_renderer_text_multiline_get_type ())
-#define DDB_CELL_RENDERER_TEXT_MULTILINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE, DdbCellRendererTextMultiline))
-#define DDB_CELL_RENDERER_TEXT_MULTILINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE, DdbCellRendererTextMultilineClass))
-#define DDB_IS_CELL_RENDERER_TEXT_MULTILINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE))
-#define DDB_IS_CELL_RENDERER_TEXT_MULTILINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE))
-#define DDB_CELL_RENDERER_TEXT_MULTILINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE, DdbCellRendererTextMultilineClass))
-
-typedef struct _DdbCellRendererTextMultiline DdbCellRendererTextMultiline;
-typedef struct _DdbCellRendererTextMultilineClass DdbCellRendererTextMultilineClass;
-typedef struct _DdbCellRendererTextMultilinePrivate DdbCellRendererTextMultilinePrivate;
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
#define _gtk_tree_path_free0(var) ((var == NULL) ? NULL : (var = (gtk_tree_path_free (var), NULL)))
-struct _DdbCellEditableTextView {
- GtkTextView parent_instance;
- DdbCellEditableTextViewPrivate * priv;
- gboolean editing_canceled;
- gchar* tree_path;
-};
-
-struct _DdbCellEditableTextViewClass {
- GtkTextViewClass parent_class;
-};
-
-struct _DdbCellRendererTextMultiline {
- GtkCellRendererText parent_instance;
- DdbCellRendererTextMultilinePrivate * priv;
-};
-
-struct _DdbCellRendererTextMultilineClass {
- GtkCellRendererTextClass parent_class;
-};
-
struct _DdbCellRendererTextMultilinePrivate {
DdbCellEditableTextView* entry;
gulong focus_out_id;
};
+struct _DdbCellEditableTextViewPrivate {
+ gboolean editing_canceled;
+};
static gpointer ddb_cell_editable_text_view_parent_class = NULL;
static GtkCellEditableIface* ddb_cell_editable_text_view_gtk_cell_editable_parent_iface = NULL;
@@ -87,14 +51,12 @@ enum {
};
static gboolean ddb_cell_editable_text_view_real_key_press_event (GtkWidget* base, GdkEventKey* event);
static void ddb_cell_editable_text_view_real_start_editing (GtkCellEditable* base, GdkEvent* event);
-#if GTK_CHECK_VERSION(2,20,0)
-static void ddb_cell_editable_text_view_real_editing_canceled (GtkCellRenderer*);
-#endif
DdbCellEditableTextView* ddb_cell_editable_text_view_new (void);
DdbCellEditableTextView* ddb_cell_editable_text_view_construct (GType object_type);
static void ddb_cell_editable_text_view_finalize (GObject* obj);
GType ddb_cell_renderer_text_multiline_get_type (void);
#define DDB_CELL_RENDERER_TEXT_MULTILINE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DDB_TYPE_CELL_RENDERER_TEXT_MULTILINE, DdbCellRendererTextMultilinePrivate))
+#define DDB_CELL_EDITABLE_TEXT_VIEW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DDB_TYPE_CELL_EDITABLE_TEXT_VIEW, DdbCellEditableTextViewPrivate))
enum {
DDB_CELL_RENDERER_TEXT_MULTILINE_DUMMY_PROPERTY
};
@@ -140,7 +102,7 @@ static gboolean ddb_cell_editable_text_view_real_key_press_event (GtkWidget* bas
_tmp6_ = *event;
_tmp7_ = _tmp6_.keyval;
if (_tmp7_ == ((guint) GDK_Escape)) {
- self->editing_canceled = TRUE;
+ self->priv->editing_canceled = TRUE;
gtk_cell_editable_editing_done ((GtkCellEditable*) self);
gtk_cell_editable_remove_widget ((GtkCellEditable*) self);
result = TRUE;
@@ -158,9 +120,8 @@ static gboolean ddb_cell_editable_text_view_real_key_press_event (GtkWidget* bas
}
static void ddb_cell_editable_text_view_real_start_editing (GtkCellEditable* base, GdkEvent* event) {
- DdbCellEditableTextView * self;
- self = (DdbCellEditableTextView*) base;
- g_return_if_fail (event != NULL);
+ DdbCellEditableTextView * self;
+ self = (DdbCellEditableTextView*) base;
}
@@ -170,8 +131,8 @@ static void ddb_cell_editable_text_view_real_editing_canceled (GtkCellRenderer*
#endif
DdbCellEditableTextView* ddb_cell_editable_text_view_construct (GType object_type) {
- DdbCellEditableTextView * self = NULL;
- self = (DdbCellEditableTextView*) g_object_new (object_type, NULL);
+ DdbCellEditableTextView * self;
+ self = g_object_newv (object_type, 0, NULL);
return self;
}
@@ -180,11 +141,77 @@ DdbCellEditableTextView* ddb_cell_editable_text_view_new (void) {
return ddb_cell_editable_text_view_construct (DDB_TYPE_CELL_EDITABLE_TEXT_VIEW);
}
+enum
+{
+ PROP_0,
+
+ PROP_EDITING_CANCELED,
+
+ N_PROPERTIES
+};
+
+static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
+
+static void
+ddb_cell_editable_text_view_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ DdbCellEditableTextView *self = DDB_CELL_EDITABLE_TEXT_VIEW (object);
+
+ switch (property_id)
+ {
+ case PROP_EDITING_CANCELED:
+ self->priv->editing_canceled = g_value_get_boolean (value);
+ break;
+
+ default:
+ /* We don't have any other property... */
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+ddb_cell_editable_text_view_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ DdbCellEditableTextView *self = DDB_CELL_EDITABLE_TEXT_VIEW (object);
+
+ switch (property_id)
+ {
+ case PROP_EDITING_CANCELED:
+ g_value_set_boolean (value, self->priv->editing_canceled);
+ break;
+
+ default:
+ /* We don't have any other property... */
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
static void ddb_cell_editable_text_view_class_init (DdbCellEditableTextViewClass * klass) {
+ g_type_class_add_private (klass, sizeof (DdbCellEditableTextViewPrivate));
ddb_cell_editable_text_view_parent_class = g_type_class_peek_parent (klass);
GTK_WIDGET_CLASS (klass)->key_press_event = ddb_cell_editable_text_view_real_key_press_event;
G_OBJECT_CLASS (klass)->finalize = ddb_cell_editable_text_view_finalize;
+
+ G_OBJECT_CLASS (klass)->set_property = ddb_cell_editable_text_view_set_property;
+ G_OBJECT_CLASS (klass)->get_property = ddb_cell_editable_text_view_get_property;
+
+ obj_properties[PROP_EDITING_CANCELED] =
+ g_param_spec_boolean ("editing-canceled",
+ "Editing canceled",
+ "Indicates whether editing on the cell has been canceled",
+ FALSE,
+ G_PARAM_READWRITE);
+
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ g_object_class_install_property (gobject_class, PROP_EDITING_CANCELED, obj_properties[PROP_EDITING_CANCELED]);
}
void ddb_cell_editable_text_view_start_editing (DdbCellEditableTextView* self, GdkEvent* event) {
@@ -194,12 +221,13 @@ void ddb_cell_editable_text_view_start_editing (DdbCellEditableTextView* self, G
static void ddb_cell_editable_text_view_gtk_cell_editable_interface_init (GtkCellEditableIface * iface) {
ddb_cell_editable_text_view_gtk_cell_editable_parent_iface = g_type_interface_peek_parent (iface);
- iface->start_editing = (void (*)(GtkCellEditable*, GdkEvent*)) ddb_cell_editable_text_view_real_start_editing;
+ iface->start_editing = ddb_cell_editable_text_view_real_start_editing;
}
static void ddb_cell_editable_text_view_instance_init (DdbCellEditableTextView * self) {
- self->editing_canceled = FALSE;
+ self->priv = DDB_CELL_EDITABLE_TEXT_VIEW_GET_PRIVATE (self);
+ self->priv->editing_canceled = FALSE;
}
@@ -260,7 +288,7 @@ static void ddb_cell_renderer_text_multiline_gtk_cell_renderer_text_editing_done
g_signal_handler_disconnect ((GObject*) _tmp0_, _tmp2_);
_tmp3_ = _self_;
_tmp4_ = entry;
- _tmp5_ = _tmp4_->editing_canceled;
+ _tmp5_ = _tmp4_->priv->editing_canceled;
gtk_cell_renderer_stop_editing ((GtkCellRenderer*) _tmp3_, _tmp5_);
_tmp6_ = entry;
_tmp7_ = gtk_text_view_get_buffer ((GtkTextView*) _tmp6_);
@@ -286,15 +314,11 @@ static void ddb_cell_renderer_text_multiline_gtk_cell_renderer_text_editing_done
static gboolean ddb_cell_renderer_text_multiline_gtk_cell_renderer_focus_out_event (DdbCellEditableTextView* entry, GdkEvent* event, DdbCellRendererTextMultiline* _self_) {
gboolean result = FALSE;
- DdbCellEditableTextView* _tmp0_;
- DdbCellEditableTextView* _tmp1_;
g_return_val_if_fail (entry != NULL, FALSE);
g_return_val_if_fail (event != NULL, FALSE);
g_return_val_if_fail (_self_ != NULL, FALSE);
- _tmp0_ = entry;
- _tmp0_->editing_canceled = TRUE;
- _tmp1_ = entry;
- gtk_cell_editable_remove_widget ((GtkCellEditable*) _tmp1_);
+ entry->priv->editing_canceled = TRUE;
+ gtk_cell_editable_remove_widget ((GtkCellEditable*) entry);
result = FALSE;
return result;
}
@@ -350,7 +374,6 @@ static GtkCellEditable* ddb_cell_renderer_text_multiline_real_start_editing (Gtk
DdbCellEditableTextView* _tmp41_;
DdbCellEditableTextView* _tmp42_;
self = (DdbCellRendererTextMultiline*) base;
- g_return_val_if_fail (event != NULL, NULL);
g_return_val_if_fail (widget != NULL, NULL);
g_return_val_if_fail (path != NULL, NULL);
g_return_val_if_fail (background_area != NULL, NULL);
@@ -437,17 +460,16 @@ static GtkCellEditable* ddb_cell_renderer_text_multiline_real_start_editing (Gtk
_g_object_unref0 (store);
_g_object_unref0 (tv);
_gtk_tree_path_free0 (p);
- _g_object_unref0 (tv);
- _g_object_unref0 (store);
- G_IS_VALUE (&v) ? (g_value_unset (&v), NULL) : NULL;
- _g_object_unref0 (buf);
+ // evil hack! need to make an event for that
+ extern int trkproperties_block_keyhandler;
+ trkproperties_block_keyhandler = 1;
return result;
}
DdbCellRendererTextMultiline* ddb_cell_renderer_text_multiline_construct (GType object_type) {
- DdbCellRendererTextMultiline * self = NULL;
- self = (DdbCellRendererTextMultiline*) g_object_new (object_type, NULL);
+ DdbCellRendererTextMultiline * self;
+ self = g_object_newv (object_type, 0, NULL);
return self;
}
@@ -460,10 +482,8 @@ DdbCellRendererTextMultiline* ddb_cell_renderer_text_multiline_new (void) {
static void ddb_cell_renderer_text_multiline_class_init (DdbCellRendererTextMultilineClass * klass) {
ddb_cell_renderer_text_multiline_parent_class = g_type_class_peek_parent (klass);
g_type_class_add_private (klass, sizeof (DdbCellRendererTextMultilinePrivate));
+ GTK_CELL_RENDERER_CLASS (klass)->start_editing = ddb_cell_renderer_text_multiline_real_start_editing;
G_OBJECT_CLASS (klass)->finalize = ddb_cell_renderer_text_multiline_finalize;
-#if GTK_CHECK_VERSION(2,20,0)
- GTK_CELL_RENDERER_CLASS (klass)->editing_canceled = (void (*)(GtkCellRenderer*)) ddb_cell_editable_text_view_real_editing_canceled;
-#endif
}
diff --git a/plugins/gtkui/ddbcellrenderertextmultiline.h b/plugins/gtkui/ddbcellrenderertextmultiline.h
index ca461f34..622a19a6 100644
--- a/plugins/gtkui/ddbcellrenderertextmultiline.h
+++ b/plugins/gtkui/ddbcellrenderertextmultiline.h
@@ -35,7 +35,6 @@ typedef struct _DdbCellRendererTextMultilinePrivate DdbCellRendererTextMultiline
struct _DdbCellEditableTextView {
GtkTextView parent_instance;
DdbCellEditableTextViewPrivate * priv;
- gboolean editing_canceled;
gchar* tree_path;
};
diff --git a/plugins/gtkui/ddbcellrenderertextmultiline.vala b/plugins/gtkui/ddbcellrenderertextmultiline.vala
deleted file mode 100644
index c23aed69..00000000
--- a/plugins/gtkui/ddbcellrenderertextmultiline.vala
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- DeaDBeeF - ultimate music player for GNU/Linux systems with X11
- Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-namespace Ddb {
-
- public class CellEditableTextView : Gtk.CellEditable, Gtk.TextView {
- public bool editing_canceled = false;
- public string tree_path;
-
- public override bool key_press_event (Gdk.EventKey event) {
- bool res = true;
- if (event.keyval == Gdk.KeySyms.Return) {
- if ((event.state & (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK)) != 0) {
- res = base.key_press_event (event);
- }
- else {
- editing_done ();
- remove_widget ();
- return true;
- }
- }
- else if (event.keyval == Gdk.KeySyms.Escape) {
- editing_canceled = true;
- editing_done ();
- remove_widget ();
- return true;
- }
- else {
- res = base.key_press_event (event);
- }
-
- return res;
- }
-
- public void start_editing (Gdk.Event event) {
- }
- }
-
- public class CellRendererTextMultiline : Gtk.CellRendererText
- {
- private CellEditableTextView entry;
- private ulong focus_out_id;
-
- private static void gtk_cell_renderer_text_editing_done (CellEditableTextView entry, CellRendererTextMultiline self) {
- entry.disconnect (self.focus_out_id);
- self.stop_editing (entry.editing_canceled);
- Gtk.TextBuffer buf = entry.get_buffer ();
- Gtk.TextIter begin, end;
- buf.get_iter_at_offset (out begin, 0);
- buf.get_iter_at_offset (out end, -1);
- string new_text = buf.get_text (begin, end, true);
- self.edited (entry.tree_path, new_text);
- }
-
- private static bool gtk_cell_renderer_focus_out_event (CellEditableTextView entry, Gdk.Event event, CellRendererTextMultiline self) {
- entry.editing_canceled = true;
- entry.remove_widget ();
- return false;
- }
-
-
- public override unowned Gtk.CellEditable start_editing (Gdk.Event event, Gtk.Widget widget, string path, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gtk.CellRendererState flags) {
- if (!editable) {
- return (Gtk.CellEditable)null;
- }
-
- Gtk.TreePath p = new Gtk.TreePath.from_string (path);
- Gtk.TreeView tv = (Gtk.TreeView)widget;
- Gtk.ListStore store = (Gtk.ListStore)tv.get_model();
- Gtk.TreeIter iter;
- store.get_iter (out iter, p);
- GLib.Value v;
- store.get_value (iter, 3, out v);
- int mult = v.get_int ();
-
- entry = new CellEditableTextView ();
- if (mult != 0) {
- text = "";
- }
-
- entry.tree_path = path;
- Gtk.TextBuffer buf = new Gtk.TextBuffer (null);
- if (text != null) {
- buf.set_text (text, -1);
- }
- entry.set_buffer (buf);
- Signal.connect (entry, "editing-done", (GLib.Callback)gtk_cell_renderer_text_editing_done, this);
- focus_out_id = Signal.connect_after (entry, "focus-out-event", (GLib.Callback)gtk_cell_renderer_focus_out_event, this);
- entry.set_size_request (cell_area.width, cell_area.height);
- entry.show ();
-
- return (Gtk.CellEditable)entry;
- }
- }
-}
diff --git a/plugins/gtkui/ddbequalizer.vala b/plugins/gtkui/ddbequalizer.vala
deleted file mode 100644
index 82a1f060..00000000
--- a/plugins/gtkui/ddbequalizer.vala
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- SuperEQ GTK Widget for for DeaDBeeF
- Copyright (C) 2010 Viktor Semykin <thesame.ml@gmail.com>
-
- 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, see <http://www.gnu.org/licenses/>.
-*/
-
-// sripped down and polished by Alexey Yakovenko <waker@users.sourceforge.net>
-
-using Gtk;
-using Gdk;
-
-const string[] freqs = {
- "55 Hz","77 Hz","110 Hz","156 Hz","220 Hz","311 Hz","440 Hz","622 Hz","880 Hz",
- "1.2 kHz","1.8 kHz","2.5 kHz","3.5 kHz","5 kHz","7 kHz","10 kHz","14 kHz","20 kHz"
-};
-
-namespace Ddb {
- public class Equalizer : Gtk.DrawingArea
- {
- public signal void on_changed ();
-
- private double[] values = new double [bands];
- private double preamp = 0.5;
-
- private int mouse_y = -1;
-
- private bool curve_hook = false;
- private bool preamp_hook = false;
-
- private int eq_margin_bottom = -1;
- private int eq_margin_left = -1;
- static const int spot_size = 3;
- static const int bands = 18;
-
-// Gdk.Cursor moving_cursor = new Gdk.Cursor (Gdk.CursorType.FLEUR);
-// Gdk.Cursor updown_cursor = new Gdk.Cursor (Gdk.CursorType.double_ARROW);
- Gdk.Cursor pointer_cursor = new Gdk.Cursor (Gdk.CursorType.LEFT_PTR);
-
- construct
- {
- eq_margin_bottom = (int)(Pango.units_to_double (get_style ().font_desc.get_size ()) * Gdk.Screen.get_default ().get_resolution () / 72 + 4);
- eq_margin_left = eq_margin_bottom * 4;
-
- //color_changed ();
- }
-
- public override bool configure_event (Gdk.EventConfigure event) {
- Gtkui.init_theme_colors ();
- return false;
- }
-
- public override void realize () {
- base.realize ();
- add_events (Gdk.EventMask.EXPOSURE_MASK | Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK | Gdk.EventMask.POINTER_MOTION_MASK);
- }
-
- public override bool
- expose_event (Gdk.EventExpose event)
- {
- Gdk.Color fore_bright_color = Gtkui.get_bar_foreground_color ();
-
- Gdk.Color c1 = fore_bright_color;
- Gdk.Color c2 = Gtkui.get_bar_background_color ();
- Gdk.Color fore_dark_color = c2;
- fore_dark_color.red += (int16)((c1.red - c2.red) * 0.5);
- fore_dark_color.green += (int16)((c1.green - c2.green) * 0.5);
- fore_dark_color.blue += (int16)((c1.blue - c2.blue) * 0.5);
-
- Allocation alloc;
- get_allocation (out alloc);
-
- int width = alloc.width;
- int height = alloc.height;
-
- var ctx = Gdk.cairo_create (get_window ());
- ctx.set_antialias (Cairo.Antialias.NONE);
- ctx.set_line_width (1.0);
- ctx.set_source_rgba (c2.red/65535.0, c2.green/65535.0, c2.blue/65535.0, 1);
- ctx.rectangle (0, 0, width, height);
- ctx.fill ();
-
- ctx.set_source_rgba (fore_dark_color.red/65535.0, fore_dark_color.green/65535.0, fore_dark_color.blue/65535.0, 1);
-
- //drawing grid:
- double step = (double)(width - eq_margin_left) / (double)(bands+1);
- int i;
- for (i = 0; i < bands; i++)
- {
- //does anyone know why this method is static?
- ctx.move_to ((int)((i+1)*step)+eq_margin_left, 0);
- ctx.line_to ((int)((i+1)*step)+eq_margin_left, height - eq_margin_bottom);
- }
-
- double vstep = (double)(height-eq_margin_bottom);
- for (double di=0; di < 2; di += 0.25)
- {
- ctx.move_to (eq_margin_left, (int)((di-preamp)*vstep));
- ctx.line_to (width, (int)((di-preamp)*vstep));
- }
- ctx.stroke ();
-
- ctx.set_source_rgba (fore_bright_color.red/65535.0, fore_bright_color.green/65535.0, fore_bright_color.blue/65535.0, 1);
-
- //drawing freqs:
-
- Pango.Layout l = Pango.cairo_create_layout (ctx);
- var pctx = l.get_context ();
-
- var fd = get_style ().font_desc.copy ();
-
- fd.set_size ((int)(get_style ().font_desc.get_size () * 0.7));
- pctx.set_font_description (fd);
- for (i = 0; i < bands; i++)
- {
- ctx.save ();
- l.set_text (freqs[i], (int)freqs[i].length);
- Pango.Rectangle ink, log;
- l.get_pixel_extents (out ink, out log);
- int offs = 2;
- if ((i % 2) != 0) {
- offs += 2;
- }
- ctx.move_to ( (int)((i+1)*step)+eq_margin_left - ink.width/2, height-eq_margin_bottom + offs);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
- }
- fd.set_size ((int)(get_style ().font_desc.get_size ()));
- pctx.set_font_description (fd);
-
- //drawing db's:
- l.set_width (eq_margin_left-1);
- l.set_alignment (Pango.Alignment.RIGHT);
-
- int fontsize = (int)(Pango.units_to_double (fd.get_size ()) * Gdk.Screen.get_default ().get_resolution () / 72);
-
- if ((mouse_y >= 0) && (mouse_y < height - eq_margin_bottom))
- {
- ctx.save ();
- double db = scale((double)(mouse_y-1) / (double)(height - eq_margin_bottom - 2));
- string tmp = "%s%.1fdB".printf (db > 0 ? "+" : "", db);
- l.set_text (tmp, (int)tmp.length);
- ctx.move_to (eq_margin_left-1, mouse_y-3);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
- }
-
- ctx.save ();
- string tmp;
- double val = scale(1);
- tmp = "%s%.1fdB".printf (val > 0 ? "+" : "", val);
- l.set_text (tmp, (int)tmp.length);
- ctx.move_to (eq_margin_left-1, height-eq_margin_bottom-fontsize);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
-
- ctx.save ();
- val = scale(0);
- tmp = "%s%.1fdB".printf (val > 0 ? "+" : "", val);
- l.set_text (tmp, (int)tmp.length);
- ctx.move_to (eq_margin_left-1, 1);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
-
- ctx.save ();
- l.set_text ("+0dB", 4);
- ctx.move_to (eq_margin_left-1, (int)((1-preamp)*(height-eq_margin_bottom))-fontsize/2);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
-
- ctx.save ();
- l.set_text ("preamp", 6);
- l.set_alignment (Pango.Alignment.LEFT);
- ctx.move_to (1, height-eq_margin_bottom+2);
- Pango.cairo_show_layout (ctx, l);
- ctx.restore ();
-
- // frame
- ctx.rectangle (eq_margin_left, 0, width-eq_margin_left-1, height-eq_margin_bottom-1);
- ctx.stroke ();
-
- //draw preamp
- ctx.rectangle (0, (int)(preamp * (height-eq_margin_bottom)), 11, height);
- ctx.clip ();
-
- ctx.set_source_rgba (fore_bright_color.red/65535.0, fore_bright_color.green/65535.0, fore_bright_color.blue/65535.0, 1.0);
- int count = (int)((height-eq_margin_bottom) / 6)+1;
- for (int j = 0; j < count; j++) {
- ctx.rectangle (1, height-eq_margin_bottom-j*6 - 6, 11, 4);
- }
- ctx.fill ();
- ctx.reset_clip ();
-
- //drawing bars:
- int bar_w = 11;
- if (step < bar_w)
- bar_w = (int)step-1;
-
-
- for (i = 0; i < bands; i++)
- {
- ctx.reset_clip ();
- ctx.rectangle ((int)((i+1)*step)+eq_margin_left - bar_w/2, (int)(values[i] * (height-eq_margin_bottom)), 11, height);
- ctx.clip ();
- count = (int)((height-eq_margin_bottom) * (1-values[i]) / 6)+1;
- for (int j = 0; j < count; j++) {
- ctx.rectangle ( (int)((i+1)*step)+eq_margin_left - bar_w/2, height-eq_margin_bottom-j*6 - 6, bar_w, 4);
- }
- ctx.fill ();
- }
-
- //drawing mouse coordinates:
- ctx.reset_clip ();
- ctx.set_dash (new double[] {4, 4}, 0);
- ctx.move_to (eq_margin_left+1, mouse_y);
- ctx.line_to (width, mouse_y);
- ctx.stroke ();
-
- return false;
- }
-
- private inline double
- scale (double val)
- {
- double k = -40;
- double d = 20;
- return (val + preamp - 0.5) * k + d;
- }
-
- private bool
- in_curve_area (double x, double y)
- {
- return
- x > eq_margin_left &&
- x < allocation.width-1 &&
- y > 1 &&
- y < allocation.height-eq_margin_bottom;
- }
-
- private void
- update_eq_drag (double x, double y) {
- double band_width = (double)(allocation.width - eq_margin_left) / (double)(bands+1);
- int band = (int)GLib.Math.floor ((x - eq_margin_left) / band_width - 0.5);
- if (band < 0) {
- band = 0;
- }
- if (band >= bands) {
- band = band-1;
- }
- if (band >= 0 && band < bands) {
- values[band] = y / (double)(allocation.height - eq_margin_bottom);
- if (values[band] > 1) {
- values[band] = 1;
- }
- else if (values[band] < 0) {
- values[band] = 0;
- }
- on_changed ();
- }
- }
-
- /* Mouse button got pressed over widget */
- public override bool
- button_press_event (Gdk.EventButton event)
- {
- if (in_curve_area ((int)event.x, (int)event.y))
- {
- curve_hook = true;
- update_eq_drag ((int)event.x, (int)event.y);
- mouse_y = (int)event.y;
- queue_draw ();
- return false;
- }
-
- if (event.x <= 11 &&
- event.y > 1 &&
- event.y <= allocation.height-eq_margin_bottom &&
- event.button == 1
- )
- {
- preamp = event.y / (double)(allocation.height - eq_margin_bottom);
- on_changed ();
- preamp_hook = true;
- mouse_y = (int)event.y;
- queue_draw ();
- }
-
- return false;
- }
-
- /* Mouse button got released */
- public override bool
- button_release_event (Gdk.EventButton event)
- {
- curve_hook = false;
- preamp_hook = false;
- get_window().set_cursor (pointer_cursor);
- return false;
- }
-
- public override bool
- leave_notify_event (Gdk.EventCrossing event)
- {
- mouse_y = -1;
- queue_draw();
- return false;
- }
-
- /* Mouse pointer moved over widget */
- public override bool
- motion_notify_event (Gdk.EventMotion event) {
- double y = event.y / (double)(allocation.height - eq_margin_bottom);
- if (y < 0) y = 0;
- if (y > 1) y = 1;
-
- if (preamp_hook)
- {
- preamp = y;
- on_changed ();
- queue_draw();
- return false;
- }
-
- if (!in_curve_area ((int)event.x, (int)event.y))
- mouse_y = -1;
- else
- mouse_y = (int)event.y;
-
- if (curve_hook)
- {
- update_eq_drag ((int)event.x, (int)event.y);
- mouse_y = (int)event.y;
- }
- queue_draw ();
- return false;
- }
-
- public void
- set_band (int band, double v) {
- values[band] = 1 - (v + 20.0) / 40.0;
- }
-
- public double
- get_band (int band) {
- return ((1 - values[band]) * 40.0) - 20.0;
- }
-
- public void
- set_preamp (double v) {
- preamp = 1 - (v + 20.0) / 40.0;
- }
-
- public double
- get_preamp () {
- return ((1 - preamp) * 40.0) - 20.0;
- }
-
- }
-}
diff --git a/plugins/gtkui/ddblistview.c b/plugins/gtkui/ddblistview.c
index 4bf53fc8..557da26b 100644
--- a/plugins/gtkui/ddblistview.c
+++ b/plugins/gtkui/ddblistview.c
@@ -296,9 +296,9 @@ static void
ddb_listview_init(DdbListview *listview)
{
// init instance - create all subwidgets, and insert into table
- draw_init_font (gtk_widget_get_style (GTK_WIDGET(listview)));
-
- listview->rowheight = draw_get_listview_rowheight ();
+ drawctx_init (&listview->listctx);
+ drawctx_init (&listview->hdrctx);
+ listview->rowheight = -1;
listview->col_movepos = -1;
listview->drag_motion_y = -1;
@@ -329,6 +329,7 @@ ddb_listview_init(DdbListview *listview)
listview->header_width = 0;
listview->columns = NULL;
+ listview->lock_columns = 1;
listview->groups = NULL;
listview->block_redraw_on_scroll = 0;
@@ -360,10 +361,18 @@ ddb_listview_init(DdbListview *listview)
gtk_widget_show (vbox);
gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+ GtkWidget *sepbox = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (sepbox);
+ gtk_container_set_border_width (GTK_CONTAINER (sepbox), 1);
+ gtk_box_pack_start (GTK_BOX (vbox), sepbox, FALSE, TRUE, 0);
+
+ GtkWidget *hsep = gtk_hseparator_new ();
+ gtk_widget_show (hsep);
+ gtk_box_pack_start (GTK_BOX (sepbox), hsep, FALSE, TRUE, 0);
+
listview->header = gtk_drawing_area_new ();
gtk_widget_show (listview->header);
gtk_box_pack_start (GTK_BOX (vbox), listview->header, FALSE, TRUE, 0);
- gtk_widget_set_size_request (listview->header, -1, draw_get_listview_rowheight ());
gtk_widget_set_events (listview->header, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
listview->list = gtk_drawing_area_new ();
@@ -371,7 +380,11 @@ ddb_listview_init(DdbListview *listview)
gtk_box_pack_start (GTK_BOX (vbox), listview->list, TRUE, TRUE, 0);
gtk_widget_set_can_focus (listview->list, TRUE);
gtk_widget_set_can_default (listview->list, TRUE);
- gtk_widget_set_events (listview->list, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK);
+ int events = GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK;
+#if GTK_CHECK_VERSION(3,0,0)
+ events |= GDK_SCROLL_MASK;
+#endif
+ gtk_widget_set_events (listview->list, events);
listview->hscrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 0, 0, 0, 0)));
gtk_widget_show (listview->hscrollbar);
@@ -504,6 +517,8 @@ ddb_listview_destroy(GObject *object)
gdk_cursor_unref (listview->cursor_drag);
listview->cursor_drag = NULL;
}
+ draw_free (&listview->listctx);
+ draw_free (&listview->hdrctx);
}
void
@@ -540,6 +555,13 @@ ddb_listview_list_realize (GtkWidget *widget,
// gtk_drag_dest_set_track_motion (widget, TRUE);
}
+static gboolean
+ddb_listview_reconf_scrolling (void *ps) {
+ ddb_listview_list_setup_vscroll (ps);
+ ddb_listview_list_setup_hscroll (ps);
+ return FALSE;
+}
+
gboolean
ddb_listview_list_configure_event (GtkWidget *widget,
GdkEventConfigure *event,
@@ -547,16 +569,14 @@ ddb_listview_list_configure_event (GtkWidget *widget,
{
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner"));
- draw_init_font (gtk_widget_get_style (widget));
- int height = draw_get_listview_rowheight ();
+ draw_init_font (&ps->listctx, gtk_widget_get_style (widget));
+ int height = draw_get_listview_rowheight (&ps->listctx);
if (height != ps->rowheight) {
ps->rowheight = height;
ddb_listview_build_groups (ps);
}
- ddb_listview_list_setup_vscroll (ps);
- ddb_listview_list_setup_hscroll (ps);
- widget = ps->list;
+ g_idle_add (ddb_listview_reconf_scrolling, ps);
return FALSE;
}
@@ -657,7 +677,7 @@ ddb_listview_list_render (DdbListview *listview, cairo_t *cr, int x, int y, int
grp = grp->next;
}
- draw_begin (cr);
+ draw_begin (&listview->listctx, cr);
int ii = 0;
while (grp && grp_y < y + h + listview->scrollpos) {
@@ -709,7 +729,7 @@ ddb_listview_list_render (DdbListview *listview, cairo_t *cr, int x, int y, int
int theming = !gtkui_override_listview_colors ();
if (theming) {
#if GTK_CHECK_VERSION(3,0,0)
- gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, "even_row_color", x, grp_y - listview->scrollpos + listview->grouptitle_height + listview->rowheight * grp->num_items, w, filler);
+ gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, "cell_even_ruled", x, grp_y - listview->scrollpos + listview->grouptitle_height + listview->rowheight * grp->num_items, w, filler);
#else
gtk_paint_flat_box (gtk_widget_get_style (treeview), gtk_widget_get_window (listview->list), GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, treeview, "cell_even_ruled", x, grp_y - listview->scrollpos + listview->grouptitle_height + listview->rowheight * grp->num_items, w, filler);
#endif
@@ -735,7 +755,7 @@ ddb_listview_list_render (DdbListview *listview, cairo_t *cr, int x, int y, int
int theming = !gtkui_override_listview_colors ();
if (theming) {
#if GTK_CHECK_VERSION(3,0,0)
- gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, "even_row_color", x, grp_y - listview->scrollpos, w, hh);
+ gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, "cell_even_ruled", x, grp_y - listview->scrollpos, w, hh);
#else
gtk_paint_flat_box (gtk_widget_get_style (treeview), listview->list->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, treeview, "cell_even_ruled", x, grp_y - listview->scrollpos, w, hh);
#endif
@@ -749,7 +769,7 @@ ddb_listview_list_render (DdbListview *listview, cairo_t *cr, int x, int y, int
}
}
deadbeef->pl_unlock ();
- draw_end ();
+ draw_end (&listview->listctx);
}
static void
@@ -1186,6 +1206,7 @@ ddb_listview_list_setup_hscroll (DdbListview *ps) {
}
if (size == 0) {
gtk_widget_hide (scroll);
+ gtk_widget_queue_draw (ps->list);
}
else {
GtkAdjustment *adj = (GtkAdjustment*)gtk_adjustment_new (gtk_range_get_value (GTK_RANGE (scroll)), 0, size, 1, w, w);
@@ -1272,7 +1293,7 @@ ddb_listview_list_render_row_background (DdbListview *ps, cairo_t *cr, DdbListvi
if (theming) {
// draw background for selection -- workaround for New Wave theme (translucency)
#if GTK_CHECK_VERSION(3,0,0)
- gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, even ? "even_row_color" : "odd_row_color", x, y, w, h);
+ gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_NORMAL, GTK_SHADOW_NONE, treeview, even ? "cell_even_ruled" : "cell_odd_ruled", x, y, w, h);
#else
gtk_paint_flat_box (gtk_widget_get_style (treeview), ps->list->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, treeview, even ? "cell_even_ruled" : "cell_odd_ruled", x, y, w, h);
#endif
@@ -1289,17 +1310,25 @@ ddb_listview_list_render_row_background (DdbListview *ps, cairo_t *cr, DdbListvi
if (sel) {
if (theming) {
#if GTK_CHECK_VERSION(3,0,0)
- gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_SELECTED, GTK_SHADOW_NONE, treeview, even ? "even_row_color" : "odd_row_color", x, y, w, h);
+ gtk_paint_flat_box (gtk_widget_get_style (treeview), cr, GTK_STATE_SELECTED, GTK_SHADOW_NONE, treeview, even ? "cell_even_ruled" : "cell_odd_ruled", x-1, y-1, w+1, h+1);
#else
gtk_paint_flat_box (gtk_widget_get_style (treeview), ps->list->window, GTK_STATE_SELECTED, GTK_SHADOW_NONE, NULL, treeview, even ? "cell_even_ruled" : "cell_odd_ruled", x, y, w, h);
#endif
}
else {
GdkColor clr;
+#if !GTK_CHECK_VERSION(3,0,0)
+ GdkGC *gc = gdk_gc_new (ps->list->window);
+ gdk_gc_set_rgb_fg_color (gc, (gtkui_get_listview_selection_color (&clr), &clr));
+ gdk_draw_rectangle (ps->list->window, gc, TRUE, x, y, w, h);
+ g_object_unref (gc);
+
+#else
gtkui_get_listview_selection_color (&clr);
cairo_set_source_rgb (cr, clr.red/65535.f, clr.green/65535.f, clr.blue/65535.f);
cairo_rectangle (cr, x, y, w, h);
cairo_fill (cr);
+#endif
}
}
if (cursor) {
@@ -1307,10 +1336,17 @@ ddb_listview_list_render_row_background (DdbListview *ps, cairo_t *cr, DdbListvi
// but we want it anyway
//treeview->style->fg_gc[GTK_STATE_NORMAL]
GdkColor clr;
+#if !GTK_CHECK_VERSION(3,0,0)
+ GdkGC *gc = gdk_gc_new (ps->list->window);
+ gdk_gc_set_rgb_fg_color (gc, (gtkui_get_listview_cursor_color (&clr), &clr));
+ gdk_draw_rectangle (ps->list->window, gc, FALSE, x, y, w-1, h-1);
+ g_object_unref (gc);
+#else
gtkui_get_listview_cursor_color (&clr);
cairo_set_source_rgb (cr, clr.red/65535.f, clr.green/65535.f, clr.blue/65535.f);
cairo_rectangle (cr, x+1, y+1, w-1, h-1);
cairo_stroke (cr);
+#endif
}
}
@@ -1324,12 +1360,12 @@ ddb_listview_list_render_row_foreground (DdbListview *ps, cairo_t *cr, DdbListvi
if (it && ps->binding->is_selected (it)) {
GdkColor *clr = &gtk_widget_get_style (theme_treeview)->fg[GTK_STATE_SELECTED];
float rgb[3] = { clr->red/65535.f, clr->green/65535.f, clr->blue/65535.f };
- draw_set_fg_color (rgb);
+ draw_set_fg_color (&ps->listctx, rgb);
}
else {
GdkColor *clr = &gtk_widget_get_style (theme_treeview)->fg[GTK_STATE_NORMAL];
float rgb[3] = { clr->red/65535.f, clr->green/65535.f, clr->blue/65535.f };
- draw_set_fg_color (rgb);
+ draw_set_fg_color (&ps->listctx, rgb);
}
DdbListviewColumn *c;
int cidx = 0;
@@ -1964,6 +2000,20 @@ ddb_listview_handle_keypress (DdbListview *ps, int keyval, int state) {
ps->binding->delete_selected ();
cursor = ps->binding->cursor ();
}
+ else if (keyval == GDK_Menu) {
+ DdbListviewIter it = ps->binding->head ();
+ while (it && !ps->binding->is_selected (it)) {
+ DdbListviewIter next = ps->binding->next (it);
+ ps->binding->unref (it);
+ it = next;
+ }
+ if (it) {
+ int sel = ps->binding->get_idx (it);
+ ps->binding->list_context_menu (ps, it, sel);
+ ps->binding->unref (it);
+ }
+ return 0;
+ }
else {
return 0;
}
@@ -2173,7 +2223,7 @@ ddb_listview_header_render (DdbListview *ps, cairo_t *cr) {
cairo_line_to (cr, a.width, a.height-1);
cairo_stroke (cr);
#endif
- draw_begin (cr);
+ draw_begin (&ps->hdrctx, cr);
x = -ps->hscrollpos;
DdbListviewColumn *c;
int need_draw_moving = 0;
@@ -2220,7 +2270,7 @@ ddb_listview_header_render (DdbListview *ps, cairo_t *cr) {
#endif
GdkColor *gdkfg = &gtk_widget_get_style (theme_button)->fg[0];
float fg[3] = {(float)gdkfg->red/0xffff, (float)gdkfg->green/0xffff, (float)gdkfg->blue/0xffff};
- draw_set_fg_color (fg);
+ draw_set_fg_color (&ps->hdrctx, fg);
int ww = w-10;
if (sort) {
ww -= arrow_sz;
@@ -2228,7 +2278,7 @@ ddb_listview_header_render (DdbListview *ps, cairo_t *cr) {
ww = 0;
}
}
- draw_text (xx + 5, 3, ww, 0, c->title);
+ draw_text (&ps->hdrctx, xx + 5, 3, ww, 0, c->title);
}
if (sort) {
int dir = sort == 1 ? GTK_ARROW_DOWN : GTK_ARROW_UP;
@@ -2280,15 +2330,15 @@ ddb_listview_header_render (DdbListview *ps, cairo_t *cr) {
#endif
GdkColor *gdkfg = &gtk_widget_get_style (theme_button)->fg[GTK_STATE_SELECTED];
float fg[3] = {(float)gdkfg->red/0xffff, (float)gdkfg->green/0xffff, (float)gdkfg->blue/0xffff};
- draw_set_fg_color (fg);
- draw_text (x + 5, 3, c->width-10, 0, c->title);
+ draw_set_fg_color (&ps->hdrctx, fg);
+ draw_text (&ps->hdrctx, x + 5, 3, c->width-10, 0, c->title);
}
break;
}
x += w;
}
}
- draw_end ();
+ draw_end (&ps->hdrctx);
}
gboolean
@@ -2327,29 +2377,40 @@ ddb_listview_header_configure_event (GtkWidget *widget,
gpointer user_data)
{
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner"));
- draw_init_font (gtk_widget_get_style (widget));
- int height = draw_get_listview_rowheight ();
+ draw_init_font (&ps->hdrctx, gtk_widget_get_style (widget));
+ int height = draw_get_listview_rowheight (&ps->hdrctx);
GtkAllocation a;
gtk_widget_get_allocation (widget, &a);
if (height != a.height) {
gtk_widget_set_size_request (widget, -1, height);
}
- if (ps->header_width == 0) {
- ps->header_width = a.width;
+ if (!ps->lock_columns) {
+ if (ps->header_width != a.width && deadbeef->conf_get_int ("gtkui.autoresize_columns", 0)) {
+ if (ps->header_width == 0) {
+ ps->header_width = a.width;
+ }
+ float ratio = (float)a.width / ps->header_width;
+ ps->header_width = a.width;
+ struct _DdbListviewColumn *c;
+ for (c = ps->columns; c; c = c->next) {
+ c->width *= ratio;
+ }
+ ps->binding->columns_changed (ps);
+ }
}
- else if (ps->header_width != a.width && deadbeef->conf_get_int ("gtkui.autoresize_columns", 0)) {
- float ratio = (float)a.width / ps->header_width;
+ else {
ps->header_width = a.width;
- struct _DdbListviewColumn *c;
- for (c = ps->columns; c; c = c->next) {
- c->width *= ratio;
- }
}
return FALSE;
}
+void
+ddb_listview_lock_columns (DdbListview *lv, gboolean lock) {
+ lv->lock_columns = lock;
+}
+
void
ddb_listview_header_realize (GtkWidget *widget,
@@ -2357,7 +2418,7 @@ ddb_listview_header_realize (GtkWidget *widget,
{
// create cursor for sizing headers
DdbListview *listview = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner"));
- int h = draw_get_font_size ();
+ int h = draw_get_font_size (&listview->hdrctx);
gtk_widget_set_size_request (widget, -1, h + 10);
listview->cursor_sz = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
listview->cursor_drag = gdk_cursor_new (GDK_FLEUR);
@@ -2385,7 +2446,7 @@ ddb_listview_header_motion_notify_event (GtkWidget *widget,
ev_x = event->x;
ev_y = event->y;
ev_state = event->state;
-#if GTK_CHECK_VERSION(2,12,0) && !defined(ULTRA_COMPATIBLE)
+#if GTK_CHECK_VERSION(2,12,0)
gdk_event_request_motions (event);
#endif
@@ -2748,7 +2809,7 @@ ddb_listview_motion_notify_event (GtkWidget *widget,
{
int x = event->x;
int y = event->y;
-#if GTK_CHECK_VERSION(2,12,0) && !defined(ULTRA_COMPATIBLE)
+#if GTK_CHECK_VERSION(2,12,0)
gdk_event_request_motions (event);
#endif
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner"));
diff --git a/plugins/gtkui/ddblistview.h b/plugins/gtkui/ddblistview.h
index d03cd240..143ef28c 100644
--- a/plugins/gtkui/ddblistview.h
+++ b/plugins/gtkui/ddblistview.h
@@ -21,6 +21,7 @@
#include <gtk/gtk.h>
#include <sys/time.h>
#include <stdint.h>
+#include "drawing.h"
// drag and drop targets
enum {
@@ -141,6 +142,8 @@ struct _DdbListview {
int header_width; // previous width before resize
struct _DdbListviewColumn *columns;
+ gboolean lock_columns;
+
struct _DdbListviewGroup *groups;
int groups_build_idx; // must be the same as playlist modification idx
int fullheight;
@@ -153,6 +156,10 @@ struct _DdbListview {
GdkCursor *cursor_sz;
GdkCursor *cursor_drag;
+
+ // drawing contexts
+ drawctx_t listctx;
+ drawctx_t hdrctx;
};
struct _DdbListviewClass {
@@ -256,6 +263,9 @@ ddb_listview_list_drag_end (GtkWidget *widget,
void
ddb_listview_clear_sort (DdbListview *listview);
+void
+ddb_listview_lock_columns (DdbListview *lv, gboolean lock);
+
G_END_DECLS
#endif // __DDBLISTVIEW_H
diff --git a/plugins/gtkui/ddbseekbar.vala b/plugins/gtkui/ddbseekbar.vala
deleted file mode 100644
index c9256666..00000000
--- a/plugins/gtkui/ddbseekbar.vala
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- DeaDBeeF - ultimate music player for GNU/Linux systems with X11
- Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-namespace Ddb {
- public class Seekbar : Gtk.Widget
- {
- construct
- {
- }
-
- public override void realize () {
- set_has_window (false);
- base.realize ();
- }
-
- public override void unrealize () {
- base.unrealize ();
- }
-
- public override void size_request (out Gtk.Requisition requisition) {
- // leave at default for now
- }
-
- public override bool expose_event (Gdk.EventExpose event) {
- seekbar_draw (base);
- return true;
- }
-
- public override bool button_press_event (Gdk.EventButton event) {
- return on_seekbar_button_press_event (this, event);
- }
-
- public override bool button_release_event (Gdk.EventButton event) {
- return on_seekbar_button_release_event (this, event);
- }
-
- public override bool motion_notify_event (Gdk.EventMotion event) {
- return on_seekbar_motion_notify_event (this, event);
- }
-
- public override bool configure_event (Gdk.EventConfigure event) {
- Gtkui.init_theme_colors ();
- return false;
- }
- }
-
-}
-
diff --git a/plugins/gtkui/ddbtabstrip.c b/plugins/gtkui/ddbtabstrip.c
index 18151ff4..f367b0f8 100644
--- a/plugins/gtkui/ddbtabstrip.c
+++ b/plugins/gtkui/ddbtabstrip.c
@@ -225,6 +225,7 @@ ddb_tabstrip_destroy(GObject *object)
g_return_if_fail(DDB_IS_TABSTRIP(object));
tabstrip = DDB_TABSTRIP (object);
+ draw_free (&tabstrip->drawctx);
}
static void
@@ -326,6 +327,10 @@ ddb_tabstrip_init(DdbTabStrip *tabstrip)
tabstrip->dragpt[1] = 0;
tabstrip->prev_x = 0;
tabstrip->movepos = 0;
+ drawctx_init (&tabstrip->drawctx);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_events (GTK_WIDGET (tabstrip), gtk_widget_get_events (GTK_WIDGET (tabstrip)) | GDK_SCROLL_MASK);
+#endif
}
static int tab_clicked = -1;
@@ -357,7 +362,11 @@ cairo_draw_poly (cairo_t *cr, GdkPoint *pts, int cnt) {
void
+#if !GTK_CHECK_VERSION(3,0,0)
+ddb_tabstrip_draw_tab (GtkWidget *widget, GdkDrawable *drawable, int idx, int selected, int x, int y, int w, int h) {
+#else
ddb_tabstrip_draw_tab (GtkWidget *widget, cairo_t *cr, int idx, int selected, int x, int y, int w, int h) {
+#endif
GdkPoint points_filled[] = {
{ x+2, y + h },
{ x+2, y + 2 },
@@ -366,7 +375,11 @@ ddb_tabstrip_draw_tab (GtkWidget *widget, cairo_t *cr, int idx, int selected, in
};
GdkPoint points_frame1[] = {
{ x, y + h-2 },
+#if !GTK_CHECK_VERSION(3,0,0)
+ { x, y + 1 },
+#else
{ x, y + 0 },
+#endif
{ x + 1, y + 0 },
{ x + w - h - 1, y + 0 },
{ x + w - h, y + 1 },
@@ -377,13 +390,22 @@ ddb_tabstrip_draw_tab (GtkWidget *widget, cairo_t *cr, int idx, int selected, in
};
GdkPoint points_frame2[] = {
{ x + 1, y + h + 1 },
+#if !GTK_CHECK_VERSION(3,0,0)
+ { x + 1, y + 1 },
+#else
{ x + 1, y + 0 },
+#endif
{ x + w - h - 1, y + 1 },
{ x + w - h, y + 2 },
{ x + w - h + 1, y + 2 },
{ x + w-3, y + h - 2 },
{ x + w-2, y + h - 2 },
};
+#if !GTK_CHECK_VERSION(3,0,0)
+ GdkGC *bg = gdk_gc_new (drawable);
+ GdkGC *outer_frame = gdk_gc_new (drawable);
+ GdkGC *inner_frame = gdk_gc_new (drawable);
+#endif
GdkColor clr_bg;
GdkColor clr_outer_frame;
GdkColor clr_inner_frame;
@@ -406,17 +428,37 @@ ddb_tabstrip_draw_tab (GtkWidget *widget, cairo_t *cr, int idx, int selected, in
if (fallback) {
gtkui_get_tabstrip_base_color (&clr_bg);
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ gdk_gc_set_rgb_fg_color (bg, &clr_bg);
+ gdk_gc_set_rgb_fg_color (outer_frame, (gtkui_get_tabstrip_dark_color (&clr_outer_frame), &clr_outer_frame));
+ gdk_gc_set_rgb_fg_color (inner_frame, (gtkui_get_tabstrip_light_color (&clr_inner_frame), &clr_inner_frame));
+#else
gtkui_get_tabstrip_dark_color (&clr_outer_frame);
gtkui_get_tabstrip_light_color (&clr_inner_frame);
+#endif
}
else {
if (fallback) {
gtkui_get_tabstrip_mid_color (&clr_bg);
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ gdk_gc_set_rgb_fg_color (bg, &clr_bg);
+ gdk_gc_set_rgb_fg_color (outer_frame, (gtkui_get_tabstrip_dark_color (&clr_outer_frame), &clr_outer_frame));
+ gdk_gc_set_rgb_fg_color (inner_frame, (gtkui_get_tabstrip_mid_color (&clr_inner_frame), &clr_inner_frame));
+#else
gtkui_get_tabstrip_dark_color (&clr_outer_frame);
gtkui_get_tabstrip_mid_color (&clr_inner_frame);
+#endif
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ gdk_draw_polygon (drawable, bg, TRUE, points_filled, 4);
+ gdk_draw_lines (drawable, outer_frame, points_frame1, 9);
+ gdk_draw_lines (drawable, inner_frame, points_frame2, 7);
+ g_object_unref (bg);
+ g_object_unref (outer_frame);
+ g_object_unref (inner_frame);
+#else
cairo_set_source_rgb (cr, clr_bg.red/65535.f, clr_bg.green/65535.f, clr_bg.blue/65535.0);
cairo_new_path (cr);
cairo_draw_poly (cr, points_filled, 4);
@@ -428,6 +470,7 @@ ddb_tabstrip_draw_tab (GtkWidget *widget, cairo_t *cr, int idx, int selected, in
cairo_set_source_rgb (cr, clr_inner_frame.red/65535.f, clr_inner_frame.green/65535.f, clr_inner_frame.blue/65535.0);
cairo_draw_lines (cr, points_frame2, 7);
cairo_stroke (cr);
+#endif
}
int
@@ -436,7 +479,7 @@ ddb_tabstrip_get_tab_width (DdbTabStrip *ts, int tab) {
char title[100];
plt_get_title_wrapper (tab, title, sizeof (title));
int h = 0;
- draw_get_text_extents (title, strlen (title), &width, &h);
+ draw_get_text_extents (&ts->drawctx, title, strlen (title), &width, &h);
width += text_left_padding + text_right_padding;
if (width < min_tab_size) {
width = min_tab_size;
@@ -532,7 +575,7 @@ tabstrip_adjust_hscroll (DdbTabStrip *ts) {
}
void
-set_tab_text_color (int idx, int selected) {
+set_tab_text_color (DdbTabStrip *ts, int idx, int selected) {
if (idx == -1) {
return;
}
@@ -545,7 +588,7 @@ set_tab_text_color (int idx, int selected) {
if (3 == sscanf (clr, "%02x%02x%02x", &r, &g, &b)) {
fallback = 0;
float fg[3] = {(float)r/0xff, (float)g/0xff, (float)b/0xff};
- draw_set_fg_color (fg);
+ draw_set_fg_color (&ts->drawctx, fg);
}
}
deadbeef->plt_unref (plt);
@@ -553,7 +596,7 @@ set_tab_text_color (int idx, int selected) {
GdkColor color;
gtkui_get_tabstrip_text_color (&color);
float fg[3] = {(float)color.red/0xffff, (float)color.green/0xffff, (float)color.blue/0xffff};
- draw_set_fg_color (fg);
+ draw_set_fg_color (&ts->drawctx, fg);
}
deadbeef->pl_unlock ();
}
@@ -561,6 +604,9 @@ set_tab_text_color (int idx, int selected) {
void
tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
GtkWidget *widget = GTK_WIDGET (ts);
+#if !GTK_CHECK_VERSION(3,0,0)
+ GdkDrawable *backbuf = gtk_widget_get_window (widget);
+#endif
GtkAllocation a;
gtk_widget_get_allocation (widget, &a);
@@ -578,7 +624,7 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
int x = -hscroll;
int w = 0;
- int h = draw_get_font_size ();
+ int h = draw_get_font_size (&ts->drawctx);
h = a.height;
tab_overlap_size = (h-4)/2;
text_right_padding = h - 3;
@@ -589,6 +635,16 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
return;
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ GdkGC *gc = gdk_gc_new (backbuf);
+ // fill background
+ GdkColor clr;
+ gdk_gc_set_rgb_fg_color (gc, (gtkui_get_tabstrip_mid_color (&clr), &clr));
+ gdk_draw_rectangle (backbuf, gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
+ gdk_gc_set_rgb_fg_color (gc, (gtkui_get_tabstrip_dark_color (&clr), &clr));
+ gdk_draw_line (backbuf, gc, 0, 0, widget->allocation.width, 0);
+#else
+
// fill background
GdkColor clr;
gtkui_get_tabstrip_mid_color (&clr);
@@ -601,10 +657,11 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
cairo_move_to (cr, 0, 1);
cairo_line_to (cr, a.width, 1);
cairo_stroke (cr);
+#endif
int y = 4;
h = a.height - 4;
- draw_begin (cr);
+ draw_begin (&ts->drawctx, cr);
int need_draw_moving = 0;
int idx;
int widths[cnt];
@@ -612,7 +669,7 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
char title[100];
plt_get_title_wrapper (idx, title, sizeof (title));
int h = 0;
- draw_get_text_extents (title, strlen (title), &widths[idx], &h);
+ draw_get_text_extents (&ts->drawctx, title, strlen (title), &widths[idx], &h);
widths[idx] += text_left_padding + text_right_padding;
if (widths[idx] < min_tab_size) {
widths[idx] = min_tab_size;
@@ -629,15 +686,23 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
area.width = w;
area.height = 24;
if (idx != tab_selected) {
+#if !GTK_CHECK_VERSION(3,0,0)
+ ddb_tabstrip_draw_tab (widget, backbuf, idx, idx == tab_selected, x, y, w, h);
+#else
ddb_tabstrip_draw_tab (widget, cr, idx, idx == tab_selected, x, y, w, h);
+#endif
char tab_title[100];
plt_get_title_wrapper (idx, tab_title, sizeof (tab_title));
- set_tab_text_color (idx, tab_selected);
- draw_text (x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
+ set_tab_text_color (ts, idx, tab_selected);
+ draw_text (&ts->drawctx, x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
}
x += w - tab_overlap_size;
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ gdk_draw_line (backbuf, widget->style->dark_gc[GTK_STATE_NORMAL], 0, widget->allocation.height-2, widget->allocation.width, widget->allocation.height-2);
+ gdk_draw_line (backbuf, widget->style->light_gc[GTK_STATE_NORMAL], 0, widget->allocation.height-1, widget->allocation.width, widget->allocation.height-1);
+#else
GdkColor *pclr = &gtk_widget_get_style (widget)->dark[GTK_STATE_NORMAL];
cairo_set_source_rgb (cr, pclr->red/65535.f, pclr->green/65535.f, pclr->blue/65535.0);
cairo_move_to (cr, 0, a.height-1);
@@ -648,6 +713,7 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
cairo_move_to (cr, 0, a.height);
cairo_line_to (cr, a.width, a.height);
cairo_stroke (cr);
+#endif
// calc position for drawin selected tab
x = -hscroll;
for (idx = 0; idx < tab_selected; idx++) {
@@ -663,11 +729,15 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
area.y = 0;
area.width = w;
area.height = 24;
+#if !GTK_CHECK_VERSION(3,0,0)
+ ddb_tabstrip_draw_tab (widget, backbuf, idx, 1, x, y, w, h);
+#else
ddb_tabstrip_draw_tab (widget, cr, idx, 1, x, y, w, h);
+#endif
char tab_title[100];
plt_get_title_wrapper (idx, tab_title, sizeof (tab_title));
- set_tab_text_color (idx, tab_selected);
- draw_text (x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
+ set_tab_text_color (ts, idx, tab_selected);
+ draw_text (&ts->drawctx, x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
}
else {
need_draw_moving = 1;
@@ -682,17 +752,32 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
break;
}
if (w > 0) {
+#if !GTK_CHECK_VERSION(3,0,0)
+ ddb_tabstrip_draw_tab (widget, backbuf, idx, 1, x, y, w, h);
+#else
ddb_tabstrip_draw_tab (widget, cr, idx, 1, x, y, w, h);
+#endif
char tab_title[100];
plt_get_title_wrapper (idx, tab_title, sizeof (tab_title));
- set_tab_text_color (idx, tab_selected);
- draw_text (x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
+ set_tab_text_color (ts, idx, tab_selected);
+ draw_text (&ts->drawctx, x + text_left_padding, y - text_vert_offset, w, 0, tab_title);
}
break;
}
x += w - tab_overlap_size;
}
}
+#if !GTK_CHECK_VERSION(3,0,0)
+ if (need_arrows) {
+ int sz = widget->allocation.height-3;
+ GdkColor clr;
+ gdk_gc_set_rgb_fg_color (gc, (gtkui_get_tabstrip_mid_color (&clr), &clr));
+ gdk_draw_rectangle (backbuf, gc, TRUE, 0, 1, arrow_widget_width, sz);
+ gtk_paint_arrow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, widget, NULL, GTK_ARROW_LEFT, TRUE, 2, sz/2-arrow_sz/2, arrow_sz, arrow_sz);
+ gdk_draw_rectangle (backbuf, gc, TRUE, widget->allocation.width-arrow_widget_width, 1, arrow_widget_width, sz);
+ gtk_paint_arrow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, widget, NULL, GTK_ARROW_RIGHT, TRUE, widget->allocation.width-arrow_sz-2, 1+sz/2-arrow_sz/2, arrow_sz, arrow_sz);
+ }
+#else
if (need_arrows) {
int sz = a.height-3;
gtkui_get_tabstrip_mid_color (&clr);
@@ -713,8 +798,9 @@ tabstrip_render (DdbTabStrip *ts, cairo_t *cr) {
gtk_paint_arrow (gtk_widget_get_style (widget), gtk_widget_get_window(widget), GTK_STATE_NORMAL, GTK_SHADOW_NONE, NULL, widget, NULL, GTK_ARROW_RIGHT, TRUE, a.width-arrow_sz-2, 1+sz/2-arrow_sz/2, arrow_sz, arrow_sz);
#endif
}
+#endif
- draw_end ();
+ draw_end (&ts->drawctx);
}
static int
@@ -733,7 +819,7 @@ get_tab_under_cursor (DdbTabStrip *ts, int x) {
plt_get_title_wrapper (idx, title, sizeof (title));
int w = 0;
int h = 0;
- draw_get_text_extents (title, strlen (title), &w, &h);
+ draw_get_text_extents (&ts->drawctx, title, strlen (title), &w, &h);
w += text_left_padding + text_right_padding;
if (w < min_tab_size) {
w = min_tab_size;
@@ -1151,10 +1237,10 @@ gboolean
on_tabstrip_configure_event (GtkWidget *widget,
GdkEventConfigure *event)
{
- draw_init_font (gtk_widget_get_style (widget));
DdbTabStrip *ts = DDB_TABSTRIP (widget);
+ draw_init_font (&ts->drawctx, gtk_widget_get_style (widget));
tabstrip_adjust_hscroll (ts);
- int height = draw_get_listview_rowheight () + 4;
+ int height = draw_get_listview_rowheight (&ts->drawctx) + 4;
GtkAllocation a;
gtk_widget_get_allocation (widget, &a);
if (height != a.height) {
@@ -1189,7 +1275,7 @@ on_tabstrip_motion_notify_event (GtkWidget *widget,
ev_x = event->x;
ev_y = event->y;
ev_state = event->state;
-#if GTK_CHECK_VERSION(2,12,0) && !defined(ULTRA_COMPATIBLE)
+#if GTK_CHECK_VERSION(2,12,0)
gdk_event_request_motions (event);
#endif
if ((ev_state & GDK_BUTTON1_MASK) && ts->prepare) {
diff --git a/plugins/gtkui/ddbtabstrip.h b/plugins/gtkui/ddbtabstrip.h
index a34eb5eb..f5f95599 100644
--- a/plugins/gtkui/ddbtabstrip.h
+++ b/plugins/gtkui/ddbtabstrip.h
@@ -20,6 +20,7 @@
#define __DDBTABSTRIP_H
#include <gtk/gtk.h>
+#include "drawing.h"
G_BEGIN_DECLS
@@ -46,6 +47,7 @@ struct _DdbTabStrip {
int movepos;
guint scroll_timer;
int scroll_direction;
+ drawctx_t drawctx;
};
struct _DdbTabStripClass {
diff --git a/plugins/gtkui/ddbvolumebar.c b/plugins/gtkui/ddbvolumebar.c
index 7c74cbec..ae7f5420 100644
--- a/plugins/gtkui/ddbvolumebar.c
+++ b/plugins/gtkui/ddbvolumebar.c
@@ -123,6 +123,7 @@ ddb_volumebar_init(DdbVolumeBar *volumebar)
snprintf (s, sizeof (s), "%s%ddB", db < 0 ? "" : "+", db);
gtk_widget_set_tooltip_text (GTK_WIDGET (volumebar), s);
gtk_widget_set_has_window (GTK_WIDGET (volumebar), FALSE);
+ gtk_widget_set_events (GTK_WIDGET (volumebar), GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
}
void
diff --git a/plugins/gtkui/deadbeef.glade b/plugins/gtkui/deadbeef.glade
index 820c30a1..907a35be 100644
--- a/plugins/gtkui/deadbeef.glade
+++ b/plugins/gtkui/deadbeef.glade
@@ -62,7 +62,7 @@
<accelerator key="O" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
- <widget class="GtkImage" id="image563">
+ <widget class="GtkImage" id="image587">
<property name="visible">True</property>
<property name="stock">gtk-open</property>
<property name="icon_size">1</property>
@@ -89,7 +89,7 @@
<signal name="activate" handler="on_add_files_activate" last_modification_time="Sat, 04 Jul 2009 13:04:01 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image564">
+ <widget class="GtkImage" id="image588">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon_size">1</property>
@@ -110,7 +110,7 @@
<signal name="activate" handler="on_add_folders_activate" last_modification_time="Sun, 06 Sep 2009 17:51:40 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image565">
+ <widget class="GtkImage" id="image589">
<property name="visible">True</property>
<property name="stock">gtk-add</property>
<property name="icon_size">1</property>
@@ -181,7 +181,7 @@
<accelerator key="Q" modifiers="GDK_CONTROL_MASK" signal="activate"/>
<child internal-child="image">
- <widget class="GtkImage" id="image566">
+ <widget class="GtkImage" id="image590">
<property name="visible">True</property>
<property name="stock">gtk-quit</property>
<property name="icon_size">1</property>
@@ -215,7 +215,7 @@
<signal name="activate" handler="on_clear1_activate" last_modification_time="Sun, 06 Sep 2009 18:30:03 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image567">
+ <widget class="GtkImage" id="image591">
<property name="visible">True</property>
<property name="stock">gtk-clear</property>
<property name="icon_size">1</property>
@@ -274,7 +274,7 @@
<signal name="activate" handler="on_remove1_activate" last_modification_time="Sun, 06 Sep 2009 18:30:03 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image568">
+ <widget class="GtkImage" id="image592">
<property name="visible">True</property>
<property name="stock">gtk-remove</property>
<property name="icon_size">1</property>
@@ -313,7 +313,7 @@
<child>
<widget class="GtkMenuItem" id="sort_by1">
<property name="visible">True</property>
- <property name="label" translatable="yes">Sort By</property>
+ <property name="label" translatable="yes">Sort by</property>
<property name="use_underline">True</property>
<child>
@@ -545,7 +545,7 @@
<child>
<widget class="GtkRadioMenuItem" id="loop_all">
<property name="visible">True</property>
- <property name="label" translatable="yes">Loop All</property>
+ <property name="label" translatable="yes">Loop all</property>
<property name="use_underline">True</property>
<property name="active">True</property>
<signal name="activate" handler="on_loop_all_activate" last_modification_time="Sat, 08 Aug 2009 12:26:33 GMT"/>
@@ -555,7 +555,7 @@
<child>
<widget class="GtkRadioMenuItem" id="loop_single">
<property name="visible">True</property>
- <property name="label" translatable="yes">Loop Single Song</property>
+ <property name="label" translatable="yes">Loop single song</property>
<property name="use_underline">True</property>
<property name="active">True</property>
<property name="group">loop_all</property>
@@ -566,7 +566,7 @@
<child>
<widget class="GtkRadioMenuItem" id="loop_disable">
<property name="visible">True</property>
- <property name="label" translatable="yes">Don't Loop</property>
+ <property name="label" translatable="yes">Don't loop</property>
<property name="use_underline">True</property>
<property name="active">True</property>
<property name="group">loop_all</property>
@@ -646,7 +646,7 @@
<signal name="activate" handler="on_help1_activate" last_modification_time="Tue, 08 Sep 2009 17:32:06 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image569">
+ <widget class="GtkImage" id="image593">
<property name="visible">True</property>
<property name="stock">gtk-help</property>
<property name="icon_size">1</property>
@@ -706,7 +706,7 @@
<signal name="activate" handler="on_about1_activate" last_modification_time="Sat, 04 Jul 2009 12:57:58 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image570">
+ <widget class="GtkImage" id="image594">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
<property name="icon_size">1</property>
@@ -727,7 +727,7 @@
<signal name="activate" handler="on_translators1_activate" last_modification_time="Sun, 19 Sep 2010 13:38:07 GMT"/>
<child internal-child="image">
- <widget class="GtkImage" id="image571">
+ <widget class="GtkImage" id="image595">
<property name="visible">True</property>
<property name="stock">gtk-about</property>
<property name="icon_size">1</property>
@@ -798,6 +798,7 @@
<signal name="clicked" handler="on_playbtn_clicked" last_modification_time="Sun, 05 Jul 2009 10:48:53 GMT"/>
<accelerator key="x" modifiers="0" signal="activate"/>
<accelerator key="Return" modifiers="0" signal="activate"/>
+ <accelerator key="KP_Enter" modifiers="0" signal="activate"/>
<child>
<widget class="GtkImage" id="image2">
@@ -1001,10 +1002,9 @@
<child>
<widget class="GtkVBox" id="vbox4">
- <property name="border_width">4</property>
<property name="visible">True</property>
<property name="homogeneous">False</property>
- <property name="spacing">0</property>
+ <property name="spacing">4</property>
<child>
<widget class="GtkEntry" id="searchentry">
@@ -1027,21 +1027,12 @@
</child>
<child>
- <widget class="GtkFrame" id="frame2">
+ <widget class="Custom" id="searchlist">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="label_yalign">0.5</property>
- <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property>
-
- <child>
- <widget class="Custom" id="searchlist">
- <property name="visible">True</property>
- <property name="creation_function">create_ddb_listview_widget</property>
- <property name="int1">0</property>
- <property name="int2">0</property>
- <property name="last_modification_time">Sat, 13 Feb 2010 20:26:18 GMT</property>
- </widget>
- </child>
+ <property name="creation_function">create_ddb_listview_widget</property>
+ <property name="int1">0</property>
+ <property name="int2">0</property>
+ <property name="last_modification_time">Sat, 13 Feb 2010 20:26:18 GMT</property>
</widget>
<packing>
<property name="padding">0</property>
@@ -2121,6 +2112,7 @@
<property name="has_frame">True</property>
<property name="invisible_char">●</property>
<property name="activates_default">True</property>
+ <signal name="changed" handler="on_editcolumn_title_changed" last_modification_time="Sun, 05 Aug 2012 10:23:04 GMT"/>
</widget>
<packing>
<property name="padding">0</property>
@@ -3438,6 +3430,46 @@ Album</property>
</child>
<child>
+ <widget class="GtkCheckButton" id="enable_cp1251_recoding">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Enable Russian CP1251 detection and recoding</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_enable_cp1251_recoding_toggled" last_modification_time="Mon, 03 Sep 2012 16:36:19 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="enable_cp936_recoding">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Enable Chinese CP936 detection and recoding</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ <signal name="toggled" handler="on_enable_cp936_recoding_toggled" last_modification_time="Mon, 03 Sep 2012 16:36:16 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkHBox" id="hbox102">
<property name="visible">True</property>
<property name="homogeneous">False</property>
@@ -3671,7 +3703,7 @@ Album</property>
<child>
<widget class="GtkLabel" id="label2">
<property name="visible">True</property>
- <property name="label" translatable="yes">GUI</property>
+ <property name="label" translatable="yes">GUI/Misc</property>
<property name="use_underline">False</property>
<property name="use_markup">False</property>
<property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -4861,6 +4893,75 @@ SOCKS5_HOSTNAME</property>
<property name="fill">False</property>
</packing>
</child>
+
+ <child>
+ <widget class="GtkHSeparator" id="hseparator1">
+ <property name="visible">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkHBox" id="hbox104">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkLabel" id="label131">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">HTTP User Agent:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0.5</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="useragent">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">False</property>
+ <signal name="changed" handler="on_useragent_changed" last_modification_time="Thu, 16 Aug 2012 18:24:48 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="tab_expand">False</property>
@@ -5774,7 +5875,7 @@ SOCKS5_HOSTNAME</property>
<widget class="GtkDialog" id="groupbydlg">
<property name="visible">True</property>
- <property name="title" translatable="yes">Group By</property>
+ <property name="title" translatable="yes">Group By ...</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">False</property>
@@ -6062,7 +6163,7 @@ SOCKS5_HOSTNAME</property>
<widget class="GtkDialog" id="sortbydlg">
<property name="visible">True</property>
- <property name="title" translatable="yes">Sort by...</property>
+ <property name="title" translatable="yes">Sort by ...</property>
<property name="type">GTK_WINDOW_TOPLEVEL</property>
<property name="window_position">GTK_WIN_POS_NONE</property>
<property name="modal">True</property>
diff --git a/plugins/gtkui/drawing.h b/plugins/gtkui/drawing.h
index 6d573346..0a7fd17f 100644
--- a/plugins/gtkui/drawing.h
+++ b/plugins/gtkui/drawing.h
@@ -21,50 +21,63 @@
#include <stdint.h>
+typedef struct {
+ cairo_t *drawable;
+ GdkColor clrfg;
+ GdkColor clrbg;
+ int pango_ready;
+ PangoContext *pangoctx;
+ PangoLayout *pangolayout;
+ GtkStyle *font_style;
+ PangoWeight font_weight;
+} drawctx_t;
+
// abstract api for drawing primitives
void
-draw_init (void);
+drawctx_init (drawctx_t *ctx);
void
-draw_free (void);
+draw_begin (drawctx_t *ctx, cairo_t *cr);
void
-draw_begin (cairo_t *cr);
+draw_end (drawctx_t *ctx);
void
-draw_end (void);
+draw_free (drawctx_t *ctx);
void
-draw_set_fg_color (float *rgb);
+draw_set_fg_color (drawctx_t *ctx, float *rgb);
void
-draw_line (float x1, float y1, float x2, float y2);
+draw_line (drawctx_t *ctx, float x1, float y1, float x2, float y2);
void
-draw_rect (float x, float y, float w, float h, int fill);
+draw_rect (drawctx_t *ctx, float x, float y, float w, float h, int fill);
float
-draw_get_font_size (void);
+draw_get_font_size (drawctx_t *ctx);
void
-draw_init_font (GtkStyle *style);
+draw_init_font (drawctx_t *ctx, GtkStyle *style);
void
-draw_init_font_bold (void);
+draw_init_font_bold (drawctx_t *ctx);
void
-draw_init_font_normal (void);
+draw_init_font_normal (drawctx_t *ctx);
void
-draw_text (float x, float y, int width, int align, const char *text);
+draw_text (drawctx_t *ctx, float x, float y, int width, int align, const char *text);
void
-draw_text_with_colors (float x, float y, int width, int align, const char *text);
+draw_text_with_colors (drawctx_t *ctx, float x, float y, int width, int align, const char *text);
void
-draw_get_text_extents (const char *text, int len, int *w, int *h);
+draw_get_text_extents (drawctx_t *ctx, const char *text, int len, int *w, int *h);
+int
+draw_get_listview_rowheight (drawctx_t *ctx);
void
gtkui_get_bar_foreground_color (GdkColor *clr);
@@ -117,7 +130,4 @@ gtkui_override_bar_colors (void);
int
gtkui_override_tabstrip_colors (void);
-int
-draw_get_listview_rowheight (void);
-
#endif // __DRAWING_H
diff --git a/plugins/gtkui/dspconfig.c b/plugins/gtkui/dspconfig.c
index 95767284..adb95f84 100644
--- a/plugins/gtkui/dspconfig.c
+++ b/plugins/gtkui/dspconfig.c
@@ -142,6 +142,9 @@ dsp_setup_init (GtkWidget *_prefwin) {
gtk_tree_view_set_model (GTK_TREE_VIEW (listview), GTK_TREE_MODEL (mdl));
fill_dsp_chain (mdl);
+ GtkTreePath *path = gtk_tree_path_new_from_indices (0, -1);
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (listview), path, NULL, FALSE);
+ gtk_tree_path_free (path);
GtkWidget *combobox = lookup_widget (prefwin, "dsp_preset");
dsp_fill_preset_list (combobox);
@@ -234,9 +237,9 @@ listview_get_index (GtkWidget *list) {
GtkTreePath *path;
GtkTreeViewColumn *col;
gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col);
- if (!path || !col) {
+ if (!path) {
// nothing selected
- return - 1;
+ return -1;
}
int *indices = gtk_tree_path_get_indices (path);
int idx = *indices;
@@ -305,16 +308,7 @@ on_dsp_configure_clicked (GtkButton *button,
gpointer user_data)
{
GtkWidget *list = lookup_widget (prefwin, "dsp_listview");
- GtkTreePath *path;
- GtkTreeViewColumn *col;
- gtk_tree_view_get_cursor (GTK_TREE_VIEW (list), &path, &col);
- if (!path || !col) {
- // nothing selected
- return;
- }
- int *indices = gtk_tree_path_get_indices (path);
- int idx = *indices;
- g_free (indices);
+ int idx = listview_get_index (list);
if (idx == -1) {
return;
}
diff --git a/plugins/gtkui/eq.c b/plugins/gtkui/eq.c
index 101c3c35..63018a75 100644
--- a/plugins/gtkui/eq.c
+++ b/plugins/gtkui/eq.c
@@ -443,3 +443,17 @@ eq_redraw (void) {
}
}
+void
+eq_refresh (void) {
+ ddb_dsp_context_t *eq = get_supereq ();
+ if (eq && eqwin) {
+ char s[20];
+ eq->plugin->get_param (eq, 0, s, sizeof (s));
+ ddb_equalizer_set_preamp (DDB_EQUALIZER (eqwin), atof(s));
+ for (int i = 0; i < 18; i++) {
+ eq->plugin->get_param (eq, i+1, s, sizeof (s));
+ ddb_equalizer_set_band (DDB_EQUALIZER (eqwin), i, atoi(s));
+ }
+ eq_redraw ();
+ }
+}
diff --git a/plugins/gtkui/eq.h b/plugins/gtkui/eq.h
index f9227278..d269f160 100644
--- a/plugins/gtkui/eq.h
+++ b/plugins/gtkui/eq.h
@@ -35,4 +35,7 @@ get_supereq (void);
void
eq_redraw (void);
+void
+eq_refresh (void);
+
#endif
diff --git a/plugins/gtkui/fileman.c b/plugins/gtkui/fileman.c
index 69f016af..72a5dfa8 100644
--- a/plugins/gtkui/fileman.c
+++ b/plugins/gtkui/fileman.c
@@ -27,6 +27,7 @@ gtkpl_adddir_cb (gpointer data, gpointer userdata) {
void
gtkpl_add_dirs (GSList *lst) {
ddb_playlist_t *plt = deadbeef->plt_get_curr ();
+ int empty = 0 == deadbeef->plt_get_item_count (plt, PL_MAIN);
if (deadbeef->pl_add_files_begin (plt) < 0) {
deadbeef->plt_unref (plt);
g_slist_free (lst);
@@ -38,7 +39,7 @@ gtkpl_add_dirs (GSList *lst) {
char t[1000];
if (!deadbeef->plt_get_title (plt, t, sizeof (t))) {
char *def = _("New Playlist");
- if (!strncmp (t, def, strlen (def))) {
+ if (!strncmp (t, def, strlen (def)) || empty) {
const char *folder = strrchr ((char*)lst->data, '/');
if (!folder) {
folder = lst->data;
diff --git a/plugins/gtkui/gdk-keysyms.vapi b/plugins/gtkui/gdk-keysyms.vapi
deleted file mode 100644
index 48253395..00000000
--- a/plugins/gtkui/gdk-keysyms.vapi
+++ /dev/null
@@ -1,2198 +0,0 @@
-/*
- DeaDBeeF - ultimate music player for GNU/Linux systems with X11
- Copyright (C) 2009-2010 Alexey Yakovenko <waker@users.sourceforge.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-*/
-
-namespace Gdk {
- [CCode (cprefix = "GDK_", cheader_filename = "gdk/gdkkeysyms.h")]
- public enum KeySyms {
- VoidSymbol,
- BackSpace,
- Tab,
- Linefeed,
- Clear,
- Return,
- Pause,
- Scroll_Lock,
- Sys_Req,
- Escape,
- Delete,
- Multi_key,
- Codeinput,
- SingleCandidate,
- MultipleCandidate,
- PreviousCandidate,
- Kanji,
- Muhenkan,
- Henkan_Mode,
- Henkan,
- Romaji,
- Hiragana,
- Katakana,
- Hiragana_Katakana,
- Zenkaku,
- Hankaku,
- Zenkaku_Hankaku,
- Touroku,
- Massyo,
- Kana_Lock,
- Kana_Shift,
- Eisu_Shift,
- Eisu_toggle,
- Kanji_Bangou,
- Zen_Koho,
- Mae_Koho,
- Home,
- Left,
- Up,
- Right,
- Down,
- Prior,
- Page_Up,
- Next,
- Page_Down,
- End,
- Begin,
- Select,
- Print,
- Execute,
- Insert,
- Undo,
- Redo,
- Menu,
- Find,
- Cancel,
- Help,
- Break,
- Mode_switch,
- script_switch,
- Num_Lock,
- KP_Space,
- KP_Tab,
- KP_Enter,
- KP_F1,
- KP_F2,
- KP_F3,
- KP_F4,
- KP_Home,
- KP_Left,
- KP_Up,
- KP_Right,
- KP_Down,
- KP_Prior,
- KP_Page_Up,
- KP_Next,
- KP_Page_Down,
- KP_End,
- KP_Begin,
- KP_Insert,
- KP_Delete,
- KP_Equal,
- KP_Multiply,
- KP_Add,
- KP_Separator,
- KP_Subtract,
- KP_Decimal,
- KP_Divide,
- KP_0,
- KP_1,
- KP_2,
- KP_3,
- KP_4,
- KP_5,
- KP_6,
- KP_7,
- KP_8,
- KP_9,
- F1,
- F2,
- F3,
- F4,
- F5,
- F6,
- F7,
- F8,
- F9,
- F10,
- F11,
- L1,
- F12,
- L2,
- F13,
- L3,
- F14,
- L4,
- F15,
- L5,
- F16,
- L6,
- F17,
- L7,
- F18,
- L8,
- F19,
- L9,
- F20,
- L10,
- F21,
- R1,
- F22,
- R2,
- F23,
- R3,
- F24,
- R4,
- F25,
- R5,
- F26,
- R6,
- F27,
- R7,
- F28,
- R8,
- F29,
- R9,
- F30,
- R10,
- F31,
- R11,
- F32,
- R12,
- F33,
- R13,
- F34,
- R14,
- F35,
- R15,
- Shift_L,
- Shift_R,
- Control_L,
- Control_R,
- Caps_Lock,
- Shift_Lock,
- Meta_L,
- Meta_R,
- Alt_L,
- Alt_R,
- Super_L,
- Super_R,
- Hyper_L,
- Hyper_R,
- ISO_Lock,
- ISO_Level2_Latch,
- ISO_Level3_Shift,
- ISO_Level3_Latch,
- ISO_Level3_Lock,
- ISO_Level5_Shift,
- ISO_Level5_Latch,
- ISO_Level5_Lock,
- ISO_Group_Shift,
- ISO_Group_Latch,
- ISO_Group_Lock,
- ISO_Next_Group,
- ISO_Next_Group_Lock,
- ISO_Prev_Group,
- ISO_Prev_Group_Lock,
- ISO_First_Group,
- ISO_First_Group_Lock,
- ISO_Last_Group,
- ISO_Last_Group_Lock,
- ISO_Left_Tab,
- ISO_Move_Line_Up,
- ISO_Move_Line_Down,
- ISO_Partial_Line_Up,
- ISO_Partial_Line_Down,
- ISO_Partial_Space_Left,
- ISO_Partial_Space_Right,
- ISO_Set_Margin_Left,
- ISO_Set_Margin_Right,
- ISO_Release_Margin_Left,
- ISO_Release_Margin_Right,
- ISO_Release_Both_Margins,
- ISO_Fast_Cursor_Left,
- ISO_Fast_Cursor_Right,
- ISO_Fast_Cursor_Up,
- ISO_Fast_Cursor_Down,
- ISO_Continuous_Underline,
- ISO_Discontinuous_Underline,
- ISO_Emphasize,
- ISO_Center_Object,
- ISO_Enter,
- dead_grave,
- dead_acute,
- dead_circumflex,
- dead_tilde,
- dead_perispomeni,
- dead_macron,
- dead_breve,
- dead_abovedot,
- dead_diaeresis,
- dead_abovering,
- dead_doubleacute,
- dead_caron,
- dead_cedilla,
- dead_ogonek,
- dead_iota,
- dead_voiced_sound,
- dead_semivoiced_sound,
- dead_belowdot,
- dead_hook,
- dead_horn,
- dead_stroke,
- dead_abovecomma,
- dead_psili,
- dead_abovereversedcomma,
- dead_dasia,
- dead_doublegrave,
- dead_belowring,
- dead_belowmacron,
- dead_belowcircumflex,
- dead_belowtilde,
- dead_belowbreve,
- dead_belowdiaeresis,
- dead_invertedbreve,
- dead_belowcomma,
- dead_currency,
- dead_a,
- dead_A,
- dead_e,
- dead_E,
- dead_i,
- dead_I,
- dead_o,
- dead_O,
- dead_u,
- dead_U,
- dead_small_schwa,
- dead_capital_schwa,
- First_Virtual_Screen,
- Prev_Virtual_Screen,
- Next_Virtual_Screen,
- Last_Virtual_Screen,
- Terminate_Server,
- AccessX_Enable,
- AccessX_Feedback_Enable,
- RepeatKeys_Enable,
- SlowKeys_Enable,
- BounceKeys_Enable,
- StickyKeys_Enable,
- MouseKeys_Enable,
- MouseKeys_Accel_Enable,
- Overlay1_Enable,
- Overlay2_Enable,
- AudibleBell_Enable,
- Pointer_Left,
- Pointer_Right,
- Pointer_Up,
- Pointer_Down,
- Pointer_UpLeft,
- Pointer_UpRight,
- Pointer_DownLeft,
- Pointer_DownRight,
- Pointer_Button_Dflt,
- Pointer_Button1,
- Pointer_Button2,
- Pointer_Button3,
- Pointer_Button4,
- Pointer_Button5,
- Pointer_DblClick_Dflt,
- Pointer_DblClick1,
- Pointer_DblClick2,
- Pointer_DblClick3,
- Pointer_DblClick4,
- Pointer_DblClick5,
- Pointer_Drag_Dflt,
- Pointer_Drag1,
- Pointer_Drag2,
- Pointer_Drag3,
- Pointer_Drag4,
- Pointer_Drag5,
- Pointer_EnableKeys,
- Pointer_Accelerate,
- Pointer_DfltBtnNext,
- Pointer_DfltBtnPrev,
- 3270_Duplicate,
- 3270_FieldMark,
- 3270_Right2,
- 3270_Left2,
- 3270_BackTab,
- 3270_EraseEOF,
- 3270_EraseInput,
- 3270_Reset,
- 3270_Quit,
- 3270_PA1,
- 3270_PA2,
- 3270_PA3,
- 3270_Test,
- 3270_Attn,
- 3270_CursorBlink,
- 3270_AltCursor,
- 3270_KeyClick,
- 3270_Jump,
- 3270_Ident,
- 3270_Rule,
- 3270_Copy,
- 3270_Play,
- 3270_Setup,
- 3270_Record,
- 3270_ChangeScreen,
- 3270_DeleteWord,
- 3270_ExSelect,
- 3270_CursorSelect,
- 3270_PrintScreen,
- 3270_Enter,
- space,
- exclam,
- quotedbl,
- numbersign,
- dollar,
- percent,
- ampersand,
- apostrophe,
- quoteright,
- parenleft,
- parenright,
- asterisk,
- plus,
- comma,
- minus,
- period,
- slash,
- _0,
- _1,
- _2,
- _3,
- _4,
- _5,
- _6,
- _7,
- _8,
- _9,
- colon,
- semicolon,
- less,
- equal,
- greater,
- question,
- at,
- A,
- B,
- C,
- D,
- E,
- F,
- G,
- H,
- I,
- J,
- K,
- L,
- M,
- N,
- O,
- P,
- Q,
- R,
- S,
- T,
- U,
- V,
- W,
- X,
- Y,
- Z,
- bracketleft,
- backslash,
- bracketright,
- asciicircum,
- underscore,
- grave,
- quoteleft,
- a,
- b,
- c,
- d,
- e,
- f,
- g,
- h,
- i,
- j,
- k,
- l,
- m,
- n,
- o,
- p,
- q,
- r,
- s,
- t,
- u,
- v,
- w,
- x,
- y,
- z,
- braceleft,
- bar,
- braceright,
- asciitilde,
- nobreakspace,
- exclamdown,
- cent,
- sterling,
- currency,
- yen,
- brokenbar,
- section,
- diaeresis,
- copyright,
- ordfeminine,
- guillemotleft,
- notsign,
- hyphen,
- registered,
- macron,
- degree,
- plusminus,
- twosuperior,
- threesuperior,
- acute,
- mu,
- paragraph,
- periodcentered,
- cedilla,
- onesuperior,
- masculine,
- guillemotright,
- onequarter,
- onehalf,
- threequarters,
- questiondown,
- Agrave,
- Aacute,
- Acircumflex,
- Atilde,
- Adiaeresis,
- Aring,
- AE,
- Ccedilla,
- Egrave,
- Eacute,
- Ecircumflex,
- Ediaeresis,
- Igrave,
- Iacute,
- Icircumflex,
- Idiaeresis,
- ETH,
- Eth,
- Ntilde,
- Ograve,
- Oacute,
- Ocircumflex,
- Otilde,
- Odiaeresis,
- multiply,
- Oslash,
- Ooblique,
- Ugrave,
- Uacute,
- Ucircumflex,
- Udiaeresis,
- Yacute,
- THORN,
- Thorn,
- ssharp,
- agrave,
- aacute,
- acircumflex,
- atilde,
- adiaeresis,
- aring,
- ae,
- ccedilla,
- egrave,
- eacute,
- ecircumflex,
- ediaeresis,
- igrave,
- iacute,
- icircumflex,
- idiaeresis,
- eth,
- ntilde,
- ograve,
- oacute,
- ocircumflex,
- otilde,
- odiaeresis,
- division,
- oslash,
- ooblique,
- ugrave,
- uacute,
- ucircumflex,
- udiaeresis,
- yacute,
- thorn,
- ydiaeresis,
- Aogonek,
- breve,
- Lstroke,
- Lcaron,
- Sacute,
- Scaron,
- Scedilla,
- Tcaron,
- Zacute,
- Zcaron,
- Zabovedot,
- aogonek,
- ogonek,
- lstroke,
- lcaron,
- sacute,
- caron,
- scaron,
- scedilla,
- tcaron,
- zacute,
- doubleacute,
- zcaron,
- zabovedot,
- Racute,
- Abreve,
- Lacute,
- Cacute,
- Ccaron,
- Eogonek,
- Ecaron,
- Dcaron,
- Dstroke,
- Nacute,
- Ncaron,
- Odoubleacute,
- Rcaron,
- Uring,
- Udoubleacute,
- Tcedilla,
- racute,
- abreve,
- lacute,
- cacute,
- ccaron,
- eogonek,
- ecaron,
- dcaron,
- dstroke,
- nacute,
- ncaron,
- odoubleacute,
- udoubleacute,
- rcaron,
- uring,
- tcedilla,
- abovedot,
- Hstroke,
- Hcircumflex,
- Iabovedot,
- Gbreve,
- Jcircumflex,
- hstroke,
- hcircumflex,
- idotless,
- gbreve,
- jcircumflex,
- Cabovedot,
- Ccircumflex,
- Gabovedot,
- Gcircumflex,
- Ubreve,
- Scircumflex,
- cabovedot,
- ccircumflex,
- gabovedot,
- gcircumflex,
- ubreve,
- scircumflex,
- kra,
- kappa,
- Rcedilla,
- Itilde,
- Lcedilla,
- Emacron,
- Gcedilla,
- Tslash,
- rcedilla,
- itilde,
- lcedilla,
- emacron,
- gcedilla,
- tslash,
- ENG,
- eng,
- Amacron,
- Iogonek,
- Eabovedot,
- Imacron,
- Ncedilla,
- Omacron,
- Kcedilla,
- Uogonek,
- Utilde,
- Umacron,
- amacron,
- iogonek,
- eabovedot,
- imacron,
- ncedilla,
- omacron,
- kcedilla,
- uogonek,
- utilde,
- umacron,
- Babovedot,
- babovedot,
- Dabovedot,
- Wgrave,
- Wacute,
- dabovedot,
- Ygrave,
- Fabovedot,
- fabovedot,
- Mabovedot,
- mabovedot,
- Pabovedot,
- wgrave,
- pabovedot,
- wacute,
- Sabovedot,
- ygrave,
- Wdiaeresis,
- wdiaeresis,
- sabovedot,
- Wcircumflex,
- Tabovedot,
- Ycircumflex,
- wcircumflex,
- tabovedot,
- ycircumflex,
- OE,
- oe,
- Ydiaeresis,
- overline,
- kana_fullstop,
- kana_openingbracket,
- kana_closingbracket,
- kana_comma,
- kana_conjunctive,
- kana_middledot,
- kana_WO,
- kana_a,
- kana_i,
- kana_u,
- kana_e,
- kana_o,
- kana_ya,
- kana_yu,
- kana_yo,
- kana_tsu,
- kana_tu,
- prolongedsound,
- kana_A,
- kana_I,
- kana_U,
- kana_E,
- kana_O,
- kana_KA,
- kana_KI,
- kana_KU,
- kana_KE,
- kana_KO,
- kana_SA,
- kana_SHI,
- kana_SU,
- kana_SE,
- kana_SO,
- kana_TA,
- kana_CHI,
- kana_TI,
- kana_TSU,
- kana_TU,
- kana_TE,
- kana_TO,
- kana_NA,
- kana_NI,
- kana_NU,
- kana_NE,
- kana_NO,
- kana_HA,
- kana_HI,
- kana_FU,
- kana_HU,
- kana_HE,
- kana_HO,
- kana_MA,
- kana_MI,
- kana_MU,
- kana_ME,
- kana_MO,
- kana_YA,
- kana_YU,
- kana_YO,
- kana_RA,
- kana_RI,
- kana_RU,
- kana_RE,
- kana_RO,
- kana_WA,
- kana_N,
- voicedsound,
- semivoicedsound,
- kana_switch,
- Farsi_0,
- Farsi_1,
- Farsi_2,
- Farsi_3,
- Farsi_4,
- Farsi_5,
- Farsi_6,
- Farsi_7,
- Farsi_8,
- Farsi_9,
- Arabic_percent,
- Arabic_superscript_alef,
- Arabic_tteh,
- Arabic_peh,
- Arabic_tcheh,
- Arabic_ddal,
- Arabic_rreh,
- Arabic_comma,
- Arabic_fullstop,
- Arabic_0,
- Arabic_1,
- Arabic_2,
- Arabic_3,
- Arabic_4,
- Arabic_5,
- Arabic_6,
- Arabic_7,
- Arabic_8,
- Arabic_9,
- Arabic_semicolon,
- Arabic_question_mark,
- Arabic_hamza,
- Arabic_maddaonalef,
- Arabic_hamzaonalef,
- Arabic_hamzaonwaw,
- Arabic_hamzaunderalef,
- Arabic_hamzaonyeh,
- Arabic_alef,
- Arabic_beh,
- Arabic_tehmarbuta,
- Arabic_teh,
- Arabic_theh,
- Arabic_jeem,
- Arabic_hah,
- Arabic_khah,
- Arabic_dal,
- Arabic_thal,
- Arabic_ra,
- Arabic_zain,
- Arabic_seen,
- Arabic_sheen,
- Arabic_sad,
- Arabic_dad,
- Arabic_tah,
- Arabic_zah,
- Arabic_ain,
- Arabic_ghain,
- Arabic_tatweel,
- Arabic_feh,
- Arabic_qaf,
- Arabic_kaf,
- Arabic_lam,
- Arabic_meem,
- Arabic_noon,
- Arabic_ha,
- Arabic_heh,
- Arabic_waw,
- Arabic_alefmaksura,
- Arabic_yeh,
- Arabic_fathatan,
- Arabic_dammatan,
- Arabic_kasratan,
- Arabic_fatha,
- Arabic_damma,
- Arabic_kasra,
- Arabic_shadda,
- Arabic_sukun,
- Arabic_madda_above,
- Arabic_hamza_above,
- Arabic_hamza_below,
- Arabic_jeh,
- Arabic_veh,
- Arabic_keheh,
- Arabic_gaf,
- Arabic_noon_ghunna,
- Arabic_heh_doachashmee,
- Farsi_yeh,
- Arabic_farsi_yeh,
- Arabic_yeh_baree,
- Arabic_heh_goal,
- Arabic_switch,
- Cyrillic_GHE_bar,
- Cyrillic_ghe_bar,
- Cyrillic_ZHE_descender,
- Cyrillic_zhe_descender,
- Cyrillic_KA_descender,
- Cyrillic_ka_descender,
- Cyrillic_KA_vertstroke,
- Cyrillic_ka_vertstroke,
- Cyrillic_EN_descender,
- Cyrillic_en_descender,
- Cyrillic_U_straight,
- Cyrillic_u_straight,
- Cyrillic_U_straight_bar,
- Cyrillic_u_straight_bar,
- Cyrillic_HA_descender,
- Cyrillic_ha_descender,
- Cyrillic_CHE_descender,
- Cyrillic_che_descender,
- Cyrillic_CHE_vertstroke,
- Cyrillic_che_vertstroke,
- Cyrillic_SHHA,
- Cyrillic_shha,
- Cyrillic_SCHWA,
- Cyrillic_schwa,
- Cyrillic_I_macron,
- Cyrillic_i_macron,
- Cyrillic_O_bar,
- Cyrillic_o_bar,
- Cyrillic_U_macron,
- Cyrillic_u_macron,
- Serbian_dje,
- Macedonia_gje,
- Cyrillic_io,
- Ukrainian_ie,
- Ukranian_je,
- Macedonia_dse,
- Ukrainian_i,
- Ukranian_i,
- Ukrainian_yi,
- Ukranian_yi,
- Cyrillic_je,
- Serbian_je,
- Cyrillic_lje,
- Serbian_lje,
- Cyrillic_nje,
- Serbian_nje,
- Serbian_tshe,
- Macedonia_kje,
- Ukrainian_ghe_with_upturn,
- Byelorussian_shortu,
- Cyrillic_dzhe,
- Serbian_dze,
- numerosign,
- Serbian_DJE,
- Macedonia_GJE,
- Cyrillic_IO,
- Ukrainian_IE,
- Ukranian_JE,
- Macedonia_DSE,
- Ukrainian_I,
- Ukranian_I,
- Ukrainian_YI,
- Ukranian_YI,
- Cyrillic_JE,
- Serbian_JE,
- Cyrillic_LJE,
- Serbian_LJE,
- Cyrillic_NJE,
- Serbian_NJE,
- Serbian_TSHE,
- Macedonia_KJE,
- Ukrainian_GHE_WITH_UPTURN,
- Byelorussian_SHORTU,
- Cyrillic_DZHE,
- Serbian_DZE,
- Cyrillic_yu,
- Cyrillic_a,
- Cyrillic_be,
- Cyrillic_tse,
- Cyrillic_de,
- Cyrillic_ie,
- Cyrillic_ef,
- Cyrillic_ghe,
- Cyrillic_ha,
- Cyrillic_i,
- Cyrillic_shorti,
- Cyrillic_ka,
- Cyrillic_el,
- Cyrillic_em,
- Cyrillic_en,
- Cyrillic_o,
- Cyrillic_pe,
- Cyrillic_ya,
- Cyrillic_er,
- Cyrillic_es,
- Cyrillic_te,
- Cyrillic_u,
- Cyrillic_zhe,
- Cyrillic_ve,
- Cyrillic_softsign,
- Cyrillic_yeru,
- Cyrillic_ze,
- Cyrillic_sha,
- Cyrillic_e,
- Cyrillic_shcha,
- Cyrillic_che,
- Cyrillic_hardsign,
- Cyrillic_YU,
- Cyrillic_A,
- Cyrillic_BE,
- Cyrillic_TSE,
- Cyrillic_DE,
- Cyrillic_IE,
- Cyrillic_EF,
- Cyrillic_GHE,
- Cyrillic_HA,
- Cyrillic_I,
- Cyrillic_SHORTI,
- Cyrillic_KA,
- Cyrillic_EL,
- Cyrillic_EM,
- Cyrillic_EN,
- Cyrillic_O,
- Cyrillic_PE,
- Cyrillic_YA,
- Cyrillic_ER,
- Cyrillic_ES,
- Cyrillic_TE,
- Cyrillic_U,
- Cyrillic_ZHE,
- Cyrillic_VE,
- Cyrillic_SOFTSIGN,
- Cyrillic_YERU,
- Cyrillic_ZE,
- Cyrillic_SHA,
- Cyrillic_E,
- Cyrillic_SHCHA,
- Cyrillic_CHE,
- Cyrillic_HARDSIGN,
- Greek_ALPHAaccent,
- Greek_EPSILONaccent,
- Greek_ETAaccent,
- Greek_IOTAaccent,
- Greek_IOTAdieresis,
- Greek_IOTAdiaeresis,
- Greek_OMICRONaccent,
- Greek_UPSILONaccent,
- Greek_UPSILONdieresis,
- Greek_OMEGAaccent,
- Greek_accentdieresis,
- Greek_horizbar,
- Greek_alphaaccent,
- Greek_epsilonaccent,
- Greek_etaaccent,
- Greek_iotaaccent,
- Greek_iotadieresis,
- Greek_iotaaccentdieresis,
- Greek_omicronaccent,
- Greek_upsilonaccent,
- Greek_upsilondieresis,
- Greek_upsilonaccentdieresis,
- Greek_omegaaccent,
- Greek_ALPHA,
- Greek_BETA,
- Greek_GAMMA,
- Greek_DELTA,
- Greek_EPSILON,
- Greek_ZETA,
- Greek_ETA,
- Greek_THETA,
- Greek_IOTA,
- Greek_KAPPA,
- Greek_LAMDA,
- Greek_LAMBDA,
- Greek_MU,
- Greek_NU,
- Greek_XI,
- Greek_OMICRON,
- Greek_PI,
- Greek_RHO,
- Greek_SIGMA,
- Greek_TAU,
- Greek_UPSILON,
- Greek_PHI,
- Greek_CHI,
- Greek_PSI,
- Greek_OMEGA,
- Greek_alpha,
- Greek_beta,
- Greek_gamma,
- Greek_delta,
- Greek_epsilon,
- Greek_zeta,
- Greek_eta,
- Greek_theta,
- Greek_iota,
- Greek_kappa,
- Greek_lamda,
- Greek_lambda,
- Greek_mu,
- Greek_nu,
- Greek_xi,
- Greek_omicron,
- Greek_pi,
- Greek_rho,
- Greek_sigma,
- Greek_finalsmallsigma,
- Greek_tau,
- Greek_upsilon,
- Greek_phi,
- Greek_chi,
- Greek_psi,
- Greek_omega,
- Greek_switch,
- leftradical,
- topleftradical,
- horizconnector,
- topintegral,
- botintegral,
- vertconnector,
- topleftsqbracket,
- botleftsqbracket,
- toprightsqbracket,
- botrightsqbracket,
- topleftparens,
- botleftparens,
- toprightparens,
- botrightparens,
- leftmiddlecurlybrace,
- rightmiddlecurlybrace,
- topleftsummation,
- botleftsummation,
- topvertsummationconnector,
- botvertsummationconnector,
- toprightsummation,
- botrightsummation,
- rightmiddlesummation,
- lessthanequal,
- notequal,
- greaterthanequal,
- integral,
- therefore,
- variation,
- infinity,
- nabla,
- approximate,
- similarequal,
- ifonlyif,
- implies,
- identical,
- radical,
- includedin,
- includes,
- intersection,
- union,
- logicaland,
- logicalor,
- partialderivative,
- function,
- leftarrow,
- uparrow,
- rightarrow,
- downarrow,
- blank,
- soliddiamond,
- checkerboard,
- ht,
- ff,
- cr,
- lf,
- nl,
- vt,
- lowrightcorner,
- uprightcorner,
- upleftcorner,
- lowleftcorner,
- crossinglines,
- horizlinescan1,
- horizlinescan3,
- horizlinescan5,
- horizlinescan7,
- horizlinescan9,
- leftt,
- rightt,
- bott,
- topt,
- vertbar,
- emspace,
- enspace,
- em3space,
- em4space,
- digitspace,
- punctspace,
- thinspace,
- hairspace,
- emdash,
- endash,
- signifblank,
- ellipsis,
- doubbaselinedot,
- onethird,
- twothirds,
- onefifth,
- twofifths,
- threefifths,
- fourfifths,
- onesixth,
- fivesixths,
- careof,
- figdash,
- leftanglebracket,
- decimalpoint,
- rightanglebracket,
- marker,
- oneeighth,
- threeeighths,
- fiveeighths,
- seveneighths,
- trademark,
- signaturemark,
- trademarkincircle,
- leftopentriangle,
- rightopentriangle,
- emopencircle,
- emopenrectangle,
- leftsinglequotemark,
- rightsinglequotemark,
- leftdoublequotemark,
- rightdoublequotemark,
- prescription,
- minutes,
- seconds,
- latincross,
- hexagram,
- filledrectbullet,
- filledlefttribullet,
- filledrighttribullet,
- emfilledcircle,
- emfilledrect,
- enopencircbullet,
- enopensquarebullet,
- openrectbullet,
- opentribulletup,
- opentribulletdown,
- openstar,
- enfilledcircbullet,
- enfilledsqbullet,
- filledtribulletup,
- filledtribulletdown,
- leftpointer,
- rightpointer,
- club,
- diamond,
- heart,
- maltesecross,
- dagger,
- doubledagger,
- checkmark,
- ballotcross,
- musicalsharp,
- musicalflat,
- malesymbol,
- femalesymbol,
- telephone,
- telephonerecorder,
- phonographcopyright,
- caret,
- singlelowquotemark,
- doublelowquotemark,
- cursor,
- leftcaret,
- rightcaret,
- downcaret,
- upcaret,
- overbar,
- downtack,
- upshoe,
- downstile,
- underbar,
- jot,
- quad,
- uptack,
- circle,
- upstile,
- downshoe,
- rightshoe,
- leftshoe,
- lefttack,
- righttack,
- hebrew_doublelowline,
- hebrew_aleph,
- hebrew_bet,
- hebrew_beth,
- hebrew_gimel,
- hebrew_gimmel,
- hebrew_dalet,
- hebrew_daleth,
- hebrew_he,
- hebrew_waw,
- hebrew_zain,
- hebrew_zayin,
- hebrew_chet,
- hebrew_het,
- hebrew_tet,
- hebrew_teth,
- hebrew_yod,
- hebrew_finalkaph,
- hebrew_kaph,
- hebrew_lamed,
- hebrew_finalmem,
- hebrew_mem,
- hebrew_finalnun,
- hebrew_nun,
- hebrew_samech,
- hebrew_samekh,
- hebrew_ayin,
- hebrew_finalpe,
- hebrew_pe,
- hebrew_finalzade,
- hebrew_finalzadi,
- hebrew_zade,
- hebrew_zadi,
- hebrew_qoph,
- hebrew_kuf,
- hebrew_resh,
- hebrew_shin,
- hebrew_taw,
- hebrew_taf,
- Hebrew_switch,
- Thai_kokai,
- Thai_khokhai,
- Thai_khokhuat,
- Thai_khokhwai,
- Thai_khokhon,
- Thai_khorakhang,
- Thai_ngongu,
- Thai_chochan,
- Thai_choching,
- Thai_chochang,
- Thai_soso,
- Thai_chochoe,
- Thai_yoying,
- Thai_dochada,
- Thai_topatak,
- Thai_thothan,
- Thai_thonangmontho,
- Thai_thophuthao,
- Thai_nonen,
- Thai_dodek,
- Thai_totao,
- Thai_thothung,
- Thai_thothahan,
- Thai_thothong,
- Thai_nonu,
- Thai_bobaimai,
- Thai_popla,
- Thai_phophung,
- Thai_fofa,
- Thai_phophan,
- Thai_fofan,
- Thai_phosamphao,
- Thai_moma,
- Thai_yoyak,
- Thai_rorua,
- Thai_ru,
- Thai_loling,
- Thai_lu,
- Thai_wowaen,
- Thai_sosala,
- Thai_sorusi,
- Thai_sosua,
- Thai_hohip,
- Thai_lochula,
- Thai_oang,
- Thai_honokhuk,
- Thai_paiyannoi,
- Thai_saraa,
- Thai_maihanakat,
- Thai_saraaa,
- Thai_saraam,
- Thai_sarai,
- Thai_saraii,
- Thai_saraue,
- Thai_sarauee,
- Thai_sarau,
- Thai_sarauu,
- Thai_phinthu,
- Thai_maihanakat_maitho,
- Thai_baht,
- Thai_sarae,
- Thai_saraae,
- Thai_sarao,
- Thai_saraaimaimuan,
- Thai_saraaimaimalai,
- Thai_lakkhangyao,
- Thai_maiyamok,
- Thai_maitaikhu,
- Thai_maiek,
- Thai_maitho,
- Thai_maitri,
- Thai_maichattawa,
- Thai_thanthakhat,
- Thai_nikhahit,
- Thai_leksun,
- Thai_leknung,
- Thai_leksong,
- Thai_leksam,
- Thai_leksi,
- Thai_lekha,
- Thai_lekhok,
- Thai_lekchet,
- Thai_lekpaet,
- Thai_lekkao,
- Hangul,
- Hangul_Start,
- Hangul_End,
- Hangul_Hanja,
- Hangul_Jamo,
- Hangul_Romaja,
- Hangul_Codeinput,
- Hangul_Jeonja,
- Hangul_Banja,
- Hangul_PreHanja,
- Hangul_PostHanja,
- Hangul_SingleCandidate,
- Hangul_MultipleCandidate,
- Hangul_PreviousCandidate,
- Hangul_Special,
- Hangul_switch,
- Hangul_Kiyeog,
- Hangul_SsangKiyeog,
- Hangul_KiyeogSios,
- Hangul_Nieun,
- Hangul_NieunJieuj,
- Hangul_NieunHieuh,
- Hangul_Dikeud,
- Hangul_SsangDikeud,
- Hangul_Rieul,
- Hangul_RieulKiyeog,
- Hangul_RieulMieum,
- Hangul_RieulPieub,
- Hangul_RieulSios,
- Hangul_RieulTieut,
- Hangul_RieulPhieuf,
- Hangul_RieulHieuh,
- Hangul_Mieum,
- Hangul_Pieub,
- Hangul_SsangPieub,
- Hangul_PieubSios,
- Hangul_Sios,
- Hangul_SsangSios,
- Hangul_Ieung,
- Hangul_Jieuj,
- Hangul_SsangJieuj,
- Hangul_Cieuc,
- Hangul_Khieuq,
- Hangul_Tieut,
- Hangul_Phieuf,
- Hangul_Hieuh,
- Hangul_A,
- Hangul_AE,
- Hangul_YA,
- Hangul_YAE,
- Hangul_EO,
- Hangul_E,
- Hangul_YEO,
- Hangul_YE,
- Hangul_O,
- Hangul_WA,
- Hangul_WAE,
- Hangul_OE,
- Hangul_YO,
- Hangul_U,
- Hangul_WEO,
- Hangul_WE,
- Hangul_WI,
- Hangul_YU,
- Hangul_EU,
- Hangul_YI,
- Hangul_I,
- Hangul_J_Kiyeog,
- Hangul_J_SsangKiyeog,
- Hangul_J_KiyeogSios,
- Hangul_J_Nieun,
- Hangul_J_NieunJieuj,
- Hangul_J_NieunHieuh,
- Hangul_J_Dikeud,
- Hangul_J_Rieul,
- Hangul_J_RieulKiyeog,
- Hangul_J_RieulMieum,
- Hangul_J_RieulPieub,
- Hangul_J_RieulSios,
- Hangul_J_RieulTieut,
- Hangul_J_RieulPhieuf,
- Hangul_J_RieulHieuh,
- Hangul_J_Mieum,
- Hangul_J_Pieub,
- Hangul_J_PieubSios,
- Hangul_J_Sios,
- Hangul_J_SsangSios,
- Hangul_J_Ieung,
- Hangul_J_Jieuj,
- Hangul_J_Cieuc,
- Hangul_J_Khieuq,
- Hangul_J_Tieut,
- Hangul_J_Phieuf,
- Hangul_J_Hieuh,
- Hangul_RieulYeorinHieuh,
- Hangul_SunkyeongeumMieum,
- Hangul_SunkyeongeumPieub,
- Hangul_PanSios,
- Hangul_KkogjiDalrinIeung,
- Hangul_SunkyeongeumPhieuf,
- Hangul_YeorinHieuh,
- Hangul_AraeA,
- Hangul_AraeAE,
- Hangul_J_PanSios,
- Hangul_J_KkogjiDalrinIeung,
- Hangul_J_YeorinHieuh,
- Korean_Won,
- Armenian_ligature_ew,
- Armenian_full_stop,
- Armenian_verjaket,
- Armenian_separation_mark,
- Armenian_but,
- Armenian_hyphen,
- Armenian_yentamna,
- Armenian_exclam,
- Armenian_amanak,
- Armenian_accent,
- Armenian_shesht,
- Armenian_question,
- Armenian_paruyk,
- Armenian_AYB,
- Armenian_ayb,
- Armenian_BEN,
- Armenian_ben,
- Armenian_GIM,
- Armenian_gim,
- Armenian_DA,
- Armenian_da,
- Armenian_YECH,
- Armenian_yech,
- Armenian_ZA,
- Armenian_za,
- Armenian_E,
- Armenian_e,
- Armenian_AT,
- Armenian_at,
- Armenian_TO,
- Armenian_to,
- Armenian_ZHE,
- Armenian_zhe,
- Armenian_INI,
- Armenian_ini,
- Armenian_LYUN,
- Armenian_lyun,
- Armenian_KHE,
- Armenian_khe,
- Armenian_TSA,
- Armenian_tsa,
- Armenian_KEN,
- Armenian_ken,
- Armenian_HO,
- Armenian_ho,
- Armenian_DZA,
- Armenian_dza,
- Armenian_GHAT,
- Armenian_ghat,
- Armenian_TCHE,
- Armenian_tche,
- Armenian_MEN,
- Armenian_men,
- Armenian_HI,
- Armenian_hi,
- Armenian_NU,
- Armenian_nu,
- Armenian_SHA,
- Armenian_sha,
- Armenian_VO,
- Armenian_vo,
- Armenian_CHA,
- Armenian_cha,
- Armenian_PE,
- Armenian_pe,
- Armenian_JE,
- Armenian_je,
- Armenian_RA,
- Armenian_ra,
- Armenian_SE,
- Armenian_se,
- Armenian_VEV,
- Armenian_vev,
- Armenian_TYUN,
- Armenian_tyun,
- Armenian_RE,
- Armenian_re,
- Armenian_TSO,
- Armenian_tso,
- Armenian_VYUN,
- Armenian_vyun,
- Armenian_PYUR,
- Armenian_pyur,
- Armenian_KE,
- Armenian_ke,
- Armenian_O,
- Armenian_o,
- Armenian_FE,
- Armenian_fe,
- Armenian_apostrophe,
- Georgian_an,
- Georgian_ban,
- Georgian_gan,
- Georgian_don,
- Georgian_en,
- Georgian_vin,
- Georgian_zen,
- Georgian_tan,
- Georgian_in,
- Georgian_kan,
- Georgian_las,
- Georgian_man,
- Georgian_nar,
- Georgian_on,
- Georgian_par,
- Georgian_zhar,
- Georgian_rae,
- Georgian_san,
- Georgian_tar,
- Georgian_un,
- Georgian_phar,
- Georgian_khar,
- Georgian_ghan,
- Georgian_qar,
- Georgian_shin,
- Georgian_chin,
- Georgian_can,
- Georgian_jil,
- Georgian_cil,
- Georgian_char,
- Georgian_xan,
- Georgian_jhan,
- Georgian_hae,
- Georgian_he,
- Georgian_hie,
- Georgian_we,
- Georgian_har,
- Georgian_hoe,
- Georgian_fi,
- Xabovedot,
- Ibreve,
- Zstroke,
- Gcaron,
- Ocaron,
- Obarred,
- xabovedot,
- ibreve,
- zstroke,
- gcaron,
- ocaron,
- obarred,
- SCHWA,
- schwa,
- Lbelowdot,
- lbelowdot,
- Abelowdot,
- abelowdot,
- Ahook,
- ahook,
- Acircumflexacute,
- acircumflexacute,
- Acircumflexgrave,
- acircumflexgrave,
- Acircumflexhook,
- acircumflexhook,
- Acircumflextilde,
- acircumflextilde,
- Acircumflexbelowdot,
- acircumflexbelowdot,
- Abreveacute,
- abreveacute,
- Abrevegrave,
- abrevegrave,
- Abrevehook,
- abrevehook,
- Abrevetilde,
- abrevetilde,
- Abrevebelowdot,
- abrevebelowdot,
- Ebelowdot,
- ebelowdot,
- Ehook,
- ehook,
- Etilde,
- etilde,
- Ecircumflexacute,
- ecircumflexacute,
- Ecircumflexgrave,
- ecircumflexgrave,
- Ecircumflexhook,
- ecircumflexhook,
- Ecircumflextilde,
- ecircumflextilde,
- Ecircumflexbelowdot,
- ecircumflexbelowdot,
- Ihook,
- ihook,
- Ibelowdot,
- ibelowdot,
- Obelowdot,
- obelowdot,
- Ohook,
- ohook,
- Ocircumflexacute,
- ocircumflexacute,
- Ocircumflexgrave,
- ocircumflexgrave,
- Ocircumflexhook,
- ocircumflexhook,
- Ocircumflextilde,
- ocircumflextilde,
- Ocircumflexbelowdot,
- ocircumflexbelowdot,
- Ohornacute,
- ohornacute,
- Ohorngrave,
- ohorngrave,
- Ohornhook,
- ohornhook,
- Ohorntilde,
- ohorntilde,
- Ohornbelowdot,
- ohornbelowdot,
- Ubelowdot,
- ubelowdot,
- Uhook,
- uhook,
- Uhornacute,
- uhornacute,
- Uhorngrave,
- uhorngrave,
- Uhornhook,
- uhornhook,
- Uhorntilde,
- uhorntilde,
- Uhornbelowdot,
- uhornbelowdot,
- Ybelowdot,
- ybelowdot,
- Yhook,
- yhook,
- Ytilde,
- ytilde,
- Ohorn,
- ohorn,
- Uhorn,
- uhorn,
- EcuSign,
- ColonSign,
- CruzeiroSign,
- FFrancSign,
- LiraSign,
- MillSign,
- NairaSign,
- PesetaSign,
- RupeeSign,
- WonSign,
- NewSheqelSign,
- DongSign,
- EuroSign,
- zerosuperior,
- foursuperior,
- fivesuperior,
- sixsuperior,
- sevensuperior,
- eightsuperior,
- ninesuperior,
- zerosubscript,
- onesubscript,
- twosubscript,
- threesubscript,
- foursubscript,
- fivesubscript,
- sixsubscript,
- sevensubscript,
- eightsubscript,
- ninesubscript,
- partdifferential,
- emptyset,
- elementof,
- notelementof,
- containsas,
- squareroot,
- cuberoot,
- fourthroot,
- dintegral,
- tintegral,
- because,
- approxeq,
- notapproxeq,
- notidentical,
- stricteq,
- braille_dot_1,
- braille_dot_2,
- braille_dot_3,
- braille_dot_4,
- braille_dot_5,
- braille_dot_6,
- braille_dot_7,
- braille_dot_8,
- braille_dot_9,
- braille_dot_10,
- braille_blank,
- braille_dots_1,
- braille_dots_2,
- braille_dots_12,
- braille_dots_3,
- braille_dots_13,
- braille_dots_23,
- braille_dots_123,
- braille_dots_4,
- braille_dots_14,
- braille_dots_24,
- braille_dots_124,
- braille_dots_34,
- braille_dots_134,
- braille_dots_234,
- braille_dots_1234,
- braille_dots_5,
- braille_dots_15,
- braille_dots_25,
- braille_dots_125,
- braille_dots_35,
- braille_dots_135,
- braille_dots_235,
- braille_dots_1235,
- braille_dots_45,
- braille_dots_145,
- braille_dots_245,
- braille_dots_1245,
- braille_dots_345,
- braille_dots_1345,
- braille_dots_2345,
- braille_dots_12345,
- braille_dots_6,
- braille_dots_16,
- braille_dots_26,
- braille_dots_126,
- braille_dots_36,
- braille_dots_136,
- braille_dots_236,
- braille_dots_1236,
- braille_dots_46,
- braille_dots_146,
- braille_dots_246,
- braille_dots_1246,
- braille_dots_346,
- braille_dots_1346,
- braille_dots_2346,
- braille_dots_12346,
- braille_dots_56,
- braille_dots_156,
- braille_dots_256,
- braille_dots_1256,
- braille_dots_356,
- braille_dots_1356,
- braille_dots_2356,
- braille_dots_12356,
- braille_dots_456,
- braille_dots_1456,
- braille_dots_2456,
- braille_dots_12456,
- braille_dots_3456,
- braille_dots_13456,
- braille_dots_23456,
- braille_dots_123456,
- braille_dots_7,
- braille_dots_17,
- braille_dots_27,
- braille_dots_127,
- braille_dots_37,
- braille_dots_137,
- braille_dots_237,
- braille_dots_1237,
- braille_dots_47,
- braille_dots_147,
- braille_dots_247,
- braille_dots_1247,
- braille_dots_347,
- braille_dots_1347,
- braille_dots_2347,
- braille_dots_12347,
- braille_dots_57,
- braille_dots_157,
- braille_dots_257,
- braille_dots_1257,
- braille_dots_357,
- braille_dots_1357,
- braille_dots_2357,
- braille_dots_12357,
- braille_dots_457,
- braille_dots_1457,
- braille_dots_2457,
- braille_dots_12457,
- braille_dots_3457,
- braille_dots_13457,
- braille_dots_23457,
- braille_dots_123457,
- braille_dots_67,
- braille_dots_167,
- braille_dots_267,
- braille_dots_1267,
- braille_dots_367,
- braille_dots_1367,
- braille_dots_2367,
- braille_dots_12367,
- braille_dots_467,
- braille_dots_1467,
- braille_dots_2467,
- braille_dots_12467,
- braille_dots_3467,
- braille_dots_13467,
- braille_dots_23467,
- braille_dots_123467,
- braille_dots_567,
- braille_dots_1567,
- braille_dots_2567,
- braille_dots_12567,
- braille_dots_3567,
- braille_dots_13567,
- braille_dots_23567,
- braille_dots_123567,
- braille_dots_4567,
- braille_dots_14567,
- braille_dots_24567,
- braille_dots_124567,
- braille_dots_34567,
- braille_dots_134567,
- braille_dots_234567,
- braille_dots_1234567,
- braille_dots_8,
- braille_dots_18,
- braille_dots_28,
- braille_dots_128,
- braille_dots_38,
- braille_dots_138,
- braille_dots_238,
- braille_dots_1238,
- braille_dots_48,
- braille_dots_148,
- braille_dots_248,
- braille_dots_1248,
- braille_dots_348,
- braille_dots_1348,
- braille_dots_2348,
- braille_dots_12348,
- braille_dots_58,
- braille_dots_158,
- braille_dots_258,
- braille_dots_1258,
- braille_dots_358,
- braille_dots_1358,
- braille_dots_2358,
- braille_dots_12358,
- braille_dots_458,
- braille_dots_1458,
- braille_dots_2458,
- braille_dots_12458,
- braille_dots_3458,
- braille_dots_13458,
- braille_dots_23458,
- braille_dots_123458,
- braille_dots_68,
- braille_dots_168,
- braille_dots_268,
- braille_dots_1268,
- braille_dots_368,
- braille_dots_1368,
- braille_dots_2368,
- braille_dots_12368,
- braille_dots_468,
- braille_dots_1468,
- braille_dots_2468,
- braille_dots_12468,
- braille_dots_3468,
- braille_dots_13468,
- braille_dots_23468,
- braille_dots_123468,
- braille_dots_568,
- braille_dots_1568,
- braille_dots_2568,
- braille_dots_12568,
- braille_dots_3568,
- braille_dots_13568,
- braille_dots_23568,
- braille_dots_123568,
- braille_dots_4568,
- braille_dots_14568,
- braille_dots_24568,
- braille_dots_124568,
- braille_dots_34568,
- braille_dots_134568,
- braille_dots_234568,
- braille_dots_1234568,
- braille_dots_78,
- braille_dots_178,
- braille_dots_278,
- braille_dots_1278,
- braille_dots_378,
- braille_dots_1378,
- braille_dots_2378,
- braille_dots_12378,
- braille_dots_478,
- braille_dots_1478,
- braille_dots_2478,
- braille_dots_12478,
- braille_dots_3478,
- braille_dots_13478,
- braille_dots_23478,
- braille_dots_123478,
- braille_dots_578,
- braille_dots_1578,
- braille_dots_2578,
- braille_dots_12578,
- braille_dots_3578,
- braille_dots_13578,
- braille_dots_23578,
- braille_dots_123578,
- braille_dots_4578,
- braille_dots_14578,
- braille_dots_24578,
- braille_dots_124578,
- braille_dots_34578,
- braille_dots_134578,
- braille_dots_234578,
- braille_dots_1234578,
- braille_dots_678,
- braille_dots_1678,
- braille_dots_2678,
- braille_dots_12678,
- braille_dots_3678,
- braille_dots_13678,
- braille_dots_23678,
- braille_dots_123678,
- braille_dots_4678,
- braille_dots_14678,
- braille_dots_24678,
- braille_dots_124678,
- braille_dots_34678,
- braille_dots_134678,
- braille_dots_234678,
- braille_dots_1234678,
- braille_dots_5678,
- braille_dots_15678,
- braille_dots_25678,
- braille_dots_125678,
- braille_dots_35678,
- braille_dots_135678,
- braille_dots_235678,
- braille_dots_1235678,
- braille_dots_45678,
- braille_dots_145678,
- braille_dots_245678,
- braille_dots_1245678,
- braille_dots_345678,
- braille_dots_1345678,
- braille_dots_2345678,
- braille_dots_12345678,
- ModeLock,
- MonBrightnessUp,
- MonBrightnessDown,
- KbdLightOnOff,
- KbdBrightnessUp,
- KbdBrightnessDown,
- Standby,
- AudioLowerVolume,
- AudioMute,
- AudioRaiseVolume,
- AudioPlay,
- AudioStop,
- AudioPrev,
- AudioNext,
- HomePage,
- Mail,
- Start,
- Search,
- AudioRecord,
- Calculator,
- Memo,
- ToDoList,
- Calendar,
- PowerDown,
- ContrastAdjust,
- RockerUp,
- RockerDown,
- RockerEnter,
- Back,
- Forward,
- Stop,
- Refresh,
- PowerOff,
- WakeUp,
- Eject,
- ScreenSaver,
- WWW,
- Sleep,
- Favorites,
- AudioPause,
- AudioMedia,
- MyComputer,
- VendorHome,
- LightBulb,
- Shop,
- History,
- OpenURL,
- AddFavorite,
- HotLinks,
- BrightnessAdjust,
- Finance,
- Community,
- AudioRewind,
- BackForward,
- Launch0,
- Launch1,
- Launch2,
- Launch3,
- Launch4,
- Launch5,
- Launch6,
- Launch7,
- Launch8,
- Launch9,
- LaunchA,
- LaunchB,
- LaunchC,
- LaunchD,
- LaunchE,
- LaunchF,
- ApplicationLeft,
- ApplicationRight,
- Book,
- CD,
- WindowClear,
- Close,
- Copy,
- Cut,
- Display,
- DOS,
- Documents,
- Excel,
- Explorer,
- Game,
- Go,
- iTouch,
- LogOff,
- Market,
- Meeting,
- MenuKB,
- MenuPB,
- MySites,
- New,
- News,
- OfficeHome,
- Open,
- Option,
- Paste,
- Phone,
- Reply,
- Reload,
- RotateWindows,
- RotationPB,
- RotationKB,
- Save,
- ScrollUp,
- ScrollDown,
- ScrollClick,
- Send,
- Spell,
- SplitScreen,
- Support,
- TaskPane,
- Terminal,
- Tools,
- Travel,
- UserPB,
- User1KB,
- User2KB,
- Video,
- WheelButton,
- Word,
- Xfer,
- ZoomIn,
- ZoomOut,
- Away,
- Messenger,
- WebCam,
- MailForward,
- Pictures,
- Music,
- Battery,
- Bluetooth,
- WLAN,
- UWB,
- AudioForward,
- AudioRepeat,
- AudioRandomPlay,
- Subtitle,
- AudioCycleTrack,
- CycleAngle,
- FrameBack,
- FrameForward,
- Time,
- SelectButton,
- View,
- TopMenu,
- Red,
- Green,
- Yellow,
- Blue,
- Suspend,
- Hibernate,
- Switch_VT_1,
- Switch_VT_2,
- Switch_VT_3,
- Switch_VT_4,
- Switch_VT_5,
- Switch_VT_6,
- Switch_VT_7,
- Switch_VT_8,
- Switch_VT_9,
- Switch_VT_10,
- Switch_VT_11,
- Switch_VT_12,
- Ungrab,
- ClearGrab,
- Next_VMode,
- Prev_VMode,
- }
-}
diff --git a/plugins/gtkui/gdkdrawing.c b/plugins/gtkui/gdkdrawing.c
index 9580af40..e6f5d7e4 100644
--- a/plugins/gtkui/gdkdrawing.c
+++ b/plugins/gtkui/gdkdrawing.c
@@ -27,145 +27,152 @@
#include "support.h"
#include "gtkui.h"
-static cairo_t *drawable;
-//static GdkGC *gc;
-static GdkColor clrfg;
-static GdkColor clrbg;
-static int pango_ready;
-static PangoContext *pangoctx;
-static PangoLayout *pangolayout;
-
void
-draw_begin (cairo_t *cr) {
- drawable = cr;
+draw_begin (drawctx_t *ctx, cairo_t *cr) {
+ ctx->drawable = cr;
}
void
-draw_end (void) {
- drawable = NULL;
+draw_end (drawctx_t *ctx) {
+ ctx->drawable = NULL;
}
void
-draw_set_fg_color (float *rgb) {
- cairo_set_source_rgb (drawable, rgb[0], rgb[1], rgb[2]);
+draw_set_fg_color (drawctx_t *ctx, float *rgb) {
+ cairo_set_source_rgb (ctx->drawable, rgb[0], rgb[1], rgb[2]);
}
void
-draw_line (float x1, float y1, float x2, float y2) {
- cairo_move_to (drawable, x1, y1);
- cairo_line_to (drawable, x2, y2);
- cairo_stroke (drawable);
+draw_line (drawctx_t *ctx, float x1, float y1, float x2, float y2) {
+ cairo_move_to (ctx->drawable, x1, y1);
+ cairo_line_to (ctx->drawable, x2, y2);
+ cairo_stroke (ctx->drawable);
}
void
-draw_rect (float x, float y, float w, float h, int fill) {
- cairo_rectangle (drawable, x, y, w, h);
- fill ? cairo_fill (drawable) : cairo_stroke (drawable);
+draw_rect (drawctx_t *ctx, float x, float y, float w, float h, int fill) {
+ cairo_rectangle (ctx->drawable, x, y, w, h);
+ fill ? cairo_fill (ctx->drawable) : cairo_stroke (ctx->drawable);
}
-static GtkStyle *font_style = NULL;
-static PangoWeight font_weight = PANGO_WEIGHT_NORMAL;
-
void
-draw_free (void) {
- draw_end ();
- if (pangoctx) {
- g_object_unref (pangoctx);
- pangoctx = NULL;
+draw_free (drawctx_t *ctx) {
+ draw_end (ctx);
+ if (ctx->pangoctx) {
+ g_object_unref (ctx->pangoctx);
+ ctx->pangoctx = NULL;
}
- if (pangolayout) {
- g_object_unref (pangolayout);
- pangolayout = NULL;
+ if (ctx->pangolayout) {
+ g_object_unref (ctx->pangolayout);
+ ctx->pangolayout = NULL;
}
}
void
-draw_init_font (GtkStyle *new_font_style) {
- if (!pango_ready || (new_font_style && font_style != new_font_style)) {
- if (pangoctx) {
- g_object_unref (pangoctx);
- pangoctx = NULL;
+draw_init_font (drawctx_t *ctx, GtkStyle *new_font_style) {
+ if (!ctx->pango_ready || (new_font_style && ctx->font_style != new_font_style)) {
+ if (ctx->pangoctx) {
+ g_object_unref (ctx->pangoctx);
+ ctx->pangoctx = NULL;
}
- if (pangolayout) {
- g_object_unref (pangolayout);
- pangolayout = NULL;
+ if (ctx->pangolayout) {
+ g_object_unref (ctx->pangolayout);
+ ctx->pangolayout = NULL;
}
- font_style = new_font_style ? new_font_style : gtk_widget_get_default_style ();
+ ctx->font_style = new_font_style ? new_font_style : gtk_widget_get_default_style ();
- pangoctx = gdk_pango_context_get ();
- pangolayout = pango_layout_new (pangoctx);
- pango_layout_set_ellipsize (pangolayout, PANGO_ELLIPSIZE_END);
- PangoFontDescription *desc = font_style->font_desc;
- font_weight = pango_font_description_get_weight (desc);
- pango_layout_set_font_description (pangolayout, desc);
- pango_ready = 1;
+ ctx->pangoctx = gdk_pango_context_get ();
+ ctx->pangolayout = pango_layout_new (ctx->pangoctx);
+ pango_layout_set_ellipsize (ctx->pangolayout, PANGO_ELLIPSIZE_END);
+ PangoFontDescription *desc = ctx->font_style->font_desc;
+ ctx->font_weight = pango_font_description_get_weight (desc);
+ pango_layout_set_font_description (ctx->pangolayout, desc);
+ ctx->pango_ready = 1;
}
else if (new_font_style) {
- PangoFontDescription *desc = font_style->font_desc;
- pango_layout_set_font_description (pangolayout, desc);
+ PangoFontDescription *desc = ctx->font_style->font_desc;
+ pango_layout_set_font_description (ctx->pangolayout, desc);
}
}
void
-draw_init_font_bold (void) {
- PangoFontDescription *desc = pango_font_description_copy (font_style->font_desc);
+draw_init_font_bold (drawctx_t *ctx) {
+ PangoFontDescription *desc = pango_font_description_copy (ctx->font_style->font_desc);
pango_font_description_set_weight (desc, PANGO_WEIGHT_BOLD);
- pango_layout_set_font_description (pangolayout, desc);
+ pango_layout_set_font_description (ctx->pangolayout, desc);
pango_font_description_free(desc);
}
void
-draw_init_font_normal (void) {
- pango_font_description_set_weight (font_style->font_desc, font_weight);
- pango_layout_set_font_description (pangolayout, font_style->font_desc);
+draw_init_font_normal (drawctx_t *ctx) {
+ pango_font_description_set_weight (ctx->font_style->font_desc, ctx->font_weight);
+ pango_layout_set_font_description (ctx->pangolayout, ctx->font_style->font_desc);
}
float
-draw_get_font_size (void) {
- draw_init_font (NULL);
+draw_get_font_size (drawctx_t *ctx) {
+ draw_init_font (ctx, NULL);
GdkScreen *screen = gdk_screen_get_default ();
float dpi = gdk_screen_get_resolution (screen);
- PangoFontDescription *desc = font_style->font_desc;
+ PangoFontDescription *desc = ctx->font_style->font_desc;
return (float)(pango_font_description_get_size (desc) / PANGO_SCALE * dpi / 72);
}
void
-draw_text (float x, float y, int width, int align, const char *text) {
- draw_init_font (NULL);
- pango_layout_set_width (pangolayout, width*PANGO_SCALE);
- pango_layout_set_alignment (pangolayout, align ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT);
- pango_layout_set_text (pangolayout, text, -1);
- cairo_move_to (drawable, x, y);
- pango_cairo_show_layout (drawable, pangolayout);
+draw_text (drawctx_t *ctx, float x, float y, int width, int align, const char *text) {
+ draw_init_font (ctx, NULL);
+ pango_layout_set_width (ctx->pangolayout, width*PANGO_SCALE);
+ pango_layout_set_alignment (ctx->pangolayout, align ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT);
+ pango_layout_set_text (ctx->pangolayout, text, -1);
+ cairo_move_to (ctx->drawable, x, y);
+ pango_cairo_show_layout (ctx->drawable, ctx->pangolayout);
}
void
-draw_text_with_colors (float x, float y, int width, int align, const char *text) {
- draw_init_font (NULL);
- pango_layout_set_width (pangolayout, width*PANGO_SCALE);
- pango_layout_set_alignment (pangolayout, align ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT);
- pango_layout_set_text (pangolayout, text, -1);
-// gdk_draw_layout_with_colors (drawable, gc, x, y, pangolayout, &clrfg, &clrbg);
- cairo_move_to (drawable, x, y);
- pango_cairo_show_layout (drawable, pangolayout);
+draw_text_with_colors (drawctx_t *ctx, float x, float y, int width, int align, const char *text) {
+ draw_init_font (ctx, NULL);
+ pango_layout_set_width (ctx->pangolayout, width*PANGO_SCALE);
+ pango_layout_set_alignment (ctx->pangolayout, align ? PANGO_ALIGN_RIGHT : PANGO_ALIGN_LEFT);
+ pango_layout_set_text (ctx->pangolayout, text, -1);
+// gdk_draw_layout_with_colors (ctx->drawable, gc, x, y, ctx->pangolayout, &clrfg, &clrbg);
+ cairo_move_to (ctx->drawable, x, y);
+ pango_cairo_show_layout (ctx->drawable, ctx->pangolayout);
}
void
-draw_get_text_extents (const char *text, int len, int *w, int *h) {
- draw_init_font (NULL);
- pango_layout_set_width (pangolayout, 1000 * PANGO_SCALE);
- pango_layout_set_alignment (pangolayout, PANGO_ALIGN_LEFT);
- pango_layout_set_text (pangolayout, text, len);
+draw_get_text_extents (drawctx_t *ctx, const char *text, int len, int *w, int *h) {
+ draw_init_font (ctx, NULL);
+ pango_layout_set_width (ctx->pangolayout, 1000 * PANGO_SCALE);
+ pango_layout_set_alignment (ctx->pangolayout, PANGO_ALIGN_LEFT);
+ pango_layout_set_text (ctx->pangolayout, text, len);
PangoRectangle ink;
PangoRectangle log;
- pango_layout_get_pixel_extents (pangolayout, &ink, &log);
+ pango_layout_get_pixel_extents (ctx->pangolayout, &ink, &log);
*w = ink.width;
*h = ink.height;
}
+int
+draw_get_listview_rowheight (drawctx_t *ctx) {
+ PangoFontDescription *font_desc = ctx->font_style->font_desc;
+ PangoFontMetrics *metrics = pango_context_get_metrics (ctx->pangoctx,
+ font_desc,
+ pango_context_get_language (ctx->pangoctx));
+ int row_height = (pango_font_metrics_get_ascent (metrics) +
+ pango_font_metrics_get_descent (metrics));
+ pango_font_metrics_unref (metrics);
+ return PANGO_PIXELS(row_height)+6;
+}
+
+void
+drawctx_init (drawctx_t *ctx) {
+ memset (ctx, 0, sizeof (drawctx_t));
+ ctx->font_weight = PANGO_WEIGHT_NORMAL;
+}
+
static GdkColor gtkui_bar_foreground_color;
static GdkColor gtkui_bar_background_color;
@@ -358,15 +365,3 @@ gtkui_get_listview_cursor_color (GdkColor *clr) {
memcpy (clr, &gtkui_listview_cursor_color, sizeof (GdkColor));
}
-int
-draw_get_listview_rowheight (void) {
- PangoFontDescription *font_desc = font_style->font_desc;
- PangoFontMetrics *metrics = pango_context_get_metrics (pangoctx,
- font_desc,
- pango_context_get_language (pangoctx));
- int row_height = (pango_font_metrics_get_ascent (metrics) +
- pango_font_metrics_get_descent (metrics));
- pango_font_metrics_unref (metrics);
- return PANGO_PIXELS(row_height)+6;
-}
-
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index 268ae16b..6bffa367 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -48,6 +48,9 @@
#include "wingeom.h"
#include "widgets.h"
#include "X11/Xlib.h"
+#ifdef EGG_SM_CLIENT_BACKEND_XSMP
+#include "smclient/eggsmclient.h"
+#endif
#define trace(...) { fprintf(stderr, __VA_ARGS__); }
//#define trace(fmt,...)
@@ -192,9 +195,9 @@ update_songinfo (gpointer ctx) {
}
}
const char *spaused = deadbeef->get_output ()->state () == OUTPUT_STATE_PAUSED ? _("Paused | ") : "";
- const char *filetype = deadbeef->pl_find_meta (track, ":FILETYPE");
- if (!filetype) {
- filetype = "-";
+ char filetype[20];
+ if (!deadbeef->pl_get_meta (track, ":FILETYPE", filetype, sizeof (filetype))) {
+ strcpy (filetype, "-");
}
snprintf (sbtext_new, sizeof (sbtext_new), _("%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"), spaused, filetype, sbitrate, samplerate, bitspersample, mode, minpos, secpos, t, deadbeef->pl_getcount (PL_MAIN), totaltime_str);
}
@@ -234,7 +237,7 @@ update_songinfo (gpointer ctx) {
void
set_tray_tooltip (const char *text) {
if (trayicon) {
-#if !GTK_CHECK_VERSION(2,16,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,16,0)
gtk_status_icon_set_tooltip (trayicon, text);
#else
gtk_status_icon_set_tooltip_text (trayicon, text);
@@ -305,8 +308,7 @@ mainwin_toggle_visible (void) {
}
}
-#if !GTK_CHECK_VERSION(2,14,0) || defined(ULTRA_COMPATIBLE)
-
+#if !GTK_CHECK_VERSION(2,14,0)
gboolean
on_trayicon_activate (GtkWidget *widget,
gpointer user_data)
@@ -541,9 +543,10 @@ gtkui_update_status_icon (gpointer unused) {
g_object_set (trayicon, "visible", FALSE, NULL);
}
-#if !GTK_CHECK_VERSION(2,14,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,14,0)
g_signal_connect ((gpointer)trayicon, "activate", G_CALLBACK (on_trayicon_activate), NULL);
#else
+ printf ("connecting button tray signals\n");
g_signal_connect ((gpointer)trayicon, "scroll_event", G_CALLBACK (on_trayicon_scroll_event), NULL);
g_signal_connect ((gpointer)trayicon, "button_press_event", G_CALLBACK (on_trayicon_button_press_event), NULL);
#endif
@@ -930,6 +933,12 @@ send_messages_to_widgets (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uin
}
}
+gboolean
+add_mainmenu_actions_cb (void *data) {
+ add_mainmenu_actions ();
+ return FALSE;
+}
+
int
gtkui_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
ddb_gtkui_widget_t *rootwidget = w_get_rootwidget ();
@@ -973,10 +982,42 @@ gtkui_message (uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
case DB_EV_PLAYLISTSWITCHED:
g_idle_add (playlistswitch_cb, NULL);
break;
+ case DB_EV_ACTIONSCHANGED:
+ g_idle_add (add_mainmenu_actions_cb, NULL);
+ break;
+ case DB_EV_DSPCHAINCHANGED:
+ eq_refresh ();
+ break;
}
return 0;
}
+#ifdef EGG_SM_CLIENT_BACKEND_XSMP
+static void
+smclient_quit_requested (EggSMClient *client, gpointer user_data) {
+ egg_sm_client_will_quit (client, TRUE);
+}
+
+static void
+smclient_quit_cancelled (EggSMClient *client, gpointer user_data) {
+}
+
+static void
+smclient_quit (EggSMClient *client, gpointer user_data) {
+ deadbeef->sendmessage (DB_EV_TERMINATE, 0, 0, 0);
+}
+
+static void
+smclient_save_state (EggSMClient *client, const char *state_dir, gpointer user_data) {
+}
+#endif
+
+static gboolean
+unlock_playlist_columns_cb (void *ctx) {
+ ddb_listview_lock_columns (DDB_LISTVIEW (lookup_widget (mainwin, "playlist")), 0);
+ return FALSE;
+}
+
void
gtkui_thread (void *ctx) {
XInitThreads (); // gtkglext/xcb doesn't work without this
@@ -995,7 +1036,37 @@ gtkui_thread (void *ctx) {
if (!deadbeef->conf_get_int ("gtkui.sync", 0)) {
argc = 1;
}
+
gtk_disable_setlocale ();
+#ifdef EGG_SM_CLIENT_BACKEND_XSMP
+ g_type_init ();
+ GOptionContext *goption_context;
+ GError *err = NULL;
+ goption_context = g_option_context_new (_("- Test logout functionality"));
+ g_option_context_add_group (goption_context, gtk_get_option_group (TRUE));
+ g_option_context_add_group (goption_context, egg_sm_client_get_option_group ());
+
+ if (!g_option_context_parse (goption_context, &argc, (char ***)&argv, &err))
+ {
+ g_printerr ("Could not parse arguments: %s\n", err->message);
+ g_error_free (err);
+ }
+ else {
+ EggSMClient *client = egg_sm_client_get ();
+ g_signal_connect (client, "quit-requested", G_CALLBACK (smclient_quit_requested), NULL);
+ g_signal_connect (client, "quit-cancelled", G_CALLBACK (smclient_quit_cancelled), NULL);
+ g_signal_connect (client, "quit", G_CALLBACK (smclient_quit), NULL);
+ g_signal_connect (client, "save-state", G_CALLBACK (smclient_save_state), NULL);
+ }
+#endif
+
+ // let's start some gtk
+ g_thread_init (NULL);
+// add_pixmap_directory (PREFIX "/share/deadbeef/pixmaps");
+ add_pixmap_directory (deadbeef->get_pixmap_dir ());
+ gdk_threads_init ();
+ gdk_threads_enter ();
+
gtk_init (&argc, (char ***)&argv);
// register widget types
@@ -1037,6 +1108,9 @@ gtkui_thread (void *ctx) {
w_append (rootwidget, w);
}
}
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_set_events (GTK_WIDGET (mainwin), gtk_widget_get_events (GTK_WIDGET (mainwin)) | GDK_SCROLL_MASK);
+#endif
gtkpl_init ();
@@ -1093,7 +1167,6 @@ gtkui_thread (void *ctx) {
progress_init ();
cover_art_init ();
- add_mainmenu_actions (lookup_widget (mainwin, "menubar1"));
gtk_widget_show (mainwin);
@@ -1106,6 +1179,8 @@ gtkui_thread (void *ctx) {
gtk_window_set_title (GTK_WINDOW (mainwin), str);
gtk_initialized = 1;
+ g_idle_add (unlock_playlist_columns_cb, NULL);
+
gtk_main ();
w_free ();
@@ -1119,7 +1194,7 @@ gtkui_thread (void *ctx) {
trkproperties_destroy ();
progress_destroy ();
gtkui_hide_status_icon ();
- draw_free ();
+// draw_free ();
if (theme_treeview) {
gtk_widget_destroy (theme_treeview);
theme_treeview = NULL;
@@ -1266,6 +1341,7 @@ gtkui_connect_cb (void *none) {
}
}
gtkui_playlist_changed ();
+ add_mainmenu_actions ();
return FALSE;
}
@@ -1289,6 +1365,10 @@ gtkui_disconnect (void) {
static gboolean
quit_gtk_cb (gpointer nothing) {
+ extern int trkproperties_modified;
+ trkproperties_modified = 0;
+ trkproperties_destroy ();
+ search_destroy ();
gtk_main_quit ();
return FALSE;
}
@@ -1342,7 +1422,7 @@ static const char settings_dlg[] =
// define plugin interface
static ddb_gtkui_t plugin = {
.gui.plugin.api_vmajor = 1,
- .gui.plugin.api_vminor = 0,
+ .gui.plugin.api_vminor = 4,
.gui.plugin.version_major = 1,
.gui.plugin.version_minor = 0,
.gui.plugin.type = DB_PLUGIN_MISC,
diff --git a/plugins/gtkui/gtkui.h b/plugins/gtkui/gtkui.h
index 2d4ddf11..56f57e8d 100644
--- a/plugins/gtkui/gtkui.h
+++ b/plugins/gtkui/gtkui.h
@@ -29,10 +29,6 @@
#include "../../config.h"
#endif
-//#if defined(ULTRA_COMPATIBLE)
-//#warning compiling for compatibility with gtk <2.14
-//#endif
-
#include "../../deadbeef.h"
extern DB_functions_t *deadbeef;
diff --git a/plugins/gtkui/gtkui.vapi b/plugins/gtkui/gtkui.vapi
deleted file mode 100644
index d18e90bb..00000000
--- a/plugins/gtkui/gtkui.vapi
+++ /dev/null
@@ -1,12 +0,0 @@
-[CCode (cheader_filename = "drawing.h,gtkui.h")]
-[CCode (cprefix = "Gtkui", lower_case_cprefix = "gtkui_")]
-namespace Gtkui {
- public static unowned Gdk.Color get_bar_foreground_color ();
- public static unowned Gdk.Color get_bar_background_color ();
- public static unowned void init_theme_colors ();
-}
-public static unowned void seekbar_draw(Gtk.Widget *widget);
-public static unowned bool on_seekbar_button_press_event(Gtk.Widget widget, Gdk.EventButton event);
-public static unowned bool on_seekbar_button_release_event(Gtk.Widget widget, Gdk.EventButton event);
-public static unowned bool on_seekbar_motion_notify_event(Gtk.Widget widget, Gdk.EventMotion event);
-
diff --git a/plugins/gtkui/interface.c b/plugins/gtkui/interface.c
index 7ccc50de..2b9f06ef 100644
--- a/plugins/gtkui/interface.c
+++ b/plugins/gtkui/interface.c
@@ -35,12 +35,21 @@ create_mainwin (void)
GtkWidget *File;
GtkWidget *File_menu;
GtkWidget *open;
+<<<<<<< HEAD
GtkWidget *image563;
GtkWidget *separator2;
GtkWidget *add_files;
GtkWidget *image564;
GtkWidget *add_folders;
GtkWidget *image565;
+=======
+ GtkWidget *image587;
+ GtkWidget *separator2;
+ GtkWidget *add_files;
+ GtkWidget *image588;
+ GtkWidget *add_folders;
+ GtkWidget *image589;
+>>>>>>> master
GtkWidget *add_location1;
GtkWidget *separatormenuitem1;
GtkWidget *new_playlist1;
@@ -48,18 +57,30 @@ create_mainwin (void)
GtkWidget *playlist_save_as;
GtkWidget *separator8;
GtkWidget *quit;
+<<<<<<< HEAD
GtkWidget *image566;
GtkWidget *Edit;
GtkWidget *Edit_menu;
GtkWidget *clear1;
GtkWidget *image567;
+=======
+ GtkWidget *image590;
+ GtkWidget *Edit;
+ GtkWidget *Edit_menu;
+ GtkWidget *clear1;
+ GtkWidget *image591;
+>>>>>>> master
GtkWidget *select_all1;
GtkWidget *deselect_all1;
GtkWidget *invert_selection1;
GtkWidget *Selection;
GtkWidget *Selection_menu;
GtkWidget *remove1;
+<<<<<<< HEAD
GtkWidget *image568;
+=======
+ GtkWidget *image592;
+>>>>>>> master
GtkWidget *crop1;
GtkWidget *find1;
GtkWidget *sort_by1;
@@ -103,16 +124,26 @@ create_mainwin (void)
GtkWidget *Help;
GtkWidget *Help_menu;
GtkWidget *help1;
+<<<<<<< HEAD
GtkWidget *image569;
+=======
+ GtkWidget *image593;
+>>>>>>> master
GtkWidget *changelog1;
GtkWidget *separator10;
GtkWidget *gpl1;
GtkWidget *lgpl1;
GtkWidget *separator9;
GtkWidget *about1;
+<<<<<<< HEAD
GtkWidget *image570;
GtkWidget *translators1;
GtkWidget *image571;
+=======
+ GtkWidget *image594;
+ GtkWidget *translators1;
+ GtkWidget *image595;
+>>>>>>> master
GtkWidget *hbox2;
GtkWidget *hbox3;
GtkWidget *stopbtn;
@@ -127,6 +158,11 @@ create_mainwin (void)
GtkWidget *image5;
GtkWidget *seekbar;
GtkWidget *volumebar;
+<<<<<<< HEAD
+=======
+ GtkWidget *tabstrip;
+ GtkWidget *playlist;
+>>>>>>> master
GtkWidget *plugins_bottom_vbox;
GtkWidget *statusbar;
GtkAccelGroup *accel_group;
@@ -160,9 +196,15 @@ create_mainwin (void)
GDK_O, (GdkModifierType) GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
+<<<<<<< HEAD
image563 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
gtk_widget_show (image563);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open), image563);
+=======
+ image587 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image587);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (open), image587);
+>>>>>>> master
separator2 = gtk_separator_menu_item_new ();
gtk_widget_show (separator2);
@@ -173,17 +215,29 @@ create_mainwin (void)
gtk_widget_show (add_files);
gtk_container_add (GTK_CONTAINER (File_menu), add_files);
+<<<<<<< HEAD
image564 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
gtk_widget_show (image564);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_files), image564);
+=======
+ image588 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image588);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_files), image588);
+>>>>>>> master
add_folders = gtk_image_menu_item_new_with_mnemonic (_("Add folder(s)"));
gtk_widget_show (add_folders);
gtk_container_add (GTK_CONTAINER (File_menu), add_folders);
+<<<<<<< HEAD
image565 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
gtk_widget_show (image565);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_folders), image565);
+=======
+ image589 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image589);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_folders), image589);
+>>>>>>> master
add_location1 = gtk_menu_item_new_with_mnemonic (_("Add location"));
gtk_widget_show (add_location1);
@@ -221,9 +275,15 @@ create_mainwin (void)
GDK_Q, (GdkModifierType) GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
+<<<<<<< HEAD
image566 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU);
gtk_widget_show (image566);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image566);
+=======
+ image590 = gtk_image_new_from_stock ("gtk-quit", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image590);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (quit), image590);
+>>>>>>> master
Edit = gtk_menu_item_new_with_mnemonic (_("_Edit"));
gtk_widget_show (Edit);
@@ -236,9 +296,15 @@ create_mainwin (void)
gtk_widget_show (clear1);
gtk_container_add (GTK_CONTAINER (Edit_menu), clear1);
+<<<<<<< HEAD
image567 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU);
gtk_widget_show (image567);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (clear1), image567);
+=======
+ image591 = gtk_image_new_from_stock ("gtk-clear", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image591);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (clear1), image591);
+>>>>>>> master
select_all1 = gtk_menu_item_new_with_mnemonic (_("Select all"));
gtk_widget_show (select_all1);
@@ -269,9 +335,15 @@ create_mainwin (void)
gtk_widget_show (remove1);
gtk_container_add (GTK_CONTAINER (Selection_menu), remove1);
+<<<<<<< HEAD
image568 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU);
gtk_widget_show (image568);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (remove1), image568);
+=======
+ image592 = gtk_image_new_from_stock ("gtk-remove", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image592);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (remove1), image592);
+>>>>>>> master
crop1 = gtk_menu_item_new_with_mnemonic (_("Crop"));
gtk_widget_show (crop1);
@@ -284,7 +356,7 @@ create_mainwin (void)
GDK_F, (GdkModifierType) GDK_CONTROL_MASK,
GTK_ACCEL_VISIBLE);
- sort_by1 = gtk_menu_item_new_with_mnemonic (_("Sort By"));
+ sort_by1 = gtk_menu_item_new_with_mnemonic (_("Sort by"));
gtk_widget_show (sort_by1);
gtk_container_add (GTK_CONTAINER (Edit_menu), sort_by1);
@@ -400,19 +472,19 @@ create_mainwin (void)
Looping_menu = gtk_menu_new ();
gtk_menu_item_set_submenu (GTK_MENU_ITEM (Looping), Looping_menu);
- loop_all = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Loop All"));
+ loop_all = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Loop all"));
loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_all));
gtk_widget_show (loop_all);
gtk_container_add (GTK_CONTAINER (Looping_menu), loop_all);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (loop_all), TRUE);
- loop_single = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Loop Single Song"));
+ loop_single = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Loop single song"));
loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_single));
gtk_widget_show (loop_single);
gtk_container_add (GTK_CONTAINER (Looping_menu), loop_single);
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (loop_single), TRUE);
- loop_disable = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Don't Loop"));
+ loop_disable = gtk_radio_menu_item_new_with_mnemonic (loop_all_group, _("Don't loop"));
loop_all_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (loop_disable));
gtk_widget_show (loop_disable);
gtk_container_add (GTK_CONTAINER (Looping_menu), loop_disable);
@@ -457,9 +529,15 @@ create_mainwin (void)
gtk_widget_show (help1);
gtk_container_add (GTK_CONTAINER (Help_menu), help1);
+<<<<<<< HEAD
image569 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU);
gtk_widget_show (image569);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (help1), image569);
+=======
+ image593 = gtk_image_new_from_stock ("gtk-help", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image593);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (help1), image593);
+>>>>>>> master
changelog1 = gtk_menu_item_new_with_mnemonic (_("_ChangeLog"));
gtk_widget_show (changelog1);
@@ -487,17 +565,29 @@ create_mainwin (void)
gtk_widget_show (about1);
gtk_container_add (GTK_CONTAINER (Help_menu), about1);
+<<<<<<< HEAD
image570 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU);
gtk_widget_show (image570);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about1), image570);
+=======
+ image594 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image594);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (about1), image594);
+>>>>>>> master
translators1 = gtk_image_menu_item_new_with_mnemonic (_("_Translators"));
gtk_widget_show (translators1);
gtk_container_add (GTK_CONTAINER (Help_menu), translators1);
+<<<<<<< HEAD
image571 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU);
gtk_widget_show (image571);
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (translators1), image571);
+=======
+ image595 = gtk_image_new_from_stock ("gtk-about", GTK_ICON_SIZE_MENU);
+ gtk_widget_show (image595);
+ gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (translators1), image595);
+>>>>>>> master
hbox2 = gtk_hbox_new (FALSE, 0);
gtk_widget_show (hbox2);
@@ -530,6 +620,9 @@ create_mainwin (void)
gtk_widget_add_accelerator (playbtn, "activate", accel_group,
GDK_Return, (GdkModifierType) 0,
GTK_ACCEL_VISIBLE);
+ gtk_widget_add_accelerator (playbtn, "activate", accel_group,
+ GDK_KP_Enter, (GdkModifierType) 0,
+ GTK_ACCEL_VISIBLE);
gtk_button_set_relief (GTK_BUTTON (playbtn), GTK_RELIEF_NONE);
image2 = gtk_image_new_from_stock ("gtk-media-play", GTK_ICON_SIZE_BUTTON);
@@ -592,6 +685,22 @@ create_mainwin (void)
gtk_widget_set_can_focus(volumebar, FALSE);
gtk_widget_set_can_default(volumebar, FALSE);
+<<<<<<< HEAD
+=======
+ tabstrip = create_tabstrip_widget ("tabstrip", "", "", 0, 0);
+ gtk_widget_show (tabstrip);
+ gtk_box_pack_start (GTK_BOX (vbox1), tabstrip, FALSE, TRUE, 0);
+ gtk_widget_set_size_request (tabstrip, -1, 24);
+ gtk_widget_set_can_focus(tabstrip, FALSE);
+ gtk_widget_set_can_default(tabstrip, FALSE);
+
+ playlist = create_ddb_listview_widget ("playlist", "", "", 0, 0);
+ gtk_widget_show (playlist);
+ gtk_box_pack_start (GTK_BOX (vbox1), playlist, TRUE, TRUE, 0);
+ gtk_widget_set_can_focus(playlist, FALSE);
+ gtk_widget_set_can_default(playlist, FALSE);
+
+>>>>>>> master
plugins_bottom_vbox = gtk_vbox_new (FALSE, 0);
gtk_widget_show (plugins_bottom_vbox);
gtk_box_pack_start (GTK_BOX (vbox1), plugins_bottom_vbox, TRUE, TRUE, 0);
@@ -785,12 +894,21 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, File, "File");
GLADE_HOOKUP_OBJECT (mainwin, File_menu, "File_menu");
GLADE_HOOKUP_OBJECT (mainwin, open, "open");
+<<<<<<< HEAD
GLADE_HOOKUP_OBJECT (mainwin, image563, "image563");
GLADE_HOOKUP_OBJECT (mainwin, separator2, "separator2");
GLADE_HOOKUP_OBJECT (mainwin, add_files, "add_files");
GLADE_HOOKUP_OBJECT (mainwin, image564, "image564");
GLADE_HOOKUP_OBJECT (mainwin, add_folders, "add_folders");
GLADE_HOOKUP_OBJECT (mainwin, image565, "image565");
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, image587, "image587");
+ GLADE_HOOKUP_OBJECT (mainwin, separator2, "separator2");
+ GLADE_HOOKUP_OBJECT (mainwin, add_files, "add_files");
+ GLADE_HOOKUP_OBJECT (mainwin, image588, "image588");
+ GLADE_HOOKUP_OBJECT (mainwin, add_folders, "add_folders");
+ GLADE_HOOKUP_OBJECT (mainwin, image589, "image589");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, add_location1, "add_location1");
GLADE_HOOKUP_OBJECT (mainwin, separatormenuitem1, "separatormenuitem1");
GLADE_HOOKUP_OBJECT (mainwin, new_playlist1, "new_playlist1");
@@ -798,18 +916,30 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, playlist_save_as, "playlist_save_as");
GLADE_HOOKUP_OBJECT (mainwin, separator8, "separator8");
GLADE_HOOKUP_OBJECT (mainwin, quit, "quit");
+<<<<<<< HEAD
GLADE_HOOKUP_OBJECT (mainwin, image566, "image566");
GLADE_HOOKUP_OBJECT (mainwin, Edit, "Edit");
GLADE_HOOKUP_OBJECT (mainwin, Edit_menu, "Edit_menu");
GLADE_HOOKUP_OBJECT (mainwin, clear1, "clear1");
GLADE_HOOKUP_OBJECT (mainwin, image567, "image567");
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, image590, "image590");
+ GLADE_HOOKUP_OBJECT (mainwin, Edit, "Edit");
+ GLADE_HOOKUP_OBJECT (mainwin, Edit_menu, "Edit_menu");
+ GLADE_HOOKUP_OBJECT (mainwin, clear1, "clear1");
+ GLADE_HOOKUP_OBJECT (mainwin, image591, "image591");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, select_all1, "select_all1");
GLADE_HOOKUP_OBJECT (mainwin, deselect_all1, "deselect_all1");
GLADE_HOOKUP_OBJECT (mainwin, invert_selection1, "invert_selection1");
GLADE_HOOKUP_OBJECT (mainwin, Selection, "Selection");
GLADE_HOOKUP_OBJECT (mainwin, Selection_menu, "Selection_menu");
GLADE_HOOKUP_OBJECT (mainwin, remove1, "remove1");
+<<<<<<< HEAD
GLADE_HOOKUP_OBJECT (mainwin, image568, "image568");
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, image592, "image592");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, crop1, "crop1");
GLADE_HOOKUP_OBJECT (mainwin, find1, "find1");
GLADE_HOOKUP_OBJECT (mainwin, sort_by1, "sort_by1");
@@ -851,16 +981,26 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, Help, "Help");
GLADE_HOOKUP_OBJECT (mainwin, Help_menu, "Help_menu");
GLADE_HOOKUP_OBJECT (mainwin, help1, "help1");
+<<<<<<< HEAD
GLADE_HOOKUP_OBJECT (mainwin, image569, "image569");
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, image593, "image593");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, changelog1, "changelog1");
GLADE_HOOKUP_OBJECT (mainwin, separator10, "separator10");
GLADE_HOOKUP_OBJECT (mainwin, gpl1, "gpl1");
GLADE_HOOKUP_OBJECT (mainwin, lgpl1, "lgpl1");
GLADE_HOOKUP_OBJECT (mainwin, separator9, "separator9");
GLADE_HOOKUP_OBJECT (mainwin, about1, "about1");
+<<<<<<< HEAD
GLADE_HOOKUP_OBJECT (mainwin, image570, "image570");
GLADE_HOOKUP_OBJECT (mainwin, translators1, "translators1");
GLADE_HOOKUP_OBJECT (mainwin, image571, "image571");
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, image594, "image594");
+ GLADE_HOOKUP_OBJECT (mainwin, translators1, "translators1");
+ GLADE_HOOKUP_OBJECT (mainwin, image595, "image595");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, hbox2, "hbox2");
GLADE_HOOKUP_OBJECT (mainwin, hbox3, "hbox3");
GLADE_HOOKUP_OBJECT (mainwin, stopbtn, "stopbtn");
@@ -875,6 +1015,11 @@ create_mainwin (void)
GLADE_HOOKUP_OBJECT (mainwin, image5, "image5");
GLADE_HOOKUP_OBJECT (mainwin, seekbar, "seekbar");
GLADE_HOOKUP_OBJECT (mainwin, volumebar, "volumebar");
+<<<<<<< HEAD
+=======
+ GLADE_HOOKUP_OBJECT (mainwin, tabstrip, "tabstrip");
+ GLADE_HOOKUP_OBJECT (mainwin, playlist, "playlist");
+>>>>>>> master
GLADE_HOOKUP_OBJECT (mainwin, plugins_bottom_vbox, "plugins_bottom_vbox");
GLADE_HOOKUP_OBJECT (mainwin, statusbar, "statusbar");
@@ -889,7 +1034,6 @@ create_searchwin (void)
GtkWidget *searchwin;
GtkWidget *vbox4;
GtkWidget *searchentry;
- GtkWidget *frame2;
GtkWidget *searchlist;
searchwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
@@ -898,10 +1042,9 @@ create_searchwin (void)
gtk_window_set_skip_taskbar_hint (GTK_WINDOW (searchwin), TRUE);
gtk_window_set_skip_pager_hint (GTK_WINDOW (searchwin), TRUE);
- vbox4 = gtk_vbox_new (FALSE, 0);
+ vbox4 = gtk_vbox_new (FALSE, 4);
gtk_widget_show (vbox4);
gtk_container_add (GTK_CONTAINER (searchwin), vbox4);
- gtk_container_set_border_width (GTK_CONTAINER (vbox4), 4);
searchentry = gtk_entry_new ();
gtk_widget_show (searchentry);
@@ -909,13 +1052,9 @@ create_searchwin (void)
gtk_entry_set_invisible_char (GTK_ENTRY (searchentry), 8226);
gtk_entry_set_activates_default (GTK_ENTRY (searchentry), TRUE);
- frame2 = gtk_frame_new (NULL);
- gtk_widget_show (frame2);
- gtk_box_pack_start (GTK_BOX (vbox4), frame2, TRUE, TRUE, 0);
-
searchlist = create_ddb_listview_widget ("searchlist", "", "", 0, 0);
gtk_widget_show (searchlist);
- gtk_container_add (GTK_CONTAINER (frame2), searchlist);
+ gtk_box_pack_start (GTK_BOX (vbox4), searchlist, TRUE, TRUE, 0);
gtk_widget_set_can_focus(searchlist, FALSE);
gtk_widget_set_can_default(searchlist, FALSE);
@@ -939,7 +1078,6 @@ create_searchwin (void)
GLADE_HOOKUP_OBJECT_NO_REF (searchwin, searchwin, "searchwin");
GLADE_HOOKUP_OBJECT (searchwin, vbox4, "vbox4");
GLADE_HOOKUP_OBJECT (searchwin, searchentry, "searchentry");
- GLADE_HOOKUP_OBJECT (searchwin, frame2, "frame2");
GLADE_HOOKUP_OBJECT (searchwin, searchlist, "searchlist");
return searchwin;
@@ -1604,6 +1742,9 @@ create_editcolumndlg (void)
gtk_widget_show (label85);
gtk_box_pack_start (GTK_BOX (hbox49), label85, FALSE, FALSE, 0);
+ g_signal_connect ((gpointer) title, "changed",
+ G_CALLBACK (on_editcolumn_title_changed),
+ NULL);
g_signal_connect ((gpointer) id, "changed",
G_CALLBACK (on_column_id_changed),
NULL);
@@ -1703,6 +1844,8 @@ create_prefwin (void)
GtkWidget *embolden_current;
GtkWidget *hide_delete_from_disk;
GtkWidget *auto_name_playlist_from_folder;
+ GtkWidget *enable_cp1251_recoding;
+ GtkWidget *enable_cp936_recoding;
GtkWidget *hbox102;
GtkWidget *label129;
GtkWidget *gui_fps;
@@ -1773,6 +1916,10 @@ create_prefwin (void)
GtkWidget *hbox62;
GtkWidget *label98;
GtkWidget *proxypassword;
+ GtkWidget *hseparator1;
+ GtkWidget *hbox104;
+ GtkWidget *label131;
+ GtkWidget *useragent;
GtkWidget *label16;
GtkWidget *hpaned1;
GtkWidget *scrolledwindow2;
@@ -2067,6 +2214,14 @@ create_prefwin (void)
gtk_widget_show (auto_name_playlist_from_folder);
gtk_box_pack_start (GTK_BOX (vbox9), auto_name_playlist_from_folder, FALSE, FALSE, 0);
+ enable_cp1251_recoding = gtk_check_button_new_with_mnemonic (_("Enable Russian CP1251 detection and recoding"));
+ gtk_widget_show (enable_cp1251_recoding);
+ gtk_box_pack_start (GTK_BOX (vbox9), enable_cp1251_recoding, FALSE, FALSE, 0);
+
+ enable_cp936_recoding = gtk_check_button_new_with_mnemonic (_("Enable Chinese CP936 detection and recoding"));
+ gtk_widget_show (enable_cp936_recoding);
+ gtk_box_pack_start (GTK_BOX (vbox9), enable_cp936_recoding, FALSE, FALSE, 0);
+
hbox102 = gtk_hbox_new (FALSE, 8);
gtk_widget_show (hbox102);
gtk_box_pack_start (GTK_BOX (vbox9), hbox102, FALSE, FALSE, 0);
@@ -2121,7 +2276,7 @@ create_prefwin (void)
gtk_widget_show (gui_plugin);
gtk_box_pack_start (GTK_BOX (hbox101), gui_plugin, TRUE, TRUE, 0);
- label2 = gtk_label_new (_("GUI"));
+ label2 = gtk_label_new (_("GUI/Misc"));
gtk_widget_show (label2);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 3), label2);
@@ -2441,6 +2596,23 @@ create_prefwin (void)
gtk_entry_set_visibility (GTK_ENTRY (proxypassword), FALSE);
gtk_entry_set_invisible_char (GTK_ENTRY (proxypassword), 9679);
+ hseparator1 = gtk_hseparator_new ();
+ gtk_widget_show (hseparator1);
+ gtk_box_pack_start (GTK_BOX (vbox11), hseparator1, FALSE, TRUE, 0);
+
+ hbox104 = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox104);
+ gtk_box_pack_start (GTK_BOX (vbox11), hbox104, FALSE, TRUE, 0);
+
+ label131 = gtk_label_new (_("HTTP User Agent:"));
+ gtk_widget_show (label131);
+ gtk_box_pack_start (GTK_BOX (hbox104), label131, FALSE, FALSE, 0);
+
+ useragent = gtk_entry_new ();
+ gtk_widget_show (useragent);
+ gtk_box_pack_start (GTK_BOX (hbox104), useragent, TRUE, TRUE, 0);
+ gtk_entry_set_invisible_char (GTK_ENTRY (useragent), 8226);
+
label16 = gtk_label_new (_("Network"));
gtk_widget_show (label16);
gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 5), label16);
@@ -2641,6 +2813,12 @@ create_prefwin (void)
g_signal_connect ((gpointer) auto_name_playlist_from_folder, "toggled",
G_CALLBACK (on_auto_name_playlist_from_folder_toggled),
NULL);
+ g_signal_connect ((gpointer) enable_cp1251_recoding, "toggled",
+ G_CALLBACK (on_enable_cp1251_recoding_toggled),
+ NULL);
+ g_signal_connect ((gpointer) enable_cp936_recoding, "toggled",
+ G_CALLBACK (on_enable_cp936_recoding_toggled),
+ NULL);
g_signal_connect ((gpointer) gui_fps, "value_changed",
G_CALLBACK (on_gui_fps_value_changed),
NULL);
@@ -2719,6 +2897,9 @@ create_prefwin (void)
g_signal_connect ((gpointer) proxypassword, "changed",
G_CALLBACK (on_proxypassword_changed),
NULL);
+ g_signal_connect ((gpointer) useragent, "changed",
+ G_CALLBACK (on_useragent_changed),
+ NULL);
g_signal_connect ((gpointer) pref_pluginlist, "cursor_changed",
G_CALLBACK (on_pref_pluginlist_cursor_changed),
NULL);
@@ -2789,6 +2970,8 @@ create_prefwin (void)
GLADE_HOOKUP_OBJECT (prefwin, embolden_current, "embolden_current");
GLADE_HOOKUP_OBJECT (prefwin, hide_delete_from_disk, "hide_delete_from_disk");
GLADE_HOOKUP_OBJECT (prefwin, auto_name_playlist_from_folder, "auto_name_playlist_from_folder");
+ GLADE_HOOKUP_OBJECT (prefwin, enable_cp1251_recoding, "enable_cp1251_recoding");
+ GLADE_HOOKUP_OBJECT (prefwin, enable_cp936_recoding, "enable_cp936_recoding");
GLADE_HOOKUP_OBJECT (prefwin, hbox102, "hbox102");
GLADE_HOOKUP_OBJECT (prefwin, label129, "label129");
GLADE_HOOKUP_OBJECT (prefwin, gui_fps, "gui_fps");
@@ -2859,6 +3042,10 @@ create_prefwin (void)
GLADE_HOOKUP_OBJECT (prefwin, hbox62, "hbox62");
GLADE_HOOKUP_OBJECT (prefwin, label98, "label98");
GLADE_HOOKUP_OBJECT (prefwin, proxypassword, "proxypassword");
+ GLADE_HOOKUP_OBJECT (prefwin, hseparator1, "hseparator1");
+ GLADE_HOOKUP_OBJECT (prefwin, hbox104, "hbox104");
+ GLADE_HOOKUP_OBJECT (prefwin, label131, "label131");
+ GLADE_HOOKUP_OBJECT (prefwin, useragent, "useragent");
GLADE_HOOKUP_OBJECT (prefwin, label16, "label16");
GLADE_HOOKUP_OBJECT (prefwin, hpaned1, "hpaned1");
GLADE_HOOKUP_OBJECT (prefwin, scrolledwindow2, "scrolledwindow2");
@@ -3140,7 +3327,7 @@ create_groupbydlg (void)
GtkWidget *label83;
groupbydlg = gtk_dialog_new ();
- gtk_window_set_title (GTK_WINDOW (groupbydlg), _("Group By"));
+ gtk_window_set_title (GTK_WINDOW (groupbydlg), _("Group By ..."));
gtk_window_set_type_hint (GTK_WINDOW (groupbydlg), GDK_WINDOW_TYPE_HINT_DIALOG);
dialog_vbox5 = gtk_dialog_get_content_area (GTK_DIALOG (groupbydlg));
@@ -3264,7 +3451,7 @@ create_sortbydlg (void)
GtkWidget *okbutton5;
sortbydlg = gtk_dialog_new ();
- gtk_window_set_title (GTK_WINDOW (sortbydlg), _("Sort by..."));
+ gtk_window_set_title (GTK_WINDOW (sortbydlg), _("Sort by ..."));
gtk_window_set_modal (GTK_WINDOW (sortbydlg), TRUE);
gtk_window_set_type_hint (GTK_WINDOW (sortbydlg), GDK_WINDOW_TYPE_HINT_DIALOG);
diff --git a/plugins/gtkui/mainplaylist.c b/plugins/gtkui/mainplaylist.c
index b781feaa..b3a7f7d2 100644
--- a/plugins/gtkui/mainplaylist.c
+++ b/plugins/gtkui/mainplaylist.c
@@ -131,7 +131,9 @@ playlist_tooltip_handler (GtkWidget *widget, gint x, gint y, gboolean keyboard_m
DdbListview *pl = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner"));
DB_playItem_t *it = (DB_playItem_t *)ddb_listview_get_iter_from_coord (pl, 0, y);
if (it) {
+ deadbeef->pl_lock ();
gtk_tooltip_set_text (tooltip, deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
deadbeef->pl_item_unref (it);
return TRUE;
}
@@ -170,18 +172,18 @@ void main_draw_group_title (DdbListview *listview, cairo_t *drawable, DdbListvie
if (theming) {
GdkColor *clr = &gtk_widget_get_style(theme_treeview)->fg[GTK_STATE_NORMAL];
float rgb[] = {clr->red/65535.f, clr->green/65535.f, clr->blue/65535.f};
- draw_set_fg_color (rgb);
+ draw_set_fg_color (&listview->listctx, rgb);
}
else {
GdkColor clr;
gtkui_get_listview_text_color (&clr);
float rgb[] = {clr.red/65535.f, clr.green/65535.f, clr.blue/65535.f};
- draw_set_fg_color (rgb);
+ draw_set_fg_color (&listview->listctx, rgb);
}
int ew, eh;
- draw_get_text_extents (str, -1, &ew, &eh);
- draw_text (x + 5, y + height/2 - draw_get_font_size ()/2 - 2, ew+5, 0, str);
- draw_line (x + 5 + ew + 3, y+height/2, x + width, y+height/2);
+ draw_get_text_extents (&listview->listctx, str, -1, &ew, &eh);
+ draw_text (&listview->listctx, x + 5, y + height/2 - draw_get_font_size (&listview->listctx)/2 - 2, ew+5, 0, str);
+ draw_line (&listview->listctx, x + 5 + ew + 3, y+height/2, x + width, y+height/2);
}
}
void
diff --git a/plugins/gtkui/plcommon.c b/plugins/gtkui/plcommon.c
index 748bd90b..3a00503c 100644
--- a/plugins/gtkui/plcommon.c
+++ b/plugins/gtkui/plcommon.c
@@ -30,6 +30,7 @@
#include "interface.h"
#include "parser.h"
#include "actions.h"
+#include "search.h"
#define min(x,y) ((x)<(y)?(x):(y))
//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
@@ -189,20 +190,20 @@ void draw_column_data (DdbListview *listview, cairo_t *cr, DdbListviewIter it, D
}
}
float fg[3] = {(float)color->red/0xffff, (float)color->green/0xffff, (float)color->blue/0xffff};
- draw_set_fg_color (fg);
+ draw_set_fg_color (&listview->listctx, fg);
- draw_init_font (gtk_widget_get_style (GTK_WIDGET (listview)));
+ draw_init_font (&listview->listctx, gtk_widget_get_style (GTK_WIDGET (listview)));
if (gtkui_embolden_current_track && it && it == playing_track) {
- draw_init_font_bold ();
+ draw_init_font_bold (&listview->listctx);
}
if (calign_right) {
- draw_text (x+5, y + 3, cwidth-10, 1, text);
+ draw_text (&listview->listctx, x+5, y + 3, cwidth-10, 1, text);
}
else {
- draw_text (x + 5, y + 3, cwidth-10, 0, text);
+ draw_text (&listview->listctx, x + 5, y + 3, cwidth-10, 0, text);
}
if (gtkui_embolden_current_track && it && it == playing_track) {
- draw_init_font_normal ();
+ draw_init_font_normal (&listview->listctx);
}
}
if (playing_track) {
@@ -224,7 +225,8 @@ main_add_to_playback_queue_activate (GtkMenuItem *menuitem,
deadbeef->pl_item_unref (it);
it = next;
}
- playlist_refresh ();
+ main_refresh ();
+ search_redraw ();
}
void
@@ -242,7 +244,8 @@ main_remove_from_playback_queue_activate
deadbeef->pl_item_unref (it);
it = next;
}
- playlist_refresh ();
+ main_refresh ();
+ search_redraw ();
}
void
@@ -253,8 +256,16 @@ main_reload_metadata_activate
DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (menuitem), "ps"));
DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN);
while (it) {
- const char *decoder_id = deadbeef->pl_find_meta (it, ":DECODER");
- if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) && decoder_id) {
+ deadbeef->pl_lock ();
+ char decoder_id[100];
+ const char *dec = deadbeef->pl_find_meta (it, ":DECODER");
+ if (dec) {
+ strncpy (decoder_id, dec, sizeof (decoder_id));
+ }
+ int match = deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) && dec;
+ deadbeef->pl_unlock ();
+
+ if (match) {
uint32_t f = deadbeef->pl_get_item_flags (it);
if (!(f & DDB_IS_SUBTRACK)) {
f &= ~DDB_TAG_MASK;
@@ -274,7 +285,8 @@ main_reload_metadata_activate
deadbeef->pl_item_unref (it);
it = next;
}
- playlist_refresh ();
+ main_refresh ();
+ search_redraw ();
trkproperties_fill_metadata ();
}
@@ -344,8 +356,9 @@ on_remove_from_disk_activate (GtkMenuItem *menuitem,
DB_playItem_t *it = deadbeef->pl_get_first (PL_MAIN);
while (it) {
- if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI"))) {
- unlink (deadbeef->pl_find_meta (it, ":URI"));
+ const char *uri = deadbeef->pl_find_meta (it, ":URI");
+ if (deadbeef->pl_is_selected (it) && deadbeef->is_local_file (uri)) {
+ unlink (uri);
}
DB_playItem_t *next = deadbeef->pl_get_next (it, PL_MAIN);
deadbeef->pl_item_unref (it);
@@ -848,11 +861,13 @@ init_column (col_info_t *inf, int id, const char *format) {
}
}
+int editcolumn_title_changed = 0;
void
on_add_column_activate (GtkMenuItem *menuitem,
gpointer user_data)
{
+ editcolumn_title_changed = 0;
GtkWidget *dlg = create_editcolumndlg ();
gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK);
gtk_window_set_title (GTK_WINDOW (dlg), _("Add column"));
@@ -899,6 +914,7 @@ on_edit_column_activate (GtkMenuItem *menuitem,
}
gtk_entry_set_text (GTK_ENTRY (lookup_widget (dlg, "title")), title);
+ editcolumn_title_changed = 0;
int idx = 10;
if (inf->id == -1) {
if (inf->format) {
diff --git a/plugins/gtkui/pluginconf.c b/plugins/gtkui/pluginconf.c
index 1f265372..33532f67 100644
--- a/plugins/gtkui/pluginconf.c
+++ b/plugins/gtkui/pluginconf.c
@@ -212,6 +212,9 @@ ddb_button_from_gtk_response (int response) {
int
gtkui_run_dialog (GtkWidget *parentwin, ddb_dialog_t *conf, uint32_t buttons, int (*callback)(int button, void *ctx), void *ctx) {
+ if (!parentwin) {
+ parentwin = mainwin;
+ }
// create window
char title[200];
snprintf (title, sizeof (title), _("Configure %s"), conf->title);
@@ -531,5 +534,5 @@ gtkui_run_dialog (GtkWidget *parentwin, ddb_dialog_t *conf, uint32_t buttons, in
int
gtkui_run_dialog_root (ddb_dialog_t *conf, uint32_t buttons, int (*callback)(int button, void *ctx), void *ctx) {
- return gtkui_run_dialog (mainwin, conf, buttons, callback, ctx);
+ return gtkui_run_dialog (conf->parent ? conf->parent : mainwin, conf, buttons, callback, ctx);
}
diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c
index 81bb49e1..546759a0 100644
--- a/plugins/gtkui/prefwin.c
+++ b/plugins/gtkui/prefwin.c
@@ -151,7 +151,6 @@ on_hk_slot_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text,
void
on_hk_slot_changed (GtkCellRendererCombo *combo, gchar *path, GtkTreeIter *new_iter, gpointer user_data) {
-
GtkTreeModel *combo_model = NULL;
g_object_get (combo, "model", &combo_model, NULL);
GValue gtitle = {0,}, gname = {0,};
@@ -197,6 +196,37 @@ on_hk_binding_edited (GtkCellRendererAccel *accel, gchar *path, guint accel_key,
strcat (new_value, "Alt ");
}
+ // translate numlock keycodes into non-numlock codes
+ switch (accel_key) {
+ case GDK_KP_0:
+ accel_key = GDK_KP_Insert;
+ break;
+ case GDK_KP_1:
+ accel_key = GDK_KP_End;
+ break;
+ case GDK_KP_2:
+ accel_key = GDK_KP_Down;
+ break;
+ case GDK_KP_3:
+ accel_key = GDK_KP_Page_Down;
+ break;
+ case GDK_KP_4:
+ accel_key = GDK_KP_Left;
+ break;
+ case GDK_KP_6:
+ accel_key = GDK_KP_Right;
+ break;
+ case GDK_KP_7:
+ accel_key = GDK_KP_Home;
+ break;
+ case GDK_KP_8:
+ accel_key = GDK_KP_Up;
+ break;
+ case GDK_KP_9:
+ accel_key = GDK_KP_Page_Up;
+ break;
+ }
+
// find key name from hotkeys plugin
DB_plugin_t *hotkeys = deadbeef->plug_get_for_id ("hotkeys");
if (hotkeys) {
@@ -334,12 +364,11 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
GLADE_HOOKUP_OBJECT (prefwin, addhotkey, "addhotkey");
GLADE_HOOKUP_OBJECT (prefwin, removehotkey, "removehotkey");
- GtkTreeView *hktree = GTK_TREE_VIEW (lookup_widget (prefwin, "hotkeystree"));
GtkListStore *hkstore = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
GtkCellRenderer *rend_hk_slot = gtk_cell_renderer_combo_new ();
g_signal_connect ((gpointer)addhotkey, "clicked", G_CALLBACK (on_addhotkey_clicked), hkstore);
- g_signal_connect ((gpointer)removehotkey, "clicked", G_CALLBACK (on_removehotkey_clicked), hktree);
+ g_signal_connect ((gpointer)removehotkey, "clicked", G_CALLBACK (on_removehotkey_clicked), GTK_TREE_VIEW (hotkeystree));
GtkListStore *slots_store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
// traverse all plugins and collect all exported actions to dropdown
@@ -372,9 +401,6 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
g_object_set (G_OBJECT (rend_hk_slot), "model", slots_store, NULL);
g_object_set (G_OBJECT (rend_hk_slot), "editable", TRUE, NULL);
-// g_signal_connect ((gpointer)rend_hk_slot, "edited",
-// G_CALLBACK (on_hk_slot_edited),
-// hkstore);
g_signal_connect ((gpointer)rend_hk_slot, "changed",
G_CALLBACK (on_hk_slot_changed),
hkstore);
@@ -387,10 +413,10 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
hkstore);
- GtkTreeViewColumn *hk_col1 = gtk_tree_view_column_new_with_attributes (_("Slot"), rend_hk_slot, "text", 0, NULL);
+ GtkTreeViewColumn *hk_col1 = gtk_tree_view_column_new_with_attributes (_("Action"), rend_hk_slot, "text", 0, NULL);
GtkTreeViewColumn *hk_col2 = gtk_tree_view_column_new_with_attributes (_("Key combination"), rend_hk_binding, "text", 1, NULL);
- gtk_tree_view_append_column (hktree, hk_col1);
- gtk_tree_view_append_column (hktree, hk_col2);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (hotkeystree), hk_col1);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (hotkeystree), hk_col2);
// fetch hotkeys from config, and add them to list
// model:
@@ -450,7 +476,7 @@ prefwin_add_hotkeys_tab (GtkWidget *prefwin) {
item = deadbeef->conf_find ("hotkeys.", item);
}
}
- gtk_tree_view_set_model (hktree, GTK_TREE_MODEL (hkstore));
+ gtk_tree_view_set_model (GTK_TREE_VIEW (hotkeystree), GTK_TREE_MODEL (hkstore));
}
@@ -550,6 +576,13 @@ on_preferences_activate (GtkMenuItem *menuitem,
// resume last session
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (w, "resume_last_session")), deadbeef->conf_get_int ("resume_last_session", 0));
+ // enable cp1251 recoding
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (w, "enable_cp1251_recoding")), deadbeef->conf_get_int ("junk.enable_cp1251_detection", 1));
+
+ // enable cp936 recoding
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lookup_widget (w, "enable_cp936_recoding")), deadbeef->conf_get_int ("junk.enable_cp936_detection", 0));
+
+
// fill gui plugin list
combobox = GTK_COMBO_BOX (lookup_widget (w, "gui_plugin"));
const char **names = deadbeef->plug_get_gui_names ();
@@ -605,6 +638,10 @@ on_preferences_activate (GtkMenuItem *menuitem,
gtk_entry_set_text (GTK_ENTRY (lookup_widget (w, "proxyuser")), deadbeef->conf_get_str_fast ("network.proxy.username", ""));
gtk_entry_set_text (GTK_ENTRY (lookup_widget (w, "proxypassword")), deadbeef->conf_get_str_fast ("network.proxy.password", ""));
+ char ua[100];
+ deadbeef->conf_get_str ("network.http_user_agent", "deadbeef", ua, sizeof (ua));
+ gtk_entry_set_text (GTK_ENTRY (lookup_widget (w, "useragent")), ua);
+
// list of plugins
GtkTreeView *tree = GTK_TREE_VIEW (lookup_widget (w, "pref_pluginlist"));
GtkCellRenderer *rend_text = gtk_cell_renderer_text_new ();
@@ -1253,6 +1290,25 @@ on_resume_last_session_toggled (GtkToggleButton *togglebutton,
deadbeef->conf_set_int ("resume_last_session", active);
}
+void
+on_enable_cp1251_recoding_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ int active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton));
+ deadbeef->conf_set_int ("junk.enable_cp1251_detection", active);
+ deadbeef->sendmessage (DB_EV_CONFIGCHANGED, 0, 0, 0);
+}
+
+
+void
+on_enable_cp936_recoding_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data)
+{
+ int active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (togglebutton));
+ deadbeef->conf_set_int ("junk.enable_cp936_detection", active);
+ deadbeef->sendmessage (DB_EV_CONFIGCHANGED, 0, 0, 0);
+}
+
void
on_auto_name_playlist_from_folder_toggled
@@ -1382,3 +1438,13 @@ on_convert8to16_toggled (GtkToggleButton *togglebutton,
deadbeef->sendmessage (DB_EV_CONFIGCHANGED, 0, 0, 0);
}
+
+
+void
+on_useragent_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ deadbeef->conf_set_str ("network.http_user_agent", gtk_entry_get_text (GTK_ENTRY (editable)));
+ deadbeef->sendmessage (DB_EV_CONFIGCHANGED, 0, 0, 0);
+}
+
diff --git a/plugins/gtkui/search.c b/plugins/gtkui/search.c
index 87344e39..6634f12f 100644
--- a/plugins/gtkui/search.c
+++ b/plugins/gtkui/search.c
@@ -50,17 +50,31 @@ extern DB_functions_t *deadbeef; // defined in gtkui.c
extern GtkWidget *searchwin;
extern GtkWidget *mainwin;
+static gboolean
+unlock_search_columns_cb (void *ctx) {
+ ddb_listview_lock_columns (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")), 0);
+ return FALSE;
+}
+
void
search_start (void) {
+ ddb_listview_lock_columns (DDB_LISTVIEW (lookup_widget (searchwin, "searchlist")), 1);
wingeom_restore (searchwin, "searchwin", -1, -1, 450, 150, 0);
gtk_entry_set_text (GTK_ENTRY (lookup_widget (searchwin, "searchentry")), "");
gtk_widget_show (searchwin);
gtk_window_present (GTK_WINDOW (searchwin));
+ g_idle_add (unlock_search_columns_cb, NULL);
search_refresh ();
main_refresh ();
}
void
+search_destroy (void) {
+ gtk_widget_destroy (searchwin);
+ searchwin = NULL;
+}
+
+void
search_process (const char *text) {
ddb_playlist_t *plt = deadbeef->plt_get_curr ();
deadbeef->plt_search_process (plt, text);
@@ -91,6 +105,14 @@ search_refresh (void) {
}
}
+void
+search_redraw (void) {
+ if (searchwin && gtk_widget_get_visible (searchwin)) {
+ GtkWidget *pl = lookup_widget (searchwin, "searchlist");
+ ddb_listview_refresh (DDB_LISTVIEW (pl), DDB_REFRESH_VSCROLL | DDB_REFRESH_LIST | DDB_LIST_CHANGED);
+ }
+}
+
///////// searchwin header handlers
gboolean
@@ -403,4 +425,3 @@ search_playlist_init (GtkWidget *widget) {
}
lock_column_config = 0;
}
-
diff --git a/plugins/gtkui/search.h b/plugins/gtkui/search.h
index 104bc24f..34931692 100644
--- a/plugins/gtkui/search.h
+++ b/plugins/gtkui/search.h
@@ -26,10 +26,16 @@ extern int search_count;
void
search_start (void);
+void
+search_destroy (void);
+
// should be called whenever playlist was changed
void
search_refresh (void);
+void
+search_redraw (void);
+
int
search_get_idx (DdbListviewIter it);
diff --git a/plugins/gtkui/smclient/eggdesktopfile.c b/plugins/gtkui/smclient/eggdesktopfile.c
new file mode 100644
index 00000000..443d5ec6
--- /dev/null
+++ b/plugins/gtkui/smclient/eggdesktopfile.c
@@ -0,0 +1,1528 @@
+/* eggdesktopfile.c - Freedesktop.Org Desktop Files
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * Based on gnome-desktop-item.c
+ * Copyright (C) 1999, 2000 Red Hat Inc.
+ * Copyright (C) 2001 George Lebl
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; see the file COPYING.LIB. If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "eggdesktopfile.h"
+
+#include <string.h>
+#include <unistd.h>
+
+#include <glib/gi18n.h>
+#include <gdk/gdkx.h>
+#include <gtk/gtk.h>
+
+struct EggDesktopFile {
+ GKeyFile *key_file;
+ char *source;
+
+ char *name, *icon;
+ EggDesktopFileType type;
+ char document_code;
+};
+
+/**
+ * egg_desktop_file_new:
+ * @desktop_file_path: path to a Freedesktop-style Desktop file
+ * @error: error pointer
+ *
+ * Creates a new #EggDesktopFile for @desktop_file.
+ *
+ * Return value: the new #EggDesktopFile, or %NULL on error.
+ **/
+EggDesktopFile *
+egg_desktop_file_new (const char *desktop_file_path, GError **error)
+{
+ GKeyFile *key_file;
+
+ key_file = g_key_file_new ();
+ if (!g_key_file_load_from_file (key_file, desktop_file_path, 0, error))
+ {
+ g_key_file_free (key_file);
+ return NULL;
+ }
+
+ return egg_desktop_file_new_from_key_file (key_file, desktop_file_path,
+ error);
+}
+
+/**
+ * egg_desktop_file_new_from_data_dirs:
+ * @desktop_file_path: relative path to a Freedesktop-style Desktop file
+ * @error: error pointer
+ *
+ * Looks for @desktop_file_path in the paths returned from
+ * g_get_user_data_dir() and g_get_system_data_dirs(), and creates
+ * a new #EggDesktopFile from it.
+ *
+ * Return value: the new #EggDesktopFile, or %NULL on error.
+ **/
+EggDesktopFile *
+egg_desktop_file_new_from_data_dirs (const char *desktop_file_path,
+ GError **error)
+{
+ EggDesktopFile *desktop_file;
+ GKeyFile *key_file;
+ char *full_path;
+
+ key_file = g_key_file_new ();
+ if (!g_key_file_load_from_data_dirs (key_file, desktop_file_path,
+ &full_path, 0, error))
+ {
+ g_key_file_free (key_file);
+ return NULL;
+ }
+
+ desktop_file = egg_desktop_file_new_from_key_file (key_file,
+ full_path,
+ error);
+ g_free (full_path);
+ return desktop_file;
+}
+
+/**
+ * egg_desktop_file_new_from_dirs:
+ * @desktop_file_path: relative path to a Freedesktop-style Desktop file
+ * @search_dirs: NULL-terminated array of directories to search
+ * @error: error pointer
+ *
+ * Looks for @desktop_file_path in the paths returned from
+ * g_get_user_data_dir() and g_get_system_data_dirs(), and creates
+ * a new #EggDesktopFile from it.
+ *
+ * Return value: the new #EggDesktopFile, or %NULL on error.
+ **/
+EggDesktopFile *
+egg_desktop_file_new_from_dirs (const char *desktop_file_path,
+ const char **search_dirs,
+ GError **error)
+{
+ EggDesktopFile *desktop_file;
+ GKeyFile *key_file;
+ char *full_path;
+
+ key_file = g_key_file_new ();
+ if (!g_key_file_load_from_dirs (key_file, desktop_file_path, search_dirs,
+ &full_path, 0, error))
+ {
+ g_key_file_free (key_file);
+ return NULL;
+ }
+
+ desktop_file = egg_desktop_file_new_from_key_file (key_file,
+ full_path,
+ error);
+ g_free (full_path);
+ return desktop_file;
+}
+
+/**
+ * egg_desktop_file_new_from_key_file:
+ * @key_file: a #GKeyFile representing a desktop file
+ * @source: the path or URI that @key_file was loaded from, or %NULL
+ * @error: error pointer
+ *
+ * Creates a new #EggDesktopFile for @key_file. Assumes ownership of
+ * @key_file (on success or failure); you should consider @key_file to
+ * be freed after calling this function.
+ *
+ * Return value: the new #EggDesktopFile, or %NULL on error.
+ **/
+EggDesktopFile *
+egg_desktop_file_new_from_key_file (GKeyFile *key_file,
+ const char *source,
+ GError **error)
+{
+ EggDesktopFile *desktop_file;
+ char *version, *type;
+
+ if (!g_key_file_has_group (key_file, EGG_DESKTOP_FILE_GROUP))
+ {
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_INVALID,
+ _("File is not a valid .desktop file"));
+ g_key_file_free (key_file);
+ return NULL;
+ }
+
+ version = g_key_file_get_value (key_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_VERSION,
+ NULL);
+ if (version)
+ {
+ double version_num;
+ char *end;
+
+ version_num = g_ascii_strtod (version, &end);
+ if (*end)
+ {
+ g_warning ("Invalid Version string '%s' in %s",
+ version, source ? source : "(unknown)");
+ }
+ else if (version_num > 1.0)
+ {
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_INVALID,
+ /* translators: 'Version' is from a desktop file, and
+ * should not be translated. '%s' would probably be a
+ * version number. */
+ _("Unrecognized desktop file Version '%s'"), version);
+ g_free (version);
+ g_key_file_free (key_file);
+ return NULL;
+ }
+ g_free (version);
+ }
+
+ desktop_file = g_new0 (EggDesktopFile, 1);
+ desktop_file->key_file = key_file;
+
+ if (g_path_is_absolute (source))
+ desktop_file->source = g_filename_to_uri (source, NULL, NULL);
+ else
+ desktop_file->source = g_strdup (source);
+
+ desktop_file->name = g_key_file_get_locale_string (key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_NAME,
+ NULL,
+ error);
+ if (!desktop_file->name)
+ {
+ egg_desktop_file_free (desktop_file);
+ return NULL;
+ }
+
+ type = g_key_file_get_string (key_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_TYPE, error);
+ if (!type)
+ {
+ egg_desktop_file_free (desktop_file);
+ return NULL;
+ }
+
+ if (!strcmp (type, "Application"))
+ {
+ char *exec, *p;
+
+ desktop_file->type = EGG_DESKTOP_FILE_TYPE_APPLICATION;
+
+ exec = g_key_file_get_string (key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_EXEC,
+ error);
+ if (!exec)
+ {
+ egg_desktop_file_free (desktop_file);
+ g_free (type);
+ return NULL;
+ }
+
+ /* See if it takes paths or URIs or neither */
+ for (p = exec; *p; p++)
+ {
+ if (*p == '%')
+ {
+ if (p[1] == '\0' || strchr ("FfUu", p[1]))
+ {
+ desktop_file->document_code = p[1];
+ break;
+ }
+ p++;
+ }
+ }
+
+ g_free (exec);
+ }
+ else if (!strcmp (type, "Link"))
+ {
+ char *url;
+
+ desktop_file->type = EGG_DESKTOP_FILE_TYPE_LINK;
+
+ url = g_key_file_get_string (key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_URL,
+ error);
+ if (!url)
+ {
+ egg_desktop_file_free (desktop_file);
+ g_free (type);
+ return NULL;
+ }
+ g_free (url);
+ }
+ else if (!strcmp (type, "Directory"))
+ desktop_file->type = EGG_DESKTOP_FILE_TYPE_DIRECTORY;
+ else
+ desktop_file->type = EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED;
+
+ g_free (type);
+
+ /* Check the Icon key */
+ desktop_file->icon = g_key_file_get_string (key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_ICON,
+ NULL);
+ if (desktop_file->icon && !g_path_is_absolute (desktop_file->icon))
+ {
+ char *ext;
+
+ /* Lots of .desktop files still get this wrong */
+ ext = strrchr (desktop_file->icon, '.');
+ if (ext && (!strcmp (ext, ".png") ||
+ !strcmp (ext, ".xpm") ||
+ !strcmp (ext, ".svg")))
+ {
+ g_warning ("Desktop file '%s' has malformed Icon key '%s'"
+ "(should not include extension)",
+ source ? source : "(unknown)",
+ desktop_file->icon);
+ *ext = '\0';
+ }
+ }
+
+ return desktop_file;
+}
+
+/**
+ * egg_desktop_file_free:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Frees @desktop_file.
+ **/
+void
+egg_desktop_file_free (EggDesktopFile *desktop_file)
+{
+ g_key_file_free (desktop_file->key_file);
+ g_free (desktop_file->source);
+ g_free (desktop_file->name);
+ g_free (desktop_file->icon);
+ g_free (desktop_file);
+}
+
+/**
+ * egg_desktop_file_get_source:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Gets the URI that @desktop_file was loaded from.
+ *
+ * Return value: @desktop_file's source URI
+ **/
+const char *
+egg_desktop_file_get_source (EggDesktopFile *desktop_file)
+{
+ return desktop_file->source;
+}
+
+/**
+ * egg_desktop_file_get_desktop_file_type:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Gets the desktop file type of @desktop_file.
+ *
+ * Return value: @desktop_file's type
+ **/
+EggDesktopFileType
+egg_desktop_file_get_desktop_file_type (EggDesktopFile *desktop_file)
+{
+ return desktop_file->type;
+}
+
+/**
+ * egg_desktop_file_get_name:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Gets the (localized) value of @desktop_file's "Name" key.
+ *
+ * Return value: the application/link name
+ **/
+const char *
+egg_desktop_file_get_name (EggDesktopFile *desktop_file)
+{
+ return desktop_file->name;
+}
+
+/**
+ * egg_desktop_file_get_icon:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Gets the value of @desktop_file's "Icon" key.
+ *
+ * If the icon string is a full path (that is, if g_path_is_absolute()
+ * returns %TRUE when called on it), it points to a file containing an
+ * unthemed icon. If the icon string is not a full path, it is the
+ * name of a themed icon, which can be looked up with %GtkIconTheme,
+ * or passed directly to a theme-aware widget like %GtkImage or
+ * %GtkCellRendererPixbuf.
+ *
+ * Return value: the icon path or name
+ **/
+const char *
+egg_desktop_file_get_icon (EggDesktopFile *desktop_file)
+{
+ return desktop_file->icon;
+}
+
+gboolean
+egg_desktop_file_has_key (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error)
+{
+ return g_key_file_has_key (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ error);
+}
+
+char *
+egg_desktop_file_get_string (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error)
+{
+ return g_key_file_get_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ error);
+}
+
+char *
+egg_desktop_file_get_locale_string (EggDesktopFile *desktop_file,
+ const char *key,
+ const char *locale,
+ GError **error)
+{
+ return g_key_file_get_locale_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key, locale,
+ error);
+}
+
+gboolean
+egg_desktop_file_get_boolean (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error)
+{
+ return g_key_file_get_boolean (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ error);
+}
+
+double
+egg_desktop_file_get_numeric (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error)
+{
+ return g_key_file_get_double (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ error);
+}
+
+int
+egg_desktop_file_get_integer (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error)
+{
+ return g_key_file_get_integer (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ error);
+}
+
+char **
+egg_desktop_file_get_string_list (EggDesktopFile *desktop_file,
+ const char *key,
+ gsize *length,
+ GError **error)
+{
+ return g_key_file_get_string_list (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key, length,
+ error);
+}
+
+char **
+egg_desktop_file_get_locale_string_list (EggDesktopFile *desktop_file,
+ const char *key,
+ const char *locale,
+ gsize *length,
+ GError **error)
+{
+ return g_key_file_get_locale_string_list (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP, key,
+ locale, length,
+ error);
+}
+
+/**
+ * egg_desktop_file_can_launch:
+ * @desktop_file: an #EggDesktopFile
+ * @desktop_environment: the name of the running desktop environment,
+ * or %NULL
+ *
+ * Tests if @desktop_file can/should be launched in the current
+ * environment. If @desktop_environment is non-%NULL, @desktop_file's
+ * "OnlyShowIn" and "NotShowIn" keys are checked to make sure that
+ * this desktop_file is appropriate for the named environment.
+ *
+ * Furthermore, if @desktop_file has type
+ * %EGG_DESKTOP_FILE_TYPE_APPLICATION, its "TryExec" key (if any) is
+ * also checked, to make sure the binary it points to exists.
+ *
+ * egg_desktop_file_can_launch() does NOT check the value of the
+ * "Hidden" key.
+ *
+ * Return value: %TRUE if @desktop_file can be launched
+ **/
+gboolean
+egg_desktop_file_can_launch (EggDesktopFile *desktop_file,
+ const char *desktop_environment)
+{
+ char *try_exec, *found_program;
+ char **only_show_in, **not_show_in;
+ gboolean found;
+ int i;
+
+ if (desktop_file->type != EGG_DESKTOP_FILE_TYPE_APPLICATION &&
+ desktop_file->type != EGG_DESKTOP_FILE_TYPE_LINK)
+ return FALSE;
+
+ if (desktop_environment)
+ {
+ only_show_in = g_key_file_get_string_list (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_ONLY_SHOW_IN,
+ NULL, NULL);
+ if (only_show_in)
+ {
+ for (i = 0, found = FALSE; only_show_in[i] && !found; i++)
+ {
+ if (!strcmp (only_show_in[i], desktop_environment))
+ found = TRUE;
+ }
+
+ g_strfreev (only_show_in);
+
+ if (!found)
+ return FALSE;
+ }
+
+ not_show_in = g_key_file_get_string_list (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_NOT_SHOW_IN,
+ NULL, NULL);
+ if (not_show_in)
+ {
+ for (i = 0, found = FALSE; not_show_in[i] && !found; i++)
+ {
+ if (!strcmp (not_show_in[i], desktop_environment))
+ found = TRUE;
+ }
+
+ g_strfreev (not_show_in);
+
+ if (found)
+ return FALSE;
+ }
+ }
+
+ if (desktop_file->type == EGG_DESKTOP_FILE_TYPE_APPLICATION)
+ {
+ try_exec = g_key_file_get_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_TRY_EXEC,
+ NULL);
+ if (try_exec)
+ {
+ found_program = g_find_program_in_path (try_exec);
+ g_free (try_exec);
+
+ if (!found_program)
+ return FALSE;
+ g_free (found_program);
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * egg_desktop_file_accepts_documents:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Tests if @desktop_file represents an application that can accept
+ * documents on the command line.
+ *
+ * Return value: %TRUE or %FALSE
+ **/
+gboolean
+egg_desktop_file_accepts_documents (EggDesktopFile *desktop_file)
+{
+ return desktop_file->document_code != 0;
+}
+
+/**
+ * egg_desktop_file_accepts_multiple:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Tests if @desktop_file can accept multiple documents at once.
+ *
+ * If this returns %FALSE, you can still pass multiple documents to
+ * egg_desktop_file_launch(), but that will result in multiple copies
+ * of the application being launched. See egg_desktop_file_launch()
+ * for more details.
+ *
+ * Return value: %TRUE or %FALSE
+ **/
+gboolean
+egg_desktop_file_accepts_multiple (EggDesktopFile *desktop_file)
+{
+ return (desktop_file->document_code == 'F' ||
+ desktop_file->document_code == 'U');
+}
+
+/**
+ * egg_desktop_file_accepts_uris:
+ * @desktop_file: an #EggDesktopFile
+ *
+ * Tests if @desktop_file can accept (non-"file:") URIs as documents to
+ * open.
+ *
+ * Return value: %TRUE or %FALSE
+ **/
+gboolean
+egg_desktop_file_accepts_uris (EggDesktopFile *desktop_file)
+{
+ return (desktop_file->document_code == 'U' ||
+ desktop_file->document_code == 'u');
+}
+
+static void
+append_quoted_word (GString *str,
+ const char *s,
+ gboolean in_single_quotes,
+ gboolean in_double_quotes)
+{
+ const char *p;
+
+ if (!in_single_quotes && !in_double_quotes)
+ g_string_append_c (str, '\'');
+ else if (!in_single_quotes && in_double_quotes)
+ g_string_append (str, "\"'");
+
+ if (!strchr (s, '\''))
+ g_string_append (str, s);
+ else
+ {
+ for (p = s; *p != '\0'; p++)
+ {
+ if (*p == '\'')
+ g_string_append (str, "'\\''");
+ else
+ g_string_append_c (str, *p);
+ }
+ }
+
+ if (!in_single_quotes && !in_double_quotes)
+ g_string_append_c (str, '\'');
+ else if (!in_single_quotes && in_double_quotes)
+ g_string_append (str, "'\"");
+}
+
+static void
+do_percent_subst (EggDesktopFile *desktop_file,
+ char code,
+ GString *str,
+ GSList **documents,
+ gboolean in_single_quotes,
+ gboolean in_double_quotes)
+{
+ GSList *d;
+ char *doc;
+
+ switch (code)
+ {
+ case '%':
+ g_string_append_c (str, '%');
+ break;
+
+ case 'F':
+ case 'U':
+ for (d = *documents; d; d = d->next)
+ {
+ doc = d->data;
+ g_string_append (str, " ");
+ append_quoted_word (str, doc, in_single_quotes, in_double_quotes);
+ }
+ *documents = NULL;
+ break;
+
+ case 'f':
+ case 'u':
+ if (*documents)
+ {
+ doc = (*documents)->data;
+ g_string_append (str, " ");
+ append_quoted_word (str, doc, in_single_quotes, in_double_quotes);
+ *documents = (*documents)->next;
+ }
+ break;
+
+ case 'i':
+ if (desktop_file->icon)
+ {
+ g_string_append (str, "--icon ");
+ append_quoted_word (str, desktop_file->icon,
+ in_single_quotes, in_double_quotes);
+ }
+ break;
+
+ case 'c':
+ if (desktop_file->name)
+ {
+ append_quoted_word (str, desktop_file->name,
+ in_single_quotes, in_double_quotes);
+ }
+ break;
+
+ case 'k':
+ if (desktop_file->source)
+ {
+ append_quoted_word (str, desktop_file->source,
+ in_single_quotes, in_double_quotes);
+ }
+ break;
+
+ case 'D':
+ case 'N':
+ case 'd':
+ case 'n':
+ case 'v':
+ case 'm':
+ /* Deprecated; skip */
+ break;
+
+ default:
+ g_warning ("Unrecognized %%-code '%%%c' in Exec", code);
+ break;
+ }
+}
+
+static char *
+parse_exec (EggDesktopFile *desktop_file,
+ GSList **documents,
+ GError **error)
+{
+ char *exec, *p, *command;
+ gboolean escape, single_quot, double_quot;
+ GString *gs;
+
+ exec = g_key_file_get_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_EXEC,
+ error);
+ if (!exec)
+ return NULL;
+
+ /* Build the command */
+ gs = g_string_new (NULL);
+ escape = single_quot = double_quot = FALSE;
+
+ for (p = exec; *p != '\0'; p++)
+ {
+ if (escape)
+ {
+ escape = FALSE;
+ g_string_append_c (gs, *p);
+ }
+ else if (*p == '\\')
+ {
+ if (!single_quot)
+ escape = TRUE;
+ g_string_append_c (gs, *p);
+ }
+ else if (*p == '\'')
+ {
+ g_string_append_c (gs, *p);
+ if (!single_quot && !double_quot)
+ single_quot = TRUE;
+ else if (single_quot)
+ single_quot = FALSE;
+ }
+ else if (*p == '"')
+ {
+ g_string_append_c (gs, *p);
+ if (!single_quot && !double_quot)
+ double_quot = TRUE;
+ else if (double_quot)
+ double_quot = FALSE;
+ }
+ else if (*p == '%' && p[1])
+ {
+ do_percent_subst (desktop_file, p[1], gs, documents,
+ single_quot, double_quot);
+ p++;
+ }
+ else
+ g_string_append_c (gs, *p);
+ }
+
+ g_free (exec);
+ command = g_string_free (gs, FALSE);
+
+ /* Prepend "xdg-terminal " if needed (FIXME: use gvfs) */
+ if (g_key_file_has_key (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_TERMINAL,
+ NULL))
+ {
+ GError *terminal_error = NULL;
+ gboolean use_terminal =
+ g_key_file_get_boolean (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_TERMINAL,
+ &terminal_error);
+ if (terminal_error)
+ {
+ g_free (command);
+ g_propagate_error (error, terminal_error);
+ return NULL;
+ }
+
+ if (use_terminal)
+ {
+ gs = g_string_new ("xdg-terminal ");
+ append_quoted_word (gs, command, FALSE, FALSE);
+ g_free (command);
+ command = g_string_free (gs, FALSE);
+ }
+ }
+
+ return command;
+}
+
+static GSList *
+translate_document_list (EggDesktopFile *desktop_file, GSList *documents)
+{
+ gboolean accepts_uris = egg_desktop_file_accepts_uris (desktop_file);
+ GSList *ret, *d;
+
+ for (d = documents, ret = NULL; d; d = d->next)
+ {
+ const char *document = d->data;
+ gboolean is_uri = !g_path_is_absolute (document);
+ char *translated;
+
+ if (accepts_uris)
+ {
+ if (is_uri)
+ translated = g_strdup (document);
+ else
+ translated = g_filename_to_uri (document, NULL, NULL);
+ }
+ else
+ {
+ if (is_uri)
+ translated = g_filename_from_uri (document, NULL, NULL);
+ else
+ translated = g_strdup (document);
+ }
+
+ if (translated)
+ ret = g_slist_prepend (ret, translated);
+ }
+
+ return g_slist_reverse (ret);
+}
+
+static void
+free_document_list (GSList *documents)
+{
+ GSList *d;
+
+ for (d = documents; d; d = d->next)
+ g_free (d->data);
+ g_slist_free (documents);
+}
+
+/**
+ * egg_desktop_file_parse_exec:
+ * @desktop_file: a #EggDesktopFile
+ * @documents: a list of document paths or URIs
+ * @error: error pointer
+ *
+ * Parses @desktop_file's Exec key, inserting @documents into it, and
+ * returns the result.
+ *
+ * If @documents contains non-file: URIs and @desktop_file does not
+ * accept URIs, those URIs will be ignored. Likewise, if @documents
+ * contains more elements than @desktop_file accepts, the extra
+ * documents will be ignored.
+ *
+ * Return value: the parsed Exec string
+ **/
+char *
+egg_desktop_file_parse_exec (EggDesktopFile *desktop_file,
+ GSList *documents,
+ GError **error)
+{
+ GSList *translated, *docs;
+ char *command;
+
+ docs = translated = translate_document_list (desktop_file, documents);
+ command = parse_exec (desktop_file, &docs, error);
+ free_document_list (translated);
+
+ return command;
+}
+
+static gboolean
+parse_link (EggDesktopFile *desktop_file,
+ EggDesktopFile **app_desktop_file,
+ GSList **documents,
+ GError **error)
+{
+ char *url;
+ GKeyFile *key_file;
+
+ url = g_key_file_get_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_URL,
+ error);
+ if (!url)
+ return FALSE;
+ *documents = g_slist_prepend (NULL, url);
+
+ /* FIXME: use gvfs */
+ key_file = g_key_file_new ();
+ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_NAME,
+ "xdg-open");
+ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_TYPE,
+ "Application");
+ g_key_file_set_string (key_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_EXEC,
+ "xdg-open %u");
+ *app_desktop_file = egg_desktop_file_new_from_key_file (key_file, NULL, NULL);
+ return TRUE;
+}
+
+#if GTK_CHECK_VERSION (2, 12, 0)
+static char *
+start_startup_notification (GdkDisplay *display,
+ EggDesktopFile *desktop_file,
+ const char *argv0,
+ int screen,
+ int workspace,
+ guint32 launch_time)
+{
+ static int sequence = 0;
+ char *startup_id;
+ char *description, *wmclass;
+ char *screen_str, *workspace_str;
+
+ if (g_key_file_has_key (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY,
+ NULL))
+ {
+ if (!g_key_file_get_boolean (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY,
+ NULL))
+ return NULL;
+ wmclass = NULL;
+ }
+ else
+ {
+ wmclass = g_key_file_get_string (desktop_file->key_file,
+ EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_STARTUP_WM_CLASS,
+ NULL);
+ if (!wmclass)
+ return NULL;
+ }
+
+ if (launch_time == (guint32)-1)
+ launch_time = gdk_x11_display_get_user_time (display);
+ startup_id = g_strdup_printf ("%s-%lu-%s-%s-%d_TIME%lu",
+ g_get_prgname (),
+ (unsigned long)getpid (),
+ g_get_host_name (),
+ argv0,
+ sequence++,
+ (unsigned long)launch_time);
+
+ description = g_strdup_printf (_("Starting %s"), desktop_file->name);
+ screen_str = g_strdup_printf ("%d", screen);
+ workspace_str = workspace == -1 ? NULL : g_strdup_printf ("%d", workspace);
+
+ gdk_x11_display_broadcast_startup_message (display, "new",
+ "ID", startup_id,
+ "NAME", desktop_file->name,
+ "SCREEN", screen_str,
+ "BIN", argv0,
+ "ICON", desktop_file->icon,
+ "DESKTOP", workspace_str,
+ "DESCRIPTION", description,
+ "WMCLASS", wmclass,
+ NULL);
+
+ g_free (description);
+ g_free (wmclass);
+ g_free (screen_str);
+ g_free (workspace_str);
+
+ return startup_id;
+}
+
+static void
+end_startup_notification (GdkDisplay *display,
+ const char *startup_id)
+{
+ gdk_x11_display_broadcast_startup_message (display, "remove",
+ "ID", startup_id,
+ NULL);
+}
+
+#define EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH (30 /* seconds */)
+
+typedef struct {
+ GdkDisplay *display;
+ char *startup_id;
+} StartupNotificationData;
+
+static gboolean
+startup_notification_timeout (gpointer data)
+{
+ StartupNotificationData *sn_data = data;
+
+ end_startup_notification (sn_data->display, sn_data->startup_id);
+ g_object_unref (sn_data->display);
+ g_free (sn_data->startup_id);
+ g_free (sn_data);
+
+ return FALSE;
+}
+
+static void
+set_startup_notification_timeout (GdkDisplay *display,
+ const char *startup_id)
+{
+ StartupNotificationData *sn_data;
+
+ sn_data = g_new (StartupNotificationData, 1);
+ sn_data->display = g_object_ref (display);
+ sn_data->startup_id = g_strdup (startup_id);
+
+ g_timeout_add_seconds (EGG_DESKTOP_FILE_SN_TIMEOUT_LENGTH,
+ startup_notification_timeout, sn_data);
+}
+#endif /* GTK 2.12 */
+
+static GPtrArray *
+array_putenv (GPtrArray *env, char *variable)
+{
+ guint i, keylen;
+
+ if (!env)
+ {
+ char **envp;
+
+ env = g_ptr_array_new ();
+
+ envp = g_listenv ();
+ for (i = 0; envp[i]; i++)
+ {
+ const char *value;
+
+ value = g_getenv (envp[i]);
+ g_ptr_array_add (env, g_strdup_printf ("%s=%s", envp[i],
+ value ? value : ""));
+ }
+ g_strfreev (envp);
+ }
+
+ keylen = strcspn (variable, "=");
+
+ /* Remove old value of key */
+ for (i = 0; i < env->len; i++)
+ {
+ char *envvar = env->pdata[i];
+
+ if (!strncmp (envvar, variable, keylen) && envvar[keylen] == '=')
+ {
+ g_free (envvar);
+ g_ptr_array_remove_index_fast (env, i);
+ break;
+ }
+ }
+
+ /* Add new value */
+ g_ptr_array_add (env, g_strdup (variable));
+
+ return env;
+}
+
+static gboolean
+egg_desktop_file_launchv (EggDesktopFile *desktop_file,
+ GSList *documents, va_list args,
+ GError **error)
+{
+ EggDesktopFileLaunchOption option;
+ GSList *translated_documents = NULL, *docs = NULL;
+ char *command, **argv;
+ int argc, i, screen_num;
+ gboolean success, current_success;
+ GdkDisplay *display;
+ char *startup_id;
+
+ GPtrArray *env = NULL;
+ char **variables = NULL;
+ GdkScreen *screen = NULL;
+ int workspace = -1;
+ const char *directory = NULL;
+ guint32 launch_time = (guint32)-1;
+ GSpawnFlags flags = G_SPAWN_SEARCH_PATH;
+ GSpawnChildSetupFunc setup_func = NULL;
+ gpointer setup_data = NULL;
+
+ GPid *ret_pid = NULL;
+ int *ret_stdin = NULL, *ret_stdout = NULL, *ret_stderr = NULL;
+ char **ret_startup_id = NULL;
+
+ if (documents && desktop_file->document_code == 0)
+ {
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE,
+ _("Application does not accept documents on command line"));
+ return FALSE;
+ }
+
+ /* Read the options: technically it's incorrect for the caller to
+ * NULL-terminate the list of options (rather than 0-terminating
+ * it), but NULL-terminating lets us use G_GNUC_NULL_TERMINATED,
+ * it's more consistent with other glib/gtk methods, and it will
+ * work as long as sizeof (int) <= sizeof (NULL), and NULL is
+ * represented as 0. (Which is true everywhere we care about.)
+ */
+ while ((option = va_arg (args, EggDesktopFileLaunchOption)))
+ {
+ switch (option)
+ {
+ case EGG_DESKTOP_FILE_LAUNCH_CLEARENV:
+ if (env)
+ g_ptr_array_free (env, TRUE);
+ env = g_ptr_array_new ();
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_PUTENV:
+ variables = va_arg (args, char **);
+ for (i = 0; variables[i]; i++)
+ env = array_putenv (env, variables[i]);
+ break;
+
+ case EGG_DESKTOP_FILE_LAUNCH_SCREEN:
+ screen = va_arg (args, GdkScreen *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_WORKSPACE:
+ workspace = va_arg (args, int);
+ break;
+
+ case EGG_DESKTOP_FILE_LAUNCH_DIRECTORY:
+ directory = va_arg (args, const char *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_TIME:
+ launch_time = va_arg (args, guint32);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_FLAGS:
+ flags |= va_arg (args, GSpawnFlags);
+ /* Make sure they didn't set any flags that don't make sense. */
+ flags &= ~G_SPAWN_FILE_AND_ARGV_ZERO;
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC:
+ setup_func = va_arg (args, GSpawnChildSetupFunc);
+ setup_data = va_arg (args, gpointer);
+ break;
+
+ case EGG_DESKTOP_FILE_LAUNCH_RETURN_PID:
+ ret_pid = va_arg (args, GPid *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE:
+ ret_stdin = va_arg (args, int *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE:
+ ret_stdout = va_arg (args, int *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE:
+ ret_stderr = va_arg (args, int *);
+ break;
+ case EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID:
+ ret_startup_id = va_arg (args, char **);
+ break;
+
+ default:
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_UNRECOGNIZED_OPTION,
+ _("Unrecognized launch option: %d"),
+ GPOINTER_TO_INT (option));
+ success = FALSE;
+ goto out;
+ }
+ }
+
+ if (screen)
+ {
+ char *display_name = gdk_screen_make_display_name (screen);
+ char *display_env = g_strdup_printf ("DISPLAY=%s", display_name);
+ env = array_putenv (env, display_env);
+ g_free (display_name);
+ g_free (display_env);
+
+ display = gdk_screen_get_display (screen);
+ }
+ else
+ {
+ display = gdk_display_get_default ();
+ screen = gdk_display_get_default_screen (display);
+ }
+ screen_num = gdk_screen_get_number (screen);
+
+ translated_documents = translate_document_list (desktop_file, documents);
+ docs = translated_documents;
+
+ success = FALSE;
+
+ do
+ {
+ command = parse_exec (desktop_file, &docs, error);
+ if (!command)
+ goto out;
+
+ if (!g_shell_parse_argv (command, &argc, &argv, error))
+ {
+ g_free (command);
+ goto out;
+ }
+ g_free (command);
+
+#if GTK_CHECK_VERSION (2, 12, 0)
+ startup_id = start_startup_notification (display, desktop_file,
+ argv[0], screen_num,
+ workspace, launch_time);
+ if (startup_id)
+ {
+ char *startup_id_env = g_strdup_printf ("DESKTOP_STARTUP_ID=%s",
+ startup_id);
+ env = array_putenv (env, startup_id_env);
+ g_free (startup_id_env);
+ }
+#else
+ startup_id = NULL;
+#endif /* GTK 2.12 */
+
+ if (env != NULL)
+ g_ptr_array_add (env, NULL);
+
+ current_success =
+ g_spawn_async_with_pipes (directory,
+ argv,
+ env ? (char **)(env->pdata) : NULL,
+ flags,
+ setup_func, setup_data,
+ ret_pid,
+ ret_stdin, ret_stdout, ret_stderr,
+ error);
+ g_strfreev (argv);
+
+ if (startup_id)
+ {
+#if GTK_CHECK_VERSION (2, 12, 0)
+ if (current_success)
+ {
+ set_startup_notification_timeout (display, startup_id);
+
+ if (ret_startup_id)
+ *ret_startup_id = startup_id;
+ else
+ g_free (startup_id);
+ }
+ else
+#endif /* GTK 2.12 */
+ g_free (startup_id);
+ }
+ else if (ret_startup_id)
+ *ret_startup_id = NULL;
+
+ if (current_success)
+ {
+ /* If we successfully launch any instances of the app, make
+ * sure we return TRUE and don't set @error.
+ */
+ success = TRUE;
+ error = NULL;
+
+ /* Also, only set the output params on the first one */
+ ret_pid = NULL;
+ ret_stdin = ret_stdout = ret_stderr = NULL;
+ ret_startup_id = NULL;
+ }
+ }
+ while (docs && current_success);
+
+ out:
+ if (env)
+ {
+ g_ptr_array_foreach (env, (GFunc)g_free, NULL);
+ g_ptr_array_free (env, TRUE);
+ }
+ free_document_list (translated_documents);
+
+ return success;
+}
+
+/**
+ * egg_desktop_file_launch:
+ * @desktop_file: an #EggDesktopFile
+ * @documents: a list of URIs or paths to documents to open
+ * @error: error pointer
+ * @...: additional options
+ *
+ * Launches @desktop_file with the given arguments. Additional options
+ * can be specified as follows:
+ *
+ * %EGG_DESKTOP_FILE_LAUNCH_CLEARENV: (no arguments)
+ * clears the environment in the child process
+ * %EGG_DESKTOP_FILE_LAUNCH_PUTENV: (char **variables)
+ * adds the NAME=VALUE strings in the given %NULL-terminated
+ * array to the child process's environment
+ * %EGG_DESKTOP_FILE_LAUNCH_SCREEN: (GdkScreen *screen)
+ * causes the application to be launched on the given screen
+ * %EGG_DESKTOP_FILE_LAUNCH_WORKSPACE: (int workspace)
+ * causes the application to be launched on the given workspace
+ * %EGG_DESKTOP_FILE_LAUNCH_DIRECTORY: (char *dir)
+ * causes the application to be launched in the given directory
+ * %EGG_DESKTOP_FILE_LAUNCH_TIME: (guint32 launch_time)
+ * sets the "launch time" for the application. If the user
+ * interacts with another window after @launch_time but before
+ * the launched application creates its first window, the window
+ * manager may choose to not give focus to the new application.
+ * Passing 0 for @launch_time will explicitly request that the
+ * application not receive focus.
+ * %EGG_DESKTOP_FILE_LAUNCH_FLAGS (GSpawnFlags flags)
+ * Sets additional #GSpawnFlags to use. See g_spawn_async() for
+ * more details.
+ * %EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC (GSpawnChildSetupFunc, gpointer)
+ * Sets the child setup callback and the data to pass to it.
+ * (See g_spawn_async() for more details.)
+ *
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_PID (GPid **pid)
+ * On a successful launch, sets *@pid to the PID of the launched
+ * application.
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID (char **startup_id)
+ * On a successful launch, sets *@startup_id to the Startup
+ * Notification "startup id" of the launched application.
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE (int *fd)
+ * On a successful launch, sets *@fd to the file descriptor of
+ * a pipe connected to the application's stdin.
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE (int *fd)
+ * On a successful launch, sets *@fd to the file descriptor of
+ * a pipe connected to the application's stdout.
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE (int *fd)
+ * On a successful launch, sets *@fd to the file descriptor of
+ * a pipe connected to the application's stderr.
+ *
+ * The options should be terminated with a single %NULL.
+ *
+ * If @documents contains multiple documents, but
+ * egg_desktop_file_accepts_multiple() returns %FALSE for
+ * @desktop_file, then egg_desktop_file_launch() will actually launch
+ * multiple instances of the application. In that case, the return
+ * value (as well as any values passed via
+ * %EGG_DESKTOP_FILE_LAUNCH_RETURN_PID, etc) will only reflect the
+ * first instance of the application that was launched (but the
+ * %EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC will be called for each
+ * instance).
+ *
+ * Return value: %TRUE if the application was successfully launched.
+ **/
+gboolean
+egg_desktop_file_launch (EggDesktopFile *desktop_file,
+ GSList *documents, GError **error,
+ ...)
+{
+ va_list args;
+ gboolean success;
+ EggDesktopFile *app_desktop_file;
+
+ switch (desktop_file->type)
+ {
+ case EGG_DESKTOP_FILE_TYPE_APPLICATION:
+ va_start (args, error);
+ success = egg_desktop_file_launchv (desktop_file, documents,
+ args, error);
+ va_end (args);
+ break;
+
+ case EGG_DESKTOP_FILE_TYPE_LINK:
+ if (documents)
+ {
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE,
+ /* translators: The 'Type=Link' string is found in a
+ * desktop file, and should not be translated. */
+ _("Can't pass document URIs to a 'Type=Link' desktop entry"));
+ return FALSE;
+ }
+
+ if (!parse_link (desktop_file, &app_desktop_file, &documents, error))
+ return FALSE;
+
+ va_start (args, error);
+ success = egg_desktop_file_launchv (app_desktop_file, documents,
+ args, error);
+ va_end (args);
+
+ egg_desktop_file_free (app_desktop_file);
+ free_document_list (documents);
+ break;
+
+ case EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED:
+ case EGG_DESKTOP_FILE_TYPE_DIRECTORY:
+ default:
+ g_set_error (error, EGG_DESKTOP_FILE_ERROR,
+ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE,
+ _("Not a launchable item"));
+ success = FALSE;
+ break;
+ }
+
+ return success;
+}
+
+
+GQuark
+egg_desktop_file_error_quark (void)
+{
+ return g_quark_from_static_string ("egg-desktop_file-error-quark");
+}
+
+
+G_LOCK_DEFINE_STATIC (egg_desktop_file);
+static EggDesktopFile *egg_desktop_file;
+
+static void
+egg_set_desktop_file_internal (const char *desktop_file_path,
+ gboolean set_defaults)
+{
+ GError *error = NULL;
+
+ G_LOCK (egg_desktop_file);
+ if (egg_desktop_file)
+ egg_desktop_file_free (egg_desktop_file);
+
+ egg_desktop_file = egg_desktop_file_new (desktop_file_path, &error);
+ if (error)
+ {
+ g_warning ("Could not load desktop file '%s': %s",
+ desktop_file_path, error->message);
+ g_error_free (error);
+ }
+
+ if (set_defaults && egg_desktop_file != NULL) {
+ /* Set localized application name and default window icon */
+ if (egg_desktop_file->name)
+ g_set_application_name (egg_desktop_file->name);
+ if (egg_desktop_file->icon)
+ {
+ if (g_path_is_absolute (egg_desktop_file->icon))
+ gtk_window_set_default_icon_from_file (egg_desktop_file->icon, NULL);
+ else
+ gtk_window_set_default_icon_name (egg_desktop_file->icon);
+ }
+ }
+
+ G_UNLOCK (egg_desktop_file);
+}
+
+/**
+ * egg_set_desktop_file:
+ * @desktop_file_path: path to the application's desktop file
+ *
+ * Creates an #EggDesktopFile for the application from the data at
+ * @desktop_file_path. This will also call g_set_application_name()
+ * with the localized application name from the desktop file, and
+ * gtk_window_set_default_icon_name() or
+ * gtk_window_set_default_icon_from_file() with the application's
+ * icon. Other code may use additional information from the desktop
+ * file.
+ * See egg_set_desktop_file_without_defaults() for a variant of this
+ * function that does not set the application name and default window
+ * icon.
+ *
+ * Note that for thread safety reasons, this function can only
+ * be called once, and is mutually exclusive with calling
+ * egg_set_desktop_file_without_defaults().
+ **/
+void
+egg_set_desktop_file (const char *desktop_file_path)
+{
+ egg_set_desktop_file_internal (desktop_file_path, TRUE);
+}
+
+/**
+ * egg_set_desktop_file_without_defaults:
+ * @desktop_file_path: path to the application's desktop file
+ *
+ * Creates an #EggDesktopFile for the application from the data at
+ * @desktop_file_path.
+ * See egg_set_desktop_file() for a variant of this function that
+ * sets the application name and default window icon from the information
+ * in the desktop file.
+ *
+ * Note that for thread safety reasons, this function can only
+ * be called once, and is mutually exclusive with calling
+ * egg_set_desktop_file().
+ **/
+void
+egg_set_desktop_file_without_defaults (const char *desktop_file_path)
+{
+ egg_set_desktop_file_internal (desktop_file_path, FALSE);
+}
+
+/**
+ * egg_get_desktop_file:
+ *
+ * Gets the application's #EggDesktopFile, as set by
+ * egg_set_desktop_file().
+ *
+ * Return value: the #EggDesktopFile, or %NULL if it hasn't been set.
+ **/
+EggDesktopFile *
+egg_get_desktop_file (void)
+{
+ EggDesktopFile *retval;
+
+ G_LOCK (egg_desktop_file);
+ retval = egg_desktop_file;
+ G_UNLOCK (egg_desktop_file);
+
+ return retval;
+}
diff --git a/plugins/gtkui/smclient/eggdesktopfile.h b/plugins/gtkui/smclient/eggdesktopfile.h
new file mode 100644
index 00000000..16c5426c
--- /dev/null
+++ b/plugins/gtkui/smclient/eggdesktopfile.h
@@ -0,0 +1,163 @@
+/* eggdesktopfile.h - Freedesktop.Org Desktop Files
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; see the file COPYING.LIB. If not,
+ * write to the Free Software Foundation, Inc., 59 Temple Place -
+ * Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __EGG_DESKTOP_FILE_H__
+#define __EGG_DESKTOP_FILE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct EggDesktopFile EggDesktopFile;
+
+typedef enum {
+ EGG_DESKTOP_FILE_TYPE_UNRECOGNIZED,
+
+ EGG_DESKTOP_FILE_TYPE_APPLICATION,
+ EGG_DESKTOP_FILE_TYPE_LINK,
+ EGG_DESKTOP_FILE_TYPE_DIRECTORY
+} EggDesktopFileType;
+
+EggDesktopFile *egg_desktop_file_new (const char *desktop_file_path,
+ GError **error);
+
+EggDesktopFile *egg_desktop_file_new_from_data_dirs (const char *desktop_file_path,
+ GError **error);
+EggDesktopFile *egg_desktop_file_new_from_dirs (const char *desktop_file_path,
+ const char **search_dirs,
+ GError **error);
+EggDesktopFile *egg_desktop_file_new_from_key_file (GKeyFile *key_file,
+ const char *source,
+ GError **error);
+
+void egg_desktop_file_free (EggDesktopFile *desktop_file);
+
+const char *egg_desktop_file_get_source (EggDesktopFile *desktop_file);
+
+EggDesktopFileType egg_desktop_file_get_desktop_file_type (EggDesktopFile *desktop_file);
+
+const char *egg_desktop_file_get_name (EggDesktopFile *desktop_file);
+const char *egg_desktop_file_get_icon (EggDesktopFile *desktop_file);
+
+gboolean egg_desktop_file_can_launch (EggDesktopFile *desktop_file,
+ const char *desktop_environment);
+
+gboolean egg_desktop_file_accepts_documents (EggDesktopFile *desktop_file);
+gboolean egg_desktop_file_accepts_multiple (EggDesktopFile *desktop_file);
+gboolean egg_desktop_file_accepts_uris (EggDesktopFile *desktop_file);
+
+char *egg_desktop_file_parse_exec (EggDesktopFile *desktop_file,
+ GSList *documents,
+ GError **error);
+
+gboolean egg_desktop_file_launch (EggDesktopFile *desktop_file,
+ GSList *documents,
+ GError **error,
+ ...) G_GNUC_NULL_TERMINATED;
+
+typedef enum {
+ EGG_DESKTOP_FILE_LAUNCH_CLEARENV = 1,
+ EGG_DESKTOP_FILE_LAUNCH_PUTENV,
+ EGG_DESKTOP_FILE_LAUNCH_SCREEN,
+ EGG_DESKTOP_FILE_LAUNCH_WORKSPACE,
+ EGG_DESKTOP_FILE_LAUNCH_DIRECTORY,
+ EGG_DESKTOP_FILE_LAUNCH_TIME,
+ EGG_DESKTOP_FILE_LAUNCH_FLAGS,
+ EGG_DESKTOP_FILE_LAUNCH_SETUP_FUNC,
+ EGG_DESKTOP_FILE_LAUNCH_RETURN_PID,
+ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDIN_PIPE,
+ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDOUT_PIPE,
+ EGG_DESKTOP_FILE_LAUNCH_RETURN_STDERR_PIPE,
+ EGG_DESKTOP_FILE_LAUNCH_RETURN_STARTUP_ID
+} EggDesktopFileLaunchOption;
+
+/* Standard Keys */
+#define EGG_DESKTOP_FILE_GROUP "Desktop Entry"
+
+#define EGG_DESKTOP_FILE_KEY_TYPE "Type"
+#define EGG_DESKTOP_FILE_KEY_VERSION "Version"
+#define EGG_DESKTOP_FILE_KEY_NAME "Name"
+#define EGG_DESKTOP_FILE_KEY_GENERIC_NAME "GenericName"
+#define EGG_DESKTOP_FILE_KEY_NO_DISPLAY "NoDisplay"
+#define EGG_DESKTOP_FILE_KEY_COMMENT "Comment"
+#define EGG_DESKTOP_FILE_KEY_ICON "Icon"
+#define EGG_DESKTOP_FILE_KEY_HIDDEN "Hidden"
+#define EGG_DESKTOP_FILE_KEY_ONLY_SHOW_IN "OnlyShowIn"
+#define EGG_DESKTOP_FILE_KEY_NOT_SHOW_IN "NotShowIn"
+#define EGG_DESKTOP_FILE_KEY_TRY_EXEC "TryExec"
+#define EGG_DESKTOP_FILE_KEY_EXEC "Exec"
+#define EGG_DESKTOP_FILE_KEY_PATH "Path"
+#define EGG_DESKTOP_FILE_KEY_TERMINAL "Terminal"
+#define EGG_DESKTOP_FILE_KEY_MIME_TYPE "MimeType"
+#define EGG_DESKTOP_FILE_KEY_CATEGORIES "Categories"
+#define EGG_DESKTOP_FILE_KEY_STARTUP_NOTIFY "StartupNotify"
+#define EGG_DESKTOP_FILE_KEY_STARTUP_WM_CLASS "StartupWMClass"
+#define EGG_DESKTOP_FILE_KEY_URL "URL"
+
+/* Accessors */
+gboolean egg_desktop_file_has_key (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error);
+char *egg_desktop_file_get_string (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error) G_GNUC_MALLOC;
+char *egg_desktop_file_get_locale_string (EggDesktopFile *desktop_file,
+ const char *key,
+ const char *locale,
+ GError **error) G_GNUC_MALLOC;
+gboolean egg_desktop_file_get_boolean (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error);
+double egg_desktop_file_get_numeric (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error);
+int egg_desktop_file_get_integer (EggDesktopFile *desktop_file,
+ const char *key,
+ GError **error);
+char **egg_desktop_file_get_string_list (EggDesktopFile *desktop_file,
+ const char *key,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+char **egg_desktop_file_get_locale_string_list (EggDesktopFile *desktop_file,
+ const char *key,
+ const char *locale,
+ gsize *length,
+ GError **error) G_GNUC_MALLOC;
+
+
+/* Errors */
+#define EGG_DESKTOP_FILE_ERROR egg_desktop_file_error_quark()
+
+GQuark egg_desktop_file_error_quark (void);
+
+typedef enum {
+ EGG_DESKTOP_FILE_ERROR_INVALID,
+ EGG_DESKTOP_FILE_ERROR_NOT_LAUNCHABLE,
+ EGG_DESKTOP_FILE_ERROR_UNRECOGNIZED_OPTION
+} EggDesktopFileError;
+
+/* Global application desktop file */
+void egg_set_desktop_file (const char *desktop_file_path);
+void egg_set_desktop_file_without_defaults (const char *desktop_file_path);
+EggDesktopFile *egg_get_desktop_file (void);
+
+
+G_END_DECLS
+
+#endif /* __EGG_DESKTOP_FILE_H__ */
diff --git a/plugins/gtkui/smclient/eggsmclient-private.h b/plugins/gtkui/smclient/eggsmclient-private.h
new file mode 100644
index 00000000..0c98eeed
--- /dev/null
+++ b/plugins/gtkui/smclient/eggsmclient-private.h
@@ -0,0 +1,59 @@
+/* eggsmclient-private.h
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __EGG_SM_CLIENT_PRIVATE_H__
+#define __EGG_SM_CLIENT_PRIVATE_H__
+
+#include <gtk/gtk.h>
+
+#if !GTK_CHECK_VERSION(2,91,7) && !GTK_CHECK_VERSION(3,0,0)
+/* GTK+ 3 includes this automatically */
+#include <gdkconfig.h>
+#endif
+
+#include "eggsmclient.h"
+
+G_BEGIN_DECLS
+
+GKeyFile *egg_sm_client_save_state (EggSMClient *client);
+void egg_sm_client_quit_requested (EggSMClient *client);
+void egg_sm_client_quit_cancelled (EggSMClient *client);
+void egg_sm_client_quit (EggSMClient *client);
+
+#if defined (GDK_WINDOWING_X11)
+# ifdef EGG_SM_CLIENT_BACKEND_XSMP
+GType egg_sm_client_xsmp_get_type (void);
+EggSMClient *egg_sm_client_xsmp_new (void);
+# endif
+# ifdef EGG_SM_CLIENT_BACKEND_DBUS
+GType egg_sm_client_dbus_get_type (void);
+EggSMClient *egg_sm_client_dbus_new (void);
+# endif
+#elif defined (GDK_WINDOWING_WIN32)
+GType egg_sm_client_win32_get_type (void);
+EggSMClient *egg_sm_client_win32_new (void);
+#elif defined (GDK_WINDOWING_QUARTZ)
+GType egg_sm_client_osx_get_type (void);
+EggSMClient *egg_sm_client_osx_new (void);
+#endif
+
+G_END_DECLS
+
+
+#endif /* __EGG_SM_CLIENT_PRIVATE_H__ */
diff --git a/plugins/gtkui/smclient/eggsmclient-xsmp.c b/plugins/gtkui/smclient/eggsmclient-xsmp.c
new file mode 100644
index 00000000..2c65de7c
--- /dev/null
+++ b/plugins/gtkui/smclient/eggsmclient-xsmp.c
@@ -0,0 +1,1381 @@
+/*
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * Inspired by various other pieces of code including GsmClient (C)
+ * 2001 Havoc Pennington, GnomeClient (C) 1998 Carsten Schaar, and twm
+ * session code (C) 1998 The Open Group.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "eggsmclient.h"
+#include "eggsmclient-private.h"
+
+#include "eggdesktopfile.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <X11/SM/SMlib.h>
+
+#include <gdk/gdk.h>
+#include <gdk/gdkx.h>
+
+#define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ())
+#define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP))
+#define EGG_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass))
+#define EGG_IS_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_XSMP))
+#define EGG_IS_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_XSMP))
+#define EGG_SM_CLIENT_XSMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass))
+
+typedef struct _EggSMClientXSMP EggSMClientXSMP;
+typedef struct _EggSMClientXSMPClass EggSMClientXSMPClass;
+
+/* These mostly correspond to the similarly-named states in section
+ * 9.1 of the XSMP spec. Some of the states there aren't represented
+ * here, because we don't need them. SHUTDOWN_CANCELLED is slightly
+ * different from the spec; we use it when the client is IDLE after a
+ * ShutdownCancelled message, but the application is still interacting
+ * and doesn't know the shutdown has been cancelled yet.
+ */
+typedef enum
+{
+ XSMP_STATE_IDLE,
+ XSMP_STATE_SAVE_YOURSELF,
+ XSMP_STATE_INTERACT_REQUEST,
+ XSMP_STATE_INTERACT,
+ XSMP_STATE_SAVE_YOURSELF_DONE,
+ XSMP_STATE_SHUTDOWN_CANCELLED,
+ XSMP_STATE_CONNECTION_CLOSED
+} EggSMClientXSMPState;
+
+static const char *state_names[] = {
+ "idle",
+ "save-yourself",
+ "interact-request",
+ "interact",
+ "save-yourself-done",
+ "shutdown-cancelled",
+ "connection-closed"
+};
+
+#define EGG_SM_CLIENT_XSMP_STATE(xsmp) (state_names[(xsmp)->state])
+
+struct _EggSMClientXSMP
+{
+ EggSMClient parent;
+
+ SmcConn connection;
+ char *client_id;
+
+ EggSMClientXSMPState state;
+ char **restart_command;
+ gboolean set_restart_command;
+ int restart_style;
+
+ guint idle;
+
+ /* Current SaveYourself state */
+ guint expecting_initial_save_yourself : 1;
+ guint need_save_state : 1;
+ guint need_quit_requested : 1;
+ guint interact_errors : 1;
+ guint shutting_down : 1;
+
+ /* Todo list */
+ guint waiting_to_set_initial_properties : 1;
+ guint waiting_to_emit_quit : 1;
+ guint waiting_to_emit_quit_cancelled : 1;
+ guint waiting_to_save_myself : 1;
+
+};
+
+struct _EggSMClientXSMPClass
+{
+ EggSMClientClass parent_class;
+
+};
+
+static void sm_client_xsmp_startup (EggSMClient *client,
+ const char *client_id);
+static void sm_client_xsmp_set_restart_command (EggSMClient *client,
+ int argc,
+ const char **argv);
+static void sm_client_xsmp_will_quit (EggSMClient *client,
+ gboolean will_quit);
+static gboolean sm_client_xsmp_end_session (EggSMClient *client,
+ EggSMClientEndStyle style,
+ gboolean request_confirmation);
+
+static void xsmp_save_yourself (SmcConn smc_conn,
+ SmPointer client_data,
+ int save_style,
+ Bool shutdown,
+ int interact_style,
+ Bool fast);
+static void xsmp_die (SmcConn smc_conn,
+ SmPointer client_data);
+static void xsmp_save_complete (SmcConn smc_conn,
+ SmPointer client_data);
+static void xsmp_shutdown_cancelled (SmcConn smc_conn,
+ SmPointer client_data);
+static void xsmp_interact (SmcConn smc_conn,
+ SmPointer client_data);
+
+static SmProp *array_prop (const char *name,
+ ...);
+static SmProp *ptrarray_prop (const char *name,
+ GPtrArray *values);
+static SmProp *string_prop (const char *name,
+ const char *value);
+static SmProp *card8_prop (const char *name,
+ unsigned char value);
+
+static void set_properties (EggSMClientXSMP *xsmp, ...);
+static void delete_properties (EggSMClientXSMP *xsmp, ...);
+
+static GPtrArray *generate_command (char **restart_command,
+ const char *client_id,
+ const char *state_file);
+
+static void save_state (EggSMClientXSMP *xsmp);
+static void do_save_yourself (EggSMClientXSMP *xsmp);
+static void update_pending_events (EggSMClientXSMP *xsmp);
+
+static void ice_init (void);
+static gboolean process_ice_messages (IceConn ice_conn);
+static void smc_error_handler (SmcConn smc_conn,
+ Bool swap,
+ int offending_minor_opcode,
+ unsigned long offending_sequence,
+ int error_class,
+ int severity,
+ SmPointer values);
+
+G_DEFINE_TYPE (EggSMClientXSMP, egg_sm_client_xsmp, EGG_TYPE_SM_CLIENT)
+
+static void
+egg_sm_client_xsmp_init (EggSMClientXSMP *xsmp)
+{
+ xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
+ xsmp->connection = NULL;
+ xsmp->restart_style = SmRestartIfRunning;
+}
+
+static void
+egg_sm_client_xsmp_class_init (EggSMClientXSMPClass *klass)
+{
+ EggSMClientClass *sm_client_class = EGG_SM_CLIENT_CLASS (klass);
+
+ sm_client_class->startup = sm_client_xsmp_startup;
+ sm_client_class->set_restart_command = sm_client_xsmp_set_restart_command;
+ sm_client_class->will_quit = sm_client_xsmp_will_quit;
+ sm_client_class->end_session = sm_client_xsmp_end_session;
+}
+
+EggSMClient *
+egg_sm_client_xsmp_new (void)
+{
+#if GTK_CHECK_VERSION(3,0,0)
+ if (!GDK_IS_X11_DISPLAY_MANAGER (gdk_display_manager_get ()))
+ return NULL;
+#endif
+
+ if (!g_getenv ("SESSION_MANAGER"))
+ return NULL;
+
+ return g_object_new (EGG_TYPE_SM_CLIENT_XSMP, NULL);
+}
+
+static gboolean
+sm_client_xsmp_set_initial_properties (gpointer user_data)
+{
+ EggSMClientXSMP *xsmp = user_data;
+ EggDesktopFile *desktop_file;
+ GPtrArray *clone, *restart;
+ char pid_str[64];
+
+ if (xsmp->idle)
+ {
+ g_source_remove (xsmp->idle);
+ xsmp->idle = 0;
+ }
+ xsmp->waiting_to_set_initial_properties = FALSE;
+
+ if (egg_sm_client_get_mode () == EGG_SM_CLIENT_MODE_NO_RESTART)
+ xsmp->restart_style = SmRestartNever;
+
+ /* Parse info out of desktop file */
+ desktop_file = egg_get_desktop_file ();
+ if (desktop_file)
+ {
+ GError *err = NULL;
+ char *cmdline, **argv;
+ int argc;
+
+ if (xsmp->restart_style == SmRestartIfRunning)
+ {
+ if (egg_desktop_file_get_boolean (desktop_file,
+ "X-GNOME-AutoRestart", NULL))
+ xsmp->restart_style = SmRestartImmediately;
+ }
+
+ if (!xsmp->set_restart_command)
+ {
+ cmdline = egg_desktop_file_parse_exec (desktop_file, NULL, &err);
+ if (cmdline && g_shell_parse_argv (cmdline, &argc, &argv, &err))
+ {
+ egg_sm_client_set_restart_command (EGG_SM_CLIENT (xsmp),
+ argc, (const char **)argv);
+ g_strfreev (argv);
+ }
+ else
+ {
+ g_warning ("Could not parse Exec line in desktop file: %s",
+ err->message);
+ g_error_free (err);
+ }
+ g_free (cmdline);
+ }
+ }
+
+ if (!xsmp->set_restart_command)
+ xsmp->restart_command = g_strsplit (g_get_prgname (), " ", -1);
+
+ clone = generate_command (xsmp->restart_command, NULL, NULL);
+ restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL);
+
+ g_debug ("Setting initial properties");
+
+ /* Program, CloneCommand, RestartCommand, and UserID are required.
+ * ProcessID isn't required, but the SM may be able to do something
+ * useful with it.
+ */
+ g_snprintf (pid_str, sizeof (pid_str), "%lu", (gulong) getpid ());
+ set_properties (xsmp,
+ string_prop (SmProgram, g_get_prgname ()),
+ ptrarray_prop (SmCloneCommand, clone),
+ ptrarray_prop (SmRestartCommand, restart),
+ string_prop (SmUserID, g_get_user_name ()),
+ string_prop (SmProcessID, pid_str),
+ card8_prop (SmRestartStyleHint, xsmp->restart_style),
+ NULL);
+ g_ptr_array_free (clone, TRUE);
+ g_ptr_array_free (restart, TRUE);
+
+ if (desktop_file)
+ {
+ set_properties (xsmp,
+ string_prop ("_GSM_DesktopFile", egg_desktop_file_get_source (desktop_file)),
+ NULL);
+ }
+
+ update_pending_events (xsmp);
+ return FALSE;
+}
+
+/* This gets called from two different places: xsmp_die() (when the
+ * server asks us to disconnect) and process_ice_messages() (when the
+ * server disconnects unexpectedly).
+ */
+static void
+sm_client_xsmp_disconnect (EggSMClientXSMP *xsmp)
+{
+ SmcConn connection;
+
+ if (!xsmp->connection)
+ return;
+
+ g_debug ("Disconnecting");
+
+ connection = xsmp->connection;
+ xsmp->connection = NULL;
+ SmcCloseConnection (connection, 0, NULL);
+ xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
+
+ xsmp->waiting_to_save_myself = FALSE;
+ update_pending_events (xsmp);
+}
+
+static void
+sm_client_xsmp_startup (EggSMClient *client,
+ const char *client_id)
+{
+ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
+ SmcCallbacks callbacks;
+ char *ret_client_id;
+ char error_string_ret[256];
+
+ xsmp->client_id = g_strdup (client_id);
+
+ ice_init ();
+ SmcSetErrorHandler (smc_error_handler);
+
+ callbacks.save_yourself.callback = xsmp_save_yourself;
+ callbacks.die.callback = xsmp_die;
+ callbacks.save_complete.callback = xsmp_save_complete;
+ callbacks.shutdown_cancelled.callback = xsmp_shutdown_cancelled;
+
+ callbacks.save_yourself.client_data = xsmp;
+ callbacks.die.client_data = xsmp;
+ callbacks.save_complete.client_data = xsmp;
+ callbacks.shutdown_cancelled.client_data = xsmp;
+
+ client_id = NULL;
+ error_string_ret[0] = '\0';
+ xsmp->connection =
+ SmcOpenConnection (NULL, xsmp, SmProtoMajor, SmProtoMinor,
+ SmcSaveYourselfProcMask | SmcDieProcMask |
+ SmcSaveCompleteProcMask |
+ SmcShutdownCancelledProcMask,
+ &callbacks,
+ xsmp->client_id, &ret_client_id,
+ sizeof (error_string_ret), error_string_ret);
+
+ if (!xsmp->connection)
+ {
+ g_warning ("Failed to connect to the session manager: %s\n",
+ error_string_ret[0] ?
+ error_string_ret : "no error message given");
+ xsmp->state = XSMP_STATE_CONNECTION_CLOSED;
+ return;
+ }
+
+ /* We expect a pointless initial SaveYourself if either (a) we
+ * didn't have an initial client ID, or (b) we DID have an initial
+ * client ID, but the server rejected it and gave us a new one.
+ */
+ if (!xsmp->client_id ||
+ (ret_client_id && strcmp (xsmp->client_id, ret_client_id) != 0))
+ xsmp->expecting_initial_save_yourself = TRUE;
+
+ if (ret_client_id)
+ {
+ g_free (xsmp->client_id);
+ xsmp->client_id = g_strdup (ret_client_id);
+ free (ret_client_id);
+
+ gdk_threads_enter ();
+#if !GTK_CHECK_VERSION(2,23,3) && !GTK_CHECK_VERSION(3,0,0)
+ gdk_set_sm_client_id (xsmp->client_id);
+#else
+ gdk_x11_set_sm_client_id (xsmp->client_id);
+#endif
+ gdk_threads_leave ();
+
+ g_debug ("Got client ID \"%s\"", xsmp->client_id);
+ }
+
+ xsmp->state = XSMP_STATE_IDLE;
+
+ /* Do not set the initial properties until we reach the main loop,
+ * so that the application has a chance to call
+ * egg_set_desktop_file(). (This may also help the session manager
+ * have a better idea of when the application is fully up and
+ * running.)
+ */
+ xsmp->waiting_to_set_initial_properties = TRUE;
+ xsmp->idle = g_idle_add (sm_client_xsmp_set_initial_properties, client);
+}
+
+static void
+sm_client_xsmp_set_restart_command (EggSMClient *client,
+ int argc,
+ const char **argv)
+{
+ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
+ int i;
+
+ g_strfreev (xsmp->restart_command);
+
+ xsmp->restart_command = g_new (char *, argc + 1);
+ for (i = 0; i < argc; i++)
+ xsmp->restart_command[i] = g_strdup (argv[i]);
+ xsmp->restart_command[i] = NULL;
+
+ xsmp->set_restart_command = TRUE;
+}
+
+static void
+sm_client_xsmp_will_quit (EggSMClient *client,
+ gboolean will_quit)
+{
+ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
+
+ if (xsmp->state == XSMP_STATE_CONNECTION_CLOSED)
+ {
+ /* The session manager has already exited! Schedule a quit
+ * signal.
+ */
+ xsmp->waiting_to_emit_quit = TRUE;
+ update_pending_events (xsmp);
+ return;
+ }
+ else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
+ {
+ /* We received a ShutdownCancelled message while the application
+ * was interacting; Schedule a quit_cancelled signal.
+ */
+ xsmp->waiting_to_emit_quit_cancelled = TRUE;
+ update_pending_events (xsmp);
+ return;
+ }
+
+ g_return_if_fail (xsmp->state == XSMP_STATE_INTERACT);
+
+ g_debug ("Sending InteractDone(%s)", will_quit ? "False" : "True");
+ SmcInteractDone (xsmp->connection, !will_quit);
+
+ if (will_quit && xsmp->need_save_state)
+ save_state (xsmp);
+
+ g_debug ("Sending SaveYourselfDone(%s)", will_quit ? "True" : "False");
+ SmcSaveYourselfDone (xsmp->connection, will_quit);
+ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
+}
+
+static gboolean
+sm_client_xsmp_end_session (EggSMClient *client,
+ EggSMClientEndStyle style,
+ gboolean request_confirmation)
+{
+ EggSMClientXSMP *xsmp = (EggSMClientXSMP *)client;
+ int save_type;
+
+ /* To end the session via XSMP, we have to send a
+ * SaveYourselfRequest. We aren't allowed to do that if anything
+ * else is going on, but we don't want to expose this fact to the
+ * application. So we do our best to patch things up here...
+ *
+ * In the worst case, this method might block for some length of
+ * time in process_ice_messages, but the only time that code path is
+ * honestly likely to get hit is if the application tries to end the
+ * session as the very first thing it does, in which case it
+ * probably won't actually block anyway. It's not worth gunking up
+ * the API to try to deal nicely with the other 0.01% of cases where
+ * this happens.
+ */
+
+ while (xsmp->state != XSMP_STATE_IDLE ||
+ xsmp->expecting_initial_save_yourself)
+ {
+ /* If we're already shutting down, we don't need to do anything. */
+ if (xsmp->shutting_down)
+ return TRUE;
+
+ switch (xsmp->state)
+ {
+ case XSMP_STATE_CONNECTION_CLOSED:
+ return FALSE;
+
+ case XSMP_STATE_SAVE_YOURSELF:
+ /* Trying to log out from the save_state callback? Whatever.
+ * Abort the save_state.
+ */
+ SmcSaveYourselfDone (xsmp->connection, FALSE);
+ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
+ break;
+
+ case XSMP_STATE_INTERACT_REQUEST:
+ case XSMP_STATE_INTERACT:
+ case XSMP_STATE_SHUTDOWN_CANCELLED:
+ /* Already in a shutdown-related state, just ignore
+ * the new shutdown request...
+ */
+ return TRUE;
+
+ case XSMP_STATE_IDLE:
+ if (xsmp->waiting_to_set_initial_properties)
+ sm_client_xsmp_set_initial_properties (xsmp);
+
+ if (!xsmp->expecting_initial_save_yourself)
+ break;
+ /* else fall through */
+
+ case XSMP_STATE_SAVE_YOURSELF_DONE:
+ /* We need to wait for some response from the server.*/
+ process_ice_messages (SmcGetIceConnection (xsmp->connection));
+ break;
+
+ default:
+ /* Hm... shouldn't happen */
+ return FALSE;
+ }
+ }
+
+ /* xfce4-session will do the wrong thing if we pass SmSaveGlobal and
+ * the user chooses to save the session. But gnome-session will do
+ * the wrong thing if we pass SmSaveBoth and the user chooses NOT to
+ * save the session... Sigh.
+ */
+ if (!strcmp (SmcVendor (xsmp->connection), "xfce4-session"))
+ save_type = SmSaveBoth;
+ else
+ save_type = SmSaveGlobal;
+
+ g_debug ("Sending SaveYourselfRequest(SmSaveGlobal, Shutdown, SmInteractStyleAny, %sFast)", request_confirmation ? "!" : "");
+ SmcRequestSaveYourself (xsmp->connection,
+ save_type,
+ True, /* shutdown */
+ SmInteractStyleAny,
+ !request_confirmation, /* fast */
+ True /* global */);
+ return TRUE;
+}
+
+static gboolean
+idle_do_pending_events (gpointer data)
+{
+ EggSMClientXSMP *xsmp = data;
+ EggSMClient *client = data;
+
+ gdk_threads_enter ();
+
+ xsmp->idle = 0;
+
+ if (xsmp->waiting_to_emit_quit)
+ {
+ fprintf (stderr, "deadbeef: egg_sm_client_quit\n");
+ xsmp->waiting_to_emit_quit = FALSE;
+ egg_sm_client_quit (client);
+ goto out;
+ }
+
+ if (xsmp->waiting_to_emit_quit_cancelled)
+ {
+ xsmp->waiting_to_emit_quit_cancelled = FALSE;
+ egg_sm_client_quit_cancelled (client);
+ xsmp->state = XSMP_STATE_IDLE;
+ }
+
+ if (xsmp->waiting_to_save_myself)
+ {
+ xsmp->waiting_to_save_myself = FALSE;
+ do_save_yourself (xsmp);
+ }
+
+ out:
+ gdk_threads_leave ();
+ return FALSE;
+}
+
+static void
+update_pending_events (EggSMClientXSMP *xsmp)
+{
+ gboolean want_idle =
+ xsmp->waiting_to_emit_quit ||
+ xsmp->waiting_to_emit_quit_cancelled ||
+ xsmp->waiting_to_save_myself;
+
+ if (want_idle)
+ {
+ if (xsmp->idle == 0)
+ xsmp->idle = g_idle_add (idle_do_pending_events, xsmp);
+ }
+ else
+ {
+ if (xsmp->idle != 0)
+ g_source_remove (xsmp->idle);
+ xsmp->idle = 0;
+ }
+}
+
+static void
+fix_broken_state (EggSMClientXSMP *xsmp, const char *message,
+ gboolean send_interact_done,
+ gboolean send_save_yourself_done)
+{
+ g_warning ("Received XSMP %s message in state %s: client or server error",
+ message, EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ /* Forget any pending SaveYourself plans we had */
+ xsmp->waiting_to_save_myself = FALSE;
+ update_pending_events (xsmp);
+
+ if (send_interact_done)
+ SmcInteractDone (xsmp->connection, False);
+ if (send_save_yourself_done)
+ SmcSaveYourselfDone (xsmp->connection, True);
+
+ xsmp->state = send_save_yourself_done ? XSMP_STATE_SAVE_YOURSELF_DONE : XSMP_STATE_IDLE;
+}
+
+/* SM callbacks */
+
+static void
+xsmp_save_yourself (SmcConn smc_conn,
+ SmPointer client_data,
+ int save_type,
+ Bool shutdown,
+ int interact_style,
+ Bool fast)
+{
+ EggSMClientXSMP *xsmp = client_data;
+ gboolean wants_quit_requested;
+
+ g_debug ("Received SaveYourself(%s, %s, %s, %s) in state %s",
+ save_type == SmSaveLocal ? "SmSaveLocal" :
+ save_type == SmSaveGlobal ? "SmSaveGlobal" : "SmSaveBoth",
+ shutdown ? "Shutdown" : "!Shutdown",
+ interact_style == SmInteractStyleAny ? "SmInteractStyleAny" :
+ interact_style == SmInteractStyleErrors ? "SmInteractStyleErrors" :
+ "SmInteractStyleNone", fast ? "Fast" : "!Fast",
+ EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ if (xsmp->state != XSMP_STATE_IDLE &&
+ xsmp->state != XSMP_STATE_SHUTDOWN_CANCELLED)
+ {
+ fix_broken_state (xsmp, "SaveYourself", FALSE, TRUE);
+ return;
+ }
+
+ if (xsmp->waiting_to_set_initial_properties)
+ sm_client_xsmp_set_initial_properties (xsmp);
+
+ /* If this is the initial SaveYourself, ignore it; we've already set
+ * properties and there's no reason to actually save state too.
+ */
+ if (xsmp->expecting_initial_save_yourself)
+ {
+ xsmp->expecting_initial_save_yourself = FALSE;
+
+ if (save_type == SmSaveLocal &&
+ interact_style == SmInteractStyleNone &&
+ !shutdown && !fast)
+ {
+ g_debug ("Sending SaveYourselfDone(True) for initial SaveYourself");
+ SmcSaveYourselfDone (xsmp->connection, True);
+ /* As explained in the comment at the end of
+ * do_save_yourself(), SAVE_YOURSELF_DONE is the correct
+ * state here, not IDLE.
+ */
+ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
+ return;
+ }
+ else
+ g_warning ("First SaveYourself was not the expected one!");
+ }
+
+ /* Even ignoring the "fast" flag completely, there are still 18
+ * different combinations of save_type, shutdown and interact_style.
+ * We interpret them as follows:
+ *
+ * Type Shutdown Interact Interpretation
+ * G F A/E/N do nothing (1)
+ * G T N do nothing (1)*
+ * G T A/E quit_requested (2)
+ * L/B F A/E/N save_state (3)
+ * L/B T N save_state (3)*
+ * L/B T A/E quit_requested, then save_state (4)
+ *
+ * 1. Do nothing, because the SM asked us to do something
+ * uninteresting (save open files, but then don't quit
+ * afterward) or rude (save open files without asking the user
+ * for confirmation).
+ *
+ * 2. Request interaction and then emit ::quit_requested. This
+ * perhaps isn't quite correct for the SmInteractStyleErrors
+ * case, but we don't care.
+ *
+ * 3. Emit ::save_state. The SmSaveBoth SaveYourselfs in these
+ * rows essentially get demoted to SmSaveLocal, because their
+ * Global halves correspond to "do nothing".
+ *
+ * 4. Request interaction, emit ::quit_requested, and then emit
+ * ::save_state after interacting. This is the SmSaveBoth
+ * equivalent of #2, but we also promote SmSaveLocal shutdown
+ * SaveYourselfs to SmSaveBoth here, because we want to give
+ * the user a chance to save open files before quitting.
+ *
+ * (* It would be nice if we could do something useful when the
+ * session manager sends a SaveYourself with shutdown True and
+ * SmInteractStyleNone. But we can't, so we just pretend it didn't
+ * even tell us it was shutting down. The docs for ::quit mention
+ * that it might not always be preceded by ::quit_requested.)
+ */
+
+ /* As an optimization, we don't actually request interaction and
+ * emit ::quit_requested if the application isn't listening to the
+ * signal.
+ */
+ wants_quit_requested = g_signal_has_handler_pending (xsmp, g_signal_lookup ("quit_requested", EGG_TYPE_SM_CLIENT), 0, FALSE);
+
+ xsmp->need_save_state = (save_type != SmSaveGlobal);
+ xsmp->need_quit_requested = (shutdown && wants_quit_requested &&
+ interact_style != SmInteractStyleNone);
+ xsmp->interact_errors = (interact_style == SmInteractStyleErrors);
+
+ xsmp->shutting_down = shutdown;
+
+ do_save_yourself (xsmp);
+}
+
+static void
+do_save_yourself (EggSMClientXSMP *xsmp)
+{
+ if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
+ {
+ /* The SM cancelled a previous SaveYourself, but we haven't yet
+ * had a chance to tell the application, so we can't start
+ * processing this SaveYourself yet.
+ */
+ xsmp->waiting_to_save_myself = TRUE;
+ update_pending_events (xsmp);
+ return;
+ }
+
+ if (xsmp->need_quit_requested)
+ {
+ xsmp->state = XSMP_STATE_INTERACT_REQUEST;
+
+ g_debug ("Sending InteractRequest(%s)",
+ xsmp->interact_errors ? "Error" : "Normal");
+ SmcInteractRequest (xsmp->connection,
+ xsmp->interact_errors ? SmDialogError : SmDialogNormal,
+ xsmp_interact,
+ xsmp);
+ return;
+ }
+
+ if (xsmp->need_save_state)
+ {
+ save_state (xsmp);
+
+ /* Though unlikely, the client could have been disconnected
+ * while the application was saving its state.
+ */
+ if (!xsmp->connection)
+ return;
+ }
+
+ g_debug ("Sending SaveYourselfDone(True)");
+ SmcSaveYourselfDone (xsmp->connection, True);
+
+ /* The client state diagram in the XSMP spec says that after a
+ * non-shutdown SaveYourself, we go directly back to "idle". But
+ * everything else in both the XSMP spec and the libSM docs
+ * disagrees.
+ */
+ xsmp->state = XSMP_STATE_SAVE_YOURSELF_DONE;
+}
+
+static void
+save_state (EggSMClientXSMP *xsmp)
+{
+ GKeyFile *state_file;
+ char *state_file_path, *data;
+ EggDesktopFile *desktop_file;
+ GPtrArray *restart;
+ int offset, fd;
+
+ /* We set xsmp->state before emitting save_state, but our caller is
+ * responsible for setting it back afterward.
+ */
+ xsmp->state = XSMP_STATE_SAVE_YOURSELF;
+
+ state_file = egg_sm_client_save_state ((EggSMClient *)xsmp);
+ if (!state_file)
+ {
+ restart = generate_command (xsmp->restart_command, xsmp->client_id, NULL);
+ set_properties (xsmp,
+ ptrarray_prop (SmRestartCommand, restart),
+ NULL);
+ g_ptr_array_free (restart, TRUE);
+ delete_properties (xsmp, SmDiscardCommand, NULL);
+ return;
+ }
+
+ desktop_file = egg_get_desktop_file ();
+ if (desktop_file)
+ {
+ GKeyFile *merged_file;
+ char *desktop_file_path;
+
+ merged_file = g_key_file_new ();
+ desktop_file_path =
+ g_filename_from_uri (egg_desktop_file_get_source (desktop_file),
+ NULL, NULL);
+ if (desktop_file_path &&
+ g_key_file_load_from_file (merged_file, desktop_file_path,
+ G_KEY_FILE_KEEP_COMMENTS |
+ G_KEY_FILE_KEEP_TRANSLATIONS, NULL))
+ {
+ guint g, k, i;
+ char **groups, **keys, *value, *exec;
+
+ groups = g_key_file_get_groups (state_file, NULL);
+ for (g = 0; groups[g]; g++)
+ {
+ keys = g_key_file_get_keys (state_file, groups[g], NULL, NULL);
+ for (k = 0; keys[k]; k++)
+ {
+ value = g_key_file_get_value (state_file, groups[g],
+ keys[k], NULL);
+ if (value)
+ {
+ g_key_file_set_value (merged_file, groups[g],
+ keys[k], value);
+ g_free (value);
+ }
+ }
+ g_strfreev (keys);
+ }
+ g_strfreev (groups);
+
+ g_key_file_free (state_file);
+ state_file = merged_file;
+
+ /* Update Exec key using "--sm-client-state-file %k" */
+ restart = generate_command (xsmp->restart_command,
+ NULL, "%k");
+ for (i = 0; i < restart->len; i++)
+ restart->pdata[i] = g_shell_quote (restart->pdata[i]);
+ g_ptr_array_add (restart, NULL);
+ exec = g_strjoinv (" ", (char **)restart->pdata);
+ g_strfreev ((char **)restart->pdata);
+ g_ptr_array_free (restart, FALSE);
+
+ g_key_file_set_string (state_file, EGG_DESKTOP_FILE_GROUP,
+ EGG_DESKTOP_FILE_KEY_EXEC,
+ exec);
+ g_free (exec);
+ }
+ else
+ desktop_file = NULL;
+
+ g_free (desktop_file_path);
+ }
+
+ /* Now write state_file to disk. (We can't use mktemp(), because
+ * that requires the filename to end with "XXXXXX", and we want
+ * it to end with ".desktop".)
+ */
+
+ data = g_key_file_to_data (state_file, NULL, NULL);
+ g_key_file_free (state_file);
+
+ offset = 0;
+ while (1)
+ {
+ state_file_path = g_strdup_printf ("%s%csession-state%c%s-%ld.%s",
+ g_get_user_config_dir (),
+ G_DIR_SEPARATOR, G_DIR_SEPARATOR,
+ g_get_prgname (),
+ (long)time (NULL) + offset,
+ desktop_file ? "desktop" : "state");
+
+ fd = open (state_file_path, O_WRONLY | O_CREAT | O_EXCL, 0644);
+ if (fd == -1)
+ {
+ if (errno == EEXIST)
+ {
+ offset++;
+ g_free (state_file_path);
+ continue;
+ }
+ else if (errno == ENOTDIR || errno == ENOENT)
+ {
+ char *sep = strrchr (state_file_path, G_DIR_SEPARATOR);
+
+ *sep = '\0';
+ if (g_mkdir_with_parents (state_file_path, 0755) != 0)
+ {
+ g_warning ("Could not create directory '%s'",
+ state_file_path);
+ g_free (state_file_path);
+ state_file_path = NULL;
+ break;
+ }
+
+ continue;
+ }
+
+ g_warning ("Could not create file '%s': %s",
+ state_file_path, g_strerror (errno));
+ g_free (state_file_path);
+ state_file_path = NULL;
+ break;
+ }
+
+ close (fd);
+ g_file_set_contents (state_file_path, data, -1, NULL);
+ break;
+ }
+ g_free (data);
+
+ restart = generate_command (xsmp->restart_command, xsmp->client_id,
+ state_file_path);
+ set_properties (xsmp,
+ ptrarray_prop (SmRestartCommand, restart),
+ NULL);
+ g_ptr_array_free (restart, TRUE);
+
+ if (state_file_path)
+ {
+ set_properties (xsmp,
+ array_prop (SmDiscardCommand,
+ "/bin/rm", "-rf", state_file_path,
+ NULL),
+ NULL);
+ g_free (state_file_path);
+ }
+}
+
+static void
+xsmp_interact (SmcConn smc_conn,
+ SmPointer client_data)
+{
+ EggSMClientXSMP *xsmp = client_data;
+ EggSMClient *client = client_data;
+
+ g_debug ("Received Interact message in state %s",
+ EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ if (xsmp->state != XSMP_STATE_INTERACT_REQUEST)
+ {
+ fix_broken_state (xsmp, "Interact", TRUE, TRUE);
+ return;
+ }
+
+ xsmp->state = XSMP_STATE_INTERACT;
+ egg_sm_client_quit_requested (client);
+}
+
+static void
+xsmp_die (SmcConn smc_conn,
+ SmPointer client_data)
+{
+ EggSMClientXSMP *xsmp = client_data;
+ EggSMClient *client = client_data;
+
+ g_debug ("Received Die message in state %s",
+ EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ sm_client_xsmp_disconnect (xsmp);
+ egg_sm_client_quit (client);
+}
+
+static void
+xsmp_save_complete (SmcConn smc_conn,
+ SmPointer client_data)
+{
+ EggSMClientXSMP *xsmp = client_data;
+
+ g_debug ("Received SaveComplete message in state %s",
+ EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE)
+ xsmp->state = XSMP_STATE_IDLE;
+ else
+ fix_broken_state (xsmp, "SaveComplete", FALSE, FALSE);
+}
+
+static void
+xsmp_shutdown_cancelled (SmcConn smc_conn,
+ SmPointer client_data)
+{
+ EggSMClientXSMP *xsmp = client_data;
+ EggSMClient *client = client_data;
+
+ g_debug ("Received ShutdownCancelled message in state %s",
+ EGG_SM_CLIENT_XSMP_STATE (xsmp));
+
+ xsmp->shutting_down = FALSE;
+
+ if (xsmp->state == XSMP_STATE_SAVE_YOURSELF_DONE)
+ {
+ /* We've finished interacting and now the SM has agreed to
+ * cancel the shutdown.
+ */
+ xsmp->state = XSMP_STATE_IDLE;
+ egg_sm_client_quit_cancelled (client);
+ }
+ else if (xsmp->state == XSMP_STATE_SHUTDOWN_CANCELLED)
+ {
+ /* Hm... ok, so we got a shutdown SaveYourself, which got
+ * cancelled, but the application was still interacting, so we
+ * didn't tell it yet, and then *another* SaveYourself arrived,
+ * which we must still be waiting to tell the app about, except
+ * that now that SaveYourself has been cancelled too! Dizzy yet?
+ */
+ xsmp->waiting_to_save_myself = FALSE;
+ update_pending_events (xsmp);
+ }
+ else
+ {
+ g_debug ("Sending SaveYourselfDone(False)");
+ SmcSaveYourselfDone (xsmp->connection, False);
+
+ if (xsmp->state == XSMP_STATE_INTERACT)
+ {
+ /* The application is currently interacting, so we can't
+ * tell it about the cancellation yet; we will wait until
+ * after it calls egg_sm_client_will_quit().
+ */
+ xsmp->state = XSMP_STATE_SHUTDOWN_CANCELLED;
+ }
+ else
+ {
+ /* The shutdown was cancelled before the application got a
+ * chance to interact.
+ */
+ xsmp->state = XSMP_STATE_IDLE;
+ }
+ }
+}
+
+/* Utilities */
+
+/* Create a restart/clone/Exec command based on @restart_command.
+ * If @client_id is non-%NULL, add "--sm-client-id @client_id".
+ * If @state_file is non-%NULL, add "--sm-client-state-file @state_file".
+ *
+ * None of the input strings are g_strdup()ed; the caller must keep
+ * them around until it is done with the returned GPtrArray, and must
+ * then free the array, but not its contents.
+ */
+static GPtrArray *
+generate_command (char **restart_command, const char *client_id,
+ const char *state_file)
+{
+ GPtrArray *cmd;
+ int i;
+
+ cmd = g_ptr_array_new ();
+ g_ptr_array_add (cmd, restart_command[0]);
+
+ if (client_id)
+ {
+ g_ptr_array_add (cmd, (char *)"--sm-client-id");
+ g_ptr_array_add (cmd, (char *)client_id);
+ }
+
+ if (state_file)
+ {
+ g_ptr_array_add (cmd, (char *)"--sm-client-state-file");
+ g_ptr_array_add (cmd, (char *)state_file);
+ }
+
+ for (i = 1; restart_command[i]; i++)
+ g_ptr_array_add (cmd, restart_command[i]);
+
+ return cmd;
+}
+
+/* Takes a NULL-terminated list of SmProp * values, created by
+ * array_prop, ptrarray_prop, string_prop, card8_prop, sets them, and
+ * frees them.
+ */
+static void
+set_properties (EggSMClientXSMP *xsmp, ...)
+{
+ GPtrArray *props;
+ SmProp *prop;
+ va_list ap;
+ guint i;
+
+ props = g_ptr_array_new ();
+
+ va_start (ap, xsmp);
+ while ((prop = va_arg (ap, SmProp *)))
+ g_ptr_array_add (props, prop);
+ va_end (ap);
+
+ if (xsmp->connection)
+ {
+ SmcSetProperties (xsmp->connection, props->len,
+ (SmProp **)props->pdata);
+ }
+
+ for (i = 0; i < props->len; i++)
+ {
+ prop = props->pdata[i];
+ g_free (prop->vals);
+ g_free (prop);
+ }
+ g_ptr_array_free (props, TRUE);
+}
+
+/* Takes a NULL-terminated list of property names and deletes them. */
+static void
+delete_properties (EggSMClientXSMP *xsmp, ...)
+{
+ GPtrArray *props;
+ char *prop;
+ va_list ap;
+
+ if (!xsmp->connection)
+ return;
+
+ props = g_ptr_array_new ();
+
+ va_start (ap, xsmp);
+ while ((prop = va_arg (ap, char *)))
+ g_ptr_array_add (props, prop);
+ va_end (ap);
+
+ SmcDeleteProperties (xsmp->connection, props->len,
+ (char **)props->pdata);
+
+ g_ptr_array_free (props, TRUE);
+}
+
+/* Takes an array of strings and creates a LISTofARRAY8 property. The
+ * strings are neither dupped nor freed; they need to remain valid
+ * until you're done with the SmProp.
+ */
+static SmProp *
+array_prop (const char *name, ...)
+{
+ SmProp *prop;
+ SmPropValue pv;
+ GArray *vals;
+ char *value;
+ va_list ap;
+
+ prop = g_new (SmProp, 1);
+ prop->name = (char *)name;
+ prop->type = (char *)SmLISTofARRAY8;
+
+ vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue));
+
+ va_start (ap, name);
+ while ((value = va_arg (ap, char *)))
+ {
+ pv.length = strlen (value);
+ pv.value = value;
+ g_array_append_val (vals, pv);
+ }
+
+ prop->num_vals = vals->len;
+ prop->vals = (SmPropValue *)vals->data;
+
+ g_array_free (vals, FALSE);
+
+ return prop;
+}
+
+/* Takes a GPtrArray of strings and creates a LISTofARRAY8 property.
+ * The array contents are neither dupped nor freed; they need to
+ * remain valid until you're done with the SmProp.
+ */
+static SmProp *
+ptrarray_prop (const char *name, GPtrArray *values)
+{
+ SmProp *prop;
+ SmPropValue pv;
+ GArray *vals;
+ guint i;
+
+ prop = g_new (SmProp, 1);
+ prop->name = (char *)name;
+ prop->type = (char *)SmLISTofARRAY8;
+
+ vals = g_array_new (FALSE, FALSE, sizeof (SmPropValue));
+
+ for (i = 0; i < values->len; i++)
+ {
+ pv.length = strlen (values->pdata[i]);
+ pv.value = values->pdata[i];
+ g_array_append_val (vals, pv);
+ }
+
+ prop->num_vals = vals->len;
+ prop->vals = (SmPropValue *)vals->data;
+
+ g_array_free (vals, FALSE);
+
+ return prop;
+}
+
+/* Takes a string and creates an ARRAY8 property. The string is
+ * neither dupped nor freed; it needs to remain valid until you're
+ * done with the SmProp.
+ */
+static SmProp *
+string_prop (const char *name, const char *value)
+{
+ SmProp *prop;
+
+ prop = g_new (SmProp, 1);
+ prop->name = (char *)name;
+ prop->type = (char *)SmARRAY8;
+
+ prop->num_vals = 1;
+ prop->vals = g_new (SmPropValue, 1);
+
+ prop->vals[0].length = strlen (value);
+ prop->vals[0].value = (char *)value;
+
+ return prop;
+}
+
+/* Takes a char and creates a CARD8 property. */
+static SmProp *
+card8_prop (const char *name, unsigned char value)
+{
+ SmProp *prop;
+ char *card8val;
+
+ /* To avoid having to allocate and free prop->vals[0], we cheat and
+ * make vals a 2-element-long array and then use the second element
+ * to store value.
+ */
+
+ prop = g_new (SmProp, 1);
+ prop->name = (char *)name;
+ prop->type = (char *)SmCARD8;
+
+ prop->num_vals = 1;
+ prop->vals = g_new (SmPropValue, 2);
+ card8val = (char *)(&prop->vals[1]);
+ card8val[0] = value;
+
+ prop->vals[0].length = 1;
+ prop->vals[0].value = card8val;
+
+ return prop;
+}
+
+/* ICE code. This makes no effort to play nice with anyone else trying
+ * to use libICE. Fortunately, no one uses libICE for anything other
+ * than SM. (DCOP uses ICE, but it has its own private copy of
+ * libICE.)
+ *
+ * When this moves to gtk, it will need to be cleverer, to avoid
+ * tripping over old apps that use GnomeClient or that use libSM
+ * directly.
+ */
+
+#include <X11/ICE/ICElib.h>
+#include <fcntl.h>
+
+static void ice_error_handler (IceConn ice_conn,
+ Bool swap,
+ int offending_minor_opcode,
+ unsigned long offending_sequence,
+ int error_class,
+ int severity,
+ IcePointer values);
+static void ice_io_error_handler (IceConn ice_conn);
+static void ice_connection_watch (IceConn ice_conn,
+ IcePointer client_data,
+ Bool opening,
+ IcePointer *watch_data);
+
+static void
+ice_init (void)
+{
+ IceSetIOErrorHandler (ice_io_error_handler);
+ IceSetErrorHandler (ice_error_handler);
+ IceAddConnectionWatch (ice_connection_watch, NULL);
+}
+
+static gboolean
+process_ice_messages (IceConn ice_conn)
+{
+ IceProcessMessagesStatus status;
+
+ gdk_threads_enter ();
+ status = IceProcessMessages (ice_conn, NULL, NULL);
+ gdk_threads_leave ();
+
+ switch (status)
+ {
+ case IceProcessMessagesSuccess:
+ return TRUE;
+
+ case IceProcessMessagesIOError:
+ sm_client_xsmp_disconnect (IceGetConnectionContext (ice_conn));
+ return FALSE;
+
+ case IceProcessMessagesConnectionClosed:
+ return FALSE;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+
+static gboolean
+ice_iochannel_watch (GIOChannel *channel,
+ GIOCondition condition,
+ gpointer client_data)
+{
+ return process_ice_messages (client_data);
+}
+
+static void
+ice_connection_watch (IceConn ice_conn,
+ IcePointer client_data,
+ Bool opening,
+ IcePointer *watch_data)
+{
+ guint watch_id;
+
+ if (opening)
+ {
+ GIOChannel *channel;
+ int fd = IceConnectionNumber (ice_conn);
+
+ fcntl (fd, F_SETFD, fcntl (fd, F_GETFD, 0) | FD_CLOEXEC);
+ channel = g_io_channel_unix_new (fd);
+ watch_id = g_io_add_watch (channel, G_IO_IN | G_IO_ERR,
+ ice_iochannel_watch, ice_conn);
+ g_io_channel_unref (channel);
+
+ *watch_data = GUINT_TO_POINTER (watch_id);
+ }
+ else
+ {
+ watch_id = GPOINTER_TO_UINT (*watch_data);
+ g_source_remove (watch_id);
+ }
+}
+
+static void
+ice_error_handler (IceConn ice_conn,
+ Bool swap,
+ int offending_minor_opcode,
+ unsigned long offending_sequence,
+ int error_class,
+ int severity,
+ IcePointer values)
+{
+ /* Do nothing */
+}
+
+static void
+ice_io_error_handler (IceConn ice_conn)
+{
+ /* Do nothing */
+}
+
+static void
+smc_error_handler (SmcConn smc_conn,
+ Bool swap,
+ int offending_minor_opcode,
+ unsigned long offending_sequence,
+ int error_class,
+ int severity,
+ SmPointer values)
+{
+ /* Do nothing */
+}
diff --git a/plugins/gtkui/smclient/eggsmclient.c b/plugins/gtkui/smclient/eggsmclient.c
new file mode 100644
index 00000000..92be8a7e
--- /dev/null
+++ b/plugins/gtkui/smclient/eggsmclient.c
@@ -0,0 +1,604 @@
+/*
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <glib/gi18n.h>
+
+#include "eggsmclient.h"
+#include "eggsmclient-private.h"
+
+static void egg_sm_client_debug_handler (const char *log_domain,
+ GLogLevelFlags log_level,
+ const char *message,
+ gpointer user_data);
+
+enum {
+ SAVE_STATE,
+ QUIT_REQUESTED,
+ QUIT_CANCELLED,
+ QUIT,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+struct _EggSMClientPrivate {
+ GKeyFile *state_file;
+};
+
+#define EGG_SM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), EGG_TYPE_SM_CLIENT, EggSMClientPrivate))
+
+G_DEFINE_TYPE (EggSMClient, egg_sm_client, G_TYPE_OBJECT)
+
+static EggSMClient *global_client;
+static EggSMClientMode global_client_mode = EGG_SM_CLIENT_MODE_NORMAL;
+
+static void
+egg_sm_client_init (EggSMClient *client)
+{
+ ;
+}
+
+static void
+egg_sm_client_class_init (EggSMClientClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ g_type_class_add_private (klass, sizeof (EggSMClientPrivate));
+
+ /**
+ * EggSMClient::save_state:
+ * @client: the client
+ * @state_file: a #GKeyFile to save state information into
+ *
+ * Emitted when the session manager has requested that the
+ * application save information about its current state. The
+ * application should save its state into @state_file, and then the
+ * session manager may then restart the application in a future
+ * session and tell it to initialize itself from that state.
+ *
+ * You should not save any data into @state_file's "start group"
+ * (ie, the %NULL group). Instead, applications should save their
+ * data into groups with names that start with the application name,
+ * and libraries that connect to this signal should save their data
+ * into groups with names that start with the library name.
+ *
+ * Alternatively, rather than (or in addition to) using @state_file,
+ * the application can save its state by calling
+ * egg_sm_client_set_restart_command() during the processing of this
+ * signal (eg, to include a list of files to open).
+ **/
+ signals[SAVE_STATE] =
+ g_signal_new ("save_state",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EggSMClientClass, save_state),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1, G_TYPE_POINTER);
+
+ /**
+ * EggSMClient::quit_requested:
+ * @client: the client
+ *
+ * Emitted when the session manager requests that the application
+ * exit (generally because the user is logging out). The application
+ * should decide whether or not it is willing to quit (perhaps after
+ * asking the user what to do with documents that have unsaved
+ * changes) and then call egg_sm_client_will_quit(), passing %TRUE
+ * or %FALSE to give its answer to the session manager. (It does not
+ * need to give an answer before returning from the signal handler;
+ * it can interact with the user asynchronously and then give its
+ * answer later on.) If the application does not connect to this
+ * signal, then #EggSMClient will automatically return %TRUE on its
+ * behalf.
+ *
+ * The application should not save its session state as part of
+ * handling this signal; if the user has requested that the session
+ * be saved when logging out, then ::save_state will be emitted
+ * separately.
+ *
+ * If the application agrees to quit, it should then wait for either
+ * the ::quit_cancelled or ::quit signals to be emitted.
+ **/
+ signals[QUIT_REQUESTED] =
+ g_signal_new ("quit_requested",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EggSMClientClass, quit_requested),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ /**
+ * EggSMClient::quit_cancelled:
+ * @client: the client
+ *
+ * Emitted when the session manager decides to cancel a logout after
+ * the application has already agreed to quit. After receiving this
+ * signal, the application can go back to what it was doing before
+ * receiving the ::quit_requested signal.
+ **/
+ signals[QUIT_CANCELLED] =
+ g_signal_new ("quit_cancelled",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EggSMClientClass, quit_cancelled),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ /**
+ * EggSMClient::quit:
+ * @client: the client
+ *
+ * Emitted when the session manager wants the application to quit
+ * (generally because the user is logging out). The application
+ * should exit as soon as possible after receiving this signal; if
+ * it does not, the session manager may choose to forcibly kill it.
+ *
+ * Normally a GUI application would only be sent a ::quit if it
+ * agreed to quit in response to a ::quit_requested signal. However,
+ * this is not guaranteed; in some situations the session manager
+ * may decide to end the session without giving applications a
+ * chance to object.
+ **/
+ signals[QUIT] =
+ g_signal_new ("quit",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EggSMClientClass, quit),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+}
+
+static gboolean sm_client_disable = FALSE;
+static char *sm_client_state_file = NULL;
+static char *sm_client_id = NULL;
+static char *sm_config_prefix = NULL;
+
+static gboolean
+sm_client_post_parse_func (GOptionContext *context,
+ GOptionGroup *group,
+ gpointer data,
+ GError **error)
+{
+ EggSMClient *client = egg_sm_client_get ();
+
+ if (sm_client_id == NULL)
+ {
+ const gchar *desktop_autostart_id;
+
+ desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID");
+
+ if (desktop_autostart_id != NULL)
+ sm_client_id = g_strdup (desktop_autostart_id);
+ }
+
+ /* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes to
+ * use the same client id. */
+ g_unsetenv ("DESKTOP_AUTOSTART_ID");
+
+ if (global_client_mode != EGG_SM_CLIENT_MODE_DISABLED &&
+ EGG_SM_CLIENT_GET_CLASS (client)->startup)
+ EGG_SM_CLIENT_GET_CLASS (client)->startup (client, sm_client_id);
+ return TRUE;
+}
+
+/**
+ * egg_sm_client_get_option_group:
+ *
+ * Creates a %GOptionGroup containing the session-management-related
+ * options. You should add this group to the application's
+ * %GOptionContext if you want to use #EggSMClient.
+ *
+ * Return value: the %GOptionGroup
+ **/
+GOptionGroup *
+egg_sm_client_get_option_group (void)
+{
+ const GOptionEntry entries[] = {
+ { "sm-client-disable", 0, 0,
+ G_OPTION_ARG_NONE, &sm_client_disable,
+ N_("Disable connection to session manager"), NULL },
+ { "sm-client-state-file", 0, 0,
+ G_OPTION_ARG_FILENAME, &sm_client_state_file,
+ N_("Specify file containing saved configuration"), N_("FILE") },
+ { "sm-client-id", 0, 0,
+ G_OPTION_ARG_STRING, &sm_client_id,
+ N_("Specify session management ID"), N_("ID") },
+ /* GnomeClient compatibility option */
+ { "sm-disable", 0, G_OPTION_FLAG_HIDDEN,
+ G_OPTION_ARG_NONE, &sm_client_disable,
+ NULL, NULL },
+ /* GnomeClient compatibility option. This is a dummy option that only
+ * exists so that sessions saved by apps with GnomeClient can be restored
+ * later when they've switched to EggSMClient. See bug #575308.
+ */
+ { "sm-config-prefix", 0, G_OPTION_FLAG_HIDDEN,
+ G_OPTION_ARG_STRING, &sm_config_prefix,
+ NULL, NULL },
+ { NULL }
+ };
+ GOptionGroup *group;
+
+ /* Use our own debug handler for the "EggSMClient" domain. */
+ g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
+ egg_sm_client_debug_handler, NULL);
+
+ group = g_option_group_new ("sm-client",
+ _("Session management options:"),
+ _("Show session management options"),
+ NULL, NULL);
+ g_option_group_add_entries (group, entries);
+ g_option_group_set_parse_hooks (group, NULL, sm_client_post_parse_func);
+
+ return group;
+}
+
+/**
+ * egg_sm_client_set_mode:
+ * @mode: an #EggSMClient mode
+ *
+ * Sets the "mode" of #EggSMClient as follows:
+ *
+ * %EGG_SM_CLIENT_MODE_DISABLED: Session management is completely
+ * disabled, until the mode is changed again. The application will
+ * not even connect to the session manager. (egg_sm_client_get()
+ * will still return an #EggSMClient object.)
+ *
+ * %EGG_SM_CLIENT_MODE_NO_RESTART: The application will connect to
+ * the session manager (and thus will receive notification when the
+ * user is logging out, etc), but will request to not be
+ * automatically restarted with saved state in future sessions.
+ *
+ * %EGG_SM_CLIENT_MODE_NORMAL: The default. #EggSMCLient will
+ * function normally.
+ *
+ * This must be called before the application's main loop begins and
+ * before any call to egg_sm_client_get(), unless the mode was set
+ * earlier to %EGG_SM_CLIENT_MODE_DISABLED and this call enables
+ * session management. Note that option parsing will call
+ * egg_sm_client_get().
+ **/
+void
+egg_sm_client_set_mode (EggSMClientMode mode)
+{
+ EggSMClientMode old_mode = global_client_mode;
+
+ g_return_if_fail (global_client == NULL || global_client_mode == EGG_SM_CLIENT_MODE_DISABLED);
+ g_return_if_fail (!(global_client != NULL && mode == EGG_SM_CLIENT_MODE_DISABLED));
+
+ global_client_mode = mode;
+
+ if (global_client != NULL && old_mode == EGG_SM_CLIENT_MODE_DISABLED)
+ {
+ if (EGG_SM_CLIENT_GET_CLASS (global_client)->startup)
+ EGG_SM_CLIENT_GET_CLASS (global_client)->startup (global_client, sm_client_id);
+ }
+}
+
+/**
+ * egg_sm_client_get_mode:
+ *
+ * Gets the global #EggSMClientMode. See egg_sm_client_set_mode()
+ * for details.
+ *
+ * Return value: the global #EggSMClientMode
+ **/
+EggSMClientMode
+egg_sm_client_get_mode (void)
+{
+ return global_client_mode;
+}
+
+/**
+ * egg_sm_client_get:
+ *
+ * Returns the master #EggSMClient for the application.
+ *
+ * On platforms that support saved sessions (ie, POSIX/X11), the
+ * application will only request to be restarted by the session
+ * manager if you call egg_set_desktop_file() to set an application
+ * desktop file. In particular, if the desktop file contains the key
+ * "X
+ *
+ * Return value: the master #EggSMClient.
+ **/
+EggSMClient *
+egg_sm_client_get (void)
+{
+ if (!global_client)
+ {
+ if (!sm_client_disable)
+ {
+#if defined (GDK_WINDOWING_WIN32)
+ global_client = egg_sm_client_win32_new ();
+#elif defined (GDK_WINDOWING_QUARTZ)
+ global_client = egg_sm_client_osx_new ();
+#else
+ /* If both D-Bus and XSMP are compiled in, try XSMP first
+ * (since it supports state saving) and fall back to D-Bus
+ * if XSMP isn't available.
+ */
+# ifdef EGG_SM_CLIENT_BACKEND_XSMP
+ global_client = egg_sm_client_xsmp_new ();
+# endif
+# ifdef EGG_SM_CLIENT_BACKEND_DBUS
+ if (!global_client)
+ global_client = egg_sm_client_dbus_new ();
+# endif
+#endif
+ }
+
+ /* Fallback: create a dummy client, so that callers don't have
+ * to worry about a %NULL return value.
+ */
+ if (!global_client)
+ global_client = g_object_new (EGG_TYPE_SM_CLIENT, NULL);
+ }
+
+ return global_client;
+}
+
+/**
+ * egg_sm_client_is_resumed:
+ * @client: the client
+ *
+ * Checks whether or not the current session has been resumed from
+ * a previous saved session. If so, the application should call
+ * egg_sm_client_get_state_file() and restore its state from the
+ * returned #GKeyFile.
+ *
+ * Return value: %TRUE if the session has been resumed
+ **/
+gboolean
+egg_sm_client_is_resumed (EggSMClient *client)
+{
+ g_return_val_if_fail (client == global_client, FALSE);
+
+ return sm_client_state_file != NULL;
+}
+
+/**
+ * egg_sm_client_get_state_file:
+ * @client: the client
+ *
+ * If the application was resumed by the session manager, this will
+ * return the #GKeyFile containing its state from the previous
+ * session.
+ *
+ * Note that other libraries and #EggSMClient itself may also store
+ * state in the key file, so if you call egg_sm_client_get_groups(),
+ * on it, the return value will likely include groups that you did not
+ * put there yourself. (It is also not guaranteed that the first
+ * group created by the application will still be the "start group"
+ * when it is resumed.)
+ *
+ * Return value: the #GKeyFile containing the application's earlier
+ * state, or %NULL on error. You should not free this key file; it
+ * is owned by @client.
+ **/
+GKeyFile *
+egg_sm_client_get_state_file (EggSMClient *client)
+{
+ EggSMClientPrivate *priv = EGG_SM_CLIENT_GET_PRIVATE (client);
+ char *state_file_path;
+ GError *err = NULL;
+
+ g_return_val_if_fail (client == global_client, NULL);
+
+ if (!sm_client_state_file)
+ return NULL;
+ if (priv->state_file)
+ return priv->state_file;
+
+ if (!strncmp (sm_client_state_file, "file://", 7))
+ state_file_path = g_filename_from_uri (sm_client_state_file, NULL, NULL);
+ else
+ state_file_path = g_strdup (sm_client_state_file);
+
+ priv->state_file = g_key_file_new ();
+ if (!g_key_file_load_from_file (priv->state_file, state_file_path, 0, &err))
+ {
+ g_warning ("Could not load SM state file '%s': %s",
+ sm_client_state_file, err->message);
+ g_clear_error (&err);
+ g_key_file_free (priv->state_file);
+ priv->state_file = NULL;
+ }
+
+ g_free (state_file_path);
+ return priv->state_file;
+}
+
+/**
+ * egg_sm_client_set_restart_command:
+ * @client: the client
+ * @argc: the length of @argv
+ * @argv: argument vector
+ *
+ * Sets the command used to restart @client if it does not have a
+ * .desktop file that can be used to find its restart command.
+ *
+ * This can also be used when handling the ::save_state signal, to
+ * save the current state via an updated command line. (Eg, providing
+ * a list of filenames to open when the application is resumed.)
+ **/
+void
+egg_sm_client_set_restart_command (EggSMClient *client,
+ int argc,
+ const char **argv)
+{
+ g_return_if_fail (EGG_IS_SM_CLIENT (client));
+
+ if (EGG_SM_CLIENT_GET_CLASS (client)->set_restart_command)
+ EGG_SM_CLIENT_GET_CLASS (client)->set_restart_command (client, argc, argv);
+}
+
+/**
+ * egg_sm_client_will_quit:
+ * @client: the client
+ * @will_quit: whether or not the application is willing to quit
+ *
+ * This MUST be called in response to the ::quit_requested signal, to
+ * indicate whether or not the application is willing to quit. The
+ * application may call it either directly from the signal handler, or
+ * at some later point (eg, after asynchronously interacting with the
+ * user).
+ *
+ * If the application does not connect to ::quit_requested,
+ * #EggSMClient will call this method on its behalf (passing %TRUE
+ * for @will_quit).
+ *
+ * After calling this method, the application should wait to receive
+ * either ::quit_cancelled or ::quit.
+ **/
+void
+egg_sm_client_will_quit (EggSMClient *client,
+ gboolean will_quit)
+{
+ g_return_if_fail (EGG_IS_SM_CLIENT (client));
+
+ if (EGG_SM_CLIENT_GET_CLASS (client)->will_quit)
+ EGG_SM_CLIENT_GET_CLASS (client)->will_quit (client, will_quit);
+}
+
+/**
+ * egg_sm_client_end_session:
+ * @style: a hint at how to end the session
+ * @request_confirmation: whether or not the user should get a chance
+ * to confirm the action
+ *
+ * Requests that the session manager end the current session. @style
+ * indicates how the session should be ended, and
+ * @request_confirmation indicates whether or not the user should be
+ * given a chance to confirm the logout/reboot/shutdown. Both of these
+ * flags are merely hints though; the session manager may choose to
+ * ignore them.
+ *
+ * Return value: %TRUE if the request was sent; %FALSE if it could not
+ * be (eg, because it could not connect to the session manager).
+ **/
+gboolean
+egg_sm_client_end_session (EggSMClientEndStyle style,
+ gboolean request_confirmation)
+{
+ EggSMClient *client = egg_sm_client_get ();
+
+ g_return_val_if_fail (EGG_IS_SM_CLIENT (client), FALSE);
+
+ if (EGG_SM_CLIENT_GET_CLASS (client)->end_session)
+ {
+ return EGG_SM_CLIENT_GET_CLASS (client)->end_session (client, style,
+ request_confirmation);
+ }
+ else
+ return FALSE;
+}
+
+/* Signal-emitting callbacks from platform-specific code */
+
+GKeyFile *
+egg_sm_client_save_state (EggSMClient *client)
+{
+ GKeyFile *state_file;
+ char *group;
+
+ g_return_val_if_fail (client == global_client, NULL);
+
+ state_file = g_key_file_new ();
+
+ g_debug ("Emitting save_state");
+ g_signal_emit (client, signals[SAVE_STATE], 0, state_file);
+ g_debug ("Done emitting save_state");
+
+ group = g_key_file_get_start_group (state_file);
+ if (group)
+ {
+ g_free (group);
+ return state_file;
+ }
+ else
+ {
+ g_key_file_free (state_file);
+ return NULL;
+ }
+}
+
+void
+egg_sm_client_quit_requested (EggSMClient *client)
+{
+ g_return_if_fail (client == global_client);
+
+ if (!g_signal_has_handler_pending (client, signals[QUIT_REQUESTED], 0, FALSE))
+ {
+ g_debug ("Not emitting quit_requested because no one is listening");
+ egg_sm_client_will_quit (client, TRUE);
+ return;
+ }
+
+ g_debug ("Emitting quit_requested");
+ g_signal_emit (client, signals[QUIT_REQUESTED], 0);
+ g_debug ("Done emitting quit_requested");
+}
+
+void
+egg_sm_client_quit_cancelled (EggSMClient *client)
+{
+ g_return_if_fail (client == global_client);
+
+ g_debug ("Emitting quit_cancelled");
+ g_signal_emit (client, signals[QUIT_CANCELLED], 0);
+ g_debug ("Done emitting quit_cancelled");
+}
+
+void
+egg_sm_client_quit (EggSMClient *client)
+{
+ g_return_if_fail (client == global_client);
+
+ g_debug ("Emitting quit");
+ g_signal_emit (client, signals[QUIT], 0);
+ g_debug ("Done emitting quit");
+
+ /* FIXME: should we just call gtk_main_quit() here? */
+}
+
+static void
+egg_sm_client_debug_handler (const char *log_domain,
+ GLogLevelFlags log_level,
+ const char *message,
+ gpointer user_data)
+{
+ static int debug = -1;
+
+ if (debug < 0)
+ debug = (g_getenv ("EGG_SM_CLIENT_DEBUG") != NULL);
+
+ if (debug)
+ g_log_default_handler (log_domain, log_level, message, NULL);
+}
diff --git a/plugins/gtkui/smclient/eggsmclient.h b/plugins/gtkui/smclient/eggsmclient.h
new file mode 100644
index 00000000..e620b754
--- /dev/null
+++ b/plugins/gtkui/smclient/eggsmclient.h
@@ -0,0 +1,117 @@
+/* eggsmclient.h
+ * Copyright (C) 2007 Novell, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __EGG_SM_CLIENT_H__
+#define __EGG_SM_CLIENT_H__
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define EGG_TYPE_SM_CLIENT (egg_sm_client_get_type ())
+#define EGG_SM_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT, EggSMClient))
+#define EGG_SM_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT, EggSMClientClass))
+#define EGG_IS_SM_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT))
+#define EGG_IS_SM_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT))
+#define EGG_SM_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT, EggSMClientClass))
+
+typedef struct _EggSMClient EggSMClient;
+typedef struct _EggSMClientClass EggSMClientClass;
+typedef struct _EggSMClientPrivate EggSMClientPrivate;
+
+typedef enum {
+ EGG_SM_CLIENT_END_SESSION_DEFAULT,
+ EGG_SM_CLIENT_LOGOUT,
+ EGG_SM_CLIENT_REBOOT,
+ EGG_SM_CLIENT_SHUTDOWN
+} EggSMClientEndStyle;
+
+typedef enum {
+ EGG_SM_CLIENT_MODE_DISABLED,
+ EGG_SM_CLIENT_MODE_NO_RESTART,
+ EGG_SM_CLIENT_MODE_NORMAL
+} EggSMClientMode;
+
+struct _EggSMClient
+{
+ GObject parent;
+
+};
+
+struct _EggSMClientClass
+{
+ GObjectClass parent_class;
+
+ /* signals */
+ void (*save_state) (EggSMClient *client,
+ GKeyFile *state_file);
+
+ void (*quit_requested) (EggSMClient *client);
+ void (*quit_cancelled) (EggSMClient *client);
+ void (*quit) (EggSMClient *client);
+
+ /* virtual methods */
+ void (*startup) (EggSMClient *client,
+ const char *client_id);
+ void (*set_restart_command) (EggSMClient *client,
+ int argc,
+ const char **argv);
+ void (*will_quit) (EggSMClient *client,
+ gboolean will_quit);
+ gboolean (*end_session) (EggSMClient *client,
+ EggSMClientEndStyle style,
+ gboolean request_confirmation);
+
+ /* Padding for future expansion */
+ void (*_egg_reserved1) (void);
+ void (*_egg_reserved2) (void);
+ void (*_egg_reserved3) (void);
+ void (*_egg_reserved4) (void);
+};
+
+GType egg_sm_client_get_type (void) G_GNUC_CONST;
+
+GOptionGroup *egg_sm_client_get_option_group (void);
+
+/* Initialization */
+void egg_sm_client_set_mode (EggSMClientMode mode);
+EggSMClientMode egg_sm_client_get_mode (void);
+EggSMClient *egg_sm_client_get (void);
+
+/* Resuming a saved session */
+gboolean egg_sm_client_is_resumed (EggSMClient *client);
+GKeyFile *egg_sm_client_get_state_file (EggSMClient *client);
+
+/* Alternate means of saving state */
+void egg_sm_client_set_restart_command (EggSMClient *client,
+ int argc,
+ const char **argv);
+
+/* Handling "quit_requested" signal */
+void egg_sm_client_will_quit (EggSMClient *client,
+ gboolean will_quit);
+
+/* Initiate a logout/reboot/shutdown */
+gboolean egg_sm_client_end_session (EggSMClientEndStyle style,
+ gboolean request_confirmation);
+
+G_END_DECLS
+
+
+#endif /* __EGG_SM_CLIENT_H__ */
diff --git a/plugins/gtkui/support.c b/plugins/gtkui/support.c
index 1eef6efc..c0d93fe4 100644
--- a/plugins/gtkui/support.c
+++ b/plugins/gtkui/support.c
@@ -145,7 +145,7 @@ glade_set_atk_action_description (AtkAction *action,
#if GTK_CHECK_VERSION(3,0,0)
GtkWidget *
gtk_combo_box_entry_new_text(void) {
- GtkWidget *w = gtk_combo_box_text_new_with_entry ();
+ return gtk_combo_box_text_new_with_entry ();
}
void
@@ -197,7 +197,7 @@ gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box) {
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
void
gtk_widget_set_allocation (GtkWidget *widget, const GtkAllocation *allocation) {
widget->allocation.x = (allocation)->x;
diff --git a/plugins/gtkui/support.h b/plugins/gtkui/support.h
index 00e31c0f..2161fb55 100644
--- a/plugins/gtkui/support.h
+++ b/plugins/gtkui/support.h
@@ -104,7 +104,7 @@ void gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box, const gchar *t
gchar *gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box);
#endif
-#if !GTK_CHECK_VERSION(2,14,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,14,0)
#define gtk_widget_get_window(widget) ((widget)->window)
#define gtk_selection_data_get_target(data) (data->target)
#define gtk_dialog_get_content_area(dialog) (dialog->vbox)
@@ -116,7 +116,7 @@ gchar *gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box);
#define gtk_adjustment_get_upper(adj) (adj->upper)
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
#define gtk_widget_set_has_window(widget, has_window) \
if (has_window) GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_WINDOW); \
else GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
@@ -127,7 +127,7 @@ void gtk_widget_set_window(GtkWidget *widget, GdkWindow *window);
#endif
-#if !GTK_CHECK_VERSION(2,18,0) || defined(ULTRA_COMPATIBLE)
+#if !GTK_CHECK_VERSION(2,18,0)
void gtk_widget_set_allocation (GtkWidget *widget,
const GtkAllocation *allocation);
diff --git a/plugins/gtkui/test.vala b/plugins/gtkui/test.vala
deleted file mode 100644
index 9a50c952..00000000
--- a/plugins/gtkui/test.vala
+++ /dev/null
@@ -1,30 +0,0 @@
-using Deadbeef;
-
-Graphic gr = null;
-
-public static bool
-redraw ()
-{
- gr.queue_draw ();
- return true;
-}
-
-public static int
-main (string[] args)
-{
- Gtk.init (ref args);
- var wnd = new Gtk.Window (Gtk.WindowType.TOPLEVEL);
- wnd.destroy.connect (Gtk.main_quit);
-
- gr = new Graphic ();
- Graphic.inst = gr;
- wnd.add (gr);
- gr.show();
- wnd.show();
-
- Timeout.add (50, redraw);
-
- Gtk.main();
- return 0;
-}
-
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index ff061cd9..36d3d2c4 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -6,12 +6,12 @@
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@@ -46,7 +46,7 @@ static GtkWidget *trackproperties;
static GtkCellRenderer *rend_text2;
static GtkListStore *store;
static GtkListStore *propstore;
-static int trkproperties_modified;
+int trkproperties_modified;
static DB_playItem_t **tracks;
static int numtracks;
static GtkWidget *progressdlg;
@@ -107,6 +107,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
return 0;
}
char *p = out;
+ deadbeef->pl_lock ();
const char **prev = malloc (sizeof (const char *) * numtracks);
memset (prev, 0, sizeof (const char *) * numtracks);
for (int i = 0; i < numtracks; i++) {
@@ -142,6 +143,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
break;
}
}
+ deadbeef->pl_unlock ();
if (size <= 1) {
gchar *prev = g_utf8_prev_char (out-4);
strcpy (prev, "...");
@@ -181,15 +183,37 @@ on_trackproperties_delete_event (GtkWidget *widget,
return TRUE;
}
+void
+on_remove_field_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_add_field_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+int trkproperties_block_keyhandler = 0;
+
+
gboolean
on_trackproperties_key_press_event (GtkWidget *widget,
GdkEventKey *event,
gpointer user_data)
{
+ if (trkproperties_block_keyhandler) {
+ return FALSE;
+ }
if (event->keyval == GDK_Escape) {
on_trackproperties_delete_event (trackproperties, NULL, NULL);
return TRUE;
}
+ else if (event->keyval == GDK_Delete) {
+ on_remove_field_activate (NULL, NULL);
+ return TRUE;
+ }
+ else if (event->keyval == GDK_Insert) {
+ on_add_field_activate (NULL, NULL);
+ return TRUE;
+ }
return FALSE;
}
@@ -221,6 +245,7 @@ on_metadata_edited (GtkCellRendererText *renderer, gchar *path, gchar *new_text,
gtk_list_store_set (store, &iter, 1, new_text, 3, 0, -1);
trkproperties_modified = 1;
}
+ trkproperties_block_keyhandler = 0;
}
// full metadata
@@ -500,8 +525,9 @@ static gboolean
set_progress_cb (void *ctx) {
DB_playItem_t *track = ctx;
GtkWidget *progressitem = lookup_widget (progressdlg, "progresstitle");
- const char *fname = deadbeef->pl_find_meta_raw (track, ":URI");
- gtk_entry_set_text (GTK_ENTRY (progressitem), fname);
+ deadbeef->pl_lock ();
+ gtk_entry_set_text (GTK_ENTRY (progressitem), deadbeef->pl_find_meta_raw (track, ":URI"));
+ deadbeef->pl_unlock ();
deadbeef->pl_item_unref (track);
return FALSE;
}
@@ -513,8 +539,15 @@ write_meta_worker (void *ctx) {
break;
}
DB_playItem_t *track = tracks[t];
- const char *decoder_id = deadbeef->pl_find_meta_raw (track, ":DECODER");
- if (track && decoder_id) {
+ deadbeef->pl_lock ();
+ const char *dec = deadbeef->pl_find_meta_raw (track, ":DECODER");
+ char decoder_id[100];
+ if (dec) {
+ strncpy (decoder_id, dec, sizeof (decoder_id));
+ }
+ int match = track && dec;
+ deadbeef->pl_unlock ();
+ if (match) {
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
continue;
@@ -625,9 +658,14 @@ on_write_tags_clicked (GtkButton *button,
void
on_add_field_activate (GtkMenuItem *menuitem,
gpointer user_data) {
+ GtkTreeView *treeview = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
+ if (!gtk_widget_is_focus(GTK_WIDGET (treeview))) {
+ return; // do not add field if Metadata tab is not focused
+ }
GtkWidget *dlg = create_entrydialog ();
+ gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (trackproperties));
gtk_dialog_set_default_response (GTK_DIALOG (dlg), GTK_RESPONSE_OK);
- gtk_window_set_title (GTK_WINDOW (dlg), _("Edit playlist"));
+ gtk_window_set_title (GTK_WINDOW (dlg), _("Field name"));
GtkWidget *e;
e = lookup_widget (dlg, "title_label");
gtk_label_set_text (GTK_LABEL(e), _("Name:"));
@@ -635,9 +673,9 @@ on_add_field_activate (GtkMenuItem *menuitem,
int res = gtk_dialog_run (GTK_DIALOG (dlg));
if (res == GTK_RESPONSE_OK) {
e = lookup_widget (dlg, "title");
-
+
const char *text = gtk_entry_get_text (GTK_ENTRY(e));
-
+
GtkTreeIter iter;
// check for _ and :
@@ -673,6 +711,11 @@ on_add_field_activate (GtkMenuItem *menuitem,
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter, 0, title, 1, value, 2, key, -1);
+ GtkTreePath *path;
+ gint rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (store), NULL);
+ path = gtk_tree_path_new_from_indices (rows - 1, -1);
+ gtk_tree_view_set_cursor (treeview, path, NULL, TRUE); // set cursor onto new field
+ gtk_tree_path_free(path);
trkproperties_modified = 1;
}
else {
@@ -687,29 +730,24 @@ on_add_field_activate (GtkMenuItem *menuitem,
break;
}
gtk_widget_destroy (dlg);
+ gtk_window_present (GTK_WINDOW (trackproperties));
}
void
on_remove_field_activate (GtkMenuItem *menuitem,
gpointer user_data) {
+ GtkTreeView *treeview = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
+ if (!gtk_widget_is_focus(GTK_WIDGET (treeview))) {
+ return; // do not remove field if Metadata tab is not focused
+ }
GtkTreePath *path;
GtkTreeViewColumn *col;
- GtkTreeView *treeview = GTK_TREE_VIEW (lookup_widget (trackproperties, "metalist"));
gtk_tree_view_get_cursor (treeview, &path, &col);
if (!path || !col) {
return;
}
- GtkWidget *dlg = gtk_message_dialog_new (GTK_WINDOW (trackproperties), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("Really remove selected field?"));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Warning"));
-
- int response = gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
- if (response != GTK_RESPONSE_YES) {
- return;
- }
-
GtkTreeIter iter;
gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path);
GValue value = {0,};
@@ -729,6 +767,7 @@ on_remove_field_activate (GtkMenuItem *menuitem,
else {
gtk_list_store_remove (store, &iter);
}
+ gtk_tree_view_set_cursor (treeview, path, NULL, FALSE); // restore cursor after deletion
gtk_tree_path_free (path);
trkproperties_modified = 1;
}
diff --git a/plugins/hotkeys/hotkeys.c b/plugins/hotkeys/hotkeys.c
index c7c1c1f3..9c317120 100644
--- a/plugins/hotkeys/hotkeys.c
+++ b/plugins/hotkeys/hotkeys.c
@@ -95,8 +95,23 @@ cmd_invoke_plugin_command (DB_plugin_action_t *action)
{
trace ("We're here to invoke action %s / %s\n", action->title, action->name);
- DB_plugin_t **plugins = deadbeef->plug_get_list();
- int i;
+ // common action
+ if (action->flags & DB_ACTION_COMMON)
+ {
+ action->callback (action, NULL);
+ return;
+ }
+
+ // playlist action
+ if (action->flags & DB_ACTION_PLAYLIST)
+ {
+ ddb_playlist_t *plt = deadbeef->plt_get_curr ();
+ if (plt) {
+ action->callback (action, plt);
+ deadbeef->plt_unref (plt);
+ }
+ return;
+ }
int selected_count = 0;
DB_playItem_t *pit = deadbeef->pl_get_first (PL_MAIN);
@@ -113,13 +128,6 @@ cmd_invoke_plugin_command (DB_plugin_action_t *action)
pit = next;
}
-
- if (action->flags & DB_ACTION_COMMON)
- {
- //Simply call common action
- action->callback (action, NULL);
- return;
- }
//Now we're checking if action is applicable:
if (selected_count == 0)
diff --git a/plugins/lastfm/lastfm.c b/plugins/lastfm/lastfm.c
index 8ab6c5f8..2f542a62 100644
--- a/plugins/lastfm/lastfm.c
+++ b/plugins/lastfm/lastfm.c
@@ -49,6 +49,8 @@ static uintptr_t lfm_cond;
static int lfm_stopthread;
static intptr_t lfm_tid;
+#define META_FIELD_SIZE 200
+
DB_plugin_t *
lastfm_load (DB_functions_t *api) {
deadbeef = api;
@@ -128,6 +130,9 @@ curl_req_send (const char *req, const char *post) {
curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, lfm_curl_control);
+ char ua[100];
+ deadbeef->conf_get_str ("network.http_user_agent", "deadbeef", ua, sizeof (ua));
+ curl_easy_setopt (curl, CURLOPT_USERAGENT, ua);
curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0);
if (post) {
curl_easy_setopt(curl, CURLOPT_POST, 1);
@@ -317,50 +322,41 @@ fail:
}
static int
-lfm_fetch_song_info (DB_playItem_t *song, const char **a, const char **t, const char **b, float *l, const char **n, const char **m) {
+lfm_fetch_song_info (DB_playItem_t *song, char *a, char *t, char *b, float *l, char *n, char *m) {
if (deadbeef->conf_get_int ("lastfm.prefer_album_artist", 0)) {
- *a = deadbeef->pl_find_meta (song, "band");
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "album artist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "albumartist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "artist");
+ if (!deadbeef->pl_get_meta (song, "band", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "album artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "albumartist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "artist", a, META_FIELD_SIZE)) {
+ return -1;
+ }
+ }
+ }
}
}
else {
- *a = deadbeef->pl_find_meta (song, "artist");
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "band");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "album artist");
- }
- if (!(*a)) {
- *a = deadbeef->pl_find_meta (song, "albumartist");
+ if (!deadbeef->pl_get_meta (song, "artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "band", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "album artist", a, META_FIELD_SIZE)) {
+ if (!deadbeef->pl_get_meta (song, "albumartist", a, META_FIELD_SIZE)) {
+ return -1;
+ }
+ }
+ }
}
}
- if (!*a) {
- return -1;
- }
- *t = deadbeef->pl_find_meta (song, "title");
- if (!*t) {
+ if (!deadbeef->pl_get_meta (song, "title", t, META_FIELD_SIZE)) {
return -1;
}
- *b = deadbeef->pl_find_meta (song, "album");
- if (!*b) {
- *b = "";
+ if (!deadbeef->pl_get_meta (song, "album", b, META_FIELD_SIZE)) {
+ *b = 0;
}
*l = deadbeef->pl_get_item_duration (song);
- *n = deadbeef->pl_find_meta (song, "track");
- if (!*n) {
- *n = "";
+ if (!deadbeef->pl_get_meta (song, "track", n, META_FIELD_SIZE)) {
+ *n = 0;
}
- *m = deadbeef->pl_find_meta (song, "mbid");
- if (!*m) {
- *m = "";
+ if (!deadbeef->pl_get_meta (song, "mbid", m, META_FIELD_SIZE)) {
+ *m = 0;
}
return 0;
}
@@ -443,12 +439,12 @@ lfm_format_uri (int subm, DB_playItem_t *song, char *out, int outl, time_t start
return -1;
}
int sz = outl;
- const char *a; // artist
- const char *t; // title
- const char *b; // album
+ char a[META_FIELD_SIZE]; // artist
+ char t[META_FIELD_SIZE]; // title
+ char b[META_FIELD_SIZE]; // album
float l; // duration
- const char *n; // tracknum
- const char *m; // muzicbrainz id
+ char n[META_FIELD_SIZE]; // tracknum
+ char m[META_FIELD_SIZE]; // muzicbrainz id
char ka[6] = "a";
char kt[6] = "t";
@@ -466,7 +462,7 @@ lfm_format_uri (int subm, DB_playItem_t *song, char *out, int outl, time_t start
strcpy (km+1, ka+1);
}
- if (lfm_fetch_song_info (song, &a, &t, &b, &l, &n, &m) == 0) {
+ if (lfm_fetch_song_info (song, a, t, b, &l, n, m) == 0) {
// trace ("playtime: %f\nartist: %s\ntitle: %s\nalbum: %s\nduration: %f\ntracknum: %s\n---\n", song->playtime, a, t, b, l, n);
}
else {
@@ -559,9 +555,8 @@ lastfm_songchanged (ddb_event_trackchange_t *ev, uintptr_t data) {
#endif
- if (!deadbeef->pl_find_meta (ev->from, "artist")
- || !deadbeef->pl_find_meta (ev->from, "title")
-// || !deadbeef->pl_find_meta (ev->from, "album")
+ if (!deadbeef->pl_meta_exists (ev->from, "artist")
+ || !deadbeef->pl_meta_exists (ev->from, "title")
) {
trace ("lfm: not enough metadata for submission, artist=%s, title=%s, album=%s\n", deadbeef->pl_find_meta (ev->from, "artist"), deadbeef->pl_find_meta (ev->from, "title"), deadbeef->pl_find_meta (ev->from, "album"));
return 0;
@@ -876,11 +871,14 @@ lastfm_stop (void) {
static int
lfm_action_lookup (DB_plugin_action_t *action, DB_playItem_t *it)
{
- const char *artist = deadbeef->pl_find_meta (it, "artist");
- const char *title = deadbeef->pl_find_meta (it, "title");
-
- if (!title || !artist)
+ char artist[META_FIELD_SIZE];
+ if (!deadbeef->pl_get_meta (it, "artist", artist, sizeof (artist))) {
+ return 0;
+ }
+ char title[META_FIELD_SIZE];
+ if (!deadbeef->pl_get_meta (it, "title", title, sizeof (title))) {
return 0;
+ }
char eartist [strlen (artist) * 3 + 1];
char etitle [strlen (title) * 3 + 1];
@@ -925,9 +923,10 @@ static DB_plugin_action_t lookup_action = {
static DB_plugin_action_t *
lfm_get_actions (DB_playItem_t *it)
{
+ deadbeef->pl_lock ();
if (!it ||
- !deadbeef->pl_find_meta (it, "artist") ||
- !deadbeef->pl_find_meta (it, "title"))
+ !deadbeef->pl_meta_exists (it, "artist") ||
+ !deadbeef->pl_meta_exists (it, "title"))
{
love_action.flags |= DB_ACTION_DISABLED;
lookup_action.flags |= DB_ACTION_DISABLED;
@@ -937,6 +936,7 @@ lfm_get_actions (DB_playItem_t *it)
love_action.flags &= ~DB_ACTION_DISABLED;
lookup_action.flags &= ~DB_ACTION_DISABLED;
}
+ deadbeef->pl_unlock ();
return &lookup_action;
}
diff --git a/plugins/aac/mp4ff/AUTHORS b/plugins/libmp4ff/AUTHORS
index 4f8d7660..4f8d7660 100644
--- a/plugins/aac/mp4ff/AUTHORS
+++ b/plugins/libmp4ff/AUTHORS
diff --git a/plugins/aac/mp4ff/COPYING b/plugins/libmp4ff/COPYING
index 920c4e67..920c4e67 100644
--- a/plugins/aac/mp4ff/COPYING
+++ b/plugins/libmp4ff/COPYING
diff --git a/plugins/aac/mp4ff/README b/plugins/libmp4ff/README
index c50e110a..c50e110a 100644
--- a/plugins/aac/mp4ff/README
+++ b/plugins/libmp4ff/README
diff --git a/plugins/aac/mp4ff/mp4atom.c b/plugins/libmp4ff/mp4atom.c
index c735c2ae..aa638c80 100644
--- a/plugins/aac/mp4ff/mp4atom.c
+++ b/plugins/libmp4ff/mp4atom.c
@@ -42,6 +42,11 @@
# include <string.h>
#endif
#include "mp4ffint.h"
+#include <stdio.h>
+
+//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+#define trace(fmt,...)
+#define min(x,y) ((x)<(y)?(x):(y))
#define COPYRIGHT_SYMBOL ((int8_t)0xA9)
@@ -129,6 +134,8 @@ static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b,
return ATOM_STTS;
else if (mp4ff_atom_compare(a,b,c,d, 's','t','c','o'))
return ATOM_STCO;
+ else if (mp4ff_atom_compare(a,b,c,d, 'c','o','6','4'))
+ return ATOM_STCO;
else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','c'))
return ATOM_STSC;
else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','z'))
@@ -224,6 +231,22 @@ static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b,
return ATOM_DESCRIPTION;
else if (mp4ff_atom_compare(a,b,c,d, 'p','c','s','t'))
return ATOM_PODCAST;
+ else if (mp4ff_atom_compare(a,b,c,d, '-','-','-','-'))
+ return ATOM_CUSTOM;
+ else if (mp4ff_atom_compare(a,b,c,d, 'c','h','p','l'))
+ return ATOM_CHPL;
+ else if (mp4ff_atom_compare(a,b,c,d, 'c','h','a','p'))
+ return ATOM_CHAP;
+ else if (mp4ff_atom_compare(a,b,c,d, 't','e','x','t'))
+ return ATOM_TEXT;
+ else if (mp4ff_atom_compare(a,b,c,d, 's','u','b','p'))
+ return ATOM_TEXT;
+ else if (mp4ff_atom_compare(a,b,c,d, 't','x','3','g'))
+ return ATOM_TEXT;
+ else if (mp4ff_atom_compare(a,b,c,d, 's','b','t','l'))
+ return ATOM_TEXT;
+ else if (mp4ff_atom_compare(a,b,c,d, 'e','l','s','t'))
+ return ATOM_ELST;
else
return ATOM_UNKNOWN;
}
@@ -249,7 +272,7 @@ uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_
size = mp4ff_read_int64(f);
}
- //printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]);
+// printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]);
*atom_type = mp4ff_atom_name_to_type(atom_header[4], atom_header[5], atom_header[6], atom_header[7]);
@@ -258,6 +281,7 @@ uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_
static int32_t mp4ff_read_stsz(mp4ff_t *f)
{
+ trace ("mp4ff_read_stsz\n");
mp4ff_read_char(f); /* version */
mp4ff_read_int24(f); /* flags */
f->track[f->total_tracks - 1]->stsz_sample_size = mp4ff_read_int32(f);
@@ -401,6 +425,8 @@ static int32_t mp4ff_read_stsd(mp4ff_t *f)
f->track[f->total_tracks - 1]->type = TRACK_VIDEO;
} else if (atom_type == ATOM_MP4S) {
f->track[f->total_tracks - 1]->type = TRACK_SYSTEM;
+ } else if (atom_type == ATOM_TEXT) {
+ f->track[f->total_tracks - 1]->type = TRACK_TEXT;
} else {
f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN;
}
@@ -413,6 +439,7 @@ static int32_t mp4ff_read_stsd(mp4ff_t *f)
static int32_t mp4ff_read_stsc(mp4ff_t *f)
{
+ trace ("mp4ff_read_stsc\n");
int32_t i;
mp4ff_read_char(f); /* version */
@@ -489,6 +516,7 @@ static int32_t mp4ff_read_ctts(mp4ff_t *f)
static int32_t mp4ff_read_stts(mp4ff_t *f)
{
+ trace ("mp4ff_read_stts\n");
int32_t i;
mp4ff_track_t * p_track = f->track[f->total_tracks - 1];
@@ -550,7 +578,6 @@ static int32_t mp4ff_read_mvhd(mp4ff_t *f)
return 0;
}
-#if 0
static int32_t mp4ff_read_tkhd(mp4ff_t *f)
{
uint8_t version;
@@ -561,21 +588,22 @@ static int32_t mp4ff_read_tkhd(mp4ff_t *f)
{
mp4ff_read_int64(f);//creation-time
mp4ff_read_int64(f);//modification-time
- mp4ff_read_int32(f);//track-id
+ f->track[f->total_tracks - 1]->id = mp4ff_read_int32(f);//track-id
mp4ff_read_int32(f);//reserved
- f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration
+// f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration
}
else //version == 0
{
mp4ff_read_int32(f);//creation-time
mp4ff_read_int32(f);//modification-time
- mp4ff_read_int32(f);//track-id
+ f->track[f->total_tracks - 1]->id = mp4ff_read_int32(f);//track-id
mp4ff_read_int32(f);//reserved
- f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration
- if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF)
- f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF;
+// f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration
+// if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF)
+// f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF;
}
+#if 0
mp4ff_read_int32(f);//reserved
mp4ff_read_int32(f);//reserved
mp4ff_read_int16(f);//layer
@@ -589,9 +617,9 @@ static int32_t mp4ff_read_tkhd(mp4ff_t *f)
mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f);
mp4ff_read_int32(f);//width
mp4ff_read_int32(f);//height
+#endif
return 1;
}
-#endif
static int32_t mp4ff_read_mdhd(mp4ff_t *f)
{
@@ -647,6 +675,129 @@ static int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size)
}
#endif
+static int32_t mp4ff_read_chpl(mp4ff_t *f, const uint64_t size)
+{
+ int i;
+ int i_read = size;
+
+ mp4ff_read_char(f); /* version */
+ mp4ff_read_int24(f); /* flags */
+
+ mp4ff_chapterdata_t *p_chpl = &f->chapters;
+
+ p_chpl->i_chapter = mp4ff_read_char (f);
+ i_read -= 5;
+
+ for( i = 0; i < p_chpl->i_chapter; i++ )
+ {
+ uint64_t i_start;
+ uint8_t i_len;
+ int i_copy;
+ i_start = mp4ff_read_int64 (f);
+ i_read -= 8;
+ i_len = mp4ff_read_char (f);
+ i_read -= 1;
+
+ p_chpl->chapter[i].psz_name = malloc( i_len + 1 );
+ if( !p_chpl->chapter[i].psz_name )
+ goto error;
+
+ i_copy = i_len < i_read ? i_len : i_read;
+ if( i_copy > 0 )
+ mp4ff_read_data (f, p_chpl->chapter[i].psz_name, i_copy);
+ p_chpl->chapter[i].psz_name[i_copy] = '\0';
+ p_chpl->chapter[i].i_start = i_start;
+
+ i_read -= i_copy;
+ }
+ /* Bubble sort by increasing start date */
+ do
+ {
+ for( i = 0; i < p_chpl->i_chapter - 1; i++ )
+ {
+ if( p_chpl->chapter[i].i_start > p_chpl->chapter[i+1].i_start )
+ {
+ char *psz = p_chpl->chapter[i+1].psz_name;
+ int64_t i64 = p_chpl->chapter[i+1].i_start;
+
+ p_chpl->chapter[i+1].psz_name = p_chpl->chapter[i].psz_name;
+ p_chpl->chapter[i+1].i_start = p_chpl->chapter[i].i_start;
+
+ p_chpl->chapter[i].psz_name = psz;
+ p_chpl->chapter[i].i_start = i64;
+
+ i = -1;
+ break;
+ }
+ }
+ } while( i == -1 );
+
+ return 0;
+
+error:
+ return -1;
+}
+
+int32_t mp4ff_chapters_get_num_items (mp4ff_t *f)
+{
+ return f->chapters.i_chapter;
+}
+
+const char *mp4ff_chapters_get_item (mp4ff_t *f, int i)
+{
+ return f->chapters.chapter[i].psz_name;
+}
+
+void mp4ff_chapters_free (mp4ff_t *f)
+{
+ int i;
+ for (i = 0; i < f->chapters.i_chapter; i++)
+ {
+ free (f->chapters.chapter[i].psz_name);
+ f->chapters.chapter[i].psz_name = NULL;
+ }
+}
+
+static int32_t mp4ff_read_tref(mp4ff_t *f, const uint64_t size)
+{
+ int i;
+
+ mp4ff_trefdata_t *p_tref = &f->tref;
+
+ p_tref->i_track_ID = NULL;
+ p_tref->i_entry_count = (size-8)/ sizeof(uint32_t);
+ if( p_tref->i_entry_count > 0 ) {
+ p_tref->i_track_ID = calloc( p_tref->i_entry_count, sizeof(uint32_t) );
+ }
+ if( p_tref->i_track_ID == NULL )
+ return -1;
+
+ for( i = 0; i < p_tref->i_entry_count; i++ )
+ {
+ p_tref->i_track_ID[i] = mp4ff_read_int32 (f);
+ }
+
+ return 0;
+}
+
+void mp4ff_tref_free (mp4ff_t *f)
+{
+ if (f->tref.i_track_ID) {
+ free (f->tref.i_track_ID);
+ f->tref.i_track_ID = NULL;
+ }
+}
+
+int32_t mp4ff_chap_get_num_tracks (mp4ff_t *f)
+{
+ return f->tref.i_entry_count;
+}
+
+int32_t mp4ff_chap_get_track_id (mp4ff_t *f, int t)
+{
+ return f->tref.i_track_ID[t];
+}
+
int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type)
{
uint64_t dest_position = mp4ff_position(f)+size-8;
@@ -680,6 +831,12 @@ int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type)
/* iTunes Metadata box */
mp4ff_read_meta(f, size);
#endif
+ } else if (atom_type == ATOM_CHPL) {
+ mp4ff_read_chpl(f, size);
+ } else if (atom_type == ATOM_CHAP) {
+ mp4ff_read_tref(f, size);
+ } else if (atom_type == ATOM_TKHD) {
+ mp4ff_read_tkhd(f);
}
mp4ff_set_position(f, dest_position);
@@ -687,3 +844,374 @@ int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type)
return 0;
}
+
+#if 0
+int mp4ff_track_create_chunks_index(mp4ff_t *f, mp4ff_track_t *trk)
+{
+ unsigned int i_chunk;
+ unsigned int i_index, i_last;
+
+ // handle case when ( (!stco && !co64) || !stsc )
+ // NOTE: stco and co64 have the same data
+
+ if (!trk->stco_entry_count || !trk->stsc_entry_count)
+ {
+ trace ("no chunks\n");
+ return -1;
+ }
+
+ trk->i_chunk_count = trk->stco_entry_count;
+
+ trace ("\033[0;31mchunk count %d\033[37;0m\n", trk->i_chunk_count);
+ trk->chunk_sample_first = malloc (sizeof (int32_t) * trk->i_chunk_count);
+ trk->chunk_first_dts = malloc (sizeof (int32_t) * trk->i_chunk_count);
+ trk->chunk_last_dts = malloc (sizeof (int32_t) * trk->i_chunk_count);
+ trk->p_sample_count_dts = malloc (sizeof (int32_t *) * trk->i_chunk_count);
+ trk->p_sample_delta_dts = malloc (sizeof (int32_t *) * trk->i_chunk_count);
+ trk->p_sample_count_pts = malloc (sizeof (int32_t *) * trk->i_chunk_count);
+ trk->p_sample_offset_pts = malloc (sizeof (int32_t *) * trk->i_chunk_count);
+
+ /* first we read chunk offset */
+ for( i_chunk = 0; i_chunk < trk->i_chunk_count; i_chunk++ )
+ {
+ // chunk.i_offset = stco_chunk_offset[i_chunk]
+ trk->chunk_first_dts[i_chunk] = 0;
+ trk->p_sample_count_dts[i_chunk] = NULL;
+ trk->p_sample_delta_dts[i_chunk] = NULL;
+ trk->p_sample_count_pts[i_chunk] = NULL;
+ trk->p_sample_offset_pts[i_chunk] = NULL;
+ }
+
+ /* now we read index for SampleEntry( soun vide mp4a mp4v ...)
+ to be used for the sample XXX begin to 1
+ We construct it begining at the end */
+ i_last = trk->i_chunk_count; /* last chunk proceded */
+ i_index = trk->stsc_entry_count;
+ if( !i_index )
+ {
+ trace ("cannot read chunk table or table empty\n");
+ return -1;
+ }
+ trk->chunk_sample_first[0] = 0;
+ trace ("\033[0;35mchunk_sample_first[%d]=%d\033[37;0m\n", 0, trk->chunk_sample_first[0]);
+ for (int i = 1; i < trk->i_chunk_count; i++)
+ {
+ trk->chunk_sample_first[i] =
+ trk->chunk_sample_first[i-1] +
+ trk->stsc_samples_per_chunk[i-1];
+ trace ("\033[0;35mchunk_sample_first[%d]=%d\033[37;0m\n", i, trk->chunk_sample_first[i]);
+ }
+
+ trace ("track[Id 0x%x] read %d chunks\n", trk->id, trk->i_chunk_count);
+ return 0;
+}
+
+int mp4ff_track_create_samples_index (mp4ff_t *f, mp4ff_track_t *trk)
+{
+ /* TODO use also stss and stsh table for seeking */
+ /* FIXME use edit table */
+ int64_t i_sample;
+ int64_t i_chunk;
+
+ int64_t i_index;
+ int64_t i_index_sample_used;
+
+ int64_t i_next_dts;
+
+ if (trk->stsz_sample_count == 0) {
+ trace ("stsz not found\n");
+ return -1;
+ }
+ if (trk->stts_entry_count == 0) {
+ trace ("stts not found\n");
+ return -1;
+ }
+
+ // we already have the table, don't construct anything
+ // sample_size = stsz_sample_size == 0 ? stsz_table[i_sample] : stsz_sample_size
+
+ /* Use stts table to create a sample number -> dts table.
+ * XXX: if we don't want to waste too much memory, we can't expand
+ * the box! so each chunk will contain an "extract" of this table
+ * for fast research (problem with raw stream where a sample is sometime
+ * just channels*bits_per_sample/8 */
+
+ i_next_dts = 0;
+ i_index = 0; i_index_sample_used = 0;
+ for( i_chunk = 0; i_chunk < trk->i_chunk_count; i_chunk++ )
+ {
+ trace ("calculating first/last dts for chunk %d\n", i_chunk);
+ int64_t i_entry, i_sample_count, i;
+
+ /* save first dts */
+ trk->chunk_first_dts[i_chunk] = i_next_dts;
+ trk->chunk_last_dts[i_chunk] = i_next_dts;
+ trace ("init %lld\n", i_next_dts);
+
+ /* count how many entries are needed for this chunk
+ * for p_sample_delta_dts and p_sample_count_dts */
+ i_sample_count = trk->stsc_samples_per_chunk[i_chunk];
+ trace ("init i_sample_count %d\n", i_sample_count);
+
+ i_entry = 0;
+ while( i_sample_count > 0 )
+ {
+ i_sample_count -= trk->stts_sample_count[i_index+i_entry];
+ trace ("- i_sample_count %d\n", i_sample_count);
+ /* don't count already used sample in this entry */
+ if( i_entry == 0 ) {
+ i_sample_count += i_index_sample_used;
+ trace ("+ i_sample_count %d\n", i_sample_count);
+ }
+
+ i_entry++;
+ }
+ trace ("+ i_entry %d\n", i_entry);
+ /* allocate them */
+ trace ("alloc mem for chunk %d (%d entries, %d samples-per-chunk)\n", i_chunk, i_entry, trk->stsc_samples_per_chunk[i_chunk]);
+ trk->p_sample_count_dts[i_chunk] = calloc( i_entry, sizeof( uint32_t ) );
+ trk->p_sample_delta_dts[i_chunk] = calloc( i_entry, sizeof( uint32_t ) );
+
+ if( !trk->p_sample_count_dts[i_chunk] || !trk->p_sample_delta_dts[i_chunk] ) {
+ trace ("out of memory allocating p_sample_count_dts or p_sample_delta_dts\n");
+ return -1; // oom
+ }
+
+ /* now copy */
+ i_sample_count = trk->stsc_samples_per_chunk[i_chunk];
+ for( i = 0; i < i_entry; i++ )
+ {
+ int64_t i_used;
+ int64_t i_rest;
+
+ i_rest = trk->stts_sample_count[i_index] - i_index_sample_used;
+
+ i_used = min( i_rest, i_sample_count );
+
+ i_index_sample_used += i_used;
+ i_sample_count -= i_used;
+ i_next_dts += i_used * trk->stts_sample_delta[i_index];
+
+ trk->p_sample_count_dts[i_chunk][i] = i_used;
+ trk->p_sample_delta_dts[i_chunk][i] = trk->stts_sample_delta[i_index];
+ if( i_used > 0 )
+ trk->chunk_last_dts[i_chunk] = i_next_dts - trk->p_sample_delta_dts[i_chunk][i];
+
+ if( i_index_sample_used >= trk->stts_sample_count[i_index] )
+ {
+ i_index++;
+ i_index_sample_used = 0;
+ }
+ }
+ }
+
+ /* Find ctts
+ * Gives the delta between decoding time (dts) and composition table (pts)
+ */
+ if (trk->ctts_entry_count)
+ {
+ /* Create pts-dts table per chunk */
+ i_index = 0; i_index_sample_used = 0;
+ for( i_chunk = 0; i_chunk < trk->i_chunk_count; i_chunk++ )
+ {
+ int64_t i_entry, i_sample_count, i;
+
+ /* count how many entries are needed for this chunk
+ * for p_sample_delta_dts and p_sample_count_dts */
+ i_sample_count = trk->stsc_samples_per_chunk[i_chunk];
+
+ i_entry = 0;
+ while( i_sample_count > 0 )
+ {
+ i_sample_count -= trk->ctts_sample_count[i_index+i_entry];
+
+ /* don't count already used sample in this entry */
+ if( i_entry == 0 )
+ i_sample_count += i_index_sample_used;
+
+ i_entry++;
+ }
+ if (i_entry == 0) {
+ continue;
+ }
+
+ /* allocate them */
+ trk->p_sample_count_pts[i_chunk] = calloc( i_entry, sizeof( uint32_t ) );
+ trk->p_sample_offset_pts[i_chunk] = calloc( i_entry, sizeof( int32_t ) );
+ if( !trk->p_sample_count_pts[i_chunk] || !trk->p_sample_offset_pts[i_chunk] ) {
+ trace ("out of memory allocating p_sample_count_pts or p_sample_offset_pts\n");
+ return -1; // oom
+ }
+
+ /* now copy */
+ i_sample_count = trk->stsc_samples_per_chunk[i_chunk];
+ for( i = 0; i < i_entry; i++ )
+ {
+ int64_t i_used;
+ int64_t i_rest;
+
+ i_rest = trk->ctts_sample_count[i_index] -
+ i_index_sample_used;
+
+ i_used = min( i_rest, i_sample_count );
+
+ i_index_sample_used += i_used;
+ i_sample_count -= i_used;
+
+ trk->p_sample_count_pts[i_chunk][i] = i_used;
+ trk->p_sample_offset_pts[i_chunk][i] = trk->ctts_sample_offset[i_index];
+
+ if( i_index_sample_used >= trk->ctts_sample_count[i_index] )
+ {
+ i_index++;
+ i_index_sample_used = 0;
+ }
+ }
+ }
+ }
+
+ trace ("track[Id 0x%x] read %d samples length:%llds\n",
+ trk->id, trk->stsz_sample_count,
+ i_next_dts / trk->timeScale );
+
+ return 0;
+}
+
+int64_t mp4ff_get_track_dts (mp4ff_t *f, int t, int s)
+{
+ mp4ff_track_t *p_track = f->track[t];
+ // find chunk for the sample
+ int i_chunk = 0;
+ for (i_chunk = 0; i_chunk < p_track->i_chunk_count-1; i_chunk++) {
+ if (p_track->chunk_sample_first[i_chunk+1] > s) {
+ break;
+ }
+ }
+// trace ("i_chunk for sample %d: %d (out of %d)\n", s, i_chunk, p_track->i_chunk_count);
+
+ unsigned int i_index = 0;
+ unsigned int i_sample = s - p_track->chunk_sample_first[i_chunk];
+ int64_t i_dts = p_track->chunk_first_dts[i_chunk];
+ trace ("start dts: %lld (i_sample: %d)\n", i_dts, i_sample);
+
+ while( i_sample > 0 )
+ {
+ if( i_sample > p_track->p_sample_count_dts[i_chunk][i_index] )
+ {
+ i_dts += p_track->p_sample_count_dts[i_chunk][i_index] *
+ p_track->p_sample_delta_dts[i_chunk][i_index];
+ i_sample -= p_track->p_sample_count_dts[i_chunk][i_index];
+ i_index++;
+ }
+ else
+ {
+ i_dts += i_sample * p_track->p_sample_delta_dts[i_chunk][i_index];
+ break;
+ }
+ }
+
+
+#if 0
+ // we don't need elst
+ /* now handle elst */
+ if (p_track->elst_entry_count)
+ {
+ /* convert to offset */
+ if( ( p_track->elst_media_rate_integer[p_track->i_elst] > 0 ||
+ p_track->elst_media_rate_fraction[p_track->i_elst] > 0 ) &&
+ p_track->elst_media_time[p_track->i_elst] > 0 )
+ {
+ i_dts -= p_track->elst_media_time[p_track->i_elst];
+ }
+
+ /* add i_elst_time */
+ i_dts += p_track->i_elst_time * p_track->timeScale /
+ f->time_scale;
+
+ if( i_dts < 0 ) i_dts = 0;
+ }
+#endif
+
+ return (int64_t)1000000 * i_dts / p_track->timeScale;
+}
+
+int64_t mp4ff_get_track_pts_delta(mp4ff_t *f, int t, int i_sample)
+{
+ mp4ff_track_t *p_track = f->track[t];
+ // find chunk for the sample
+ int i_chunk = 0;
+ for (i_chunk = 0; i_chunk < p_track->i_chunk_count-1; i_chunk++) {
+ if (p_track->chunk_sample_first[i_chunk+1] > i_sample) {
+ break;
+ }
+ }
+// trace ("i_chunk for sample %d: %d (out of %d)\n", i_sample, i_chunk, p_track->i_chunk_count);
+ unsigned int i_index = 0;
+ i_sample = i_sample - p_track->chunk_sample_first[i_chunk];
+
+ if( p_track->p_sample_count_pts[i_chunk] == NULL || p_track->p_sample_offset_pts[i_chunk] == NULL ) {
+ trace ("pts info not found :(\n");
+ return -1;
+ }
+
+ for( i_index = 0;; i_index++ )
+ {
+ if( i_sample < p_track->p_sample_count_pts[i_chunk][i_index] )
+ return p_track->p_sample_offset_pts[i_chunk][i_index] * (int64_t)1000000 /
+ (int64_t)p_track->timeScale;
+
+ i_sample -= p_track->p_sample_count_pts[i_chunk][i_index];
+ }
+ return 0;
+}
+
+int mp4ff_get_track_sample_size(mp4ff_t *f, int t, int s)
+{
+ mp4ff_track_t *p_track = f->track[t];
+ int i_size;
+
+ if( p_track->stsz_sample_size == 0 )
+ {
+ /* most simple case */
+ return p_track->stsz_table[s];
+ }
+ if(p_track->type != TRACK_AUDIO)
+ {
+ return p_track->stsz_sample_size;
+ }
+
+// that's all we need for chapters, sound length is calculated differently for now
+ return 0;
+#if 0
+ p_soun = p_track->p_sample->data.p_sample_soun;
+
+ if( p_soun->i_qt_version == 1 )
+ {
+ int i_samples = p_track->chunk[p_track->i_chunk].i_sample_count;
+ if( p_track->fmt.audio.i_blockalign > 1 )
+ i_samples = p_soun->i_sample_per_packet;
+
+ i_size = i_samples / p_soun->i_sample_per_packet * p_soun->i_bytes_per_frame;
+ }
+ else if( p_track->i_sample_size > 256 )
+ {
+ /* We do that so we don't read too much data
+ * (in this case we are likely dealing with compressed data) */
+ i_size = p_track->i_sample_size;
+ }
+ else
+ {
+ /* Read a bunch of samples at once */
+ int i_samples = p_track->chunk[p_track->i_chunk].i_sample_count -
+ ( p_track->i_sample -
+ p_track->chunk[p_track->i_chunk].i_sample_first );
+
+ i_samples = __MIN( QT_V0_MAX_SAMPLES, i_samples );
+ i_size = i_samples * p_track->i_sample_size;
+ }
+
+ //fprintf( stderr, "size=%d\n", i_size );
+ return i_size;
+#endif
+}
+#endif
diff --git a/plugins/aac/mp4ff/mp4ff.c b/plugins/libmp4ff/mp4ff.c
index ce33aad5..2b396ec0 100644
--- a/plugins/aac/mp4ff/mp4ff.c
+++ b/plugins/libmp4ff/mp4ff.c
@@ -33,6 +33,9 @@
#include <stdio.h>
#include "mp4ffint.h"
+#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+//#define trace(fmt,...)
+
mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f)
{
mp4ff_t *ff = malloc(sizeof(mp4ff_t));
@@ -59,6 +62,45 @@ mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f)
return ff;
}
+void mp4ff_track_free (mp4ff_track_t *trk) {
+#if 0
+ if (trk->chunk_sample_first) {
+ free (trk->chunk_sample_first);
+ }
+ if (trk->chunk_first_dts) {
+ free (trk->chunk_first_dts);
+ }
+ if (trk->chunk_last_dts) {
+ free (trk->chunk_last_dts);
+ }
+ if (trk->p_sample_count_dts) {
+ for (int i = 0; i < trk->stsc_entry_count; i++) {
+ free (trk->p_sample_count_dts[i]);
+ }
+ free (trk->p_sample_count_dts);
+ }
+ if (trk->p_sample_delta_dts) {
+ for (int i = 0; i < trk->stsc_entry_count; i++) {
+ free (trk->p_sample_delta_dts[i]);
+ }
+ free (trk->p_sample_delta_dts);
+ }
+ if (trk->p_sample_count_pts) {
+ for (int i = 0; i < trk->stsc_entry_count; i++) {
+ free (trk->p_sample_count_pts[i]);
+ }
+ free (trk->p_sample_count_pts);
+ }
+ if (trk->p_sample_offset_pts) {
+ for (int i = 0; i < trk->stsc_entry_count; i++) {
+ free (trk->p_sample_offset_pts[i]);
+ }
+ free (trk->p_sample_offset_pts);
+ }
+#endif
+ free (trk);
+}
+
void mp4ff_close(mp4ff_t *ff)
{
int32_t i;
@@ -91,7 +133,7 @@ void mp4ff_close(mp4ff_t *ff)
if (ff->track[i]->p_drms)
drms_free(ff->track[i]->p_drms);
#endif
- free(ff->track[i]);
+ mp4ff_track_free (ff->track[i]);
}
}
@@ -99,6 +141,9 @@ void mp4ff_close(mp4ff_t *ff)
mp4ff_tag_delete(&(ff->tags));
#endif
+ mp4ff_chapters_free (ff);
+ mp4ff_tref_free (ff);
+
if (ff) free(ff);
}
@@ -173,6 +218,15 @@ int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only)
} else {
mp4ff_atom_read(f, (uint32_t)size, atom_type);
}
+#if 0
+ if (atom_type == ATOM_TRAK)
+ {
+ trace ("mp4ff_track_create_chunks_index\n");
+ mp4ff_track_create_chunks_index (f, f->track[f->total_tracks-1]);
+ trace ("mp4ff_track_create_samples_index\n");
+ mp4ff_track_create_samples_index (f, f->track[f->total_tracks-1]);
+ }
+#endif
}
return 0;
@@ -255,6 +309,11 @@ int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track)
return f->track[track]->type;
}
+int32_t mp4ff_get_track_id(const mp4ff_t *f, const int track)
+{
+ return f->track[track]->id;
+}
+
int32_t mp4ff_total_tracks(const mp4ff_t *f)
{
return f->total_tracks;
@@ -428,7 +487,7 @@ int32_t mp4ff_read_sample(mp4ff_t *f, const int32_t track, const int32_t sample,
*audio_buffer = (uint8_t*)malloc(*bytes);
if (!(*audio_buffer)) {
- fprintf (stderr, "mp4ff_read_sample: malloc failure (tried to alloc %d bytes). possible mp4ff bug or memleak! please report a bug to deadbeef developers (i'm serious).\n", *bytes);
+ //fprintf (stderr, "mp4ff_read_sample: malloc failure (tried to alloc %d bytes). possible mp4ff bug or memleak! please report a bug to deadbeef developers (i'm serious).\n", *bytes);
return 0;
}
diff --git a/plugins/aac/mp4ff/mp4ff.h b/plugins/libmp4ff/mp4ff.h
index f8828f4f..b47bcb8e 100644
--- a/plugins/aac/mp4ff/mp4ff.h
+++ b/plugins/libmp4ff/mp4ff.h
@@ -40,20 +40,7 @@ extern "C" {
#else
#include "mp4ff_int_types.h"
#endif
-
-/* file callback structure */
-typedef struct
-{
- uint32_t (*read)(void *user_data, void *buffer, uint32_t length);
- uint32_t (*write)(void *udata, void *buffer, uint32_t length);
- uint32_t (*seek)(void *user_data, uint64_t position);
- uint32_t (*truncate)(void *user_data);
- void *user_data;
-} mp4ff_callback_t;
-
-/* mp4 main file structure */
-typedef void* mp4ff_t;
-
+#include "mp4ffint.h"
/* API */
@@ -78,6 +65,9 @@ int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample)
int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int track,
unsigned char** ppBuf, unsigned int* pBufSize);
int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track);
+int32_t mp4ff_get_track_id(const mp4ff_t *f, const int track);
+int32_t mp4ff_get_track_fmt_cat(const mp4ff_t *f, const int track);
+int32_t mp4ff_get_track_fmt_codec(const mp4ff_t *f, const int track);
int32_t mp4ff_total_tracks(const mp4ff_t *f);
int32_t mp4ff_num_samples(const mp4ff_t *f, const int track);
int32_t mp4ff_time_scale(const mp4ff_t *f, const int track);
@@ -113,19 +103,15 @@ int mp4ff_meta_get_tempo(const mp4ff_t *f, char **value);
int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value);
#ifdef USE_TAGGING
-/* metadata tag structure */
-typedef struct
-{
- char *item;
- char *value;
-} mp4ff_tag_t;
-
-/* metadata list structure */
-typedef struct
-{
- mp4ff_tag_t *tags;
- uint32_t count;
-} mp4ff_metadata_t;
+int32_t mp4ff_chapters_get_num_items (mp4ff_t *f);
+const char *mp4ff_chapters_get_item (mp4ff_t *f, int i);
+int32_t mp4ff_chap_get_num_tracks (mp4ff_t *f);
+int32_t mp4ff_chap_get_track_id (mp4ff_t *f, int t);
+#if 0
+int64_t mp4ff_get_track_dts (mp4ff_t *f, int t, int s);
+int64_t mp4ff_get_track_pts_delta(mp4ff_t *f, int t, int s);
+int mp4ff_get_track_sample_size(mp4ff_t *f, int t, int s);
+#endif
int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data);
diff --git a/plugins/aac/mp4ff/mp4ff_int_types.h b/plugins/libmp4ff/mp4ff_int_types.h
index 15e7fd60..15e7fd60 100644
--- a/plugins/aac/mp4ff/mp4ff_int_types.h
+++ b/plugins/libmp4ff/mp4ff_int_types.h
diff --git a/plugins/aac/mp4ff/mp4ffint.h b/plugins/libmp4ff/mp4ffint.h
index f4673b03..e0d335b2 100644
--- a/plugins/aac/mp4ff/mp4ffint.h
+++ b/plugins/libmp4ff/mp4ffint.h
@@ -43,7 +43,9 @@ extern "C" {
#define TRACK_AUDIO 1
#define TRACK_VIDEO 2
#define TRACK_SYSTEM 3
+#define TRACK_TEXT 4
+#define ATOM_TREF 100
#define SUBATOMIC 128
@@ -52,7 +54,6 @@ extern "C" {
#define ATOM_MDAT 130
#define ATOM_MVHD 131
#define ATOM_TKHD 132
-#define ATOM_TREF 133
#define ATOM_MDHD 134
#define ATOM_VMHD 135
#define ATOM_SMHD 136
@@ -93,6 +94,11 @@ extern "C" {
#define ATOM_SEASON 170
#define ATOM_EPISODE 171
#define ATOM_PODCAST 172
+#define ATOM_CUSTOM 173
+#define ATOM_CHPL 174
+#define ATOM_CHAP 175
+#define ATOM_TEXT 176
+#define ATOM_ELST 176
#define ATOM_UNKNOWN 255
#define ATOM_FREE ATOM_UNKNOWN
@@ -165,6 +171,7 @@ typedef struct
typedef struct
{
int32_t type;
+ int32_t id;
int32_t channelCount;
int32_t sampleSize;
uint16_t sampleRate;
@@ -183,6 +190,21 @@ typedef struct
int32_t *stts_sample_count;
int32_t *stts_sample_delta;
+#if 0
+// experimental support for indexing chunks samples based on VLC code
+ /* chunk index generated in mp4ff_create_chunks_index */
+ // chunk->i_sample_count = stsc_samples_per_chunk[i_chunk]
+ // chunk->i_sample_description_index = stsc_sample_desc_index[chunk]
+ // trk->p_sample_size[i_sample] = stsz_sample_size ? stsz_sample_size : stsz_table[i_sample]
+ int32_t i_chunk_count; // stco_entry_count
+ int32_t *chunk_sample_first;
+ int32_t *chunk_first_dts;
+ int32_t *chunk_last_dts;
+ int32_t **p_sample_count_dts;
+ int32_t **p_sample_delta_dts;
+ int32_t **p_sample_count_pts;
+ int32_t **p_sample_offset_pts;
+#endif
/* stsc */
int32_t stsc_entry_count;
int32_t *stsc_first_chunk;
@@ -198,6 +220,18 @@ typedef struct
int32_t *ctts_sample_count;
int32_t *ctts_sample_offset;
+
+#if 0
+ /* elst */
+ int i_elst; /* current elst */
+ int64_t i_elst_time; /* current elst start time (in movie time scale)*/
+ uint32_t elst_entry_count;
+ uint64_t *elst_segment_duration;
+ int64_t *elst_media_time;
+ uint16_t *elst_media_rate_integer;
+ uint16_t *elst_media_rate_fraction;
+#endif
+
/* esde */
uint8_t *decoderConfig;
int32_t decoderConfigLen;
@@ -205,11 +239,27 @@ typedef struct
uint32_t maxBitrate;
uint32_t avgBitrate;
- uint32_t timeScale;
+ uint32_t timeScale; // FIXME: check calculation
uint64_t duration;
} mp4ff_track_t;
+typedef struct
+{
+ uint8_t i_chapter;
+ struct
+ {
+ char *psz_name;
+ int64_t i_start;
+ } chapter[256];
+} mp4ff_chapterdata_t;
+
+typedef struct
+{
+ uint32_t i_entry_count;
+ uint32_t *i_track_ID;
+} mp4ff_trefdata_t;
+
/* mp4 main file structure */
typedef struct
{
@@ -235,6 +285,10 @@ typedef struct
/* metadata */
mp4ff_metadata_t tags;
+
+ /* chapters */
+ mp4ff_chapterdata_t chapters;
+ mp4ff_trefdata_t tref;
} mp4ff_t;
@@ -317,6 +371,10 @@ mp4ff_t *mp4ff_open_edit(mp4ff_callback_t *f);
#endif
void mp4ff_close(mp4ff_t *ff);
//void mp4ff_track_add(mp4ff_t *f);
+#if 0
+int mp4ff_track_create_chunks_index(mp4ff_t *f, mp4ff_track_t *trk);
+int mp4ff_track_create_samples_index (mp4ff_t *f, mp4ff_track_t *trk);
+#endif
int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only);
int32_t parse_atoms(mp4ff_t *f,int meta_only);
@@ -336,6 +394,8 @@ int32_t mp4ff_num_samples(const mp4ff_t *f, const int32_t track);
uint32_t mp4ff_meta_genre_to_index(const char * genrestr);//returns 1-based index, 0 if not found
const char * mp4ff_meta_index_to_genre(uint32_t idx);//returns pointer to static string
+void mp4ff_chapters_free (mp4ff_t *f);
+void mp4ff_tref_free (mp4ff_t *f);
#ifdef __cplusplus
}
diff --git a/plugins/aac/mp4ff/mp4meta.c b/plugins/libmp4ff/mp4meta.c
index 5e13c693..5e13c693 100644
--- a/plugins/aac/mp4ff/mp4meta.c
+++ b/plugins/libmp4ff/mp4meta.c
diff --git a/plugins/aac/mp4ff/mp4sample.c b/plugins/libmp4ff/mp4sample.c
index 95994641..95994641 100644
--- a/plugins/aac/mp4ff/mp4sample.c
+++ b/plugins/libmp4ff/mp4sample.c
diff --git a/plugins/aac/mp4ff/mp4tagupdate.c b/plugins/libmp4ff/mp4tagupdate.c
index 79b59c71..79b59c71 100644
--- a/plugins/aac/mp4ff/mp4tagupdate.c
+++ b/plugins/libmp4ff/mp4tagupdate.c
diff --git a/plugins/aac/mp4ff/mp4util.c b/plugins/libmp4ff/mp4util.c
index 24d89c7b..24d89c7b 100644
--- a/plugins/aac/mp4ff/mp4util.c
+++ b/plugins/libmp4ff/mp4util.c
diff --git a/plugins/m3u/m3u.c b/plugins/m3u/m3u.c
index 8097698c..8a105e2f 100644
--- a/plugins/m3u/m3u.c
+++ b/plugins/m3u/m3u.c
@@ -50,15 +50,20 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
}
int sz = deadbeef->fgetlength (fp);
trace ("loading m3u...\n");
- uint8_t *buffer = malloc (sz);
- if (!buffer) {
+ uint8_t *membuffer = malloc (sz);
+ if (!membuffer) {
deadbeef->fclose (fp);
trace ("failed to allocate %d bytes to read the file %s\n", sz, fname);
return NULL;
}
+ uint8_t *buffer = membuffer;
deadbeef->fread (buffer, 1, sz, fp);
deadbeef->fclose (fp);
+ if (sz >= 3 && buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf) {
+ buffer += 3;
+ sz -= 3;
+ }
int line = 0;
int read_extm3u = 0;
@@ -83,8 +88,8 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
else if (read_extm3u) {
if (end - p >= 8 && !strncmp (p, "#EXTINF:", 8)) {
length = -1;
- title[0] = 0;
- artist[0] = 0;
+ memset (title, 0, sizeof (title));
+ memset (artist, 0, sizeof (artist));
p += 8;
e = p;
while (e < end && *e >= 0x20) {
@@ -161,7 +166,26 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
}
DB_playItem_t *it = NULL;
- if (strrchr (nm, '/')) {
+ int is_fullpath = 0;
+ if (nm[0] == '/') {
+ is_fullpath = 1;
+ }
+ else {
+ uint8_t *p = strstr (nm, "://");
+ if (p) {
+ p--;
+ while (p >= nm) {
+ if (*p < 'a' && *p > 'z') {
+ break;
+ }
+ p--;
+ }
+ if (p < nm) {
+ is_fullpath = 1;
+ }
+ }
+ }
+ if (is_fullpath) { // full path
trace ("pl_insert_m3u: adding file %s\n", nm);
it = deadbeef->plt_insert_file (plt, after, nm, pabort, cb, user_data);
if (it) {
@@ -169,13 +193,10 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
deadbeef->plt_set_item_duration (plt, it, length);
}
if (title[0]) {
- deadbeef->pl_replace_meta (it, "title", title);
- }
- else if (artist[0]) {
- deadbeef->pl_replace_meta (it, "title", " ");
+ deadbeef->pl_add_meta (it, "title", title);
}
if (artist[0]) {
- deadbeef->pl_replace_meta (it, "artist", artist);
+ deadbeef->pl_add_meta (it, "artist", artist);
}
}
}
@@ -194,7 +215,7 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
if (after) {
deadbeef->pl_item_ref (after);
}
- free (buffer);
+ free (membuffer);
return after;
}
p = e;
@@ -206,7 +227,7 @@ load_m3u (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname, int *pab
deadbeef->pl_item_ref (after);
}
trace ("leave pl_insert_m3u\n");
- free (buffer);
+ free (membuffer);
return after;
}
@@ -470,15 +491,19 @@ m3uplug_save_m3u (const char *fname, DB_playItem_t *first, DB_playItem_t *last)
while (it) {
int dur = (int)ceil(deadbeef->pl_get_item_duration (it));
char s[1000];
- if (deadbeef->pl_find_meta (it, "artist")) {
+ if (deadbeef->pl_meta_exists (it, "artist")) {
deadbeef->pl_format_title (it, -1, s, sizeof (s), -1, "%a - %t");
}
else {
deadbeef->pl_format_title (it, -1, s, sizeof (s), -1, "%t");
}
- const char *fname = deadbeef->pl_find_meta (it, ":URI");
fprintf (fp, "#EXTINF:%d,%s\n", dur, s);
- fprintf (fp, "%s\n", fname);
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+ fprintf (fp, "%s\n", fname);
+ }
+ deadbeef->pl_unlock ();
if (it == last) {
break;
@@ -518,8 +543,12 @@ m3uplug_save_pls (const char *fname, DB_playItem_t *first, DB_playItem_t *last)
deadbeef->pl_item_ref (it);
int i = 1;
while (it) {
- const char *fname = deadbeef->pl_find_meta (it, ":URI");
- fprintf (fp, "File%d=%s\n", i, fname);
+ deadbeef->pl_lock ();
+ {
+ const char *fname = deadbeef->pl_find_meta (it, ":URI");
+ fprintf (fp, "File%d=%s\n", i, fname);
+ }
+ deadbeef->pl_unlock ();
if (it == last) {
break;
diff --git a/plugins/mms/libmms/mms.c b/plugins/mms/libmms/mms.c
index 222a82b9..ad63e6f8 100644
--- a/plugins/mms/libmms/mms.c
+++ b/plugins/mms/libmms/mms.c
@@ -142,6 +142,8 @@ struct mms_s {
int seekable;
off_t current_pos;
int eos;
+
+ int *need_abort;
};
static int fallback_io_select(void *data, int socket, int state, int timeout_msec)
@@ -154,12 +156,13 @@ static int fallback_io_select(void *data, int socket, int state, int timeout_mse
(state == MMS_IO_WRITE_READY) ? &set : NULL, NULL, &tv);
}
-static off_t fallback_io_read(void *data, int socket, char *buf, off_t num)
+static off_t fallback_io_read(void *data, int socket, char *buf, off_t num, int *need_abort)
{
off_t len = 0, ret;
/* lprintf("%d\n", fallback_io_select(data, socket, MMS_IO_READ_READY, 1000)); */
errno = 0;
- while (len < num)
+ int nretry = 200;
+ while (len < num && nretry > 0)
{
ret = (off_t)read(socket, buf + len, num - len);
if(ret == 0)
@@ -170,6 +173,8 @@ static off_t fallback_io_read(void *data, int socket, char *buf, off_t num)
switch(errno)
{
case EAGAIN:
+ usleep (30000); // sleeping 30ms 200 times will give us about 6 sec of time to complete the request
+ nretry--;
continue;
default:
/* if already read something, return it, we will fail next time */
@@ -499,7 +504,7 @@ static int get_packet_header (mms_io_t *io, mms_t *this, mms_packet_header_t *he
header->packet_seq = 0;
header->flags = 0;
header->packet_id_type = 0;
- len = io_read(io, this->s, this->buf, 8);
+ len = io_read(io, this->s, this->buf, 8, this->need_abort);
this->buf_packet_seq_offset = -1;
if (len != 8)
goto error;
@@ -507,7 +512,7 @@ static int get_packet_header (mms_io_t *io, mms_t *this, mms_packet_header_t *he
if (LE_32(this->buf + 4) == 0xb00bface) {
/* command packet */
header->flags = this->buf[3];
- len = io_read(io, this->s, this->buf + 8, 4);
+ len = io_read(io, this->s, this->buf + 8, 4, this->need_abort);
if (len != 4)
goto error;
@@ -544,7 +549,7 @@ static int get_packet_command (mms_io_t *io, mms_t *this, uint32_t packet_len) {
int command = 0;
size_t len;
- len = io_read(io, this->s, this->buf + 12, packet_len) ;
+ len = io_read(io, this->s, this->buf + 12, packet_len, this->need_abort) ;
//this->buf_packet_seq_offset = -1; // already set in get_packet_header
if (len != packet_len) {
lprintf("mms: error reading command packet\n");
@@ -638,7 +643,7 @@ static int get_asf_header (mms_io_t *io, mms_t *this) {
return 0;
}
len = io_read(io, this->s,
- this->asf_header + this->asf_header_len, header.packet_len);
+ this->asf_header + this->asf_header_len, header.packet_len, this->need_abort);
if (len != header.packet_len) {
lprintf("mms: error reading asf header\n");
return 0;
@@ -1434,7 +1439,7 @@ static int get_media_packet (mms_io_t *io, mms_t *this) {
this->current_pos = (off_t)this->asf_header_len +
((off_t)header.packet_seq - this->start_packet_seq) * (off_t)this->asf_packet_len;
- len = io_read(io, this->s, this->buf, header.packet_len);
+ len = io_read(io, this->s, this->buf, header.packet_len, this->need_abort);
if (len != header.packet_len) {
lprintf("mms: error reading asf packet\n");
return 0;
@@ -1472,11 +1477,11 @@ int mms_peek_header (mms_t *this, char *data, int maxsize) {
return len;
}
-int mms_read (mms_io_t *io, mms_t *this, char *data, int len) {
+int mms_read (mms_io_t *io, mms_t *this, char *data, int len, int *need_abort) {
int total;
total = 0;
- while (total < len && !this->eos) {
+ while (total < len && !this->eos && (!need_abort || !(*need_abort))) {
if (this->asf_header_read < this->asf_header_len) {
int n, bytes_left;
diff --git a/plugins/mms/libmms/mms.h b/plugins/mms/libmms/mms.h
index bce71d54..be329eef 100644
--- a/plugins/mms/libmms/mms.h
+++ b/plugins/mms/libmms/mms.h
@@ -39,7 +39,7 @@ typedef struct mms_s mms_t;
mms_t* mms_connect (mms_io_t *io, void *data, const char *url, int bandwidth);
-int mms_read (mms_io_t *io, mms_t *instance, char *data, int len);
+int mms_read (mms_io_t *io, mms_t *instance, char *data, int len, int *need_abort);
int mms_request_time_seek (mms_io_t *io, mms_t *instance, double time_sec);
int mms_time_seek (mms_io_t *io, mms_t *instance, double time_sec);
int mms_request_packet_seek (mms_io_t *io, mms_t *instance,
diff --git a/plugins/mms/libmms/mmsh.c b/plugins/mms/libmms/mmsh.c
index 9a7b119b..a0552f6c 100644
--- a/plugins/mms/libmms/mmsh.c
+++ b/plugins/mms/libmms/mmsh.c
@@ -202,6 +202,8 @@ struct mmsh_s {
off_t current_pos;
int user_bandwidth;
+
+ int *need_abort;
};
static int fallback_io_select(void *data, int socket, int state, int timeout_msec)
@@ -214,7 +216,7 @@ static int fallback_io_select(void *data, int socket, int state, int timeout_mse
(state == MMS_IO_WRITE_READY) ? &set : NULL, NULL, &tv);
}
-static off_t fallback_io_read(void *data, int socket, char *buf, off_t num)
+static off_t fallback_io_read(void *data, int socket, char *buf, off_t num, int *need_abort)
{
off_t len = 0, ret;
/* lprintf("%d\n", fallback_io_select(data, socket, MMS_IO_READ_READY, 1000)); */
@@ -367,7 +369,7 @@ static int get_answer (mms_io_t *io, mmsh_t *this) {
while (!done) {
- if (io_read(io, this->s, &(this->buf[len]), 1) != 1) {
+ if (io_read(io, this->s, &(this->buf[len]), 1, this->need_abort) != 1) {
lprintf ("mmsh: alart: end of stream\n");
return 0;
}
@@ -454,7 +456,7 @@ static int get_chunk_header (mms_io_t *io, mmsh_t *this) {
int ext_header_len;
/* read chunk header */
- read_len = io_read(io, this->s, chunk_header, CHUNK_HEADER_LENGTH);
+ read_len = io_read(io, this->s, chunk_header, CHUNK_HEADER_LENGTH, this->need_abort);
if (read_len != CHUNK_HEADER_LENGTH) {
if (read_len == 0)
return EOS;
@@ -482,7 +484,7 @@ static int get_chunk_header (mms_io_t *io, mmsh_t *this) {
}
/* read extended header */
if (ext_header_len > 0) {
- read_len = io_read (io, this->s, ext_header, ext_header_len);
+ read_len = io_read (io, this->s, ext_header, ext_header_len, this->need_abort);
if (read_len != ext_header_len) {
lprintf("mmsh: extended header read failed. %d != %d\n", read_len, ext_header_len);
return ERROR;
@@ -546,7 +548,7 @@ static int get_header (mms_io_t *io, mmsh_t *this) {
return ERROR;
} else {
len = io_read(io, this->s, this->asf_header + this->asf_header_len,
- this->chunk_length);
+ this->chunk_length, this->need_abort);
if (len > 0)
this->asf_header_len += len;
if (len != this->chunk_length) {
@@ -567,7 +569,7 @@ static int get_header (mms_io_t *io, mmsh_t *this) {
if (this->chunk_type == CHUNK_TYPE_DATA) {
/* read the first data chunk */
- len = io_read (io, this->s, this->buf, this->chunk_length);
+ len = io_read (io, this->s, this->buf, this->chunk_length, this->need_abort);
if (len != this->chunk_length) {
lprintf ("mmsh: asf data chunk read failed, %d != %d\n", len,
@@ -1216,7 +1218,7 @@ static int get_media_packet (mms_io_t *io, mmsh_t *this) {
return ERROR;
}
- len = io_read (io, this->s, this->buf, this->chunk_length);
+ len = io_read (io, this->s, this->buf, this->chunk_length, this->need_abort);
if (len == this->chunk_length) {
/* explicit padding with 0 */
@@ -1253,7 +1255,7 @@ int mmsh_peek_header (mmsh_t *this, char *data, int maxsize) {
return len;
}
-int mmsh_read (mms_io_t *io, mmsh_t *this, char *data, int len) {
+int mmsh_read (mms_io_t *io, mmsh_t *this, char *data, int len, int *need_abort) {
int total;
total = 0;
@@ -1262,7 +1264,7 @@ int mmsh_read (mms_io_t *io, mmsh_t *this, char *data, int len) {
if (this->s == -1)
return total;
- while (total < len) {
+ while (total < len && (!need_abort || !(*need_abort))) {
if (this->asf_header_read < this->asf_header_len) {
int n, bytes_left ;
diff --git a/plugins/mms/libmms/mmsh.h b/plugins/mms/libmms/mmsh.h
index b222eeaa..744eefc0 100644
--- a/plugins/mms/libmms/mmsh.h
+++ b/plugins/mms/libmms/mmsh.h
@@ -39,7 +39,7 @@ typedef struct mmsh_s mmsh_t;
char* mmsh_connect_common(int *s ,int *port, char *url, char **host, char **path, char **file);
mmsh_t* mmsh_connect (mms_io_t *io, void *data, const char *url_, int bandwidth);
-int mmsh_read (mms_io_t *io, mmsh_t *instance, char *data, int len);
+int mmsh_read (mms_io_t *io, mmsh_t *instance, char *data, int len, int *need_abort);
int mmsh_time_seek (mms_io_t *io, mmsh_t *instance, double time_sec);
mms_off_t mmsh_seek (mms_io_t *io, mmsh_t *instance, mms_off_t offset, int origin);
uint32_t mmsh_get_length (mmsh_t *instance);
diff --git a/plugins/mms/libmms/mmsio.h b/plugins/mms/libmms/mmsio.h
index 8e4304d9..a1cb93bb 100644
--- a/plugins/mms/libmms/mmsio.h
+++ b/plugins/mms/libmms/mmsio.h
@@ -19,7 +19,7 @@ extern "C" {
#endif /* __cplusplus */
typedef mms_off_t (*mms_io_write_func)(void *data, int socket, char *buf, mms_off_t num);
-typedef mms_off_t (*mms_io_read_func)(void *data, int socket, char *buf, mms_off_t num);
+typedef mms_off_t (*mms_io_read_func)(void *data, int socket, char *buf, mms_off_t num, int *need_abort);
/* select states */
#define MMS_IO_READ_READY 1
diff --git a/plugins/mms/libmms/mmsx.c b/plugins/mms/libmms/mmsx.c
index fc95de86..e2c3fd9b 100644
--- a/plugins/mms/libmms/mmsx.c
+++ b/plugins/mms/libmms/mmsx.c
@@ -33,9 +33,10 @@
struct mmsx_s {
mms_t *connection;
mmsh_t *connection_h;
+ int *need_abort;
};
-mmsx_t *mmsx_connect(mms_io_t *io, void *data, const char *url, int bandwidth)
+mmsx_t *mmsx_connect(mms_io_t *io, void *data, const char *url, int bandwidth, int *need_abort)
{
mmsx_t *mmsx = calloc(1, sizeof(mmsx_t));
char *try_mms_first = getenv("LIBMMS_TRY_MMS_FIRST");
@@ -43,6 +44,8 @@ mmsx_t *mmsx_connect(mms_io_t *io, void *data, const char *url, int bandwidth)
if (!mmsx)
return mmsx;
+ mmsx->need_abort = need_abort;
+
/* Normally we try mmsh first, as mms: is a rollover protocol identifier
according to microsoft and recent mediaplayer versions will try
mmsh before mms for mms:// uris. Note that in case of a mmst:// or a
@@ -72,9 +75,9 @@ mmsx_t *mmsx_connect(mms_io_t *io, void *data, const char *url, int bandwidth)
int mmsx_read (mms_io_t *io, mmsx_t *mmsx, char *data, int len)
{
if(mmsx->connection)
- return mms_read(io, mmsx->connection, data, len);
+ return mms_read(io, mmsx->connection, data, len, mmsx->need_abort);
else
- return mmsh_read(io, mmsx->connection_h, data, len);
+ return mmsh_read(io, mmsx->connection_h, data, len, mmsx->need_abort);
}
int mmsx_time_seek (mms_io_t *io, mmsx_t *mmsx, double time_sec)
diff --git a/plugins/mms/libmms/mmsx.h b/plugins/mms/libmms/mmsx.h
index df4adfce..d2acc877 100644
--- a/plugins/mms/libmms/mmsx.h
+++ b/plugins/mms/libmms/mmsx.h
@@ -39,7 +39,7 @@ extern "C" {
typedef struct mmsx_s mmsx_t;
-mmsx_t* mmsx_connect (mms_io_t *io, void *data, const char *url, int bandwidth);
+mmsx_t* mmsx_connect (mms_io_t *io, void *data, const char *url, int bandwidth, int *need_abort);
int mmsx_read (mms_io_t *io, mmsx_t *instance, char *data, int len);
int mmsx_time_seek (mms_io_t *io, mmsx_t *instance, double time_sec);
diff --git a/plugins/mms/mmsplug.c b/plugins/mms/mmsplug.c
index 94d0ed3c..3d2e3faf 100644
--- a/plugins/mms/mmsplug.c
+++ b/plugins/mms/mmsplug.c
@@ -28,6 +28,7 @@ typedef struct {
DB_vfs_t *vfs;
mmsx_t *stream;
const mms_io_t *io;
+ int need_abort;
} MMS_FILE;
static DB_vfs_t plugin;
@@ -49,7 +50,7 @@ static DB_FILE *
mms_open (const char *fname) {
MMS_FILE *fp = malloc (sizeof (MMS_FILE));
fp->io = mms_get_default_io_impl();
- fp->stream = mmsx_connect ((mms_io_t *)fp->io, fp, fname, 1544000);
+ fp->stream = mmsx_connect ((mms_io_t *)fp->io, fp, fname, 1544000, &fp->need_abort);
if (!fp->stream) {
free (fp);
return NULL;
@@ -118,6 +119,11 @@ mms_is_streaming (void) {
return 1;
}
+static void
+mms_abort (DB_FILE *fp) {
+ ((MMS_FILE *)fp)->need_abort = 1;
+}
+
static DB_vfs_t plugin = {
.plugin.api_vmajor = 1,
.plugin.api_vminor = 0,
@@ -156,6 +162,7 @@ static DB_vfs_t plugin = {
.get_content_type = mms_get_content_type,
.get_schemes = mms_get_schemes,
.is_streaming = mms_is_streaming,
+ .abort = mms_abort,
};
DB_plugin_t *
diff --git a/plugins/mpgmad/mpgmad.c b/plugins/mpgmad/mpgmad.c
index 487219e2..132adebc 100644
--- a/plugins/mpgmad/mpgmad.c
+++ b/plugins/mpgmad/mpgmad.c
@@ -793,7 +793,9 @@ cmp3_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
mpgmad_info_t *info = (mpgmad_info_t *)_info;
_info->plugin = &plugin;
memset (&info->buffer, 0, sizeof (info->buffer));
+ deadbeef->pl_lock ();
info->buffer.file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->buffer.file) {
return -1;
}
@@ -807,7 +809,7 @@ cmp3_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
trace ("mpgmad: skipping %d(%xH) bytes of junk\n", skip, skip);
deadbeef->fseek (info->buffer.file, skip, SEEK_SET);
}
- int res = cmp3_scan_stream (&info->buffer, -1);
+ int res = cmp3_scan_stream (&info->buffer, deadbeef->conf_get_int ("mp3.disable_gapless", 0) ? 0 : -1);
if (res < 0) {
trace ("mpgmad: cmp3_init: initial cmp3_scan_stream failed\n");
return -1;
@@ -1357,15 +1359,20 @@ cmp3_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
deadbeef->plt_set_item_duration (plt, it, buffer.duration);
deadbeef->fclose (fp);
- const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
- if (cuesheet) {
- DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), buffer.totalsamples-buffer.delay-buffer.padding, buffer.samplerate);
- if (last) {
- deadbeef->pl_item_unref (it);
- deadbeef->pl_item_unref (last);
- return last;
+ deadbeef->pl_lock ();
+ {
+ const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
+ if (cuesheet) {
+ DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), buffer.totalsamples-buffer.delay-buffer.padding, buffer.samplerate);
+ if (last) {
+ deadbeef->pl_item_unref (it);
+ deadbeef->pl_item_unref (last);
+ deadbeef->pl_unlock ();
+ return last;
+ }
}
}
+ deadbeef->pl_unlock ();
// FIXME! bad numsamples passed to cue
@@ -1383,7 +1390,9 @@ cmp3_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
int
cmp3_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
@@ -1440,6 +1449,10 @@ static const char *exts[] = {
"mp1", "mp2", "mp3", NULL
};
+static const char settings_dlg[] =
+ "property \"Disable gapless playback (faster scanning)\" checkbox mp3.disable_gapless 0;\n"
+;
+
// define plugin interface
static DB_decoder_t plugin = {
.plugin.api_vmajor = 1,
@@ -1468,6 +1481,7 @@ static DB_decoder_t plugin = {
"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n"
,
.plugin.website = "http://deadbeef.sf.net",
+ .plugin.configdialog = settings_dlg,
.open = cmp3_open,
.init = cmp3_init,
.free = cmp3_free,
diff --git a/plugins/musepack/musepack.c b/plugins/musepack/musepack.c
index 69f0455a..c26f7d40 100644
--- a/plugins/musepack/musepack.c
+++ b/plugins/musepack/musepack.c
@@ -97,7 +97,9 @@ musepack_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->reader.get_size = musepack_vfs_get_size;
info->reader.canseek = musepack_vfs_canseek;
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
@@ -483,7 +485,9 @@ musepack_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
}
static int musepack_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
diff --git a/plugins/notify/notify.c b/plugins/notify/notify.c
index 905b65e0..d958191c 100644
--- a/plugins/notify/notify.c
+++ b/plugins/notify/notify.c
@@ -224,9 +224,12 @@ static void show_notification (DB_playItem_t *track) {
dbus_uint32_t v_id = 0;
char *v_iconname = NULL;
if (deadbeef->conf_get_int("notify.albumart", 0) && artwork_plugin) {
+ deadbeef->pl_lock ();
const char *album = deadbeef->pl_find_meta (track, "album");
const char *artist = deadbeef->pl_find_meta (track, "artist");
- v_iconname = artwork_plugin->get_album_art (deadbeef->pl_find_meta (track, ":URI"), artist, album, deadbeef->conf_get_int ("notify.albumart_size", 64), cover_avail_callback, NULL);
+ const char *fname = deadbeef->pl_find_meta (track, ":URI");
+ v_iconname = artwork_plugin->get_album_art (fname, artist, album, deadbeef->conf_get_int ("notify.albumart_size", 64), cover_avail_callback, NULL);
+ deadbeef->pl_unlock ();
}
if (!v_iconname) {
v_iconname = strdup ("deadbeef");
diff --git a/plugins/shellexec/Makefile.am b/plugins/shellexec/Makefile.am
index 212f6a0b..d38a08b7 100644
--- a/plugins/shellexec/Makefile.am
+++ b/plugins/shellexec/Makefile.am
@@ -1,7 +1,7 @@
if HAVE_SHELLEXEC
shxdir = $(libdir)/$(PACKAGE)
pkglib_LTLIBRARIES = shellexec.la
-shellexec_la_SOURCES = shellexec.c
+shellexec_la_SOURCES = shellexec.c shellexec.h
shellexec_la_LDFLAGS = -module
shellexec_la_LIBADD = $(LDADD)
diff --git a/plugins/shellexec/shellexec.c b/plugins/shellexec/shellexec.c
index d442672a..7d49c2d6 100644
--- a/plugins/shellexec/shellexec.c
+++ b/plugins/shellexec/shellexec.c
@@ -39,7 +39,7 @@
local - command allowed for local files
remote - command allowed for non-local files
playlist - command allowed for playlist tabs
- disabled - ignore command
+ common - command appears in main menu bar
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
@@ -83,6 +83,11 @@ trim (char* s)
static int
shx_callback (Shx_action_t *action, DB_playItem_t *it)
{
+ if (action->parent.flags&(DB_ACTION_PLAYLIST|DB_ACTION_COMMON)) {
+ trace ("%s\n", action->shcommand);
+ system (action->shcommand);
+ return 0;
+ }
char cmd[_POSIX_ARG_MAX];
int res = deadbeef->pl_format_title_escaped (it, -1, cmd, sizeof (cmd) - 2, -1, action->shcommand);
if (res < 0) {
@@ -98,7 +103,9 @@ shx_callback (Shx_action_t *action, DB_playItem_t *it)
static DB_plugin_action_t *
shx_get_plugin_actions (DB_playItem_t *it)
{
+ deadbeef->pl_lock ();
int is_local = it ? deadbeef->is_local_file (deadbeef->pl_find_meta (it, ":URI")) : 1;
+ deadbeef->pl_unlock ();
Shx_action_t *action;
for (action = actions; action; action = (Shx_action_t *)action->parent.next)
@@ -127,10 +134,10 @@ shx_find_sep (char *str) {
}
void
-shx_save_actions(Shx_action_t *action_list)
+shx_save_actions (void)
{
deadbeef->conf_remove_items("shellexec.");
- Shx_action_t *action = action_list;
+ Shx_action_t *action = actions;
int i = 0;
while(action) {
// build config line
@@ -160,8 +167,8 @@ shx_save_actions(Shx_action_t *action_list)
if(action->parent.flags & DB_ACTION_ALLOW_MULTIPLE_TRACKS) {
strcat(conf_line, "multiple,");
}
- if(action->parent.flags & DB_ACTION_DISABLED) {
- strcat(conf_line, "disabled,");
+ if(action->parent.flags & DB_ACTION_COMMON) {
+ strcat(conf_line, "common,");
}
deadbeef->conf_set_str(conf_key, conf_line);
action = (Shx_action_t*)action->parent.next;
@@ -171,7 +178,7 @@ shx_save_actions(Shx_action_t *action_list)
}
Shx_action_t*
-shx_get_actions (DB_plugin_action_callback_t callback, int omit_disabled)
+shx_get_actions (DB_plugin_action_callback_t callback)
{
Shx_action_t *action_list = NULL;
Shx_action_t *prev = NULL;
@@ -214,11 +221,6 @@ shx_get_actions (DB_plugin_action_callback_t callback, int omit_disabled)
flags = "local,single";
}
- if (strstr (flags, "disabled") && omit_disabled) {
- item = deadbeef->conf_find ("shellexec.", item);
- continue;
- }
-
Shx_action_t *action = calloc (sizeof (Shx_action_t), 1);
action->parent.title = strdup (title);
@@ -244,9 +246,8 @@ shx_get_actions (DB_plugin_action_callback_t callback, int omit_disabled)
if (strstr (flags, "playlist"))
action->parent.flags |= DB_ACTION_PLAYLIST;
- if (strstr (flags, "disabled")) {
- action->parent.flags |= DB_ACTION_DISABLED;
- }
+ if (strstr (flags, "common"))
+ action->parent.flags |= DB_ACTION_COMMON;
if (prev)
prev->parent.next = (DB_plugin_action_t *)action;
@@ -260,10 +261,82 @@ shx_get_actions (DB_plugin_action_callback_t callback, int omit_disabled)
return action_list;
}
+Shx_action_t*
+shx_action_add (void) {
+ Shx_action_t *a = calloc (sizeof (Shx_action_t), 1);
+ a->parent.callback = (DB_plugin_action_callback_t)shx_callback;
+ if (!actions) {
+ actions = a;
+ }
+ else {
+ for (Shx_action_t *last = actions; last; last = (Shx_action_t *)last->parent.next) {
+ if (!last->parent.next) {
+ last->parent.next = (DB_plugin_action_t *)a;
+ break;
+ }
+ }
+ }
+ return a;
+}
+
+void
+shx_action_free (Shx_action_t *a) {
+ if (a->shcommand) {
+ free ((char *)a->shcommand);
+ }
+ if (a->parent.title) {
+ free ((char *)a->parent.title);
+ }
+ if (a->parent.name) {
+ free ((char *)a->parent.name);
+ }
+ free (a);
+}
+
+void
+shx_action_remove (Shx_action_t *action) {
+ Shx_action_t *prev = NULL;
+ for (Shx_action_t *a = actions; a; a = (Shx_action_t *)a->parent.next) {
+ if (a == action) {
+ if (prev) {
+ prev->parent.next = a->parent.next;
+ }
+ else {
+ actions = (Shx_action_t *)a->parent.next;
+ }
+ break;
+ }
+ prev = a;
+ }
+ shx_action_free (action);
+}
+
static int
shx_start ()
{
- actions = shx_get_actions((DB_plugin_action_callback_t)shx_callback, 1);
+ actions = shx_get_actions((DB_plugin_action_callback_t)shx_callback);
+ return 0;
+}
+
+static int
+shx_stop ()
+{
+ Shx_action_t *a = actions;
+ while (a) {
+ Shx_action_t *next = (Shx_action_t *)a->parent.next;
+ if (a->shcommand) {
+ free ((char *)a->shcommand);
+ }
+ if (a->parent.title) {
+ free ((char *)a->parent.title);
+ }
+ if (a->parent.name) {
+ free ((char *)a->parent.name);
+ }
+ free (a);
+ a = next;
+ }
+ actions = NULL;
return 0;
}
@@ -288,7 +361,6 @@ static Shx_plugin_t plugin = {
" single - command allowed only for single track\n"
" local - command allowed only for local files\n"
" remote - command allowed only for non-local files\n"
- " disabled - ignore command\n\n"
"EXAMPLE: shellexec.00 notify-send \"%a - %t\":Show selected track:notify:single\n"
"this would show the name of selected track in notification popup"
,
@@ -314,8 +386,11 @@ static Shx_plugin_t plugin = {
,
.misc.plugin.website = "http://deadbeef.sf.net",
.misc.plugin.start = shx_start,
+ .misc.plugin.stop = shx_stop,
.misc.plugin.get_actions = shx_get_plugin_actions,
- .shx_get_actions = shx_get_actions,
- .shx_save_actions = shx_save_actions
+ .save_actions = shx_save_actions,
+ .action_add = shx_action_add,
+ .action_remove = shx_action_remove,
+ .action_free = shx_action_free,
};
diff --git a/plugins/shellexec/shellexec.h b/plugins/shellexec/shellexec.h
index 748340bd..1d10ac7d 100644
--- a/plugins/shellexec/shellexec.h
+++ b/plugins/shellexec/shellexec.h
@@ -40,10 +40,11 @@ typedef struct Shx_action_s
typedef struct Shx_plugin_s
{
DB_misc_t misc;
- Shx_action_t *
- (*shx_get_actions)(DB_plugin_action_callback_t callback, int omit_disabled);
- void
- (*shx_save_actions)(Shx_action_t *action_list);
+
+ void (*save_actions) (void);
+ Shx_action_t* (*action_add) (void);
+ void (*action_remove) (Shx_action_t *a);
+ void (*action_free) (Shx_action_t *a);
} Shx_plugin_t;
#endif
diff --git a/plugins/shellexecui/Makefile.am b/plugins/shellexecui/Makefile.am
new file mode 100644
index 00000000..688d271f
--- /dev/null
+++ b/plugins/shellexecui/Makefile.am
@@ -0,0 +1,46 @@
+if HAVE_SHELLEXECUI
+
+EXTRA_DIST = shellexec.glade
+
+if HAVE_GTK2
+if HAVE_GTK3
+pkglib_LTLIBRARIES = shellexecui_gtk2.la shellexecui_gtk3.la
+else
+pkglib_LTLIBRARIES = shellexecui_gtk2.la
+endif
+else
+if HAVE_GTK3
+pkglib_LTLIBRARIES = shellexecui_gtk3.la
+endif
+endif
+
+AM_CFLAGS = $(CFLAGS) -std=c99 -fPIC
+
+if HAVE_GTK2
+shellexecui_gtk2_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h
+shellexecui_gtk2_la_LDFLAGS = -module
+endif
+if HAVE_GTK3
+shellexecui_gtk3_la_SOURCES = shellexecui.c interface.c support.c callbacks.c interface.h support.h callbacks.h
+shellexecui_gtk3_la_LDFLAGS = -module
+endif
+
+if STATICLINK
+GTK_ROOT=@top_srcdir@/$(LIB)/gtk-2.12.12/usr
+
+shellexecui_gtk2_la_LIBADD = $(LDADD) -L$(GTK_ROOT)/lib $(GTK_ROOT)/lib/libgtk-x11-2.0.la $(GTK_ROOT)/lib/libgdk-x11-2.0.la $(GTK_ROOT)/lib/libpangoft2-1.0.la $(GTK_ROOT)/lib/libpangocairo-1.0.la $(GTK_ROOT)/lib/libgdk_pixbuf-2.0.la -lm $(GTK_ROOT)/lib/libcairo.la $(GTK_ROOT)/lib/libpango-1.0.la $(GTK_ROOT)/lib/libgobject-2.0.la $(GTK_ROOT)/lib/libgmodule-2.0.la $(GTK_ROOT)/lib/libgthread-2.0.la -lrt $(GTK_ROOT)/lib/libglib-2.0.la
+
+shellexecui_gtk2_la_CFLAGS = -std=c99 -I $(GTK_ROOT)/include -I $(GTK_ROOT)/lib/gtk-2.0/include -I $(GTK_ROOT)/include/glib-2.0 -I $(GTK_ROOT)/include/gtk-2.0 -I $(GTK_ROOT)/include/cairo -I $(GTK_ROOT)/lib/glib-2.0/include/ -I $(GTK_ROOT)/include/pango-1.0 -I $(GTK_ROOT)/include/atk-1.0 -DULTRA_COMPATIBLE=1
+else
+if HAVE_GTK2
+shellexecui_gtk2_la_LIBADD = $(LDADD) $(GTK2_DEPS_LIBS)
+shellexecui_gtk2_la_CFLAGS = -std=c99 $(GTK2_DEPS_CFLAGS)
+endif
+if HAVE_GTK3
+shellexecui_gtk3_la_LIBADD = $(LDADD) $(GTK3_DEPS_LIBS)
+shellexecui_gtk3_la_CFLAGS = -std=c99 $(GTK3_DEPS_CFLAGS)
+endif
+
+endif
+
+endif
diff --git a/plugins/shellexecui/callbacks.c b/plugins/shellexecui/callbacks.c
new file mode 100644
index 00000000..b8fb56d3
--- /dev/null
+++ b/plugins/shellexecui/callbacks.c
@@ -0,0 +1,11 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+
diff --git a/plugins/shellexecui/callbacks.h b/plugins/shellexecui/callbacks.h
new file mode 100644
index 00000000..c4b57687
--- /dev/null
+++ b/plugins/shellexecui/callbacks.h
@@ -0,0 +1,30 @@
+#include <gtk/gtk.h>
+
+
+void
+on_add_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_remove_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_cancel_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_save_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_edit_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_edit_cancel_button_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_edit_ok_button_clicked (GtkButton *button,
+ gpointer user_data);
diff --git a/plugins/shellexecui/interface.c b/plugins/shellexecui/interface.c
new file mode 100644
index 00000000..ee41ed1d
--- /dev/null
+++ b/plugins/shellexecui/interface.c
@@ -0,0 +1,277 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+ g_object_set_data_full (G_OBJECT (component), name, \
+ g_object_ref(G_OBJECT(widget)), (GDestroyNotify) g_object_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+ g_object_set_data (G_OBJECT (component), name, widget)
+
+GtkWidget*
+create_shellexec_conf_dialog (void)
+{
+ GtkWidget *shellexec_conf_dialog;
+ GtkWidget *dialog_vbox;
+ GtkWidget *vbox1;
+ GtkWidget *hbox1;
+ GtkWidget *add_button;
+ GtkWidget *remove_button;
+ GtkWidget *edit_button;
+ GtkWidget *scrolledwindow;
+ GtkWidget *command_treeview;
+ GtkWidget *dialog_action_area;
+ GtkWidget *save_button;
+
+ shellexec_conf_dialog = gtk_dialog_new ();
+ gtk_container_set_border_width (GTK_CONTAINER (shellexec_conf_dialog), 12);
+ gtk_window_set_title (GTK_WINDOW (shellexec_conf_dialog), _("Custom Shell Commands"));
+ gtk_window_set_type_hint (GTK_WINDOW (shellexec_conf_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_dialog_set_has_separator (GTK_DIALOG (shellexec_conf_dialog), FALSE);
+
+ dialog_vbox = gtk_dialog_get_content_area (GTK_DIALOG (shellexec_conf_dialog));
+ gtk_widget_show (dialog_vbox);
+
+ vbox1 = gtk_vbox_new (FALSE, 8);
+ gtk_widget_show (vbox1);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox), vbox1, TRUE, TRUE, 0);
+
+ hbox1 = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox1);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
+
+ add_button = gtk_button_new_with_mnemonic (_("Add"));
+ gtk_widget_show (add_button);
+ gtk_box_pack_start (GTK_BOX (hbox1), add_button, TRUE, TRUE, 0);
+
+ remove_button = gtk_button_new_with_mnemonic (_("Remove"));
+ gtk_widget_show (remove_button);
+ gtk_box_pack_start (GTK_BOX (hbox1), remove_button, TRUE, TRUE, 0);
+
+ edit_button = gtk_button_new_with_mnemonic (_("Edit"));
+ gtk_widget_show (edit_button);
+ gtk_box_pack_start (GTK_BOX (hbox1), edit_button, TRUE, TRUE, 0);
+
+ scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolledwindow);
+ gtk_box_pack_start (GTK_BOX (vbox1), scrolledwindow, TRUE, TRUE, 0);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow), GTK_SHADOW_IN);
+
+ command_treeview = gtk_tree_view_new ();
+ gtk_widget_show (command_treeview);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow), command_treeview);
+
+ dialog_action_area = gtk_dialog_get_action_area (GTK_DIALOG (shellexec_conf_dialog));
+ gtk_widget_show (dialog_action_area);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area), GTK_BUTTONBOX_END);
+
+ save_button = gtk_button_new_with_mnemonic (_("Close"));
+ gtk_widget_show (save_button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (shellexec_conf_dialog), save_button, 0);
+ gtk_widget_set_can_default(save_button, TRUE);
+
+ g_signal_connect ((gpointer) add_button, "clicked",
+ G_CALLBACK (on_add_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) remove_button, "clicked",
+ G_CALLBACK (on_remove_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) edit_button, "clicked",
+ G_CALLBACK (on_edit_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) save_button, "clicked",
+ G_CALLBACK (on_save_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_dialog, shellexec_conf_dialog, "shellexec_conf_dialog");
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_dialog, dialog_vbox, "dialog_vbox");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, vbox1, "vbox1");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, hbox1, "hbox1");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, add_button, "add_button");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, remove_button, "remove_button");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, edit_button, "edit_button");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, scrolledwindow, "scrolledwindow");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, command_treeview, "command_treeview");
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_dialog, dialog_action_area, "dialog_action_area");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_dialog, save_button, "save_button");
+
+ return shellexec_conf_dialog;
+}
+
+GtkWidget*
+create_shellexec_conf_edit_dialog (void)
+{
+ GtkWidget *shellexec_conf_edit_dialog;
+ GtkWidget *dialog_vbox1;
+ GtkWidget *table1;
+ GtkWidget *title_label;
+ GtkWidget *cmd_label;
+ GtkWidget *cmd_entry;
+ GtkWidget *name_label;
+ GtkWidget *title_entry;
+ GtkWidget *name_entry;
+ GtkWidget *single_check;
+ GtkWidget *multiple_check;
+ GtkWidget *local_check;
+ GtkWidget *remote_check;
+ GtkWidget *playlist_check;
+ GtkWidget *common_check;
+ GtkWidget *dialog_action_area1;
+ GtkWidget *edit_cancel_button;
+ GtkWidget *edit_ok_button;
+
+ shellexec_conf_edit_dialog = gtk_dialog_new ();
+ gtk_container_set_border_width (GTK_CONTAINER (shellexec_conf_edit_dialog), 12);
+ gtk_window_set_title (GTK_WINDOW (shellexec_conf_edit_dialog), _("Edit Command"));
+ gtk_window_set_modal (GTK_WINDOW (shellexec_conf_edit_dialog), TRUE);
+ gtk_window_set_type_hint (GTK_WINDOW (shellexec_conf_edit_dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+ gtk_dialog_set_has_separator (GTK_DIALOG (shellexec_conf_edit_dialog), FALSE);
+
+ dialog_vbox1 = gtk_dialog_get_content_area (GTK_DIALOG (shellexec_conf_edit_dialog));
+ gtk_widget_show (dialog_vbox1);
+
+ table1 = gtk_table_new (3, 2, FALSE);
+ gtk_widget_show (table1);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), table1, FALSE, TRUE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
+ gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
+
+ title_label = gtk_label_new (_("Title:"));
+ gtk_widget_show (title_label);
+ gtk_table_attach (GTK_TABLE (table1), title_label, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (title_label), 0, 0.5);
+
+ cmd_label = gtk_label_new (_("Command:"));
+ gtk_widget_show (cmd_label);
+ gtk_table_attach (GTK_TABLE (table1), cmd_label, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (cmd_label), 0, 0.5);
+
+ cmd_entry = gtk_entry_new ();
+ gtk_widget_show (cmd_entry);
+ gtk_table_attach (GTK_TABLE (table1), cmd_entry, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_tooltip_text (cmd_entry, _("Arbitrary shell command. Will be executed in the shell context which the main application was started from. Title formatting can be used. Example: xdg-open %D"));
+ gtk_entry_set_invisible_char (GTK_ENTRY (cmd_entry), 8226);
+
+ name_label = gtk_label_new (_("ID:"));
+ gtk_widget_show (name_label);
+ gtk_table_attach (GTK_TABLE (table1), name_label, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (name_label), 0, 0.5);
+
+ title_entry = gtk_entry_new ();
+ gtk_widget_show (title_entry);
+ gtk_table_attach (GTK_TABLE (table1), title_entry, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_tooltip_text (title_entry, _("Free-form name, for example \"My Shell Command\""));
+ gtk_entry_set_invisible_char (GTK_ENTRY (title_entry), 8226);
+
+ name_entry = gtk_entry_new ();
+ gtk_widget_show (name_entry);
+ gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_widget_set_tooltip_text (name_entry, _("Command ID, normally it should be something short, for example \"youtube_open\". It must be unique."));
+ gtk_entry_set_invisible_char (GTK_ENTRY (name_entry), 8226);
+
+ single_check = gtk_check_button_new_with_mnemonic (_("Single Tracks"));
+ gtk_widget_show (single_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), single_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (single_check, _("Works on single track."));
+
+ multiple_check = gtk_check_button_new_with_mnemonic (_("Multiple Tracks"));
+ gtk_widget_show (multiple_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), multiple_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (multiple_check, _("Works on multiple tracks."));
+
+ local_check = gtk_check_button_new_with_mnemonic (_("Local"));
+ gtk_widget_show (local_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), local_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (local_check, _("Works on local files."));
+
+ remote_check = gtk_check_button_new_with_mnemonic (_("Remote"));
+ gtk_widget_show (remote_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), remote_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (remote_check, _("Works on remote files (e.g. http:// streams)"));
+
+ playlist_check = gtk_check_button_new_with_mnemonic (_("Playlist"));
+ gtk_widget_show (playlist_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), playlist_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (playlist_check, _("Item should appear on the playlist tab context menu"));
+
+ common_check = gtk_check_button_new_with_mnemonic (_("Common"));
+ gtk_widget_show (common_check);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), common_check, FALSE, FALSE, 0);
+ gtk_widget_set_tooltip_text (common_check, _("Item should appear in the main menu"));
+
+ dialog_action_area1 = gtk_dialog_get_action_area (GTK_DIALOG (shellexec_conf_edit_dialog));
+ gtk_widget_show (dialog_action_area1);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END);
+
+ edit_cancel_button = gtk_button_new_from_stock ("gtk-cancel");
+ gtk_widget_show (edit_cancel_button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (shellexec_conf_edit_dialog), edit_cancel_button, GTK_RESPONSE_CANCEL);
+ gtk_widget_set_can_default(edit_cancel_button, TRUE);
+
+ edit_ok_button = gtk_button_new_from_stock ("gtk-ok");
+ gtk_widget_show (edit_ok_button);
+ gtk_dialog_add_action_widget (GTK_DIALOG (shellexec_conf_edit_dialog), edit_ok_button, GTK_RESPONSE_OK);
+ gtk_widget_set_can_default(edit_ok_button, TRUE);
+
+ g_signal_connect ((gpointer) edit_cancel_button, "clicked",
+ G_CALLBACK (on_edit_cancel_button_clicked),
+ NULL);
+ g_signal_connect ((gpointer) edit_ok_button, "clicked",
+ G_CALLBACK (on_edit_ok_button_clicked),
+ NULL);
+
+ /* Store pointers to all widgets, for use by lookup_widget(). */
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_edit_dialog, shellexec_conf_edit_dialog, "shellexec_conf_edit_dialog");
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_edit_dialog, dialog_vbox1, "dialog_vbox1");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, table1, "table1");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, title_label, "title_label");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, cmd_label, "cmd_label");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, cmd_entry, "cmd_entry");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, name_label, "name_label");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, title_entry, "title_entry");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, name_entry, "name_entry");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, single_check, "single_check");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, multiple_check, "multiple_check");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, local_check, "local_check");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, remote_check, "remote_check");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, playlist_check, "playlist_check");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, common_check, "common_check");
+ GLADE_HOOKUP_OBJECT_NO_REF (shellexec_conf_edit_dialog, dialog_action_area1, "dialog_action_area1");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, edit_cancel_button, "edit_cancel_button");
+ GLADE_HOOKUP_OBJECT (shellexec_conf_edit_dialog, edit_ok_button, "edit_ok_button");
+
+ return shellexec_conf_edit_dialog;
+}
+
diff --git a/plugins/shellexecui/interface.h b/plugins/shellexecui/interface.h
new file mode 100644
index 00000000..8bfea88d
--- /dev/null
+++ b/plugins/shellexecui/interface.h
@@ -0,0 +1,6 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_shellexec_conf_dialog (void);
+GtkWidget* create_shellexec_conf_edit_dialog (void);
diff --git a/plugins/shellexecui/shellexec.glade b/plugins/shellexecui/shellexec.glade
new file mode 100644
index 00000000..d2f21b35
--- /dev/null
+++ b/plugins/shellexecui/shellexec.glade
@@ -0,0 +1,521 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">
+
+<glade-interface>
+
+<widget class="GtkDialog" id="shellexec_conf_dialog">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Custom Shell Commands</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">False</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="save_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Close</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">0</property>
+ <signal name="clicked" handler="on_save_button_clicked" last_modification_time="Sat, 28 Jan 2012 03:21:29 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkVBox" id="vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkHBox" id="hbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child>
+ <widget class="GtkButton" id="add_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Add</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_add_button_clicked" last_modification_time="Sat, 28 Jan 2012 11:02:39 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="remove_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Remove</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_remove_button_clicked" last_modification_time="Sat, 28 Jan 2012 11:02:47 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="edit_button">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Edit</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <signal name="clicked" handler="on_edit_button_clicked" last_modification_time="Sat, 31 Mar 2012 22:29:32 GMT"/>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkScrolledWindow" id="scrolledwindow">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">GTK_SHADOW_IN</property>
+ <property name="window_placement">GTK_CORNER_TOP_LEFT</property>
+
+ <child>
+ <widget class="GtkTreeView" id="command_treeview">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="headers_visible">True</property>
+ <property name="rules_hint">False</property>
+ <property name="reorderable">False</property>
+ <property name="enable_search">True</property>
+ <property name="fixed_height_mode">False</property>
+ <property name="hover_selection">False</property>
+ <property name="hover_expand">False</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+<widget class="GtkDialog" id="shellexec_conf_edit_dialog">
+ <property name="border_width">12</property>
+ <property name="visible">True</property>
+ <property name="title" translatable="yes">Edit Command</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_NONE</property>
+ <property name="modal">True</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="has_separator">False</property>
+
+ <child internal-child="vbox">
+ <widget class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+
+ <child internal-child="action_area">
+ <widget class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+
+ <child>
+ <widget class="GtkButton" id="edit_cancel_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-6</property>
+ <signal name="clicked" handler="on_edit_cancel_button_clicked" last_modification_time="Sun, 01 Apr 2012 05:14:42 GMT"/>
+ </widget>
+ </child>
+
+ <child>
+ <widget class="GtkButton" id="edit_ok_button">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-ok</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="response_id">-5</property>
+ <signal name="clicked" handler="on_edit_ok_button_clicked" last_modification_time="Sun, 01 Apr 2012 07:44:07 GMT"/>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkTable" id="table1">
+ <property name="visible">True</property>
+ <property name="n_rows">3</property>
+ <property name="n_columns">2</property>
+ <property name="homogeneous">False</property>
+ <property name="row_spacing">8</property>
+ <property name="column_spacing">8</property>
+
+ <child>
+ <widget class="GtkLabel" id="title_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Title:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="cmd_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Command:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="cmd_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Arbitrary shell command. Will be executed in the shell context which the main application was started from. Title formatting can be used. Example: xdg-open %D</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkLabel" id="name_label">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">ID:</property>
+ <property name="use_underline">False</property>
+ <property name="use_markup">False</property>
+ <property name="justify">GTK_JUSTIFY_LEFT</property>
+ <property name="wrap">False</property>
+ <property name="selectable">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0.5</property>
+ <property name="xpad">0</property>
+ <property name="ypad">0</property>
+ <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+ <property name="width_chars">-1</property>
+ <property name="single_line_mode">False</property>
+ <property name="angle">0</property>
+ </widget>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="right_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="x_options">fill</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="title_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Free-form name, for example &quot;My Shell Command&quot;</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">1</property>
+ <property name="bottom_attach">2</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkEntry" id="name_entry">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Command ID, normally it should be something short, for example &quot;youtube_open&quot;. It must be unique.</property>
+ <property name="can_focus">True</property>
+ <property name="editable">True</property>
+ <property name="visibility">True</property>
+ <property name="max_length">0</property>
+ <property name="text" translatable="yes"></property>
+ <property name="has_frame">True</property>
+ <property name="invisible_char">•</property>
+ <property name="activates_default">False</property>
+ </widget>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">0</property>
+ <property name="bottom_attach">1</property>
+ <property name="y_options"></property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="single_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Works on single track.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Single Tracks</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="multiple_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Works on multiple tracks.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Multiple Tracks</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="local_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Works on local files.</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Local</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="remote_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Works on remote files (e.g. http:// streams)</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Remote</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="playlist_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Item should appear on the playlist tab context menu</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Playlist</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkCheckButton" id="common_check">
+ <property name="visible">True</property>
+ <property name="tooltip" translatable="yes">Item should appear in the main menu</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Common</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ <property name="active">False</property>
+ <property name="inconsistent">False</property>
+ <property name="draw_indicator">True</property>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+</widget>
+
+</glade-interface>
diff --git a/plugins/shellexecui/shellexec.gladep b/plugins/shellexecui/shellexec.gladep
new file mode 100644
index 00000000..3daaaba7
--- /dev/null
+++ b/plugins/shellexecui/shellexec.gladep
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
+<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
+
+<glade-project>
+ <name>Shellexecui</name>
+ <program_name>shellexecui</program_name>
+ <source_directory></source_directory>
+ <gnome_support>FALSE</gnome_support>
+ <output_main_file>FALSE</output_main_file>
+ <output_support_files>FALSE</output_support_files>
+ <output_build_files>FALSE</output_build_files>
+</glade-project>
diff --git a/plugins/shellexecui/shellexecui.c b/plugins/shellexecui/shellexecui.c
new file mode 100644
index 00000000..b2a60230
--- /dev/null
+++ b/plugins/shellexecui/shellexecui.c
@@ -0,0 +1,443 @@
+/*
+ Copyright (C) 2012 Azeem Arshad <kr00r4n@gmail.com>
+
+ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*/
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include "interface.h"
+#include "callbacks.h"
+#include "support.h"
+#include "../../deadbeef.h"
+#include "../gtkui/gtkui_api.h"
+#include "../shellexec/shellexec.h"
+
+#define trace(...) { fprintf(stderr, __VA_ARGS__); }
+
+DB_functions_t *deadbeef;
+static DB_misc_t plugin;
+static ddb_gtkui_t *gtkui_plugin;
+static Shx_plugin_t *shellexec_plugin;
+
+static Shx_action_t *actions; // list of actions being edited
+static GtkWidget *conf_dlg;
+static GtkWidget *edit_dlg;
+static Shx_action_t *current_action; // selection action when edit window is active
+
+enum {
+ COL_TITLE = 0,
+ COL_META,
+ COL_COUNT,
+};
+
+static int
+name_exists(const char *name, Shx_action_t *skip) {
+ DB_plugin_t **p = deadbeef->plug_get_list ();
+ for (int i = 0; p[i]; i++) {
+ if (!p[i]->get_actions) {
+ continue;
+ }
+ DB_plugin_action_t *action = p[i]->get_actions (NULL);
+ while(action) {
+ if(action != (DB_plugin_action_t*)skip && action->name && !strcmp(action->name, name)) {
+ return 1;
+ }
+ action = action->next;
+ }
+ }
+ return 0;
+}
+
+static int
+is_empty(const char *name) {
+ char *p = (char *)name;
+ while(*p) {
+ if(*p != ' ' || *p != '\t') {
+ return 0;
+ }
+ p++;
+ }
+ return 1;
+}
+
+void
+on_save_button_clicked (GtkButton *button,
+ gpointer user_data) {
+ gtk_widget_destroy(conf_dlg);
+}
+
+GtkWidget *create_edit_dlg() {
+ GtkWidget *dlg = create_shellexec_conf_edit_dialog();
+ gtk_window_set_transient_for(GTK_WINDOW(dlg),
+ GTK_WINDOW(conf_dlg));
+ return dlg;
+}
+
+void
+on_add_button_clicked (GtkButton *button,
+ gpointer user_data) {
+ current_action = NULL;
+ edit_dlg = create_edit_dlg();
+ gtk_window_set_title(GTK_WINDOW(edit_dlg), _("Add Command"));
+
+ // generate unique command name
+ char name[15] = "new_cmd";
+ int suffix = 0;
+ while(name_exists(name, NULL) && suffix < 1000) { // create a unique name
+ snprintf(name, sizeof (name), "new_cmd%d", suffix);
+ suffix++;
+ }
+ if (name_exists (name, NULL)) {
+ return;
+ }
+ // Set default values in text fields
+ gtk_entry_set_text(
+ GTK_ENTRY(lookup_widget(edit_dlg, "name_entry")),
+ name);
+ gtk_entry_set_text(
+ GTK_ENTRY(lookup_widget(edit_dlg, "title_entry")),
+ "New Command");
+
+ // Set default values in check boxes
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "single_check")),
+ TRUE);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "local_check")),
+ TRUE);
+
+ gtk_widget_show(edit_dlg);
+}
+
+void
+on_remove_button_clicked (GtkButton *button,
+ gpointer user_data) {
+ GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(conf_dlg, "command_treeview"));
+ GtkTreeModel *treemodel = gtk_tree_view_get_model(treeview);
+ GtkTreeIter iter;
+ GtkTreeSelection *selection;
+ selection = gtk_tree_view_get_selection(treeview);
+ if(gtk_tree_selection_get_selected(selection, &treemodel, &iter)) {
+ // ask confirmation
+ GtkWidget *confirm_dlg = gtk_message_dialog_new (GTK_WINDOW(conf_dlg), GTK_DIALOG_MODAL,
+ GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO,
+ _("Delete"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (confirm_dlg),
+ "%s", _("This action will delete the selected shell command. Are you sure?"));
+ gtk_window_set_transient_for(GTK_WINDOW (confirm_dlg), GTK_WINDOW (conf_dlg));
+ gtk_window_set_title (GTK_WINDOW (confirm_dlg), _("Confirm Remove"));
+ int response = gtk_dialog_run (GTK_DIALOG (confirm_dlg));
+ gtk_widget_destroy(confirm_dlg);
+ if(response == GTK_RESPONSE_NO) {
+ return;
+ }
+
+ Shx_action_t *action;
+ gtk_tree_model_get(treemodel, &iter, COL_META, &action, -1);
+
+ //remove action from list
+ shellexec_plugin->action_remove (action);
+ actions = (Shx_action_t *)shellexec_plugin->misc.plugin.get_actions(NULL);
+
+ GtkTreeIter next_iter = iter;
+ if(gtk_tree_model_iter_next(treemodel, &next_iter)) {
+ gtk_tree_selection_select_iter(selection, &next_iter);
+ }
+ else {
+ int count = gtk_tree_model_iter_n_children(treemodel, NULL);
+ if(count >= 2) {
+ GtkTreePath *last = gtk_tree_path_new_from_indices(count-2, -1);
+ gtk_tree_selection_select_path(selection, last);
+ }
+ }
+ gtk_list_store_remove(GTK_LIST_STORE(treemodel), &iter);
+
+ shellexec_plugin->save_actions();
+ deadbeef->sendmessage (DB_EV_ACTIONSCHANGED, 0, 0, 0);
+ }
+}
+
+void
+on_edit_button_clicked(GtkButton *button, gpointer user_data) {
+ GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(conf_dlg, "command_treeview"));
+ GtkTreeModel *treemodel = gtk_tree_view_get_model(treeview);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ GtkTreeIter iter;
+ if(gtk_tree_selection_get_selected(selection, &treemodel, &iter)) {
+ gtk_tree_model_get(treemodel, &iter, COL_META, &current_action, -1);
+ edit_dlg = create_edit_dlg();
+ // Set text fields
+ gtk_entry_set_text(
+ GTK_ENTRY(lookup_widget(edit_dlg, "name_entry")),
+ current_action->parent.name);
+ gtk_entry_set_text(
+ GTK_ENTRY(lookup_widget(edit_dlg, "title_entry")),
+ current_action->parent.title);
+ gtk_entry_set_text(
+ GTK_ENTRY(lookup_widget(edit_dlg, "cmd_entry")),
+ current_action->shcommand);
+
+ // Set check boxes
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "single_check")),
+ current_action->parent.flags & DB_ACTION_SINGLE_TRACK);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "multiple_check")),
+ current_action->parent.flags & DB_ACTION_ALLOW_MULTIPLE_TRACKS);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "playlist_check")),
+ current_action->parent.flags & DB_ACTION_PLAYLIST);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "local_check")),
+ current_action->shx_flags & SHX_ACTION_LOCAL_ONLY);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "remote_check")),
+ current_action->shx_flags & SHX_ACTION_REMOTE_ONLY);
+ gtk_toggle_button_set_active(
+ GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "common_check")),
+ current_action->parent.flags & DB_ACTION_COMMON);
+
+ gtk_widget_show(edit_dlg);
+ }
+}
+
+void
+on_edit_cancel_button_clicked (GtkButton *button, gpointer user_data) {
+ gtk_widget_destroy(edit_dlg);
+}
+
+static int
+validate_command_edit () {
+ const char *text;
+ char message[256] = "";
+ int valid = 1;
+
+ text = gtk_entry_get_text(GTK_ENTRY(lookup_widget(edit_dlg, "name_entry")));
+ if(is_empty(text) || name_exists(text, current_action)) {
+ strcat(message, _("ID must be non-empty and unique.\n"));
+ valid = 0;
+ }
+
+ text = gtk_entry_get_text(GTK_ENTRY(lookup_widget(edit_dlg, "title_entry")));
+ if(is_empty(text)) {
+ strcat(message, _("Title must be non-empty.\n"));
+ valid = 0;
+ }
+
+ text = gtk_entry_get_text(GTK_ENTRY(lookup_widget(edit_dlg, "cmd_entry")));
+ if(is_empty(text)) {
+ strcat(message, _("Shell Command must be non-empty.\n"));
+ valid = 0;
+ }
+
+ if(!valid) {
+ GtkWidget *invalid_dlg = gtk_message_dialog_new (GTK_WINDOW(conf_dlg), GTK_DIALOG_MODAL,
+ GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
+ _("Invalid Values"));
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (invalid_dlg),
+ "%s", message);
+ gtk_window_set_transient_for(GTK_WINDOW (invalid_dlg), GTK_WINDOW (conf_dlg));
+ gtk_window_set_title (GTK_WINDOW (invalid_dlg), _("Invalid Values"));
+ gtk_dialog_run (GTK_DIALOG (invalid_dlg));
+ gtk_widget_destroy(invalid_dlg);
+ }
+ return valid;
+}
+
+void
+on_edit_ok_button_clicked (GtkButton *button, gpointer user_data) {
+ if(!validate_command_edit()) {
+ return;
+ }
+ // Update the main window tree view
+ GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(conf_dlg, "command_treeview"));
+ GtkTreeModel *treemodel = gtk_tree_view_get_model(treeview);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+ GtkTreeIter iter;
+
+ if(current_action == NULL) {
+ current_action = shellexec_plugin->action_add ();
+ actions = (Shx_action_t *)shellexec_plugin->misc.plugin.get_actions(NULL);
+ gtk_list_store_append(GTK_LIST_STORE(treemodel), &iter);
+ gtk_list_store_set(GTK_LIST_STORE(treemodel), &iter, COL_META, current_action, -1);
+ gtk_tree_selection_select_iter(selection, &iter);
+ }
+ else {
+ gtk_tree_selection_get_selected(selection, &treemodel, &iter);
+ }
+ // Store all the text fields in the current action
+ GtkEntry *entry;
+ entry = GTK_ENTRY(lookup_widget(edit_dlg, "name_entry"));
+ current_action->parent.name = strdup(gtk_entry_get_text(entry));
+ entry = GTK_ENTRY(lookup_widget(edit_dlg, "title_entry"));
+ current_action->parent.title = strdup(gtk_entry_get_text(entry));
+ entry = GTK_ENTRY(lookup_widget(edit_dlg, "cmd_entry"));
+ current_action->shcommand = strdup(gtk_entry_get_text(entry));
+
+ gboolean active;
+ int flags = current_action->parent.flags;
+ int shx_flags = current_action->shx_flags;
+ // Store all the check button values in the current action
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "single_check")));
+ flags = (flags & ~DB_ACTION_SINGLE_TRACK) | (active?DB_ACTION_SINGLE_TRACK:0);
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "multiple_check")));
+ flags = (flags & ~DB_ACTION_ALLOW_MULTIPLE_TRACKS) | (active?DB_ACTION_ALLOW_MULTIPLE_TRACKS:0);
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "playlist_check")));
+ flags = (flags & ~DB_ACTION_PLAYLIST) | (active?DB_ACTION_PLAYLIST:0);
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "local_check")));
+ shx_flags = (shx_flags & ~SHX_ACTION_LOCAL_ONLY) | (active?SHX_ACTION_LOCAL_ONLY:0);
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "remote_check")));
+ shx_flags = (shx_flags & ~SHX_ACTION_REMOTE_ONLY) | (active?SHX_ACTION_REMOTE_ONLY:0);
+ active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(edit_dlg, "common_check")));
+ flags = (flags & ~DB_ACTION_COMMON) | (active?DB_ACTION_COMMON:0);
+
+ current_action->parent.flags = flags;
+ current_action->shx_flags = shx_flags;
+
+ gtk_list_store_set(GTK_LIST_STORE(treemodel), &iter,
+ COL_TITLE, current_action->parent.title, -1);
+
+ gtk_widget_destroy(edit_dlg);
+ edit_dlg = NULL;
+ current_action = NULL;
+
+ shellexec_plugin->save_actions();
+ deadbeef->sendmessage (DB_EV_ACTIONSCHANGED, 0, 0, 0);
+}
+
+static void
+init_treeview() {
+ // Create the tree view and cell renderers
+ GtkTreeView *treeview = GTK_TREE_VIEW(lookup_widget(conf_dlg, "command_treeview"));
+ GtkCellRenderer *cell_renderer;
+ cell_renderer = gtk_cell_renderer_text_new();
+ gtk_tree_view_insert_column_with_attributes(treeview, -1, _("Title"), cell_renderer,
+ "text", COL_TITLE, NULL);
+
+ // Create the tree view data model and fill it with values
+ GtkListStore *liststore;
+ liststore = gtk_list_store_new(COL_COUNT,
+ G_TYPE_STRING,
+ //G_TYPE_BOOLEAN,
+ G_TYPE_POINTER);
+ actions = (Shx_action_t *)shellexec_plugin->misc.plugin.get_actions(NULL);
+ Shx_action_t *action = actions;
+ GtkTreeIter iter;
+ while(action) {
+ gtk_list_store_append(liststore, &iter);
+ gtk_list_store_set(liststore, &iter,
+ COL_TITLE, action->parent.title,
+ COL_META, action, -1);
+ action = (Shx_action_t *)action->parent.next;
+ }
+
+ gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(liststore));
+ g_object_unref(liststore);
+}
+
+static gboolean
+shellexecui_action_gtk (void *data)
+{
+ conf_dlg = create_shellexec_conf_dialog();
+ gtk_widget_set_size_request (conf_dlg, 400, 400);
+ gtk_window_set_transient_for(GTK_WINDOW(conf_dlg),
+ GTK_WINDOW(gtkui_plugin->get_mainwin()));
+ init_treeview();
+ gtk_widget_show(conf_dlg);
+ return FALSE;
+}
+
+static int
+shellexecui_action_callback(DB_plugin_action_t *action,
+ void *user_data) {
+ g_idle_add (shellexecui_action_gtk, NULL);
+ return 0;
+}
+
+static DB_plugin_action_t shellexecui_action = {
+ .title = "Edit/Configure custom shell commands",
+ .name = "shellexec_conf",
+ .flags = DB_ACTION_COMMON,
+ .callback = shellexecui_action_callback,
+ .next = NULL,
+};
+
+static DB_plugin_action_t *
+shxui_getactions(DB_playItem_t *it) {
+ return &shellexecui_action;
+}
+
+int shxui_connect() {
+#if GTK_CHECK_VERSION(3,0,0)
+ gtkui_plugin = (ddb_gtkui_t *)deadbeef->plug_get_for_id ("gtkui3");
+#else
+ gtkui_plugin = (ddb_gtkui_t *)deadbeef->plug_get_for_id ("gtkui");
+#endif
+ shellexec_plugin = (Shx_plugin_t *)deadbeef->plug_get_for_id ("shellexec");
+ if(!gtkui_plugin || !shellexec_plugin) {
+ return -1;
+ }
+ if(shellexec_plugin->misc.plugin.version_major == 1 &&
+ shellexec_plugin->misc.plugin.version_minor < 1) {
+ return -1;
+ }
+ return 0;
+}
+
+static DB_misc_t plugin = {
+ .plugin.type = DB_PLUGIN_MISC,
+ .plugin.api_vmajor = 1,
+ .plugin.api_vminor = 0,
+ .plugin.version_major = 1,
+ .plugin.version_minor = 0,
+#if GTK_CHECK_VERSION(3,0,0)
+ .plugin.id = "shellexecui_gtk3",
+ .plugin.name = "Shellexec GTK3 UI",
+#else
+ .plugin.id = "shellexecui_gtk2",
+ .plugin.name = "Shellexec GTK2 UI",
+#endif
+ .plugin.descr = "A GTK UI for the Shellexec plugin",
+ .plugin.copyright =
+ "Copyright (C) 2012 Azeem Arshad <kr00r4n@gmail.com>\n"
+ "\n"
+ "This program is free software; you can redistribute it and/or\n"
+ "modify it under the terms of the GNU General Public License\n"
+ "as published by the Free Software Foundation; either version 2\n"
+ "of the License, or (at your option) any later version.\n"
+ "\n"
+ "This program is distributed in the hope that it will be useful,\n"
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ "GNU General Public License for more details.\n"
+ "\n"
+ "You should have received a copy of the GNU General Public License\n"
+ "along with this program; if not, write to the Free Software\n"
+ "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n",
+ .plugin.website = "http://azeemarshad.in",
+ .plugin.get_actions = shxui_getactions,
+ .plugin.connect = shxui_connect,
+};
+
+DB_plugin_t *
+#if GTK_CHECK_VERSION(3,0,0)
+shellexecui_gtk3_load (DB_functions_t *api) {
+#else
+shellexecui_gtk2_load (DB_functions_t *api) {
+#endif
+ deadbeef = api;
+ return DB_PLUGIN(&plugin);
+}
diff --git a/plugins/shellexecui/support.c b/plugins/shellexecui/support.c
new file mode 100644
index 00000000..c0d93fe4
--- /dev/null
+++ b/plugins/shellexecui/support.c
@@ -0,0 +1,221 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = gtk_widget_get_parent (widget);
+ if (!parent)
+ parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to find pixmap files. */
+static gchar*
+find_pixmap_file (const gchar *filename)
+{
+ GList *elem;
+
+ /* We step through each of the pixmaps directory to find it. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data,
+ G_DIR_SEPARATOR_S, filename);
+ if (g_file_test (pathname, G_FILE_TEST_EXISTS))
+ return pathname;
+ g_free (pathname);
+ elem = elem->next;
+ }
+ return NULL;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *pathname = NULL;
+ GtkWidget *pixmap;
+
+ if (!filename || !filename[0])
+ return gtk_image_new ();
+
+ pathname = find_pixmap_file (filename);
+
+ if (!pathname)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return gtk_image_new ();
+ }
+
+ pixmap = gtk_image_new_from_file (pathname);
+ g_free (pathname);
+ return pixmap;
+}
+
+/* This is an internally used function to create pixmaps. */
+GdkPixbuf*
+create_pixbuf (const gchar *filename)
+{
+ gchar *pathname = NULL;
+ GdkPixbuf *pixbuf;
+ GError *error = NULL;
+
+ if (!filename || !filename[0])
+ return NULL;
+
+ pathname = find_pixmap_file (filename);
+
+ if (!pathname)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return NULL;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_file (pathname, &error);
+ if (!pixbuf)
+ {
+ fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",
+ pathname, error->message);
+ g_error_free (error);
+ }
+ g_free (pathname);
+ return pixbuf;
+}
+
+/* This is used to set ATK action descriptions. */
+void
+glade_set_atk_action_description (AtkAction *action,
+ const gchar *action_name,
+ const gchar *description)
+{
+ gint n_actions, i;
+
+ n_actions = atk_action_get_n_actions (action);
+ for (i = 0; i < n_actions; i++)
+ {
+ if (!strcmp (atk_action_get_name (action, i), action_name))
+ atk_action_set_description (action, i, description);
+ }
+}
+
+#if GTK_CHECK_VERSION(3,0,0)
+GtkWidget *
+gtk_combo_box_entry_new_text(void) {
+ return gtk_combo_box_text_new_with_entry ();
+}
+
+void
+gtk_dialog_set_has_separator (GtkDialog *dlg, gboolean has) {
+}
+#endif
+
+#if !GTK_CHECK_VERSION(2,22,0)
+GdkDragAction
+gdk_drag_context_get_selected_action (GdkDragContext *context) {
+ return context->action;
+}
+GList *
+gdk_drag_context_list_targets (GdkDragContext *context) {
+ return context->targets;
+}
+#endif
+
+#if !GTK_CHECK_VERSION(2,24,0)
+#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
+GtkWidget *
+gtk_combo_box_text_new () {
+ return gtk_combo_box_new_text ();
+}
+
+GtkWidget *
+gtk_combo_box_text_new_with_entry (void) {
+ return gtk_combo_box_entry_new ();
+}
+
+void
+gtk_combo_box_text_append_text (GtkComboBoxText *combo_box, const gchar *text) {
+ gtk_combo_box_append_text (combo_box, text);
+}
+
+void
+gtk_combo_box_text_insert_text (GtkComboBoxText *combo_box, gint position, const gchar *text) {
+ gtk_combo_box_insert_text (combo_box, position, text);
+}
+
+void
+gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box, const gchar *text) {
+ gtk_combo_box_prepend_text (combo_box, text);
+}
+gchar *
+gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box) {
+ return gtk_combo_box_get_active_text (combo_box);
+}
+
+#endif
+
+#if !GTK_CHECK_VERSION(2,18,0)
+void
+gtk_widget_set_allocation (GtkWidget *widget, const GtkAllocation *allocation) {
+ widget->allocation.x = (allocation)->x;
+ widget->allocation.y = (allocation)->y;
+ widget->allocation.width = (allocation)->width;
+ widget->allocation.height = (allocation)->height;
+}
+
+void
+gtk_widget_get_allocation (GtkWidget *widget, GtkAllocation *allocation) {
+ (allocation)->x = widget->allocation.x;
+ (allocation)->y = widget->allocation.y;
+ (allocation)->width = widget->allocation.width;
+ (allocation)->height = widget->allocation.height;
+}
+
+void
+gtk_widget_set_window(GtkWidget *widget, GdkWindow *window) {
+ widget->window = window;
+}
+#endif
diff --git a/plugins/shellexecui/support.h b/plugins/shellexecui/support.h
new file mode 100644
index 00000000..b7800a1d
--- /dev/null
+++ b/plugins/shellexecui/support.h
@@ -0,0 +1,146 @@
+#ifndef __SUPPORT_H
+#define __SUPPORT_H
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#if GTK_CHECK_VERSION(3,0,0)
+#include <gdk/gdkkeysyms-compat.h>
+#else
+#include <gdk/gdkkeysyms.h>
+#endif
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# undef _
+# define _(String) dgettext (PACKAGE, String)
+# define Q_(String) g_strip_context ((String), gettext (String))
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+#ifndef _
+# define _(String) (String)
+#endif
+# define Q_(String) g_strip_context ((String), (String))
+# define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps used in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
+/* This is used to create the pixbufs used in the interface. */
+GdkPixbuf* create_pixbuf (const gchar *filename);
+
+/* This is used to set ATK action descriptions. */
+void glade_set_atk_action_description (AtkAction *action,
+ const gchar *action_name,
+ const gchar *description);
+
+#if GTK_CHECK_VERSION(3,0,0)
+GtkWidget *
+gtk_combo_box_entry_new_text(void);
+
+void
+gtk_dialog_set_has_separator (GtkDialog *dlg, gboolean has);
+#endif
+
+#if !GTK_CHECK_VERSION(2,20,0)
+#define gtk_widget_set_realized(widget, realized) {if (realized) GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); else GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED);}
+#define gtk_widget_get_realized(widget) (GTK_WIDGET_REALIZED (widget))
+#endif
+
+#if !GTK_CHECK_VERSION(2,22,0)
+GdkDragAction
+gdk_drag_context_get_selected_action (GdkDragContext *context);
+GList *
+gdk_drag_context_list_targets (GdkDragContext *context);
+#endif
+
+#if !GTK_CHECK_VERSION(2,24,0)
+#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
+typedef GtkComboBox GtkComboBoxText;
+GtkWidget *gtk_combo_box_text_new ();
+GtkWidget *gtk_combo_box_text_new_with_entry (void);
+void gtk_combo_box_text_append_text (GtkComboBoxText *combo_box, const gchar *text);
+void gtk_combo_box_text_insert_text (GtkComboBoxText *combo_box, gint position, const gchar *text);
+void gtk_combo_box_text_prepend_text (GtkComboBoxText *combo_box, const gchar *text);
+gchar *gtk_combo_box_text_get_active_text (GtkComboBoxText *combo_box);
+#endif
+
+#if !GTK_CHECK_VERSION(2,14,0)
+#define gtk_widget_get_window(widget) ((widget)->window)
+#define gtk_selection_data_get_target(data) (data->target)
+#define gtk_dialog_get_content_area(dialog) (dialog->vbox)
+#define gtk_dialog_get_action_area(dialog) (dialog->action_area)
+#define gtk_selection_data_get_data(data) (data->data)
+#define gtk_selection_data_get_length(data) (data->length)
+#define gtk_selection_data_get_format(data) (data->format)
+#define gtk_adjustment_get_lower(adj) (adj->lower)
+#define gtk_adjustment_get_upper(adj) (adj->upper)
+#endif
+
+#if !GTK_CHECK_VERSION(2,18,0)
+#define gtk_widget_set_has_window(widget, has_window) \
+ if (has_window) GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_WINDOW); \
+ else GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
+
+#define gtk_widget_get_visible(widget) (GTK_WIDGET_VISIBLE(widget))
+#define gtk_widget_get_has_window(widget) (!GTK_WIDGET_NO_WINDOW(widget))
+void gtk_widget_set_window(GtkWidget *widget, GdkWindow *window);
+#endif
+
+
+#if !GTK_CHECK_VERSION(2,18,0)
+void gtk_widget_set_allocation (GtkWidget *widget,
+ const GtkAllocation *allocation);
+
+void gtk_widget_get_allocation (GtkWidget *widget,
+ GtkAllocation *allocation);
+
+#define gtk_widget_set_can_focus(widget, canfocus) {if (canfocus) GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); else GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_FOCUS);}
+
+#define gtk_widget_get_can_focus(widget) (GTK_WIDGET_CAN_FOCUS (widget));
+
+#define gtk_widget_set_can_default(widget, candefault) {if (candefault) GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT); else GTK_WIDGET_UNSET_FLAGS(widget, GTK_CAN_DEFAULT);}
+
+#define gtk_widget_get_can_default(widget) (GTK_WIDGET_CAN_DEFAULT (widget));
+#endif
+
+#endif
diff --git a/plugins/shn/shn.c b/plugins/shn/shn.c
index da69866b..cc03ac72 100644
--- a/plugins/shn/shn.c
+++ b/plugins/shn/shn.c
@@ -322,7 +322,9 @@ shn_init(DB_fileinfo_t *_info, DB_playItem_t *it) {
char data[4];
DB_FILE *f;
+ deadbeef->pl_lock ();
f = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!f) {
trace ("shn: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
@@ -346,10 +348,13 @@ shn_init(DB_fileinfo_t *_info, DB_playItem_t *it) {
return -1;
}
+ deadbeef->pl_lock ();
if (!(info->shnfile = load_shn(deadbeef->pl_find_meta (it, ":URI")))) {
+ deadbeef->pl_unlock ();
trace ("shn: load_shn failed\n");
return -1;
}
+ deadbeef->pl_unlock ();
_info->fmt.bps = info->shnfile->wave_header.bits_per_sample;
_info->fmt.channels = info->shnfile->wave_header.channels;
diff --git a/plugins/sid/csid.cpp b/plugins/sid/csid.cpp
index 2bb5b84e..6658850e 100644
--- a/plugins/sid/csid.cpp
+++ b/plugins/sid/csid.cpp
@@ -299,7 +299,9 @@ csid_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
// libsidplay crashes if file doesn't exist
// so i have to check it here
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp ){
return -1;
}
@@ -318,7 +320,9 @@ csid_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->resid->sampling (samplerate);
info->duration = deadbeef->pl_get_item_duration (it);
+ deadbeef->pl_lock ();
info->tune = new SidTune (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
info->tune->selectSong (deadbeef->pl_find_meta_int (it, ":TRACKNUM", 0)+1);
sid2_config_t conf;
diff --git a/plugins/sid/sidplay-libs/libsidplay/src/player.cpp b/plugins/sid/sidplay-libs/libsidplay/src/player.cpp
index 38b612c0..4fa51139 100644
--- a/plugins/sid/sidplay-libs/libsidplay/src/player.cpp
+++ b/plugins/sid/sidplay-libs/libsidplay/src/player.cpp
@@ -272,7 +272,7 @@ Player::Player (void)
m_running (false),
m_sampleCount (0)
{
- srand ((uint) ::time(NULL));
+// srand ((uint) ::time(NULL));
m_rand = (uint_least32_t) rand ();
// Set the ICs to use this environment
diff --git a/plugins/sndfile/sndfile.c b/plugins/sndfile/sndfile.c
index 071dffdb..49571642 100644
--- a/plugins/sndfile/sndfile.c
+++ b/plugins/sndfile/sndfile.c
@@ -47,6 +47,7 @@ typedef struct {
int bitrate;
int sf_format;
int read_as_short;
+ int sf_need_endswap;
} sndfile_info_t;
// vfs wrapper for sf
@@ -161,7 +162,9 @@ sndfile_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
sndfile_info_t *info = (sndfile_info_t*)_info;
SF_INFO inf;
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
trace ("sndfile: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
@@ -176,6 +179,7 @@ sndfile_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
}
_info->plugin = &plugin;
info->sf_format = inf.format&0x000f;
+ info->sf_need_endswap = sf_command (info->ctx, SFC_RAW_DATA_NEEDS_ENDSWAP, NULL, 0);
switch (inf.format&0x000f) {
case SF_FORMAT_PCM_S8:
@@ -279,6 +283,36 @@ sndfile_read (DB_fileinfo_t *_info, char *bytes, int size) {
((int8_t *)bytes)[i] = sample-0x80;
}
}
+ else if (info->sf_need_endswap) {
+ switch (info->info.fmt.bps) {
+ case 16:
+ {
+ uint16_t *data = (uint16_t *)bytes;
+ for (int i = 0; i < n/2; i++, data++) {
+ *data = ((*data & 0xff) << 8) | ((*data & 0xff00) >> 8);
+ }
+ }
+ break;
+ case 24:
+ {
+ uint8_t *data = bytes;
+ for (int i = 0; i < n/3; i++, data += 3) {
+ uint8_t temp = data[0];
+ data[0] = data[2];
+ data[2] = temp;
+ }
+ }
+ break;
+ case 32:
+ {
+ uint32_t *data = (uint32_t *)bytes;
+ for (int i = 0; i < n/4; i++, data++) {
+ *data = ((*data & 0xff) << 24) | ((*data & 0xff00) << 8) | ((*data & 0xff0000) >> 8) | ((*data & 0xff0000) >> 24);
+ }
+ }
+ break;
+ }
+ }
n /= samplesize;
}
diff --git a/plugins/tta/ttaplug.c b/plugins/tta/ttaplug.c
index 5b433e44..cb6f35f7 100644
--- a/plugins/tta/ttaplug.c
+++ b/plugins/tta/ttaplug.c
@@ -61,16 +61,21 @@ static int
tta_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
tta_info_t *info = (tta_info_t *)_info;
- trace ("open_tta_file %s\n", deadbeef->pl_find_meta (it, ":URI"));
- if (open_tta_file (deadbeef->pl_find_meta (it, ":URI"), &info->tta, 0) != 0) {
- fprintf (stderr, "tta: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_lock ();
+ const char *fname = deadbeef->pl_find_meta (it, ":URI")
+ trace ("open_tta_file %s\n", fname);
+ if (open_tta_file (fname, &info->tta, 0) != 0) {
+ deadbeef->pl_unlock ();
+ fprintf (stderr, "tta: failed to open %s\n", fname);
return -1;
}
if (player_init (&info->tta) != 0) {
- fprintf (stderr, "tta: failed to init player for %s\n", deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
+ fprintf (stderr, "tta: failed to init player for %s\n", fname);
return -1;
}
+ deadbeef->pl_unlock ();
_info->fmt.bps = info->tta.BPS;
_info->fmt.channels = info->tta.NCH;
@@ -251,7 +256,9 @@ tta_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
}
static int tta_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
diff --git a/plugins/vfs_curl/vfs_curl.c b/plugins/vfs_curl/vfs_curl.c
index b0779da7..2574e9fe 100644
--- a/plugins/vfs_curl/vfs_curl.c
+++ b/plugins/vfs_curl/vfs_curl.c
@@ -576,7 +576,9 @@ http_thread_func (void *ctx) {
struct curl_slist *headers = NULL;
curl_easy_reset (curl);
curl_easy_setopt (curl, CURLOPT_URL, fp->url);
- curl_easy_setopt (curl, CURLOPT_USERAGENT, "deadbeef");
+ char ua[100];
+ deadbeef->conf_get_str ("network.http_user_agent", "deadbeef", ua, sizeof (ua));
+ curl_easy_setopt (curl, CURLOPT_USERAGENT, ua);
curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 1);
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, http_curl_write);
curl_easy_setopt (curl, CURLOPT_WRITEDATA, ctx);
@@ -652,6 +654,7 @@ http_thread_func (void *ctx) {
trace ("curl error:\n%s\n", fp->http_err);
}
deadbeef->mutex_lock (fp->mutex);
+#if 0
if (status == 0 && fp->length < 0 && fp->status != STATUS_ABORTED && fp->status != STATUS_SEEK) {
trace ("vfs_curl: restarting stream\n");
// NOTE: don't do http_stream_reset here - we don't want to cut the ending
@@ -669,6 +672,7 @@ http_thread_func (void *ctx) {
deadbeef->mutex_unlock (fp->mutex);
continue;
}
+#endif
if (fp->status != STATUS_SEEK) {
trace ("vfs_curl: break loop\n");
deadbeef->mutex_unlock (fp->mutex);
diff --git a/plugins/vorbis/vorbis.c b/plugins/vorbis/vorbis.c
index cbc23a62..a121695a 100644
--- a/plugins/vorbis/vorbis.c
+++ b/plugins/vorbis/vorbis.c
@@ -112,10 +112,13 @@ update_vorbis_comments (DB_playItem_t *it, vorbis_comment *vc, int refresh_playl
int l = strlen (metainfo[m]);
if (vc->comment_lengths[i] > l && !strncasecmp (metainfo[m], s, l) && s[l] == '=') {
if (refresh_playlist == 2) {
+ deadbeef->pl_lock ();
const char *val = deadbeef->pl_find_meta (it, metainfo[m+1]);
if (!val || strcmp (val, s+l+1)) {
+ deadbeef->pl_unlock ();
return 1;
}
+ deadbeef->pl_unlock ();
}
else {
deadbeef->pl_append_meta (it, metainfo[m+1], s + l + 1);
@@ -197,7 +200,9 @@ cvorbis_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
info->ptrack = it;
deadbeef->pl_item_ref (it);
+ deadbeef->pl_lock ();
info->info.file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->info.file) {
trace ("ogg: failed to open file %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
@@ -222,7 +227,7 @@ cvorbis_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
if (plt) {
deadbeef->plt_unref (plt);
}
- deadbeef->pl_replace_meta (it, ":FILETYPE", "OggVorbis");
+ deadbeef->pl_replace_meta (it, "!FILETYPE", "OggVorbis");
}
else
{
@@ -463,7 +468,7 @@ cvorbis_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
int64_t fsize = deadbeef->fgetlength (fp);
if (fp->vfs->is_streaming ()) {
DB_playItem_t *it = deadbeef->pl_item_alloc_init (fname, plugin.plugin.id);
- deadbeef->pl_add_meta (it, ":FILETYPE", "OggVorbis");
+ deadbeef->pl_add_meta (it, "!FILETYPE", "OggVorbis");
deadbeef->plt_set_item_duration (plt, it, -1);
deadbeef->pl_add_meta (it, "title", NULL);
after = deadbeef->plt_insert_item (plt, after, it);
@@ -536,16 +541,19 @@ cvorbis_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
}
// embedded cue
+ deadbeef->pl_lock ();
const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
if (cuesheet) {
cue = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), totalsamples, samplerate);
if (cue) {
+ deadbeef->pl_unlock ();
deadbeef->pl_item_unref (it);
deadbeef->pl_item_unref (cue);
ov_clear (&vorbis_file);
return cue;
}
}
+ deadbeef->pl_unlock ();
}
else {
currentsample += totalsamples;
@@ -574,7 +582,9 @@ cvorbis_read_metadata (DB_playItem_t *it) {
OggVorbis_File vorbis_file;
vorbis_info *vi = NULL;
+ deadbeef->pl_lock ();
fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
trace ("cvorbis_read_metadata: failed to fopen %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
@@ -624,6 +634,8 @@ cvorbis_write_metadata (DB_playItem_t *it) {
FILE *out = NULL;
int err = -1;
char outname[PATH_MAX] = "";
+ char fname[PATH_MAX];
+ deadbeef->pl_get_meta (it, ":URI", fname, sizeof (fname));
struct field {
struct field *next;
@@ -638,9 +650,9 @@ cvorbis_write_metadata (DB_playItem_t *it) {
trace ("cvorbis_write_metadata: vcedit_new_state failed\n");
return -1;
}
- fp = fopen (deadbeef->pl_find_meta (it, ":URI"), "rb");
+ fp = fopen (fname, "rb");
if (!fp) {
- trace ("cvorbis_write_metadata: failed to read metadata from %s\n", deadbeef->pl_find_meta (it, ":URI"));
+ trace ("cvorbis_write_metadata: failed to read metadata from %s\n", fname);
goto error;
}
if (vcedit_open (state, fp) != 0) {
@@ -717,13 +729,13 @@ cvorbis_write_metadata (DB_playItem_t *it) {
m = m->next;
}
deadbeef->pl_unlock ();
-
// add preserved fields
for (struct field *f = preserved_fields; f; f = f->next) {
vorbis_comment_add (vc, f->data);
}
- snprintf (outname, sizeof (outname), "%s.temp.ogg", deadbeef->pl_find_meta (it, ":URI"));
+ snprintf (outname, sizeof (outname), "%s.temp.ogg", fname);
+
out = fopen (outname, "w+b");
if (!out) {
@@ -732,7 +744,7 @@ cvorbis_write_metadata (DB_playItem_t *it) {
}
if (vcedit_write (state, out) < 0) {
- trace ("cvorbis_write_metadata: failed to write tags to %s, error: %s\n", deadbeef->pl_find_meta (it, ":URI"), vcedit_error (state));
+ trace ("cvorbis_write_metadata: failed to write tags to %s, error: %s\n", fname, vcedit_error (state));
goto error;
}
@@ -754,7 +766,7 @@ error:
}
if (!err) {
- rename (outname, deadbeef->pl_find_meta (it, ":URI"));
+ rename (outname, fname);
}
else if (out) {
unlink (outname);
diff --git a/plugins/vtx/vtx.c b/plugins/vtx/vtx.c
index 81a60b0e..35cbde95 100644
--- a/plugins/vtx/vtx.c
+++ b/plugins/vtx/vtx.c
@@ -61,7 +61,9 @@ vtx_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
size_t sz = 0;
char *buf = NULL;
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
trace ("vtx: failed to open file %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
diff --git a/plugins/wavpack/wavpack.c b/plugins/wavpack/wavpack.c
index 73f3c9f7..7e81f5e9 100644
--- a/plugins/wavpack/wavpack.c
+++ b/plugins/wavpack/wavpack.c
@@ -125,21 +125,26 @@ wv_open (uint32_t hints) {
static int
wv_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
wvctx_t *info = (wvctx_t *)_info;
+ deadbeef->pl_lock ();
info->file = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->file) {
return -1;
}
#ifndef TINYWV
- char *c_fname = alloca (strlen (deadbeef->pl_find_meta (it, ":URI")) + 2);
+ deadbeef->pl_lock ();
+ const char *uri = deadbeef->pl_find_meta (it, ":URI");
+ char *c_fname = alloca (strlen (uri) + 2);
if (c_fname) {
- strcpy (c_fname, deadbeef->pl_find_meta (it, ":URI"));
+ strcpy (c_fname, uri);
strcat (c_fname, "c");
info->c_file = deadbeef->fopen (c_fname);
}
else {
fprintf (stderr, "wavpack warning: failed to alloc memory for correction file name\n");
}
+ deadbeef->pl_unlock ();
#endif
char error[80];
@@ -336,11 +341,13 @@ wv_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
deadbeef->pl_add_meta (it, ":WAVPACK_MODE", s);
// embedded cue
+ deadbeef->pl_lock ();
const char *cuesheet = deadbeef->pl_find_meta (it, "cuesheet");
if (cuesheet) {
trace ("found cuesheet: %s\n", cuesheet);
DB_playItem_t *last = deadbeef->plt_insert_cue_from_buffer (plt, after, it, cuesheet, strlen (cuesheet), totalsamples, samplerate);
if (last) {
+ deadbeef->pl_unlock ();
deadbeef->fclose (fp);
WavpackCloseFile (ctx);
deadbeef->pl_item_unref (it);
@@ -348,6 +355,7 @@ wv_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
return last;
}
}
+ deadbeef->pl_unlock ();
// cue file on disc
DB_playItem_t *cue_after = deadbeef->plt_insert_cue (plt, after, it, totalsamples, samplerate);
if (cue_after) {
@@ -368,10 +376,13 @@ wv_insert (ddb_playlist_t *plt, DB_playItem_t *after, const char *fname) {
int
wv_read_metadata (DB_playItem_t *it) {
+ deadbeef->pl_lock ();
DB_FILE *fp = deadbeef->fopen (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!fp) {
return -1;
}
+ deadbeef->pl_delete_all_meta (it);
int apeerr = deadbeef->junk_apev2_read (it, fp);
if (!apeerr) {
trace ("wv: ape tag found\n");
diff --git a/plugins/wildmidi/src/wildmidi_lib.c b/plugins/wildmidi/src/wildmidi_lib.c
index 66a2ca4a..d870877c 100644
--- a/plugins/wildmidi/src/wildmidi_lib.c
+++ b/plugins/wildmidi/src/wildmidi_lib.c
@@ -671,7 +671,7 @@ WM_BufferFile (const char *filename, unsigned long int *size) {
return data;
}
-inline void
+static inline void
WM_Lock (int * wmlock) {
LOCK_START:
if (__builtin_expect(((*wmlock) == 0),1)) {
@@ -689,7 +689,7 @@ WM_Lock (int * wmlock) {
goto LOCK_START;
}
-inline void
+static inline void
WM_Unlock (int *wmlock) {
(*wmlock)--;
}
@@ -2498,7 +2498,7 @@ do_note_off (unsigned char ch, struct _mdi *mdi, unsigned long int ptr) {
return;
}
-inline unsigned long int
+static inline unsigned long int
get_inc (struct _mdi *mdi, struct _note *nte) {
int ch = nte->noteid >> 8;
signed long int note_f;
@@ -2519,7 +2519,7 @@ get_inc (struct _mdi *mdi, struct _note *nte) {
return (((freq / ((WM_SampleRate * 100) / 1024)) * 1024 / nte->sample->inc_div));
}
-inline signed short int
+static inline signed short int
get_volume(struct _mdi *mdi, unsigned char ch, struct _note *nte) {
signed long int volume;
diff --git a/plugins/wildmidi/wildmidiplug.c b/plugins/wildmidi/wildmidiplug.c
index 36e2be3f..a346f6b7 100644
--- a/plugins/wildmidi/wildmidiplug.c
+++ b/plugins/wildmidi/wildmidiplug.c
@@ -52,7 +52,9 @@ int
wmidi_init (DB_fileinfo_t *_info, DB_playItem_t *it) {
wmidi_info_t *info = (wmidi_info_t *)_info;
+ deadbeef->pl_lock ();
info->m = WildMidi_Open (deadbeef->pl_find_meta (it, ":URI"));
+ deadbeef->pl_unlock ();
if (!info->m) {
trace ("wmidi: failed to open %s\n", deadbeef->pl_find_meta (it, ":URI"));
return -1;
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
deleted file mode 100644
index cc8a2227..00000000
--- a/po/Makefile.in.in
+++ /dev/null
@@ -1,217 +0,0 @@
-# Makefile for program source directory in GNU NLS utilities package.
-# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu>
-# Copyright (C) 2004-2008 Rodney Dawes <dobey.pwns@gmail.com>
-#
-# This file may be copied and used freely without restrictions. It may
-# be used in projects which are not available under a GNU Public License,
-# but which still want to provide support for the GNU gettext functionality.
-#
-# - Modified by Owen Taylor <otaylor@redhat.com> to use GETTEXT_PACKAGE
-# instead of PACKAGE and to look for po2tbl in ./ not in intl/
-#
-# - Modified by jacob berkman <jacob@ximian.com> to install
-# Makefile.in.in and po2tbl.sed.in for use with glib-gettextize
-#
-# - Modified by Rodney Dawes <dobey.pwns@gmail.com> for use with intltool
-#
-# We have the following line for use by intltoolize:
-# INTLTOOL_MAKEFILE
-
-GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
-PACKAGE = @PACKAGE@
-VERSION = @VERSION@
-
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-top_builddir = @top_builddir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-datadir = @datadir@
-datarootdir = @datarootdir@
-libdir = @libdir@
-DATADIRNAME = @DATADIRNAME@
-itlocaledir = $(prefix)/$(DATADIRNAME)/locale
-subdir = po
-install_sh = @install_sh@
-# Automake >= 1.8 provides @mkdir_p@.
-# Until it can be supposed, use the safe fallback:
-mkdir_p = $(install_sh) -d
-
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-
-GMSGFMT = @GMSGFMT@
-MSGFMT = @MSGFMT@
-XGETTEXT = @XGETTEXT@
-INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
-INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
-MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist
-GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot
-
-ALL_LINGUAS = @ALL_LINGUAS@
-
-PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi)
-
-USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi)
-
-USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done)
-
-POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done)
-
-DISTFILES = Makefile.in.in POTFILES.in $(POFILES)
-EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS
-
-POTFILES = \
-# This comment gets stripped out
-
-CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done)
-
-.SUFFIXES:
-.SUFFIXES: .po .pox .gmo .mo .msg .cat
-
-.po.pox:
- $(MAKE) $(GETTEXT_PACKAGE).pot
- $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox
-
-.po.mo:
- $(MSGFMT) -o $@ $<
-
-.po.gmo:
- file=`echo $* | sed 's,.*/,,'`.gmo \
- && rm -f $$file && $(GMSGFMT) -o $$file $<
-
-.po.cat:
- sed -f ../intl/po2msg.sed < $< > $*.msg \
- && rm -f $@ && gencat $@ $*.msg
-
-
-all: all-@USE_NLS@
-
-all-yes: $(CATALOGS)
-all-no:
-
-$(GETTEXT_PACKAGE).pot: $(POTFILES)
- $(GENPOT)
-
-install: install-data
-install-data: install-data-@USE_NLS@
-install-data-no: all
-install-data-yes: all
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \
- $(mkdir_p) $$dir; \
- if test -r $$lang.gmo; then \
- $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
- echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \
- else \
- $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \
- echo "installing $(srcdir)/$$lang.gmo as" \
- "$$dir/$(GETTEXT_PACKAGE).mo"; \
- fi; \
- if test -r $$lang.gmo.m; then \
- $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \
- echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \
- else \
- if test -r $(srcdir)/$$lang.gmo.m ; then \
- $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \
- $$dir/$(GETTEXT_PACKAGE).mo.m; \
- echo "installing $(srcdir)/$$lang.gmo.m as" \
- "$$dir/$(GETTEXT_PACKAGE).mo.m"; \
- else \
- true; \
- fi; \
- fi; \
- done
-
-# Empty stubs to satisfy archaic automake needs
-dvi info ctags tags CTAGS TAGS ID:
-
-# Define this as empty until I found a useful application.
-install-exec installcheck:
-
-uninstall:
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \
- rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \
- done
-
-check: all $(GETTEXT_PACKAGE).pot
- rm -f missing notexist
- srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m
- if [ -r missing -o -r notexist ]; then \
- exit 1; \
- fi
-
-mostlyclean:
- rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp
- rm -f .intltool-merge-cache
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile Makefile.in POTFILES stamp-it
- rm -f *.mo *.msg *.cat *.cat.m *.gmo
-
-maintainer-clean: distclean
- @echo "This command is intended for maintainers to use;"
- @echo "it deletes files that may require special tools to rebuild."
- rm -f Makefile.in.in
-
-distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
-dist distdir: $(DISTFILES)
- dists="$(DISTFILES)"; \
- extra_dists="$(EXTRA_DISTFILES)"; \
- for file in $$extra_dists; do \
- test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \
- done; \
- for file in $$dists; do \
- test -f $$file || file="$(srcdir)/$$file"; \
- ln $$file $(distdir) 2> /dev/null \
- || cp -p $$file $(distdir); \
- done
-
-update-po: Makefile
- $(MAKE) $(GETTEXT_PACKAGE).pot
- tmpdir=`pwd`; \
- linguas="$(USE_LINGUAS)"; \
- for lang in $$linguas; do \
- echo "$$lang:"; \
- result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \
- if $$result; then \
- if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \
- rm -f $$tmpdir/$$lang.new.po; \
- else \
- if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \
- :; \
- else \
- echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \
- rm -f $$tmpdir/$$lang.new.po; \
- exit 1; \
- fi; \
- fi; \
- else \
- echo "msgmerge for $$lang.gmo failed!"; \
- rm -f $$tmpdir/$$lang.new.po; \
- fi; \
- done
-
-Makefile POTFILES: stamp-it
- @if test ! -f $@; then \
- rm -f stamp-it; \
- $(MAKE) stamp-it; \
- fi
-
-stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in
- cd $(top_builddir) \
- && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \
- $(SHELL) ./config.status
-
-# Tell versions [3.59,3.63) of GNU make not to export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ad7f4f97..6faa92eb 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -26,3 +26,9 @@ plugins/converter/support.c
plugins/gtkui/dspconfig.c
plugins/gtkui/fileman.c
plugins/converter/converter.glade
+plugins/shellexecui/interface.c
+plugins/shellexecui/shellexecui.c
+plugins/shellexecui/support.c
+plugins/shellexecui/shellexec.glade
+plugins/gtkui/smclient/eggdesktopfile.c
+plugins/gtkui/smclient/eggsmclient.c
diff --git a/po/be.po b/po/be.po
index b4aac805..70ffe07f 100644
--- a/po/be.po
+++ b/po/be.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.4.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-15 20:32+0200\n"
"Last-Translator: Мікалай <crom-a@tut.by>\n"
"Language-Team: Belarusian <>\n"
@@ -16,8 +16,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: \n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
@@ -56,9 +56,9 @@ msgstr "Не ўдалося загрузіць файл даведкі"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Даведка"
@@ -72,849 +72,888 @@ msgstr "Пра праграму DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Змены ў DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Перакладчыкі DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Рэдагаваць плэйліст"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Назва:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Перайменаваць плэйліст"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Сцерці плэйліст"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Дадаць новы плэйліст"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Захаваць перадусталёўкі эквалайзера DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Файлы перадусталёвак DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Загрузіць перадусталёўкі эквалайзера DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Перадусталёўкі эквалайзера DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Імпартаваць перадусталёўку эквалайзера Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Перадусталёўкі эквалайзера Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Запісаць"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Загрузіць"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Імпартаваць перадусталёўку Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Уключыць"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Абнуліць усё"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Абнуліць перадузмацненне"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Абнуліць частоты"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Профілі"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 дзень %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d дзён %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Стоп | %d трэкаў | %s агульны час"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Мона"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стэрэа"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d кбіт/с "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Паўза | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dГц | %d біт | %s | %d:%02d / %s | %d трэкаў | %s агульны час"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Запісаць плэйліст як"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Файлы плэйлістоў DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Прачытаць плэйліст"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Іншыя файлы (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Новы плэйліст"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Новы плэйліст (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Файл"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Адкрыць файл(ы)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Дадаць файл(ы)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Дадаць каталог(і)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Дадаць месцазнаходжанне"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Новы плэйліст"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Прачытаць плэйліст"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Запісаць плэйліст"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Выйсцi"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Рэдагаваць"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Ачысціць"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Вылучыць усё"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Зняць вылучэнне"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Інвертаваць вылучэнне"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Вылучэнне"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Сцерці"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Пакінуць вылучанае"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Знайсці"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Парадкаваць па"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Назва"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Нумар трэка"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Альбом"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Выканаўца"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Дата"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Выпадкова"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Карыстальніцкі"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Наладкі"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Выгляд"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Радок стану"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Загалоўкі слупкоў"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Карткі"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Эквалайзер"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Прай_граванне"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Чарга"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Лінейная"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Перамяшаць трэкі"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Перамяшаць альбомы"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Выпадкова"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Паўтараць"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Паўтараць усё"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Паўтараць адзін трэк"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Не паўтараць"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Пракручваць плэйліст аўтаматычна"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Вылучаць бягучы трэк"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Спыніць пасля бягучага"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Перайсці на бягучы трэк"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Даведка"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Змены"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Пра праграму"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Перакладчыкі"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Пошук"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Стоп"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Прайграць"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Паўза"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Папярэдняя"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Наступная"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Граць выпадкова"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Пра праграму"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Выйсці"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Уласцівасці трэка"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Настаўленні"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Ужыць"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Замкнуць"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Метаданыя"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Уласцівасці"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Увядзіце назву новага слупка"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Тып:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Нумар"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Прайграецца"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Вокладка альбома"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Выканаўца - Альбом"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Працягласць"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Нумар трэка"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Гурт / Выканаўца альбома"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Фармат:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Выраўніванне:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Па леваму краю"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Па праваму краю"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Скасаваць"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_ОК"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Модуль вываду:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Прылада вываду:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Заўсёды канверсаваць 8-біт аўдыё ў 16-біт"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Гук"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Рэжым аўтаўстаноўкі гучнасці:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Адключаны"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Трэк"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Выкарыстоўваць пікавае значэнне"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 дБ"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 дБ"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Перадузмацненне з рыплэйгейна:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Глабальнае перадузмацненне:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Дадаваць файлы з загаднага радка (ці файлавага кіраўніка) у гэты плэйліст:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Узнаўляць папярэдні сеанс пры запуску"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Не дадаваць з архіваў пры праглядзе каталога"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Спыніць пасля бягучага"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Прайграванне"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Канфігурацыя"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Профіль ланцужкоў DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Чытаць"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Згортваць у трэй замест закрыцця"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Сярэдняя кнопка мышы закрывае плэйліст"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Не паказваць іконку у трэі"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Выкарыстоўваць цёмны шрыфт для бягучага трэка"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Прыбраць пункт \"Сцерці з дыска\" з кантэкстнага меню"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Аўтаматычна называць плэйліст, калі дадаецца адзін каталог"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Частата абнаўлення інтэрфейсу (разоў за сек.):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Тэкст загалоўка пры прайграванні:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Тэкст загалоўка пры спыненні:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Плагін графічнага інтэрфейсу (змена патрабуе перазапуску):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Інтэрфейс"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Замяніць"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Пярэдні план"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Фон"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Асноўныя колеры"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Сярэдні"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Светлы"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Цёмны"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Грунтоўны"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Тэкст"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Колеры картак"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Замяніць (губляюцца настаўленні тэмы GTK, але павялічваецца хуткасць "
"адлюстравання)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Цотны радок"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Няцотны радок"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Вылучаны радок"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Вылучаны тэкст"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Курсор"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Колеры плэйліста"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Колеры"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Уключыць проксі-сервер"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Адрас:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Порт:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Тып проксі:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Імя карыстальніка:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Пароль:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Сетка"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Версія: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Аўтарскія правы"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Дадаткі"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Групаваць па"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Парадкаваць па..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Фармат"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Да павелічэння"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Да памяншэння"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Вылучце плагін DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Плагін"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Настаўленні рэдактара тэгаў"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Пісаць ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Пісаць ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Пісаць APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Выразаць ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Выразаць ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Выразаць APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Версія ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (рэкамендавана)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Знаказбор ID3v1 (прадвызначаны iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Пісать ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Выканаўца / Альбом"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Трэк №"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Выдаліць файлы з цвёрдага дыска"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -922,49 +961,48 @@ msgstr ""
"Файлы будуць выдалены. Працягваць?\n"
"(Гэты дыялог можы быць адключаны ў настаўленнях плагіна GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Увага"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Дадаць у чаргу"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Выдаліць з чаргі"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Аднавіць метададзеныя"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Выдаліць з жорсткага дыска"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Дадаць слупок"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Рэдагаваць слупок"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Прыбраць слупок"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Групаваць па"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Няма"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Выканаўца/Дата/Альбом"
@@ -972,7 +1010,7 @@ msgstr "Выканаўца/Дата/Альбом"
msgid "Open file..."
msgstr "Адкрыць файл..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Наставіць %s"
@@ -981,19 +1019,23 @@ msgstr "Наставіць %s"
msgid "Default Audio Device"
msgstr "Прадвызначаная прылада аўдыё"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Дадаць"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Гарачыя клавішы"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Слот"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Месцазнаходжанне"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Камбінацыя клавіш"
@@ -1005,151 +1047,158 @@ msgstr "Даданне файлаў..."
msgid "Initializing..."
msgstr "Ініцыялізацыя..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Дадзеныя для гэтага трэка былі зменены."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Закрыць акно?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Некалькі велічынь] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ключ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Значэнне"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Запісанне тэгаў..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Назва:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Назвы палёў не могуць пачынацца з : ці _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Немагчыма дадаць поле"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Поле з такой назвай ужо ёсць, паспрабуйце назваць інакш."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Сцерці вылучаныя палі?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Дадаць поле"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Сцерці поле"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Ужыванне: deadbeef [опцыі] [файл(ы)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опцыі:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ці -h Адлюстраваць даведку (гэты тэкст) і выйсці\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Выйсці з плэера\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
" --version Адлюстраваць інфармацыю аб версіі праграмы і выйсці\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Пачаць граць\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Спыніць прайграванне\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Прыпыніць прайграванне\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Пераключыць паўзу\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Пачаць прайграванне, калі спынена, іначай пераключыць "
+msgstr ""
+" --play-pause Пачаць прайграванне, калі спынена, іначай пераключыць "
"паўзу\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Настуная песня ў плэйлісце\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Папярэдняя песня ў плэйлісце\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Выпадковая песня ў плэлісце\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Дадаць файл(ы) у існуючы плэйліст\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Адлюстраваць адфарматыраваную назву трэка\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
-" FMT %%-сінтаксіс: %%a-выканаўца, %%t-назва, %%"
-"b-альбом,\n"
-" %%l-даўжыня, %%n-нумар трэка, %%y-год, %%"
-"c-каментарый,\n"
+" FMT %%-сінтаксіс: %%a-выканаўца, %%t-назва, %%b-"
+"альбом,\n"
+" %%l-даўжыня, %%n-нумар трэка, %%y-год, %%c-"
+"каментарый,\n"
" %%r-аўтарскія правы, %%e-пройдзены час\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1158,53 +1207,28 @@ msgstr ""
" Напрыклад: --nowplaying \"%%a - %%t\" павінна вывесці "
"на экран \"artist - title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " за падрабязнымі звесткамі, гл. http://sourceforge.net/a"
-"pps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" за падрабязнымі звесткамі, гл. http://sourceforge.net/"
+"apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Прадвызначана"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Так"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Не"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Рэкамендавана)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Да павелічэння\n"
-"Да памяншэння"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Адключыць\n"
-"Трэк\n"
-"Альбом"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1230,7 +1254,7 @@ msgstr ""
"Гурт / Выканаўца альбома\n"
"Рознае"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1238,13 +1262,40 @@ msgstr ""
"Левы\n"
"Правы"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Адключыць\n"
+"Трэк\n"
+"Альбом"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Да павелічэння\n"
+"Да памяншэння"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Рэкамендавана)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Не ўдалося знайсці файл выявы: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1256,7 +1307,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Дадаць аўдыё CD"
#: ../translation/extra.c:4
@@ -1272,7 +1324,7 @@ msgstr "Выкарыстоўваць перадыскрэтызацыю з да
msgid "Release device while stopped"
msgstr "Вызваляць прыстасаванне ў час спынення"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Упадабаны памер буферу"
@@ -1301,265 +1353,303 @@ msgstr "Пароль"
msgid "Scrobble URL"
msgstr "Адрас для скроблінга"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Файл прылады"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Абход хібы OSS4 samplerate"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Перыяд аднаўлення кэша (гадзіны)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Атрымліваць з унутраных тэгаў"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Атрымліваць з лакальнай тэчкі"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Файлавая маска для лакальных вокладак"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Атрымліваць з last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Атрымліваць з albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Маштабаваць выявы па даўжэйшым баку"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Выкарыстоўваць CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Выкарытоўваць CD-Text замест CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (напрыклад, 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Нумар парта CDDB (напрыклад, '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Выкарыстоўваць пратакол CDDB замест HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Уключыць падтрымку NRG вобразаў"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Якасць перадысрэтызацыі (0..2, вышэй - лепш)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Максімальная даўжыня трэка (у хвілінах)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Тыповая даўжыня трэка (сек.)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Запытваць пацверджанне на выдаленне файлаў з жорсткага дыска"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Адчувальнасць рэгулятара гучнасці ў значку статусу"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Карстальніцкі значок статусу"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Запускаць gtk_init з ключом --sync (рэжым адладкі)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Дадаваць раздзельнікі паміж пунктамі кантэкстнага меню плагінаў"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Фармат загалоўка паведамлення"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Фармат зместу паведамлення"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Паказваць вокладку альбома"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Памер вокладкі альбома (пікс.)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Сервер PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Частата дыскрэтызацыі"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Адносны шлях табліцы пошуку"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Абсолютный путь таблицы поиска"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Пераставіць месцамі аўдыё байты"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Уключыць падтрымку HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (from HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Бітаў на сэмпл (8 ці 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Тыповая даўжыня трэка (сек.)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Файл канфігурацыі для банка Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Назва трэка"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Выканаўца"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Усяго трэкаў"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Кампазітар"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Нумар дыска"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Каментар"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Кодер / Продавец"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Месцазнаходжанне"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Нумар укладзенага трэка"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тып(ы) тэгаў"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Укладзены файл cue"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодэк"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Канчаткі файлаў (праз ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Канверсаваць"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Мэтавая частата дыскрэтызацыі"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Якасць / Алгарытм"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Аўтаматычная частата дыскрэтызацыі (перакрывае Мэтавую)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Уключыць скроблер"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Файл ужо існуе. Перапісаць?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Папярэджанне канвертара"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Выберыце кадавальнік"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Памылка кадавальніка"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Пераўтварэнне..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Вылучыць каталог..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Не ўдалося запісаць профіль кадавальніка"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1567,63 +1657,78 @@ msgstr ""
"Праверце правы доступу каталога, паспрабуйце іншую назву, ці высвабадзіце "
"месца на дыску"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Профіль з такой назвай ужо існуе. Паспрабуйце іншую назву."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Памылка"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Дадаць кадавальнік"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Рэдагаваць кадавальнік"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Сцерці профіль"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Гэта дзеянне выдаліць вылучаны профіль. Упэўнены?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Кадавальнікі"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Дадаць плагін у ланцуг DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Не ўдалося запісаць профіль DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Новы профіль DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Рэдагаваць профіль DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Профілі DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Каталог вываду:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Захоўваць структуру каталогаў, пачынаючы з:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Назва файла вываду:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1631,84 +1736,91 @@ msgstr ""
"Канчатак файла (напр. mp3) будзе дададзены аўтаматычна.\n"
"Пакіньце гэта поле пустым для прадвызначэння (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Кадавальнік:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Профіль DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Колькасць нітак:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Фармат выходнага сэмпла:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Захоўваць фармат крыніцы"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8-біт знакавая цэлая"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16-біт знакавая цэлая"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24-біт знакавая цэлая"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32-біт знакавая цэлая"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32-біт плыўная"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Калі файл існуе:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Спытаць"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Перапісаць"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Захоўваць структуру каталогаў, пачынаючы з:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Рэдагаваць профіль кадавальніка"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Неназваны кадавальнік"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Канчатак файла вываду:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Напр. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Загадны радок:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1716,8 +1828,9 @@ msgstr ""
"Прыклад: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1725,50 +1838,317 @@ msgstr ""
"<small>%o - назва файла вываду\n"
"%i - назва файла часовага ўводу</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Метад:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Канвеер"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Часовы файл"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Рэдактар тэгаў</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Рэдактар профіляў DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Неназваны профіль DSP"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Перапісаць"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Часовы файл"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Рэдагаваць"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Замкнуць"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Рэдагаваць слупок"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Загадны радок:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Перамяшаць трэкі"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Некалькі велічынь] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Месцазнаходжанне"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Сцерці"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Новы плэйліст"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Каментар"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Дадаць слупок"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Гэта дзеянне выдаліць вылучаны профіль. Упэўнены?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Канфігурацыя"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Настаўленні"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Інтэрфейс"
+
+#~ msgid "Slot"
+#~ msgstr "Слот"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Сцерці вылучаныя палі?"
+
#~ msgid "about.txt"
#~ msgstr "about.txt"
diff --git a/po/bg.po b/po/bg.po
index 6939c28f..6b19006a 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2012-01-01 01:02+0200\n"
-"Last-Translator: Радослав <Rec.ku@hotmail.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-04-08 23:49+0200\n"
+"Last-Translator: Радослав <reckku@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
@@ -52,11 +52,11 @@ msgstr "Грешка при зареждане на помощен файл"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Помощ"
@@ -70,851 +70,888 @@ msgstr "Относно DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s Списък с промени"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Преводачи на DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Редактирай Списъка за изпълнение"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Заглавие:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Преименувай Списъка за изпълнение"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Премахни Списъка за изпълнение"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Добави нов Списък за изпълнение"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Запамети стойностите на Тонкоректора"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Файлове със стойности на Тонкоректора (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Зареждане стойности на Тонкоректора..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Зададени стойности на Тонкоректора (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Внасяне на стойности за Тонкоректор: Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Стойности на Тонкоректора Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Запамети зададеното"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Зареди зададено"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Внасяне на стойности Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Активирай"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Анулирай всичко"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Анулирай предусилвателя"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Анулирай лентите"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Предварително зададени"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 ден %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d дена %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Спрян | %d песни | %s времетраене"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Моно"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стерео"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d кбвс"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Паузиран |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dХц | %d бит | %s | %d:%02d / %s | %d песни | %s времетраене"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Запамети списъка като..."
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF списъци за изпълнение (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Зареди Списък"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Други файлове (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Нов Списък"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Нов Списък (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Файл"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Отваряне на файл(ове)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Добави файл(ове)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Добави папка/и"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Добави местоположение"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Нов списък"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Зареждане на списък"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Зпаметяване на списъка"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Изход от приложението"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Редактиране"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Изчистване"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Маркиране на всички"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Демаркиране на всички"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Обръщане на избора"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Подбиране"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Премахване"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Изрязване"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Търсене"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Сортиране по"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Заглавие"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Номер на файла"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Албум"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Изпълнител"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Дата"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Произволно"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Предпочитани"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Предпочитания"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Изглед"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Панел на състоянието"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Заглавия на колоните"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Етикети"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Тонкоректор"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Изпълнява се"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Подредба"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Линейно"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Разбъркване на песни"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Разбъркване на албуми"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Произволно"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Повтаряемост"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Повтаряне след всички"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Повтаряне на една песен"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Без повтаряне"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Превъртане следва изпълняването"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Курсора следва изпълняването"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Спри след текущото"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Прескачане до текущата песен"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Помощ"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Отчет"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "От_носно"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "П_реводачи"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Търсене"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Спиране"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Пускане"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Паузиране"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Предишна"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Следваща"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Произволно изпълняване"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Относно"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Изход"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Свойства за Песента"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Настройки"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Прилагане"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Затваряне"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Метаданни"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Свойства"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Име на нова колона:"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Вид:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Индекс на елемента"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Изпълнява се"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Обложка на албума"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Изпълнител - Албум"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Продължителност"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Номер на песента"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Група / Изпълнител на албума"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Формат:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Подравняване:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Ляво"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Дясно"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Отказ"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Да"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Изходна приставка:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Иходно устройство:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Винаги да се конвертира 8-битов звук в 16-битов"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Звук"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Режим на усилване:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Деактивиране"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Име на файла"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Скала за усилване на максимума"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 дБ"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 дБ"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Режим на усилване:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Усилване за цялата система:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Добавяне на файлове с команда (или файлов мениджър) в този лист за "
"изпълнение:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "При следващото стартиране, продължи предишната сесия"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Да не се добавят от архиви, когато се добавят папки"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Спри след текущото"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Възпроизвеждане"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Настройване"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "Запамети зададеното"
+msgstr "Запамети зададеното за DSP (Разпределение на цифровите сигнали)"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "Заре_ждане"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "Разпределение на цифровите сигнали (DSP)"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
-msgstr "При затваряне, минимизирай в таблата"
+msgstr "При затваряне, минимизирай в панела"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Средният бутон на мишката затваря листа за изпълнение"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Скрий иконата в таблата"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Използване на удебелен шрифт за текущата песен"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Скриване на елемент от менюто - \"Изтриване от Диска\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
"Автоматично именуване на листа за изпълнение, когато е добавена само една "
"папка"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Опресняване (пъти в секунда):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Заглавен текст при изпълнение:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Заглавен текст при спиране:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Приставка за графичния вид (промяната изисква рестарт):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Графичен вид"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Презапис"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "На преден план"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "На фон"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Цвят на бутона за Превъртане/Усилване"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Среден"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Светъл"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Тъмен"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Основен"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Текст"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Цветове на разделната лента"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Презапис (увеличава се производителността, но се губи естетиката)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Четен ред"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Нечетен ред"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Маркираният ред"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Маркираният текст"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Курсор"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Цветове на листа"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Цветове"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Активиране на помощен сървър"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Адрес на помощния сървър:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Порт на помощния сървър:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Вид помощен сървър:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Потребителско име:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Парола:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Мрежа"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Версия:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Приставки"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "Адрес:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Групиране по"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Сортиране по..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Формат"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Възходящ"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Низходящ"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Подбиране"
+msgstr "Избор на приставка за DSP (разпределение на цифровите сигнали)"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Приставка"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Настройки на редактора на етикети"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Запиши ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Запиши ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Зпаиши APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Лента ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Лента ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Лента APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Версия на ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Препоръчителна)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Транслиране на символите за ID3v1 (по подразбиране е iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Запиши ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Артист/Албум"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Номер на Песента"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Изтрий файловете от носителя"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -923,49 +960,48 @@ msgstr ""
"(Това съобщение, може да бъде деактивирано от настройките\n"
"на приставката за Графичния вид)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Предупреждение"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Добави в опашката за изпълнение"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Премахни от опашката за изпълнение"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Презареди метаданните"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Прехани от носителя"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Добавяне на Колона"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Редактиране на Колона"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Премахване на Колона"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Групиране по"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Нищо"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Изпълнител/Дата/Албум"
@@ -973,7 +1009,7 @@ msgstr "Изпълнител/Дата/Албум"
msgid "Open file..."
msgstr "Отвори файл..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Настройване на %s"
@@ -982,19 +1018,23 @@ msgstr "Настройване на %s"
msgid "Default Audio Device"
msgstr "Аудио устройство по подразбиране"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Добави"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Системни \"Бързи\" клавиши"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Слот"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Местоположение"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Клавишна комбинация"
@@ -1006,137 +1046,144 @@ msgstr "Добавяне на файлове..."
msgid "Initializing..."
msgstr "Разпознаване..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Имате променяни данни за тази песен."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Да се затвори ли прозореца?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Множество стойности]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ключ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Стойност"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Записване на етикетите..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Име:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Имената на полетата не могат да започват с \":\" или \"_\""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Не може да бъде добавено поле"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Вече съществува поле със същото име, моля пробвайте с друго!"
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Да се премахне ли избраното поле?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Добавяне на поле"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Премахване на поле"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Употреба: deadbeef [опции] [файл(ове)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опции:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr "--help или -h Изписва помощ (това съобщение) и излиза\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr "--quit Изход от Плейъра\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr "--version Изписва информация за версията и излиза\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr "--play Възпроизвеждане\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr "--stop Спиране\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr "--pause Паузиране\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr "--toggle-pause Превключване в\\от режим на пауза\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr "--play-pause Започване на възпроизвеждане, ако е спряно или излизане от "
+msgstr ""
+"--play-pause Започване на възпроизвеждане, ако е спряно или излизане от "
"режим на пауза\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr "--next Следващата песен в листа\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr "--prev Предишната песен в листа\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr "--random Произволна песен от листа\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr "--queue Прибавяне на файл(ове) в съществуващия лист\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr "--nowplaying \"Формат\" Изписва Форматирано име\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1147,60 +1194,35 @@ msgstr ""
"[b]-Албум, [l]-Времетраене, [n]-Номер на песента,\n"
"[y]-Година, [c]-Коментар, [r]-Авторски права, [e]-Изминали\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr "пр.: --nowplaying \"%%a - %%t\" ще изведе \"изпълнител - песен\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr "За повече информация: http://sourceforge.net/apps/mediawiki/deadbeef/index.p"
-"hp?title=Title_Formatting\n"
+msgstr ""
+"За повече информация: http://sourceforge.net/apps/mediawiki/deadbeef/index."
+"php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "По подразбиране"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Да"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Не"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Препоръчителна)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Възходящо\n"
-"Низходящо"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Деактивиране\n"
-"Песен\n"
-"Албум"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1226,7 +1248,7 @@ msgstr ""
"Група/Албумен Изпълнител\n"
"Обичайни"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1234,13 +1256,40 @@ msgstr ""
"Ляво\n"
"Дясно"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Деактивиране\n"
+"Песен\n"
+"Албум"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Възходящо\n"
+"Низходящо"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Препоръчителна)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Не е открито Х-изображение: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1253,7 +1302,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Добавяне на Аудио диск"
#: ../translation/extra.c:4
@@ -1269,7 +1319,7 @@ msgstr "Използване на ALSA ресемплинг"
msgid "Release device while stopped"
msgstr "Освободи устройство след спиране"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Предпочитан размер на буфера"
@@ -1298,488 +1348,805 @@ msgstr "Парола:"
msgid "Scrobble URL"
msgstr "Адрес на помощния сървър"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Файл за устройство"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "Решение за OSS4 бъг"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr ""
+msgstr "Период за обновяване на кеш (часове)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
-msgstr ""
+msgstr "Извличане от вградените етикети"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
-msgstr ""
+msgstr "Извличане от местна папка"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
-msgstr ""
+msgstr "Маска за обложка от файл"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
-msgstr ""
+msgstr "Извличане от last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
-msgstr ""
+msgstr "Извличане от albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Оразмеряване на обложката към по-дългата страна"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
-msgstr ""
+msgstr "Използвай CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "Предпочита се CD-Text пред CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
-msgstr ""
+msgstr "CDDB външен линк (пр: \"freedb.org\")"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
-msgstr ""
+msgstr "CDDB номер на порт (пр: \"888\")"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "Предпочита се CDDB протокол пред HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
-msgstr ""
+msgstr "Прилагане на поддръжка за NRG изображения"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
+msgstr "Подобряване на качеството (от 0 до 2, по-голямото е по-добро)"
+
+#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
msgstr ""
#. Game_Music_Emu decoder plugin
-#: ../translation/extra.c:37
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
+msgstr "Най-голяма дължина на песен (в минути)"
+
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Дължина на песен по подразбиране (секунди)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
msgstr ""
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
-#, fuzzy
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
-msgstr "Изтрий файловете от носителя"
+msgstr "Искай потвърждение за изтриване на файлове от диска"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
-msgstr ""
+msgstr "Чувствителност на контрола на звука от иконата"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
-msgstr ""
+msgstr "Друга икона"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
-msgstr ""
+msgstr "Изпълни gtk_init с добавен -sync (режим на дебъгване)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "Добави разделители между елементите на контекстното меню на добавката"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr ""
+msgstr "Формат на заглавието в известието"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr ""
+msgstr "Формат на съдържанието в известието"
-#: ../translation/extra.c:47
-#, fuzzy
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr "Обложка на албума"
+msgstr "Показвай обложка на албума"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Размер на обложката (пиксели)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
-msgstr ""
+msgstr "Сървър на PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
-msgstr ""
+msgstr "Честота"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
-msgstr ""
+msgstr "Относително положение на полето за превъртане"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
-msgstr ""
+msgstr "Абсолютно положение на полето за превъртане"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
-msgstr ""
+msgstr "Размени аудио частите (превключване ако всичко е статично)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr ""
+msgstr "Активиране на HVSC Songlength база данни"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlenghts.txt (от HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Части за период (8 или 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr ""
+msgstr "Дължина на песен по подразбиране (секунди)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
-msgstr ""
+msgstr "Timidity++ празен файл с настройки"
-#: ../translation/extra.c:66
-#, fuzzy
+#: ../translation/extra.c:70
msgid "Track Title"
-msgstr "Номер на Песента"
+msgstr "Заглавие на песента"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
-msgstr ""
+msgstr "Изпълнител"
-#: ../translation/extra.c:72
-#, fuzzy
+#: ../translation/extra.c:76
msgid "Total Tracks"
-msgstr "Заглавие/Изпълнител"
+msgstr "Всички песни"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
-msgstr ""
+msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
-msgstr ""
+msgstr "Композитор"
-#: ../translation/extra.c:75
-#, fuzzy
+#: ../translation/extra.c:79
msgid "Disc Number"
-msgstr "Номер на файла"
+msgstr "Колекция"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
-msgstr ""
+msgstr "Коментар"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
-msgstr ""
+msgstr "Кодировчик/Доставчик"
-#: ../translation/extra.c:79
-#, fuzzy
+#: ../translation/extra.c:83
msgid "Location"
-msgstr "Добави местоположение"
+msgstr "Местоположение"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
-msgstr ""
+msgstr "Индекс на подзаглавието"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тип(ове) Етикет(и)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Вградени фрази"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодек"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Разширение на файловете (разделяне с \";\")"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Превръщане"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
+msgstr "Честота на резултатния файл"
+
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "Качесво/Алгоритъм"
+
+#: ../translation/extra.c:95
+msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
+"Автоматична честота (презаписва зададената честота на резултатния файл)"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../translation/extra.c:91
-msgid "Automatic Samplerate (overrides Target Samplerate)"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
-msgid "The file already exists. Overwrite?"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Активиране на помощен сървър"
+
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr "Файлът вече съществува. Презипасване?"
+
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
-msgstr ""
+msgstr "Внимание при превръщане"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "Моля изберете кодиране"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Грешка при превръщане"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Превръщане..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "Маркиране на всички"
+msgstr "Избор на директория..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "Неуспех при записване за избраното кодиране"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
+"Проверете правата за избраната папка, пробвайте да изберете друго име на "
+"файла или освободете място на диска."
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
-msgstr ""
+msgstr "Дублират се имената. Пробвайте да изберете друго име."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Грешка"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Добави ново кодиране"
-#: ../plugins/converter/convgui.c:724
-#, fuzzy
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr "Редактиране на Колона"
+msgstr "Редактиране на кодирането"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "Запамети зададеното"
+msgstr "Премахни зададеното"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
-msgstr ""
+msgstr "Това ще премахне зададения профил. Сигурни ли сте?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "Планове за кодиране"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr ""
+msgstr "Слагане на добавка в DSP канала"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "Неуспех при запаметяване на DSP профила"
-#: ../plugins/converter/convgui.c:1098
-#, fuzzy
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr "Запамети зададеното"
+msgstr "Нов DSP профил"
-#: ../plugins/converter/convgui.c:1183
-#, fuzzy
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr "Запамети зададеното"
+msgstr "Редактирай DSP профила"
-#: ../plugins/converter/convgui.c:1203
-#, fuzzy
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr "Запамети зададеното"
+msgstr "DSP профили"
-#: ../plugins/converter/interface.c:94
-#, fuzzy
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
-msgstr "Иходно устройство:"
+msgstr "Резултатна директория:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Пресъздаване на структурата от директории, започвайки от:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr "Изходна приставка:"
+msgstr "Име на резултатния файл:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"Разширението (пр: .mp3) ще бъде прикрепено автоматинчо.\n"
+"За използване на настройките по подразбиране оставете полето празно (%a - "
+"%t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "Кодиране:"
-#: ../plugins/converter/interface.c:163
-#, fuzzy
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr "Запамети зададеното"
+msgstr "DSP профил:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "Брой на нишките:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "Формат на резултатната честота:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "Запази формата от източника"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "8-битов подпис"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "16-битов подпис"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "24-битов подпис"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "32-битов подпис"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "32-битов (плаващ)"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "Когато файла съществува:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "Подсказване"
-#: ../plugins/converter/interface.c:225
-#, fuzzy
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr "Презапис"
-
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
+msgstr "Презаписване"
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "Зареди зададено"
+msgstr "Редактиране на профила за кодиране"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "Неименуван профил за кодиране"
-#: ../plugins/converter/interface.c:410
-#, fuzzy
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr "Изходна приставка:"
+msgstr "Разширение на резултатния файл:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "Пример: mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "Команда:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"Например: характерно \"- %o\"\n"
+"за файла източник \"%i\", за резултатния файл \"%o\", за стандартен източник "
+"\"-\""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>\"%o\" - име на резултатен файл\n"
+"име на временния източник - \"%i\"</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "Метод:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "Поток"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "Временен файл"
-#: ../plugins/converter/interface.c:480
-#, fuzzy
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
-msgstr "Зпаиши APEv2"
+msgstr "Записване на APEv2"
-#: ../plugins/converter/interface.c:486
-#, fuzzy
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
-msgstr "Запиши ID3v1"
+msgstr "Записване на ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
-#, fuzzy
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
-msgstr "Запиши ID3v2"
+msgstr "Записване на ID3v2"
-#: ../plugins/converter/interface.c:520
-#, fuzzy
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr "Създаване на етикети"
+msgstr "<b>Създаване на етикети</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "Редактор на DSP профили"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "Неозаглавен DSP профил"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Презаписване"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Временен файл"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Редактиране"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Затваряне"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Редактиране на Колона"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Команда:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Разбъркване на песни"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Множество стойности]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Местоположение"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Премахване"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Нов Списък"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
msgstr ""
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Коментар"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Добавяне на Колона"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Това ще премахне зададения профил. Сигурни ли сте?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Настройване"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Настройки"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Графичен вид"
+
+#~ msgid "Slot"
+#~ msgstr "Слот"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Да се премахне ли избраното поле?"
+
#~ msgid "Save playlist as"
#~ msgstr "Запаметяване на списъка като..."
diff --git a/po/bn.po b/po/bn.po
index a9c4b205..0311ba07 100644
--- a/po/bn.po
+++ b/po/bn.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: bn\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-06-15 12:31+0600\n"
"Last-Translator: Israt Jahan <israt@ankur.org.bd>\n"
"Language-Team: LBengali <ankur-bd-l10n@googlegroups.com>\n"
@@ -55,9 +55,9 @@ msgstr "সহায়িকা ফাইল লোড করতে ব্যর
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "সহায়তা"
@@ -71,123 +71,127 @@ msgstr "DeaDBeeF %s সম্বন্ধে"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s লগপরিবর্তন"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, fuzzy, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF এখন চালাচ্ছে"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "প্লেলিস্ট সম্পাদন করুন"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "শিরোনাম:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "প্লেলিস্ট পুনরায় নামকরণ করুন"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "প্লেলিস্ট অপসারণ করুন"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "নতুন প্লেলিস্ট যোগ করুন"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "পূর্বনির্ধারিত DeaDBeeF EQ সংরক্ষণ করুন"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "পূর্বনির্ধারিত DeaDBeeF EQ ফাইলসমূহ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "পূর্বনির্ধারিত DeaDBeeF EQ লোড করুন..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "পূর্বনির্ধারিত DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "পূর্বনির্ধারিত Foobar2000 EQ ইম্পোর্ট করুন..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "পূর্বনির্ধারিত Foobar2000 EQ (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "পূর্বনির্ধারিত অংশ লোড করুন"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "পূর্বনির্ধারিত Foobar2000 ইম্পোর্ট করুন"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "সক্রিয়"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "সবগুলো শূন্য"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "শূন্য প্রিম্প"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "শূন্য ব্যান্ড"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "প্রথম দিন %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d দিন %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "বন্ধ | %d ট্র্যাকসমুহ | %s সর্বমোট যতটুকু সময় চালানো হয়েছে"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "মোনো"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "স্টেরিও"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "বিরত | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -195,735 +199,768 @@ msgstr ""
"%s%s %s| %dHz | %d বিট | %s | %d:%02d / %s | %d ট্র্যাকসমূহ | %s যতটুকু সময় "
"চালানো হয়েছে"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "নতুন ভাবে প্লেলিস্ট সংরক্ষণ করুন"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF প্লেলিস্ট ফাইলসমূহ (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "প্লেলিস্ট লোড করুন"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "অন্যান্য ফাইলসমূহ (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "নতুন প্লেলিস্ট"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "নতুন প্লেলিস্ট (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "ফাইল (_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "ফাইল খুলুন (_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "ফাইল যোগ করুন"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "ফোল্ডার যোগ করুন"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "অবস্থান যোগ করুন"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "নতুন প্লেলিস্ট"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "প্লেলিস্ট লোড করুন"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "প্লেলিস্ট সংরক্ষণ করুন"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "প্রস্থান করুন (_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "সম্পাদনা করুন (_Q)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "মুছে ফেলুন (_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "সব নির্বাচন করুন"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "সব অনির্বাচিত করুন"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "বিপরীতমুখী নির্বাচন"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "নির্বাচন"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "অপসারণ"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "ছাঁটা"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "খুঁজুন (_F)"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "শিরোনাম"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "ফাইল সংখ্যা"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "অ্যালবাম"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "শিল্পী"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "এলোমেলো"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "স্বনির্ধারিত"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "পছন্দসমূহ"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "প্রদর্শন করুন (_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "স্ট্যাটাস বার"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "কলাম শীর্ষচরণ"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "ট্যাব"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "ইকুয়ালাইজার"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "প্লেব্যাক (_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "ক্রম"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "রৈখিক"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "এলোমেলো করা"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "এলোমেলো করা"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "এলোমেলো"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "পুনরাবৃত্তি হচ্ছে"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "সবগুলো পুনরাবৃত্তি করুন"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "একক গান পুনরাবৃত্তি করুন"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "পুনরাবৃত্তি হবে না"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "স্ক্রল প্লেব্যাককে অনুসরণ করে"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "কার্সার প্লেব্যাককে অনুসরণ করে"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "বর্তমানটি হয়ে যাওয়ার পর থামুন"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "সহায়তা (_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "লগপরিবর্তন (_C)"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "সম্বন্ধে (_A)"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "অনুসন্ধান করুন"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "বন্ধ করুন"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "চালান"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "বিরতি"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "পূর্ববর্তী"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "পরবর্তী"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "এলোমেলোভাবে চালান"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "সম্বন্ধে"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "প্রস্থান করুন"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "ট্র্যাক বৈশিষ্ট্যাবলী"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "প্রয়োগ করুন (_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "বন্ধ করুন (_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "মেটাডাটা"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "বৈশিষ্ট্যাবলী"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "নতুন কলাম শিরোনাম দিন"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "টাইপ করুন:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "চলছে"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "অ্যালবাম শিল্প"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "শিল্পী - অ্যালবাম"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "স্থিতিকাল"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "ট্র্যাক নং"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "ব্যান্ড / অ্যালবাম শিল্পী"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "বিন্যাস:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "প্রান্তিককরণ:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "বাম"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "ডান"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "বাতিল (_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "ঠিক আছে (_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "অাউটপুট প্লাগইন:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "অাউটপুট ডিভাইস:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "শব্দ"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "পুনরায় চালানোর মোড:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "নিষ্ক্রিয়"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "ট্র্যাক"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "পুনরায় চালনার সর্বোচ্চ মান"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "পুনরায় চালানোর মোড:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "বর্তমানটি হয়ে যাওয়ার পর থামুন"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
#, fuzzy
msgid "Playback"
msgstr "প্লেব্যাক (_P)"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "কনফিগার"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "ট্রে ছোট করতে বন্ধ করুন"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "মাউসের মধ্যবর্তী বোতাম দ্বারা প্লেলিস্ট বন্ধ করা হয়"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "উপেক্ষা করা"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "পুরোভূমি"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "পটভূমি"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "সিকবার/ভলিউমবার এর রঙ"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "মধ্যবর্তী"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "হালকা"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "গাঢ়"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "ভিত্তি"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "টেক্সট"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "ট্যাবের অংশের রং"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "উপেক্ষা (GTK ট্রিভিউ থিমিং হারায়, কিন্তু পরিণত করার গতি বাড়ায়)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "জোড় সংখ্যক সারি"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "বিজোড় সংখ্যক সারি"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "নির্বাচিত সারি"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "নির্বাচিত টেক্সট"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "কারসার"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "প্লেলিস্টের রং"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "প্রক্সি সার্ভার সক্রিয় করুন"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "প্রক্সি সার্ভারের ঠিকানা:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "প্রক্সি সার্ভারের পোর্ট:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "প্রক্সির ধরণ:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "প্রক্সি ব্যবহারকাীর নাম:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "প্রক্সি পাসওয়ার্ড:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "নেটওয়ার্ক"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "প্লাগইন"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "যা অনুসারে গ্রুপ হবে"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "বিন্যাস:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "নির্বাচন"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "প্লাগইন"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "ট্যাগ লেখক"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 লিখুন"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 লিখুন"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 লিখুন"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 অংশ"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 অংশ"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 অংশ"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 সংস্করণ"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "২.৩ (সুপারিশকৃত)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "২.৪"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 অক্ষর এনকোড করছে (iso8859-1 পূর্বনির্ধারিত)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 লিখুন"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "শিল্পী / অ্যালবাম"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "ট্র্যাক নং"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "ডিস্ক থেকে ফাইল অপসারণ করুন"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -931,49 +968,48 @@ msgstr ""
"ফাইল মুছে যাবে। চালিয়ে যেতে চান?\n"
"(GTKUI প্লাগইন সেটিং এ এই ডায়ালগটি বন্ধ করা যেতে পারে)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "সতর্কবানী"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "প্লেব্যাকের সারিতে যোগ করুন"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "প্লেব্যাক সারি থেকে অপসারণ করুন"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "মেটাডাটা পুনরায় লোড করুন"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "ডিস্ক থেকে অপসারণ করুন"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "কলাম যোগ করুন"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "কলাম সম্পাদনা করুন"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "কলাম অপসারণ করুন"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "যা অনুসারে গ্রুপ হবে"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "কোনটি না"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "শিল্পী/তারিখ/অ্যালবাম"
@@ -981,7 +1017,7 @@ msgstr "শিল্পী/তারিখ/অ্যালবাম"
msgid "Open file..."
msgstr "ফাইল খুলুন..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "কনফিগার"
@@ -990,19 +1026,23 @@ msgstr "কনফিগার"
msgid "Default Audio Device"
msgstr "পূর্বনির্ধারিত অডিও ডিভাইস"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "যোগ"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "গ্লোবাল হটকীসমূহ"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "স্লট"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "অবস্থান যোগ করুন"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "কী সমাবেশ"
@@ -1014,139 +1054,144 @@ msgstr "ফাইল যোগ করা হচ্ছে..."
msgid "Initializing..."
msgstr "আরম্ভ করা হচ্ছে..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "আপনি এই ট্র্যাকে ডাটা পরিবর্তন করেছেন।"
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "সত্যিই উইন্ডোটি বন্ধ করতে চান?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "কী"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "মান"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "সত্যিই উইন্ডোটি বন্ধ করতে চান?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "ফাইল যোগ করুন"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "অপসারণ"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "ব্যবহারের নিয়ম: deadbeef [অপশন] [ফাইল]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "অপশন:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --সহায়তা অথবা -h সহায়তা মুদ্রণ করুন (এই বার্তা) এবং প্রস্থান করুন\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --বন্ধ করুন প্লেয়ার বন্ধ করুন\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --সংস্করণ সংস্করণের তথ্য মুদ্রণ করে বন্ধ করুন\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --চালান প্লেব্যাক শুরু করুন\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --বন্ধ করুন প্লেব্যাক বন্ধ করুন\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --বিরতি প্লেব্যাক বিরত রাখুন\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --পরবর্তী প্লেলিস্টে পরবর্তী গান\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --পূর্ববর্তী প্লেলিস্টে পূর্ববর্তী গান\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --এলোমেলো প্লেলিস্টে এলোমেলো গান\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --সারি বিদ্যমান প্লেলিস্টে সবশেষে যোগ করা ফাইল\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --FMT এখন চলছে স্ট্যান্ডআউটে বিন্যাসিত ট্র্যাক নাম মুদ্রণ করুন\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1157,7 +1202,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1166,50 +1211,26 @@ msgstr ""
" e.g.: --এখন চলছে \"%%a - %%t\" মুদ্রণ হবে \"শিল্পী - "
"শিরোনাম\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "পূর্বনির্ধারিত"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "হ্যাঁ"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "না"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"২.৩ (সুপারিশকৃত)‌‌\n"
-"২.৪"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"নিষ্ক্রিয়\n"
-"ট্র্যাক\n"
-"অ্যালবাম"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1236,7 +1257,7 @@ msgstr ""
"ব্যান্ড / অ্যালবাম শিল্পী\n"
"স্বনির্ধারিত"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1244,13 +1265,38 @@ msgstr ""
"বাম\n"
"ডান"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"নিষ্ক্রিয়\n"
+"ট্র্যাক\n"
+"অ্যালবাম"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"২.৩ (সুপারিশকৃত)‌‌\n"
+"২.৪"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "pixmap ফাইল পায়নি: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1260,7 +1306,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "অডিও CD যোগ করুন"
#: ../translation/extra.c:4
@@ -1276,7 +1323,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1309,488 +1356,810 @@ msgstr "প্রক্সি পাসওয়ার্ড:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "ডিস্ক থেকে ফাইল অপসারণ করুন"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "অ্যালবাম শিল্প"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "ট্র্যাক নং"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "শিরোনাম / ট্র্যাক শিল্পী"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "ফাইল সংখ্যা"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "অবস্থান যোগ করুন"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "ট্যাগের ধরণ"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "সন্নিবেশিত তথ্যপৃষ্ঠা"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "প্রক্সি সার্ভার সক্রিয় করুন"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "সব নির্বাচন করুন"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "কলাম সম্পাদনা করুন"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "অাউটপুট ডিভাইস:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "অাউটপুট প্লাগইন:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "পূর্বনির্ধারিত অংশ সংরক্ষণ করুন"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "উপেক্ষা করা"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "পূর্বনির্ধারিত অংশ লোড করুন"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "অাউটপুট প্লাগইন:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "APEv2 লিখুন"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "ID3v1 লিখুন"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "ID3v2 লিখুন"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "ট্যাগ লেখক"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "উপেক্ষা করা"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "সম্পাদনা করুন (_Q)"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "বন্ধ করুন (_C)"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "কলাম সম্পাদনা করুন"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "এলোমেলো করা"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "শিরোনাম / ট্র্যাক শিল্পী"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "অবস্থান যোগ করুন"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "অপসারণ"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "নতুন প্লেলিস্ট"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "কলাম যোগ করুন"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "কনফিগার"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "স্লট"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "সত্যিই উইন্ডোটি বন্ধ করতে চান?"
+
#~ msgid "Save playlist as"
#~ msgstr "প্লেলিস্ট নতুনভাবে সংরক্ষণ করুন"
diff --git a/po/ca.po b/po/ca.po
index e0256c9a..0e6cc85d 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-09-01 00:39+0200\n"
"Last-Translator: sisco <sisco.garcia@ubuntu.cat>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -56,9 +56,9 @@ msgstr "Error en la càrrega del fitxer d'ajuda"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ajuda"
@@ -72,928 +72,960 @@ msgstr "Sobre DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Registre de canvis al DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Edita la llista de reproducció"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Títol:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Reanomena la Llista de Reproducció"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Elimina la Llista de Reproducció"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Afegeix una Nova Llista de Reproducció"
# Suposo que el més correcte seria «Desa els preajustaments d'equalització del DeaDBeeF», però ho trobo excessiu.
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
#, fuzzy
msgid "Save DeaDBeeF EQ Preset"
msgstr "Desa el DeaDBeeF EQ Preset"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
#, fuzzy
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Fitxers de preajustament del DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Carrega els Preajustaments del DeaDBeeF EQ..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Preajustaments del DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importa els Preajustaments Foobar2000 EQ..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Preajustaments Foobar2000 EQ (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Desa els preajustaments"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Carrega els preajustaments"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importa els preajustaments del Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Activa"
# podria ser «tots muts»?
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
#, fuzzy
msgid "Zero All"
msgstr "Tots nuls"
# Podria ser «emmudeix el preamplificador»?
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
#, fuzzy
msgid "Zero Preamp"
msgstr "Preamplificador a Zero"
# Podria ser «emmudeix les bandes»?
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
#, fuzzy
msgid "Zero Bands"
msgstr "Bandes a zero"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Desa els preajustaments"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, fuzzy, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dia %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, fuzzy, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dies %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, fuzzy, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Aturat | %d temes | %s temps total"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
#, fuzzy
msgid "Stereo"
msgstr "Estèreo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, fuzzy, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "En pausa |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, fuzzy, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d temes | %s temps total"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Anomena i desa la Llista de Reproducció"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Fitxers de la Llista de Reproducció DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Carrega la Llista de Reproducció"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Altres fitxers (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Llista de Reproducció Nova"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Llista de Reproducció Nova (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fitxer"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Obre fitxer(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Afegeix fitxer(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Afegeix fitxer(s)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Afegeix localització"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova llista de reproducció"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Carrega la llista de reproducció"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Desa la llista de reproducció"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Surt"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Edita"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Neteja"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Selecciona-ho tot"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Deselecciona-ho tot"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverteix la selecció"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selecció"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Elimina"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr ""
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
#, fuzzy
msgid "_Find"
msgstr "_Troba"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Títol"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "Nombre de fitxer"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Àlbum"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artista"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aleatori"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalització"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferències"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Vista"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra d'estat"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Encapçalaments de columna"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Pestanyes"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalitzador"
# Suposo que «Playback» és admès hores d'ara.
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reproducció"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordre"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
#, fuzzy
msgid "Linear"
msgstr "Lineal"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Shuffle"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Shuffle"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Aleatori"
-
# Podria ser «bucle»?
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
#, fuzzy
msgid "Looping"
msgstr "Repeteix"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
#, fuzzy
-msgid "Loop All"
+msgid "Loop all"
msgstr "Repeteix totes"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
#, fuzzy
-msgid "Loop Single Song"
+msgid "Loop single song"
msgstr "Repeteix una sola cançó"
# Potser és millor «Deixa de repetir»?
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
#, fuzzy
-msgid "Don't Loop"
+msgid "Don't loop"
msgstr "No repeteixis"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
#, fuzzy
msgid "Scroll follows playback"
msgstr "L'escroll segueix la reproducció"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
#, fuzzy
msgid "Cursor follows playback"
msgstr "El cursor segueix la reproducció"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Atura't en acabar l'actual"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Ajuda"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Registre de Canvis"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Sobre"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Cerca"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Atura"
# Potser ja s'admet «Play»?
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
#, fuzzy
msgid "Play"
msgstr "Engega"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "En pausa"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Anterior"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Següent"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Reproducció aleatòria"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Sobre"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Surt"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propietats del tema"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplica"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Tanca"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadada"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propietats"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Introduïu un nou títol de columna aquí"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipus:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Reproduint"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr ""
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artista - Àlbum"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr ""
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr ""
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Banda / Àlbum Artista"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alineació:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Esquerra"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Dreta"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancel·la"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Correcte"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
#, fuzzy
msgid "Output plugin:"
msgstr "Connexió de sortida:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositiu de sortida"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "So"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr ""
# Pista?
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
#, fuzzy
msgid "Track"
msgstr "Tema"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Atura't en acabar l'actual"
+
# Suposo que «Playback» és admès hores d'ara.
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
#, fuzzy
msgid "Playback"
msgstr "_Reproducció"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr ""
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Desa els preajustaments"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr ""
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr ""
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr ""
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr ""
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr ""
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr ""
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Selecció"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr ""
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr ""
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr ""
@@ -1001,7 +1033,7 @@ msgstr ""
msgid "Open file..."
msgstr ""
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr ""
@@ -1010,19 +1042,23 @@ msgstr ""
msgid "Default Audio Device"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Afegeix localització"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -1034,138 +1070,144 @@ msgstr "Afegint fitxers..."
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Afegeix fitxer(s)"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Elimina"
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr ""
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr ""
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr ""
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr ""
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1173,52 +1215,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1233,19 +1256,39 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1255,7 +1298,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Afegeix Àudio CD"
#: ../translation/extra.c:4
@@ -1271,7 +1315,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1300,479 +1344,788 @@ msgstr ""
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr ""
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr ""
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Títol"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Nombre de fitxer"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Afegeix localització"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Selecciona-ho tot"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Desa els preajustaments"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Desa els preajustaments"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Desa els preajustaments"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Desa els preajustaments"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Dispositiu de sortida"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Connexió de sortida:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Desa els preajustaments"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Carrega els preajustaments"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Connexió de sortida:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr ""
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr ""
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr ""
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Edita"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Tanca"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Shuffle"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Shuffle"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Afegeix localització"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Elimina"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Llista de Reproducció Nova"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Afegeix localització"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Elimina"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
#~ msgid "Save playlist as"
#~ msgstr "Anomena i desa la llista de reproducció"
diff --git a/po/cs.po b/po/cs.po
index 95e39eea..dc141d4c 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -8,26 +8,26 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeeF\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-11-18 18:16+0100\n"
-"Last-Translator: Vašek Kovářík <l3d9z6@seznam.cz>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-08-14 13:25+0200\n"
+"Last-Translator: ALIUM <info@aloisnespor.info>\n"
"Language-Team: čeština <>\n"
-"Language: \n"
+"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Country: Czech Republic\n"
"X-Poedit-Language: Czech\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
#: ../plugins/gtkui/callbacks.c:123
msgid "Supported sound formats"
msgstr "Podporované zvukové formáty"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Další soubory (*)"
+msgstr "Všechny soubory (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -57,9 +57,9 @@ msgstr "Selhalo načtení souboru nápovědy"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Nápověda"
@@ -73,122 +73,126 @@ msgstr "O aplikaci DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s ChangeLog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF přeložili"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Upravit playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Název:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Přejmenovat playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Odstranit playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Přidat nový playlist"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Uložit předvolbu ekvalizéru DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Soubory předvoleb ekvalizéru DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Načíst předvolby ekvalizéru DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Předvolby ekvalizéru DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importovat předvolby ekvalizéru Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Předvolby ekvalizéru Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Uložit předvolbu"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Načíst předvolbu"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importovat předvolby Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Povolit"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Vynulovat vše"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Vynulovat předzesilovač"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Vynulovat pásma"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Předvolby"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 den %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dní %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Zastaveno | %d stop | %s celkový čas přehrávání"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Zastaveno | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -196,727 +200,761 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d stop | %s celkový čas "
"přehrávání"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Uložit playlist jako"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Soubory playlistů DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Načíst playlist"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Další soubory (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nový playlist"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nový playlist (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Soubor"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Otevřít soubor(y)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Přidat soubor(y)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Přidat složku(y)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Přidat umístění"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nový playlist"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Načíst playlist"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Uložit playlist"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Zavřít"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Upravit"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Smazat"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Vybrat vše"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
-msgstr "Zrušit výběr "
+msgstr "Zrušit výběr"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Invertovat výběr"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Výběr"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Odstranit"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Ořez"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Hledat"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Třídit dle"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Název"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Číslo stopy"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Umělec"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Náhodně"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Vlastní"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Nastavení"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Zobrazit"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Stavový řádek"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Záhlaví sloupců"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Záložky"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekvalizér"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Přehrát"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Pořadí"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineárně"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Náhodné stopy"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Náhodná alba"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Náhodně"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Opakování"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Opakovat vše"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Opakovat jednotlivou skladbu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Neopakovat"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Posunovat s přehráváním"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Sledovat kurzorem přehrávání"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Zastavit po aktuální"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Přeskočit na aktuální stopu"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Nápověda"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_O aplikaci"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Přeložili"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Hledat"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Zastavit"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Přehrát"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pauza"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Předchozí"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Následující"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Přehrát náhodně"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Info"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Konec"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Vlastnosti skladby"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Nastavení"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Použít"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Zavřít"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Vlastnosti"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Zde vložit nový název sloupce"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Rejstřík"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Přehrávání"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Obal alba"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Umělec - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Trvání"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Číslo stopy"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr "Skupina/umělec alba"
+msgstr "Skupina / umělec alba"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formát:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Zarovnání:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Vlevo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Vpravo"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Zrušit"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Výstupní zásuvné moduly:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Výstupní zařízení:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Vždy převést 8 bit audio na 16 bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Zvuk"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Režim replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Zakázat"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Stopa"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Měřítko vrcholu replaygain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Předzesilovač replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr "Předzesilovač replaygain:"
+msgstr "Globální předzesilovač (preamp):"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Přidat soubory z příkazové řádky (nebo souborového manažeru) do tohoto "
"playlistu:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Při startu obnovit předchozí sezení"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Ignorovat archivy během přidávání adresářů"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Zastavit po aktuální"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Přehrát"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Nastavit"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Předvolba DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Načíst"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Zavřít do traye"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Zavřít playlist prostředním tlačítkem myši"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Skrýt ikonu v trayi"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Použít tučný font pro přehrávanou stopu"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Skrýt položku \"Smazat z disku\" z kontextového menu"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Automaticky pojmenovat přidaný adresář"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Četnost obnovení rozhraní (za vteřinu):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Titulní text během přehrávání:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Titulní text během zastavení:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI Plugin (vyžaduje restart):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Předefinovat"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Popředí"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Pozadí"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Barvy průběhu hledání/hlasitosti"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Střední"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Světlé"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tmavé"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Základní"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Barvy lišty záložek"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Předefinovat (ztratí GTK téma, ale zrychlí vykreslování)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Sudý řádek"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Lichý řádek"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Vybraný řádek"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Vybraný text"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kurzor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Barvy playlistu"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Barvy"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Povolit server Proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresa Proxy serveru:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port Proxy serveru:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Typ Proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Uživatelské jméno Proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Heslo Proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Síť"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr "Verze:"
+msgstr "Verze: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Zásuvné moduly"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Seskupit dle"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Třídit dle..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formát"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Vzestupně"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Sestupně"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Vybrat zásuvný modul DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Zásuvný modul"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Nastavení autora popisku"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Zapsat ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Zapsat ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Zapsat APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Odstranit ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Odstranit ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Odstranit APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Verze ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Doporučeno)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Kódování znaků ID3v1 (výchozí je iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Zapsat ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Umělec / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
-msgstr "Stopa č."
+msgstr "Stopa č"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Smazat soubory z disku"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -924,49 +962,48 @@ msgstr ""
"Soubory budou ztraceny. Pokračovat?\n"
"(Tento dialog lze vypnout v nastavení zásuvného modulu GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Upozornění"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Přidat do fronty přehrávání"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Odstranit z fronty přehrávání"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Znovu načíst metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Odstranit z disku"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Přidat sloupec"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Upravit sloupec"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Odstranit sloupec"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Seskupit dle"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Žádné"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Umělec/Datum/Album"
@@ -974,7 +1011,7 @@ msgstr "Umělec/Datum/Album"
msgid "Open file..."
msgstr "Otevřít soubor..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Nastavit %s"
@@ -983,19 +1020,23 @@ msgstr "Nastavit %s"
msgid "Default Audio Device"
msgstr "Výchozí audio zařízení"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Přidat"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globální klávesové zkratky"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Umístění"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kombinace kláves"
@@ -1007,105 +1048,105 @@ msgstr "Přidávají se soubory..."
msgid "Initializing..."
msgstr "Inicializuje se..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Byla změněna data této stopy."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Opravdu zavřít okno?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr "[Vícenásobné hodnoty]"
+msgstr "[Vícenásobné hodnoty] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Klávesa"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Hodnota"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Zapisují se tagy..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Jméno:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Název pole nesmí začínat : nebo _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Nelze přidat pole"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Pole s tímto názvem již existuje, prosím, zvolte jiný název."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Opravdu odstranit vybrané pole?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Přidat pole"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Odstranit pole"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Použití: deadbeef [volby] [soubor(y)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Volby:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Zobrazit nápovědu (tuto zprávu) a ukončit\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Zavřít přehrávač\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Zobrazit verzi a ukončit\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Zahájit přehrávání\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zastavit přehrávání\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pauza přehrávání\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Přepnout pauzu\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
@@ -1113,32 +1154,38 @@ msgstr ""
" --play-pause Spustit přehrávání, pokud je zastaveno, jinak přepnout "
"pauzu\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Další skladba z playlistu\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Předchozí skladba z playlistu\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Náhodná skladba z playlistu\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Připojit soubor(y) do existujícího playlistu\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Zapsat zformátovaný název stopy do stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1149,7 +1196,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1158,7 +1205,7 @@ msgstr ""
" např.: --nowplaying \"%%a - %%t\" zapíše \"umělec - "
"název\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
@@ -1167,45 +1214,19 @@ msgstr ""
" pro další informace navštivte http://sourceforge.net/"
"apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Výchozí"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ano"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ne"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Doporučeno)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Vzestupně\n"
-"Sestupně"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Zakázat\n"
-"Stopa\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1230,7 +1251,7 @@ msgstr ""
"Skupina / umělec alba\n"
"Vlastní"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1238,13 +1259,40 @@ msgstr ""
"Vlevo\n"
"Vpravo"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Zakázat\n"
+"Stopa\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Vzestupně\n"
+"Sestupně"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Doporučeno)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Nelze najít pixmap soubor: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1252,12 +1300,13 @@ msgid ""
msgstr ""
"wilmidi: konfigurační soubor freepats nenalezen. Instalujte balíček timidity-"
"freepats nebo v nastavení zásuvného modulu nastavte cestu k souboru freepats."
-"cfg"
+"cfg."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Přidat Audio CD"
#: ../translation/extra.c:4
@@ -1273,7 +1322,7 @@ msgstr "Použít ALSA převzorkování"
msgid "Release device while stopped"
msgstr "Při zastavení uvolnit zařízení"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Preferovaná velikost bufferu"
@@ -1302,266 +1351,304 @@ msgstr "Heslo"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Soubor zařízení"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Obcházení chyb vzorkovací frekvence OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Perioda aktualizace vyrovnávací paměti (hod)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Získat z vložených popisků"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Získat z místního adresáře"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Maska místního souboru s obalem"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Získat z Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Získat z albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Přizpůsobit obrázek delší straně"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Použít CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Upřednostnit CD-Text před CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (např. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Číslo portu CDDB (např. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Upřednostnit protokol CDDB před HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Povolit podporu obrázků NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Převzorkovat kvalitu (0..2, vyšší je lepší)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maximální délka skladby (v minutách)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Výchozí délka skladby (s)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Potvrzovat mazání souborů z disku"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Citlivost ovládání hlasitosti"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Vlastní ikona stavu"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Spustit gtk_init se --sync (ladící režim )"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Přidat oddělovače mezi položky kontextového menu zásuvných modulů"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Formát titulku upozornění"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Formát obsahu upozornění"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Zobrazit obal alba"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Velikost obalu alba (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Server PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Vzorkovací frekvence"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relativní cesta vyhledávací tabulky"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Absolutní cesta vyhledávací tabulky"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Přehození audio bajtů (zapnout pokud je zvuk statický)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Povolit HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (z HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bitů na vzorek (8 or 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Výchozí délka skladby (s)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Konfigurační soubor Timidity++ bank"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Název stopy"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Protagonista"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Celkem stop"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Žánr"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Skladatel"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Číslo disku"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Komentář"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Kódování / Vydavatel"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Umístění"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Subtrack rejstřík"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Typ(y) popisků"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Vložený Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Přípony souborů (oddělené s ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Převést"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Cílová vzorkovací frekvence"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Kvalita / Algorytmus"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
"Automatická vzorkovací frekvence (přepíše cílovou vzorkovací frekvenci)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Povolit scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Soubor již existuje. Přepsat?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Varování konvertoru"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Vyberte enkodér"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Chyba konvertoru"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Převádí se..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Vybrat adresář..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Selhalo ukládání předvolby enkodéru"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1569,63 +1656,78 @@ msgstr ""
"Ověřte oprávnění k adresáři předvolby, zvolte jiný název nebo uvolněte místo "
"na disku"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Předvolba stejného jména již existuje. Zkuste zvolit jiný název."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Chyba"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Přidat nový enkodér"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Upravit enkodér"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Odstranit předvolbu"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Tato akce odstraní vybranou předvolbu. Pokračovat?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Enkodéry"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Přidat zásuvný modul do řetězce DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Selhalo ukládání předvolby DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nová předvolba DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Upravit předvolbu DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Předvolby DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Výstupní adresář:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Zachovat strukturu adresáře, počínaje od:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Název výstupního souboru:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1633,84 +1735,91 @@ msgstr ""
"Přípona (např. .mp3) bude připojena automaticky.\n"
"Ponechte pole prázdné pro výchozí (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Enkodér:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Předvolba DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Počet vláken:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Výstupní formát vzorku:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Zachovat zdrojový formát"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit podepsaný int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit podepsaný int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit podepsaný int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit podepsaný int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit plovoucí"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Pokud soubor existuje:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Prompt"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Přepsat"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Zachovat strukturu adresáře, počínaje od:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Upravit předvolbu enkodéru"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Enkodér bez názvu"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Přípona výstupního souboru:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Např. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Příkazový řádek:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1718,8 +1827,9 @@ msgstr ""
"Příklad: lame - %o\n"
"%i pro vstupní soubor, %o pro výstupní soubor, - pro stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1727,75 +1837,321 @@ msgstr ""
"<small>%o - název výstupního souboru\n"
"%i - název dočasného vstupního souboru</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Metoda:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Roura"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Dočasný soubor"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Autor popisku</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor předvolby DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Předvolba DSP bez názvu"
-#~ msgid ""
-#~ "Keep source format\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-#~ msgstr ""
-#~ "Zachovat zdrojový formát\n"
-#~ "8 bit podepsaný int\n"
-#~ "16 bit podepsaný int\n"
-#~ "24 bit podepsaný int\n"
-#~ "32 bit podepsaný int\n"
-#~ "32 bit plovoucí"
-
-#~ msgid ""
-#~ "Pipe\n"
-#~ "Temporary file"
-#~ msgstr ""
-#~ "Roura\n"
-#~ "Dočasný soubor"
-
-#~ msgid ""
-#~ "Prompt\n"
-#~ "Overwrite"
-#~ msgstr ""
-#~ "Prompt\n"
-#~ "Přepsat"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"Zachovat zdrojový formát\n"
+"8 bit podepsaný int\n"
+"16 bit podepsaný int\n"
+"24 bit podepsaný int\n"
+"32 bit podepsaný int\n"
+"32 bit plovoucí"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"Prompt\n"
+"Přepsat"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"Roura\n"
+"Dočasný soubor"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Upravit"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Zavřít"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Upravit sloupec"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Příkazový řádek:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Náhodné stopy"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Vícenásobné hodnoty] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Umístění"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Odstranit"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nový playlist"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Komentář"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Přidat sloupec"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Tato akce odstraní vybranou předvolbu. Pokračovat?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Nastavit"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Nastavení"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Opravdu odstranit vybrané pole?"
diff --git a/po/da.po b/po/da.po
index 32a111af..a4818968 100644
--- a/po/da.po
+++ b/po/da.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-27 13:40+0200\n"
"Last-Translator: mjjzf <mjjzf@syntaktisk.dk>\n"
"Language-Team: \n"
@@ -64,9 +64,9 @@ msgstr "Kunne ikke indlæse hjælpefil"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Hjælp"
@@ -80,74 +80,77 @@ msgstr "Om DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s - ændringslog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Oversættere af DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Rediger afspilningsliste"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titel:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Omdøb afspilningsliste"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Fjern afspilningsliste"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Tilføj ny afspilningsliste"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Gem DeaDBeef EQ-forhåndsindstilling"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ-forhåndsindstillede filer (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Indlæs DeaDBeeF EQ forhåndsindstilling..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ-forhåndsindstillinger (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importer Foobar2000 EQ-forhåndsindstilling..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ-forhåndsindstillinger (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Indlæs forhåndsindstilling"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importer Foobar2000-forhåndsindstilling"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Aktiver"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nulstil alle"
@@ -155,54 +158,55 @@ msgstr "Nulstil alle"
# Hmm, altså det kommer jo an på om man taler om det den gør ved
# lydniveauet (forforstærkning) eller den enhed som gør det, som hedder
# en forforstærker
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Nulstil forforstærkning"
# KDE amarok: Bands -> bands
# hvis det er sådan nogle frekvensintervaller i en equlizer så kan man
# måske godt kommen afsted med at kalde det bånd, frekvensbånd.
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Nulstil frekvensbånd"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Forhåndsindstillinger"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dag %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dage %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Stoppet | %d numre | %s samlet afspilningstid"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pause | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -210,400 +214,414 @@ msgstr ""
"%s%s %s| %d Hz | %d bit | %s | %d:%02d / %s | %d numre | %s samlet "
"afspilningstid"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Gem afspilningsliste som"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF-afspilningsfiler (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Indlæs afspilningsliste"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Andre filer (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Ny afspilningsliste"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Ny afspilningsliste (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fil"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Åbn filer"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Tilføj filer"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Tilføj mapper"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Tilføj placering"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Ny afspilningsliste"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Indlæs afspilningsliste"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Gem afspilningsliste"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Afslut"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Rediger"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Ryd"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Vælg alle"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Fravælg alle"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverter markering"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Markering"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Fjern"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Beskær"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Find"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sorter efter"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titel"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Nummer"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Kunstner"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Dato"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Tilfældig"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Tilpasset"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Indstillinger"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Vis"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusbjælke"
# kunne også være ..overskrifter men man er lige nødt til at sikre sig at det går
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Kolonnehoveder"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Faneblade"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Afspilning"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Rækkefølge"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineær"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Bland numre"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Bland albums"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Tilfældig"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Gentage"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Gentag alle"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Gentag enkelt sang"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Gentag ikke"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Rul følger afspilning"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Markør følger afspilning"
# mon ikke det passer bedre med aktuelle, sådan som jeg kan forestille
# mig den streng brugt
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stop efter aktuelle"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Spring til aktuelle nummer"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Hjælp"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Ændringslog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Om"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "Oversæ_ttere"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Søg"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
# afspil, spil
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Afspil"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pause"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Forrige"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Næste"
# spørgsmålet er så om den betyder, afspil en tilfældig fil, eller mere
# generelt afspil tilfældigt, det er måske værd at spørge om
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Afspil tilfældig"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Om"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Afslut"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Nummeregenskaber"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Indstillinger"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Anvend"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Luk"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Egenskaber"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Indtast ny kolonnetitel her"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Type:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Indeks"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Spiller"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albumomslag"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Kunstner - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Varighed"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Nummer"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Band-/albumkunstner"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Justering:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Venstre"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Højre"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Afbryd"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_O.k."
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Udvidelsesmodul for uddata:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Uddataenhed:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Konverter altid 8-bits lyd til 16-bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Lyd"
@@ -613,29 +631,29 @@ msgstr "Lyd"
# en ide til oversættelse. Jeg tror måske at vi kan kalde det sådan
# noget som afspilningsforstærkning måske:
# "Tilstand for afspilningsforstærkning:"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygains tilstand:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Deaktiver"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Nummer"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replaygains niveauskala"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
@@ -645,317 +663,340 @@ msgstr "+12 dB"
# en ide til oversættelse. Jeg tror måske at vi kan kalde det sådan
# noget som afspilningsforstærkning måske:
# "Tilstand for afspilningsforstærkning:"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "Replaygains tilstand:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Tilføj filer fra kommandolinje (eller filhåndtering) til afspilningslisten:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Genoptag forrige session ved opstart"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+# mon ikke det passer bedre med aktuelle, sådan som jeg kan forestille
+# mig den streng brugt
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stop efter aktuelle"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Afspilning"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Konfigurer"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Luk minimeringer til statusfelt"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Midterste museknap lukker afspilningsliste"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Skjul statusikon"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Brug fed skrift for det nummer som aktuelt afspilles"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Skjul kontekstmenupunktet »Slet fra disk«"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Titelbjælketekst under afspilning:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Titelbjælketekst når stoppet:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Overskriv"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Forgrund"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Baggrund"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Farver for søgebjælke/lydstyrkebjælke"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Midt"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Lys"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Mørk"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
# hvad er dette?
# Den her tror jeg at jeg ville fejlmelde og bede om information
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Farver for fanebladsfjernelse"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Overskriv (mister tema for GTK-trævisning, men øger optegningshastigheden)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Lige række"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Ulige række"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Markeret række"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Markeret tekst"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Markør"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Farver på afspilningsliste"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Farver"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Aktiver proxyserver"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresse for proxyserver:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port til proxyserver:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Proxytype:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Brugernavn til proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Adgangskode til proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Netværk"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Udvidelsesmoduler"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "Internetadresse:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupper efter"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Sorter efter"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Markering"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Udvidelsesmoduler"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Mærkeskrivning"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Skriv ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Skriv ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Skriv APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Fjern ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Fjern ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Fjern APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2-version"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Anbefalet)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1-tegnkodning (standard er iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Skriv ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Kunster / album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Nummer"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Slet filer fra disk"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -963,49 +1004,48 @@ msgstr ""
"Filer vil gå tabt. Fortsæt?\n"
"(Denne dialog kan fjernes i opsætningen for GTKUI-udvidelsesmodulet)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Advarsel"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Tilføj til afspilningskø"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Fjern fra afspilningskø"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Genindlæs metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Fjern fra disk"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Tilføj kolonne"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Rediger kolonne"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Fjern kolonne"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grupper efter"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ingen"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Kunster/dato/album"
@@ -1013,7 +1053,7 @@ msgstr "Kunster/dato/album"
msgid "Open file..."
msgstr "Åbn fil..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Konfigurer"
@@ -1022,19 +1062,23 @@ msgstr "Konfigurer"
msgid "Default Audio Device"
msgstr "Standardlydenhed"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Tilføj"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globale genveje"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Plads"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Tilføj placering"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Tastekombination"
@@ -1046,139 +1090,144 @@ msgstr "Tilføjer filer..."
msgid "Initializing..."
msgstr "Initialiserer..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Du har ændret data for dette nummer."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Luk vinduet?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Tast"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Værdi"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Luk vinduet?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Tilføj filer"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Fjern"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Brug: deadbeef [tilvalg] [filer]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Tilvalg:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help eller -h Vis hjælp (denne besked) og afslut\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Afslut afspiller\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Vis versionsinfo og afslut\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Start afspilning\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Stop afspilning\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pause afspilning\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Næste sang i afspilningsliste\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Forrige sang i afspilningsliste\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Tilfældig sang i afspilningsliste\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Tilføj filer til eksisterende afspilningsliste\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Vis formateret nummernavn til stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1189,7 +1238,7 @@ msgstr ""
" [l] længde, [n] nummer, [y] år, [c] bemærkning,\n"
" [r] ophavsret, [e] forløbet\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1198,50 +1247,26 @@ msgstr ""
" f.eks.: --nowplaying \"%%a - %%t\" skal vise »kunstner "
"- titel«\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Standard"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ja"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nej"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Anbefalet)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Deaktiver\n"
-"Nummer\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1268,7 +1293,7 @@ msgstr ""
"Band / albumkunstner\n"
"Tilpasset"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1276,13 +1301,38 @@ msgstr ""
"Venstre\n"
"Højre"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Deaktiver\n"
+"Nummer\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Anbefalet)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Kunne ikke finde pixmapfil: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1295,7 +1345,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1312,7 +1362,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Titelbjælketekst når stoppet:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1345,488 +1395,810 @@ msgstr "Adgangskode til proxy:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Slet filer fra disk"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Albumomslag"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Nummer"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Titel / kunstner"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Filnummer"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Tilføj placering"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Mærketyper"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Indlejret stikordsliste (cuesheet)"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Aktiver proxyserver"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Vælg alle"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Rediger kolonne"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Uddataenhed:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Udvidelsesmodul for uddata:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Gem forhåndsindstilling"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Overskriv"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Indlæs forhåndsindstilling"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Udvidelsesmodul for uddata:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Skriv APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Skriv ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Skriv ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Mærkeskrivning"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Overskriv"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Rediger"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Luk"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Rediger kolonne"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Bland numre"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Titel / kunstner"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Tilføj placering"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Fjern"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Ny afspilningsliste"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Tilføj kolonne"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Konfigurer"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Indstillinger"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Plads"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Luk vinduet?"
+
#~ msgid "Save playlist as"
#~ msgstr "Gem afspilningsliste som"
diff --git a/po/de.po b/po/de.po
index db32340e..3aa6fff6 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,14 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeeF\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2010-06-03 17:59+0100\n"
-"Last-Translator: Jan D. Behrens <zykure@web.de>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-07-09 21:31+0200\n"
+"Last-Translator: Daniel <d@winzen4.de>\n"
"Language-Team: \n"
-"Language: \n"
+"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Country: Germany\n"
"X-Poedit-Language: German\n"
@@ -23,9 +25,8 @@ msgid "Supported sound formats"
msgstr "Unterstützte Tonformate"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Andere Dateien (*)"
+msgstr "Alle Dateien (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -53,11 +54,11 @@ msgstr "Fehler beim Laden der Hilfedatei"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Hilfe"
@@ -71,850 +72,889 @@ msgstr "Über DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s ChangeLog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF Übersetzer"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Wiedergabeliste bearbeiten"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titel:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Wiedergabeliste umbenennen"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Wiedergabeliste löschen"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Neue Wiedergabeliste hinzufügen"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF EQ Voreinstellung speichern"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ Voreinstellung (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF EQ Voreinstellung laden..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ Voreinstellungen (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ Voreinstellung laden..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ Voreinstellungen (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Voreinstellung speichern"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Voreinstellung laden"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importiere Foobar2000 Voreinstellung"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Aktivieren"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Alles zurücksetzen"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Vorverstärkung zurücksetzen"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Equalizer zurücksetzen"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Voreinstellungen"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 Tag %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d Tage %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Angehalten | %d Titel | %s gesamte Spielzeit"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausiert | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d Titel | %s gesamte Spielzeit"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Wiedergabeliste speichern unter..."
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF Wiedergabeliste (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Wiedergabeliste laden..."
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Andere Dateien (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Neue Wiedergabeliste"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Neue Wiedergabeliste (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Datei"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "Dateien ö_ffnen"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dateien hinzufügen"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Verzeichnisse hinzufügen"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Ort hinzufügen"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Neue Wiedergabeliste"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Wiedergabeliste laden"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Wiedergabeliste speichern"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Beenden"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Bearbeiten"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Löschen"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Alles auswählen"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Alles abwählen"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Auswahl umkehren"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Auswahl"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Entfernen"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Abschneiden"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "Suchen"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sortieren nach"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titel"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Track-Nummer"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Künstler"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Zufällig"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Benutzerdefiniert"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Einstellungen"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Ansicht"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusleiste"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Spaltentitel"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Reiter"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Wiedergabe"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Reihenfolge"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linear"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Track-Shuffle"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Album-Shuffle"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Zufällig"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Wiederholen"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Wiederhole alle"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Wiederhole einzelnes Lied"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Nicht wiederholen"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Bildlauf folgt Wiedergabe"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Mauszeiger folgt Wiedergabe"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Nach aktuellem Titel beenden"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Zu aktuellem Titel springen"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Hilfe"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Info"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Übersetzer"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Suche"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stopp"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Abspielen"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Anhalten"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Vorheriges"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Nächstes"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Zufälliges Abspielen"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Info"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Beenden"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Titeleigenschaften"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Einstellungen"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "A_nwenden"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "S_chließen"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadaten"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Eigenschaften"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Neuen Spaltentitel eingeben"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Index"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Wiedergabe"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album Artwork"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Künstler - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Dauer"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Track-Nummer"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Band / Album-Künstler"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Ausrichtung:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Linksbündig"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Rechtsbündig"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Abbrechen"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Ausgabeplugin:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Ausgabegerät:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Immer 8-bit Audio nach 16-bit konvertieren"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Wiedergabe"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygain-Modus:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Deaktivieren"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Titel"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replaygain-Ausschlagschutz"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Replaygain-Vorverstärkung:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Globale Vorverstärkung:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Datein beim Hinzufügen von Kommandozeile (oder Dateimanager) an Liste "
"anhängen:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Beim Start letzte Sitzung wiederherstellen"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
"Dateien innerhalb von Archiven beim Hinzufügen von Verzeichnissen auslassen"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Nach aktuellem Titel beenden"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Wiedergabe"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Einstellungen"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP Voreinstellung"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Laden"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Beim Schließen minimieren"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Mittlere Maustaste zum Schließen der Wiedergabeliste verwenden"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Systemleisten-Icon verstecken"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Aktuellen Titel hervorheben"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Eintrag \"Vom Datenträger entfernen\" im Kontextmenü verstecken"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
"Wiedergabeliste beim Hinzufügen einzelner Verzeichnisse automatisch benennen"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Aktualisierungsrate der Benutzeroberfläche (Ereignisse pro Sekunde):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Fenstertitel beim Abspielen:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Fenstertitel wenn angehalten:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI-Plugin (Änderung benötigt Neustart):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Überschreiben"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Vordergrund"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Hintergrund"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Farben von Suchleiste und Lautstärkeregler"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Mittel"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Hell"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Dunkel"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Basis"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Farben der Reiterleiste"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Überschreiben (beschleunigt die Darstellung)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Gerade Zeile"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Ungerade Zeile"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Ausgewählte Zeile"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Ausgewählter Text"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Mauszeiger"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Farben der Wiedergabeliste"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Farben"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Proxyserver aktivieren"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresse des Proxyservers:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port des Proxyservers:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Art des Proxyservers:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Benutzername für Proxyserver:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Passwort für Proxyserver:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Netzwerk"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Version: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Erweiterungen"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Gruppieren nach"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Sortieren nach..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Format"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr "Auftseigend"
+msgstr "Aufsteigend"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Absteigend"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Auswahl des DSP-Plugins"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Erweiterung"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Einstellungen für den Tag-Editor"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Schreibe ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Schreibe ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 schreiben"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 entfernen"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 entfernen"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 entfernen"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 Version"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (empfohlen)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 Zeichensatz (Vorgabe ist iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Schreibe ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Künstler / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Track-Nr."
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Dateien vom Datenträger entfernen"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -922,49 +962,48 @@ msgstr ""
"Dateien werden verloren gehen. Weitermachen?\n"
"(Diese Abfrage kann in den Einstellungen des GTK-Plugin abgeschaltet werden)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Warnung"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Zur Warteschlange hinzufügen"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Von Warteschlange entfernen"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Metadaten neu laden"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Vom Datenträger entfernen"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Spalte hinzufügen"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Spalte bearbeiten"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Spalte entfernen"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Gruppieren nach"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nichts"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Künstler/Datum/Album"
@@ -972,7 +1011,7 @@ msgstr "Künstler/Datum/Album"
msgid "Open file..."
msgstr "Datei öffnen..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "%s konfigurieren"
@@ -981,19 +1020,23 @@ msgstr "%s konfigurieren"
msgid "Default Audio Device"
msgstr "Standard Ausgabegerät"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Hinzufügen"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globale Tastenkürzel"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Aktion"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Ort"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Tastenkombination"
@@ -1005,150 +1048,158 @@ msgstr "Dateien hinzufügen..."
msgid "Initializing..."
msgstr "Initialisiere..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Sie haben Daten für diesen Titel geändert."
# Soll das Fenster wirklich geschlossen werden?
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Möchten Sie das Fenster wirklich schließen?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Mehrere Werte] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Schlüssel"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Wert"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Speichere Tags..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Name:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Feldnamen dürfen nicht mit : oder _ beginnen"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Kann Feld nicht hinzufügen"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
"Ein Feld mit diesem Namen existiert bereits, bitte einen anderen Name wählen."
-# Soll das Fenster wirklich geschlossen werden?
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Möchten Sie das Fenster wirklich schließen?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Feld hinzufügen"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Feld entfernen"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Benutzung: deadbeef [Optionen] [Datei(en)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Optionen:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help oder -h Hilfe (diese Meldung) anzeigen und beenden\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Player beenden\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Versionsinformationen anzeigen und beenden\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Wiedergabe starten\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Wiedergabe beenden\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Wiedergabe pausieren\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Wiedergabe umschalten (Play/Pause)\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
" --play-pause Wiedergabe starten falls angehalten, sonst pausieren\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Nächster Titel in der Wiedergabeliste\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Vorheriger Titel in der Wiedergabeliste\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Zufälliger Titel in der Wiedergabeliste\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Datei(en) an bestehende Wiedergabeliste anhängen\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Formatierten Tracknamen auf Standardausgabe schreiben\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
+" FMT %%-Syntax: [a]rtist, [t]itel, Al[b]um,\n"
+" [l]änge, Titel[n]ummer, [y]Jahr, [c]Kommentar,\n"
+" copy[r]ight, [e]verstrichen\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1157,52 +1208,28 @@ msgstr ""
" z.B.: --nowplaying \"%%a - %%t\" sollte \"Artist - "
"Titel\" ausgeben\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+"für mehr Informationen siehe http://sourceforge.net/apps/mediawiki/deadbeef/"
+"index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Standard"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ja"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nein"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Empfohlen)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Aufsteigend\n"
-"Absteigend"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Ausschalten\n"
-"Track\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1228,7 +1255,7 @@ msgstr ""
"Band / Album-Künstler\n"
"Benutzerdefiniert"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1236,13 +1263,40 @@ msgstr ""
"Links\n"
"Rechts"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Ausschalten\n"
+"Track\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Aufsteigend\n"
+"Absteigend"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Empfohlen)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Pixmap-Datei nicht gefunden: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1255,7 +1309,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Audio-CD hinzufügen"
#: ../translation/extra.c:4
@@ -1271,7 +1326,7 @@ msgstr "ALSA-Resampling verwenden"
msgid "Release device while stopped"
msgstr "Gerät bei angehaltener Wiedergabe freigeben"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Bevorzugte Puffergröße"
@@ -1300,265 +1355,303 @@ msgstr "Passwort"
msgid "Scrobble URL"
msgstr "Scrobble-URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Ausgabegerät"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Cache-Aktualisierungsperiode (Stunden)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Aus eingebetteten Tags lesen"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Aus lokalem Verzeichnis lesen"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Maske für lokale Cover-Dateien"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Von Last.fm holen"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Von albumart.org holen"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Artwork zu längerer Seite skalieren"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB verwenden"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "CD-Text gegenüber CDDB vorziehen"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB-URL (z.B. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB-Port (z.B. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "CDDB-Protokoll gegenüber HTTP vorziehen"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Unterstützung von NRG-Abbilddateien einschalten"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Resampling-Qualität (0..2, höher ist besser)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maximale Song-Länge (in Minuten)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Standard-Songlänge (Sekunden)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Entfernen von Dateien vom Datenträger bestätigen lassen"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Sensitivität des Volumenreglers im Systemleisten-Icon"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Benutzerdefiniertes Systemleisten-Icon"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "gtk_init mit --sync ausführen (Debug-Modus)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Kontextmenü-Einträge von verschiedenen Plugins trennen"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Titel der Benachrichtigung"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Inhalt der Benachrichtigung"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Album Artwork anzeigen"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Größe des Album Artworks (Pixel)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio Server"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Samplerate"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relativer Pfad der Suchtabelle"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Absoluter Pfad der Suchtabelle"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Audio-Bytes vertauschen (umschalten, falls nur Rauschen zu hören ist)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "HVSC Songlängen-Datenbank aktivieren"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Pfad zur songlengths.txt (von HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits pro Sample (8 oder 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Standard-Songlänge (Sekunden)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ Konfigurationsdatei"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Titel"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Interpret"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Gesamtanzahl Tracks"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Genre"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Verfasser"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Disk-Nummer"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Kommentar"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Encoder / Anbieter"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Ort"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Subtrack-Index"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tag-Typ"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Eingebettetes Cusheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Dateiendungen (trennen mit ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Konvertieren"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Samplerate"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Qualität / Algorithmus"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Automatische Samplerate (überschreibt die Ziel-Samplerate)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Scrobbler aktivieren"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Die Datei existiert bereits. Überschreiben?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Converter: Warnung"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Bitte einen Encoder auswählen"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Converter: Fehler"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Konvertiere..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Verzeichnis wählen..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Fehler beim Speichern des Encoder-Profil"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1566,65 +1659,80 @@ msgstr ""
"Bitte Zugriffsrechte auf das Verzeichnis prüfen, einen anderen Titel wählen "
"oder freien Platz auf der Festplatte schaffen"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
"Ein Profil mit diesem Namen existiert bereits. Bitte einen anderen Titel "
"wählen."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Fehler"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Neuen Encoder hinzufügen"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Encoder bearbeiten"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Profil entfernen"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Diese Aktion wird das gewählte Profil löschen. Sind Sie sicher?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Encoder"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Plugin in DSP-Kette einfügen"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Fehler beim Speichern des DSP-Profils"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Neues DSP-Profil"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "DSP-Profil bearbeiten"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP-Profile"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Zielverzeichnis:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Verzeichnis-Struktur beibehalten, starten mit:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Dateiname:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1632,84 +1740,91 @@ msgstr ""
"Erweiterung (z.B. .mp3) wird automatisch angehängt.\n"
"Feld leer lassen um Standardwert zu verwenden (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Encoder:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP-Profil:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Thread-Anzahl:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Ausgabe-Sampleformat:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Format der Eingangsdatei verwenden"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Falls Datei bereits existiert:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Nachfragen"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Überschreiben"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Verzeichnis-Struktur beibehalten, starten mit:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Profil laden"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Neuer Encoder"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Endung der Zieldatei:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Z.B. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Kommandozeile:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1717,8 +1832,9 @@ msgstr ""
"Beispiel: lame - %o\n"
"%i für Eingabedatei, %o für Zieldatei, - für stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1726,50 +1842,318 @@ msgstr ""
"<small>%o - Name der Zieldatei\n"
"%i - Name der temporären Eingabedatei</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Methode:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Temporäre Datei"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Tags schreiben</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP-Profileditor"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Neues DSP-Profil"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Überschreiben"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Temporäre Datei"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Bearbeiten"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "S_chließen"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Spalte bearbeiten"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Kommandozeile:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Track-Shuffle"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Mehrere Werte] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Ort"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Entfernen"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Neue Wiedergabeliste"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Kommentar"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Spalte hinzufügen"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Diese Aktion wird das gewählte Profil löschen. Sind Sie sicher?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Einstellungen"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Einstellungen"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Aktion"
+
+# Soll das Fenster wirklich geschlossen werden?
+#~ msgid "Really remove selected field?"
+#~ msgstr "Möchten Sie das Fenster wirklich schließen?"
+
#~ msgid "Save playlist as"
#~ msgstr "Wiedergabeliste speichern unter"
diff --git a/po/deadbeef.pot b/po/deadbeef.pot
new file mode 100644
index 00000000..129768f5
--- /dev/null
+++ b/po/deadbeef.pot
@@ -0,0 +1,2062 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\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"
+
+#: ../plugins/gtkui/callbacks.c:123
+msgid "Supported sound formats"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:134
+msgid "All files (*)"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:144
+msgid "Open file(s)..."
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:179
+msgid "Add file(s) to playlist..."
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:220
+msgid "Add folder(s) to playlist..."
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:225
+msgid "Follow symlinks"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:711
+msgid "Failed while reading help file"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:721
+msgid "Failed to load help file"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:736
+msgid "help.txt"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
+msgid "Help"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:747
+#, c-format
+msgid "About DeaDBeeF %s"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:760
+#, c-format
+msgid "DeaDBeeF %s ChangeLog"
+msgstr ""
+
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
+msgid "DeaDBeeF Translators"
+msgstr ""
+
+#: ../plugins/gtkui/ddbtabstrip.c:842
+msgid "Edit playlist"
+msgstr ""
+
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
+msgid "Title:"
+msgstr ""
+
+#: ../plugins/gtkui/ddbtabstrip.c:1034
+msgid "Rename Playlist"
+msgstr ""
+
+#: ../plugins/gtkui/ddbtabstrip.c:1041
+msgid "Remove Playlist"
+msgstr ""
+
+#: ../plugins/gtkui/ddbtabstrip.c:1048
+msgid "Add New Playlist"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:141
+msgid "Save DeaDBeeF EQ Preset"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:148
+msgid "DeaDBeeF EQ preset files (*.ddbeq)"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:187
+msgid "Load DeaDBeeF EQ Preset..."
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:191
+msgid "DeaDBeeF EQ presets (*.ddbeq)"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:252
+msgid "Import Foobar2000 EQ Preset..."
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:256
+msgid "Foobar2000 EQ presets (*.feq)"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:321
+msgid "Save Preset"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:329
+msgid "Load Preset"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:337
+msgid "Import Foobar2000 Preset"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:362
+msgid "Enable"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:371
+msgid "Zero All"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:378
+msgid "Zero Preamp"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:385
+msgid "Zero Bands"
+msgstr ""
+
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
+msgid "Presets"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:140
+#, c-format
+msgid "1 day %d:%02d:%02d"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:143
+#, c-format
+msgid "%d days %d:%02d:%02d"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:152
+#, c-format
+msgid "Stopped | %d tracks | %s total playtime"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
+msgid "Mono"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
+msgid "Stereo"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:190
+#, c-format
+msgid "| %4d kbps "
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:196
+msgid "Paused | "
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:201
+#, c-format
+msgid ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:647
+msgid "Save Playlist As"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:658
+msgid "DeaDBeeF playlist files (*.dbpl)"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:776
+msgid "Load Playlist"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:791
+msgid "Other files (*)"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
+msgid "New Playlist"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:932
+#, c-format
+msgid "New Playlist (%d)"
+msgstr ""
+
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
+msgid "_File"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
+msgid "_Open file(s)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
+msgid "Add file(s)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
+msgid "Add folder(s)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
+msgid "Add location"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
+msgid "New playlist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
+msgid "Load playlist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
+msgid "Save playlist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
+msgid "_Quit"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
+msgid "_Edit"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
+msgid "_Clear"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
+msgid "Select all"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
+msgid "Deselect all"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
+msgid "Invert selection"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
+msgid "Selection"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
+msgid "Remove"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
+msgid "Crop"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
+msgid "_Find"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
+msgid "Title"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
+msgid "Track number"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
+msgid "Album"
+msgstr ""
+
+#. Track properties dialog
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
+msgid "Artist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
+msgid "Date"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
+msgid "Custom"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
+msgid "Preferences"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
+msgid "_View"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
+msgid "Status bar"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
+msgid "Column headers"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
+msgid "Tabs"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
+msgid "Equalizer"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
+msgid "_Playback"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
+msgid "Order"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
+msgid "Linear"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
+msgid "Shuffle tracks"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
+msgid "Shuffle albums"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
+msgid "Looping"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
+msgid "Scroll follows playback"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
+msgid "Cursor follows playback"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
+msgid "Stop after current"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
+msgid "Jump to current track"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
+msgid "_Help"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
+msgid "_ChangeLog"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
+msgid "_GPLv2"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
+msgid "_LGPLv2.1"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
+msgid "_About"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
+msgid "_Translators"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
+msgid "Search"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
+msgid "Stop"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
+msgid "Play"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
+msgid "Pause"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
+msgid "Previous"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
+msgid "Next"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
+msgid "Play Random"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
+msgid "About"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
+msgid "Quit"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
+msgid "Track Properties"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
+msgid "Settings"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
+msgid "_Apply"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
+msgid "_Close"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
+msgid "Metadata"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
+msgid "Properties"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
+msgid "Enter new column title here"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
+msgid "Type:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1513
+msgid "Item Index"
+msgstr ""
+
+#. create default set of columns
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
+msgid "Playing"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1515
+msgid "Album Art"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1516
+msgid "Artist - Album"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
+msgid "Duration"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
+msgid "Track Number"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
+msgid "Band / Album Artist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
+msgid "Format:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
+msgid "Alignment:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1562
+msgid "Left"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1563
+msgid "Right"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
+msgid "_Cancel"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
+msgid "_OK"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
+msgid "Output plugin:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
+msgid "Output device:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
+msgid "Always convert 8 bit audio to 16 bit"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
+msgid "Sound"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
+msgid "Replaygain mode:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1886
+msgid "Disable"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1887
+msgid "Track"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
+msgid "Replaygain peak scale"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
+msgid "-12 dB"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
+msgid "+12 dB"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
+msgid "Replaygain preamp:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
+msgid "Global preamp:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
+msgid "Add files from command line (or file manager) to this playlist:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
+msgid "Resume previous session on startup"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
+msgid "Don't add from archives when adding folders"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
+msgid "Playback"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
+msgid "Configure"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
+msgid "DSP Chain Preset"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
+msgid "_Load"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
+msgid "DSP"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
+msgid "Close minimizes to tray"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
+msgid "Middle mouse button closes playlist"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
+msgid "Hide system tray icon"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
+msgid "Use bold font for currently playing track"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
+msgid "Hide \"Delete from disk\" context menu item"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
+msgid "Auto-name playlists when adding a single folder"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
+msgid "Titlebar text while playing:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
+msgid "Titlebar text while stopped:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
+msgid "GUI Plugin (changing requires restart):"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
+msgid "Override"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
+msgid "Foreground"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
+msgid "Background"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
+msgid "Seekbar/Volumebar colors"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
+msgid "Middle"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
+msgid "Light"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
+msgid "Dark"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
+msgid "Base"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
+msgid "Text"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
+msgid "Tab strip colors"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
+msgid "Override (looses GTK treeview theming, but speeds up rendering)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
+msgid "Even row"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
+msgid "Odd row"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
+msgid "Selected row"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
+msgid "Selected text"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
+msgid "Cursor"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
+msgid "Playlist colors"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
+msgid "Colors"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
+msgid "Enable Proxy Server"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
+msgid "Proxy Server Address:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
+msgid "Proxy Server Port:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
+msgid "Proxy Type:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
+msgid "Proxy Username:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
+msgid "Proxy Password:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
+msgid "Network"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
+msgid "Version: "
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
+msgid "Copyright"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
+msgid "Plugins"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
+msgid "URL:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
+msgid "Format"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3366
+msgid "Ascending"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3367
+msgid "Descending"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
+msgid "Select DSP Plugin"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
+msgid "Plugin"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
+msgid "Tag Writer Settings"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
+msgid "Write ID3v2"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
+msgid "Write ID3v1"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
+msgid "Write APEv2"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
+msgid "Strip ID3v2"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
+msgid "Strip ID3v1"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
+msgid "Strip APEv2"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
+msgid "ID3v2 version"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3592
+msgid "2.3 (Recommended)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3593
+msgid "2.4"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
+msgid "ID3v1 character encoding (default is iso8859-1)"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
+msgid "Write ID3v2.4"
+msgstr ""
+
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
+msgid "Artist / Album"
+msgstr ""
+
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
+msgid "Track No"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:349
+msgid "Delete files from disk"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:350
+msgid ""
+"Files will be lost. Proceed?\n"
+"(This dialog can be turned off in GTKUI plugin settings)"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
+msgid "Warning"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:456
+msgid "Add to playback queue"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:461
+msgid "Remove from playback queue"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:469
+msgid "Reload metadata"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:488
+msgid "Remove from disk"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
+msgid "Add column"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
+msgid "Edit column"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:1003
+msgid "Remove column"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:1013
+msgid "Group by"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:1020
+msgid "None"
+msgstr ""
+
+#: ../plugins/gtkui/plcommon.c:1024
+msgid "Artist/Date/Album"
+msgstr ""
+
+#: ../plugins/gtkui/pluginconf.c:42
+msgid "Open file..."
+msgstr ""
+
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
+msgid "Configure %s"
+msgstr ""
+
+#: ../plugins/gtkui/prefwin.c:82
+msgid "Default Audio Device"
+msgstr ""
+
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
+msgid "Add"
+msgstr ""
+
+#: ../plugins/gtkui/prefwin.c:358
+msgid "Global Hotkeys"
+msgstr ""
+
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
+msgstr ""
+
+#: ../plugins/gtkui/prefwin.c:417
+msgid "Key combination"
+msgstr ""
+
+#: ../plugins/gtkui/progress.c:56
+msgid "Adding files..."
+msgstr ""
+
+#: ../plugins/gtkui/progress.c:90
+msgid "Initializing..."
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:161
+msgid "You've modified data for this track."
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:163
+msgid "Really close the window?"
+msgstr ""
+
+#. get value to edit
+#: ../plugins/gtkui/trkproperties.c:272
+msgid "[Multiple values] "
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
+msgid "Key"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
+msgid "Value"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:623
+msgid "Writing tags..."
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
+msgid "Name:"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:666
+msgid "Field names must not start with : or _"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
+msgid "Cannot add field"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:705
+msgid "Field with such name already exists, please try different name."
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:767
+msgid "Add field"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:770
+msgid "Remove field"
+msgstr ""
+
+#: ../main.c:84
+#, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
+msgstr ""
+
+#: ../main.c:85
+#, c-format
+msgid "Options:\n"
+msgstr ""
+
+#: ../main.c:86
+#, c-format
+msgid " --help or -h Print help (this message) and exit\n"
+msgstr ""
+
+#: ../main.c:87
+#, c-format
+msgid " --quit Quit player\n"
+msgstr ""
+
+#: ../main.c:88
+#, c-format
+msgid " --version Print version info and exit\n"
+msgstr ""
+
+#: ../main.c:89
+#, c-format
+msgid " --play Start playback\n"
+msgstr ""
+
+#: ../main.c:90
+#, c-format
+msgid " --stop Stop playback\n"
+msgstr ""
+
+#: ../main.c:91
+#, c-format
+msgid " --pause Pause playback\n"
+msgstr ""
+
+#: ../main.c:92
+#, c-format
+msgid " --toggle-pause Toggle pause\n"
+msgstr ""
+
+#: ../main.c:93
+#, c-format
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr ""
+
+#: ../main.c:94
+#, c-format
+msgid " --next Next song in playlist\n"
+msgstr ""
+
+#: ../main.c:95
+#, c-format
+msgid " --prev Previous song in playlist\n"
+msgstr ""
+
+#: ../main.c:96
+#, c-format
+msgid " --random Random song in playlist\n"
+msgstr ""
+
+#: ../main.c:97
+#, c-format
+msgid " --queue Append file(s) to existing playlist\n"
+msgstr ""
+
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
+#, c-format
+msgid " --nowplaying FMT Print formatted track name to stdout\n"
+msgstr ""
+
+#: ../main.c:100
+#, c-format
+msgid ""
+" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
+" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
+" copy[r]ight, [e]lapsed\n"
+msgstr ""
+
+#: ../main.c:103
+#, c-format
+msgid ""
+" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
+"- title\"\n"
+msgstr ""
+
+#: ../main.c:104
+#, c-format
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+
+#: ../playlist.c:454 ../playlist.c:2418
+msgid "Default"
+msgstr ""
+
+#: ../playlist.c:3793
+msgid "Yes"
+msgstr ""
+
+#: ../playlist.c:3793
+msgid "No"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:73
+msgid ""
+"Item Index\n"
+"Playing\n"
+"Album Art\n"
+"Artist - Album\n"
+"Artist\n"
+"Album\n"
+"Title\n"
+"Duration\n"
+"Track Number\n"
+"Band / Album Artist\n"
+"Custom"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:86
+msgid ""
+"Left\n"
+"Right"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
+#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: ../plugins/wildmidi/wildmidiplug.c:164
+#, c-format
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+
+#. this file should list extra translatable strings that are not referenced
+#. directly in source code, e.g. scripted plugin configuration strings
+#: ../translation/extra.c:3
+msgid "Add audio CD"
+msgstr ""
+
+#: ../translation/extra.c:4
+msgid "Lookup on Last.fm"
+msgstr ""
+
+#. ALSA output plugin
+#: ../translation/extra.c:6
+msgid "Use ALSA resampling"
+msgstr ""
+
+#: ../translation/extra.c:7
+msgid "Release device while stopped"
+msgstr ""
+
+#: ../translation/extra.c:8 ../translation/extra.c:55
+msgid "Preferred buffer size"
+msgstr ""
+
+#: ../translation/extra.c:9
+msgid "Preferred period size"
+msgstr ""
+
+#. Last.fm plugin
+#: ../translation/extra.c:11
+msgid "Enable scrobbler"
+msgstr ""
+
+#: ../translation/extra.c:12
+msgid "Disable nowplaying"
+msgstr ""
+
+#: ../translation/extra.c:13
+msgid "Username"
+msgstr ""
+
+#: ../translation/extra.c:14
+msgid "Password"
+msgstr ""
+
+#: ../translation/extra.c:15
+msgid "Scrobble URL"
+msgstr ""
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
+#. OSS output plugin
+#: ../translation/extra.c:18
+msgid "Device file"
+msgstr ""
+
+#: ../translation/extra.c:19
+msgid "OSS4 samplerate bug workaround"
+msgstr ""
+
+#. Album Artwork plugin
+#: ../translation/extra.c:21
+msgid "Cache update period (hr)"
+msgstr ""
+
+#: ../translation/extra.c:22
+msgid "Fetch from embedded tags"
+msgstr ""
+
+#: ../translation/extra.c:23
+msgid "Fetch from local folder"
+msgstr ""
+
+#: ../translation/extra.c:24
+msgid "Local cover file mask"
+msgstr ""
+
+#: ../translation/extra.c:25
+msgid "Fetch from last.fm"
+msgstr ""
+
+#: ../translation/extra.c:26
+msgid "Fetch from albumart.org"
+msgstr ""
+
+#: ../translation/extra.c:27
+msgid "Scale artwork towards longer side"
+msgstr ""
+
+#. Audio CD player
+#: ../translation/extra.c:29
+msgid "Use CDDB/FreeDB"
+msgstr ""
+
+#: ../translation/extra.c:30
+msgid "Prefer CD-Text over CDDB"
+msgstr ""
+
+#: ../translation/extra.c:31
+msgid "CDDB url (e.g. 'freedb.org')"
+msgstr ""
+
+#: ../translation/extra.c:32
+msgid "CDDB port number (e.g. '888')"
+msgstr ""
+
+#: ../translation/extra.c:33
+msgid "Prefer CDDB protocol over HTTP"
+msgstr ""
+
+#: ../translation/extra.c:34
+msgid "Enable NRG image support"
+msgstr ""
+
+#. DUMB module player plugin
+#: ../translation/extra.c:36
+msgid "Resampling quality (0..2, higher is better)"
+msgstr ""
+
+#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
+msgid "Max song length (in minutes)"
+msgstr ""
+
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
+#. Standard GTK2 user interface plugin
+#: ../translation/extra.c:43
+msgid "Ask confirmation to delete files from disk"
+msgstr ""
+
+#: ../translation/extra.c:44
+msgid "Status icon volume control sensitivity"
+msgstr ""
+
+#: ../translation/extra.c:45
+msgid "Custom status icon"
+msgstr ""
+
+#: ../translation/extra.c:46
+msgid "Run gtk_init with --sync (debug mode)"
+msgstr ""
+
+#: ../translation/extra.c:47
+msgid "Add separators between plugin context menu items"
+msgstr ""
+
+#. OSD Notify plugin
+#: ../translation/extra.c:49
+msgid "Notification title format"
+msgstr ""
+
+#: ../translation/extra.c:50
+msgid "Notification content format"
+msgstr ""
+
+#: ../translation/extra.c:51
+msgid "Show album art"
+msgstr ""
+
+#: ../translation/extra.c:52
+msgid "Album art size (px)"
+msgstr ""
+
+#. PulseAudio output plugin
+#: ../translation/extra.c:54
+msgid "PulseAudio server"
+msgstr ""
+
+#: ../translation/extra.c:56
+msgid "Samplerate"
+msgstr ""
+
+#. SHN player plugin
+#: ../translation/extra.c:58
+msgid "Relative seek table path"
+msgstr ""
+
+#: ../translation/extra.c:59
+msgid "Absolute seek table path"
+msgstr ""
+
+#: ../translation/extra.c:60
+msgid "Swap audio bytes (toggle if all you hear is static)"
+msgstr ""
+
+#. SID decoder plugin
+#: ../translation/extra.c:62
+msgid "Enable HVSC Songlength DB"
+msgstr ""
+
+#: ../translation/extra.c:63
+msgid "Songlengths.txt (from HVSC)"
+msgstr ""
+
+#: ../translation/extra.c:64
+msgid "Bits per sample (8 or 16)"
+msgstr ""
+
+#: ../translation/extra.c:65
+msgid "Default song length (sec)"
+msgstr ""
+
+#. WildMidi player plugin
+#: ../translation/extra.c:67
+msgid "Timidity++ bank configuration file"
+msgstr ""
+
+#: ../translation/extra.c:70
+msgid "Track Title"
+msgstr ""
+
+#: ../translation/extra.c:71
+msgid "Performer"
+msgstr ""
+
+#: ../translation/extra.c:76
+msgid "Total Tracks"
+msgstr ""
+
+#: ../translation/extra.c:77
+msgid "Genre"
+msgstr ""
+
+#: ../translation/extra.c:78
+msgid "Composer"
+msgstr ""
+
+#: ../translation/extra.c:79
+msgid "Disc Number"
+msgstr ""
+
+#: ../translation/extra.c:80
+msgid "Comment"
+msgstr ""
+
+#: ../translation/extra.c:81
+msgid "Encoder / Vendor"
+msgstr ""
+
+#: ../translation/extra.c:83
+msgid "Location"
+msgstr ""
+
+#: ../translation/extra.c:84
+msgid "Subtrack Index"
+msgstr ""
+
+#: ../translation/extra.c:85
+msgid "Tag Type(s)"
+msgstr ""
+
+#: ../translation/extra.c:86
+msgid "Embedded Cuesheet"
+msgstr ""
+
+#: ../translation/extra.c:87
+msgid "Codec"
+msgstr ""
+
+#. FFmpeg deocder plugin
+#: ../translation/extra.c:89
+msgid "File Extensions (separate with ';')"
+msgstr ""
+
+#. Converter GUI
+#: ../translation/extra.c:91
+msgid "Convert"
+msgstr ""
+
+#. Resampler (Secret Rabbit Code)
+#: ../translation/extra.c:93
+msgid "Target Samplerate"
+msgstr ""
+
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
+msgstr ""
+
+#: ../translation/extra.c:95
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr ""
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:119
+msgid "Converter warning"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:271
+msgid "Please select encoder"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:273
+msgid "Converter error"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:297
+msgid "Converting..."
+msgstr ""
+
+#: ../plugins/converter/convgui.c:459
+msgid "Select folder..."
+msgstr ""
+
+#: ../plugins/converter/convgui.c:681
+msgid "Failed to save encoder preset"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid "Preset with the same name already exists. Try to pick another title."
+msgstr ""
+
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
+msgid "Error"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:738
+msgid "Add new encoder"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:768
+msgid "Edit encoder"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
+msgid "Remove preset"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
+msgid "This action will delete the selected preset. Are you sure?"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:826
+msgid "Encoders"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
+msgid "Add plugin to DSP chain"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:1156
+msgid "Failed to save DSP preset"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:1220
+msgid "New DSP Preset"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:1305
+msgid "Edit DSP Preset"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:1325
+msgid "DSP Presets"
+msgstr ""
+
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
+msgid "Output folder:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
+msgid "Output file name:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
+msgid ""
+"Extension (e.g. .mp3) will be appended automatically.\n"
+"Leave the field empty for default (%a - %t)."
+msgstr ""
+
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
+msgid "Encoder:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
+msgid "DSP preset:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
+msgid "Number of threads:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
+msgid "Output sample format:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:212
+msgid "Keep source format"
+msgstr ""
+
+#: ../plugins/converter/interface.c:213
+msgid "8 bit signed int"
+msgstr ""
+
+#: ../plugins/converter/interface.c:214
+msgid "16 bit signed int"
+msgstr ""
+
+#: ../plugins/converter/interface.c:215
+msgid "24 bit signed int"
+msgstr ""
+
+#: ../plugins/converter/interface.c:216
+msgid "32 bit signed int"
+msgstr ""
+
+#: ../plugins/converter/interface.c:217
+msgid "32 bit float"
+msgstr ""
+
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
+msgid "When file exists:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:230
+msgid "Prompt"
+msgstr ""
+
+#: ../plugins/converter/interface.c:231
+msgid "Overwrite"
+msgstr ""
+
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
+msgid "Edit Encoder Preset"
+msgstr ""
+
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
+msgid "Untitled Encoder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
+msgid "Output file extension:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
+msgid "E.g. mp3"
+msgstr ""
+
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
+msgid "Command line:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
+msgid ""
+"Example: lame - %o\n"
+"%i for input file, %o for output file, - for stdin"
+msgstr ""
+
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
+msgid ""
+"<small>%o - output file name\n"
+"%i - temporary input file name</small>"
+msgstr ""
+
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
+msgid "Method:"
+msgstr ""
+
+#: ../plugins/converter/interface.c:445
+msgid "Pipe"
+msgstr ""
+
+#: ../plugins/converter/interface.c:446
+msgid "Temporary file"
+msgstr ""
+
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
+msgid "APEv2"
+msgstr ""
+
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
+msgid "ID3v1"
+msgstr ""
+
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
+msgid "OggVorbis"
+msgstr ""
+
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
+msgid "FLAC"
+msgstr ""
+
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
+msgid "ID3v2"
+msgstr ""
+
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
+msgid "<b>Tag writer</b>"
+msgstr ""
+
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
+msgid "DSP Preset Editor"
+msgstr ""
+
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
+msgid "Untitled DSP Preset"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+msgid "Playlist"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
diff --git a/po/el.po b/po/el.po
index 37dc838c..379b5ebd 100644
--- a/po/el.po
+++ b/po/el.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-04-18 08:17+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-05-20 22:09+0200\n"
"Last-Translator: George <forfolias@gmail.com>\n"
"Language-Team: Greek\n"
"Language: el\n"
@@ -25,9 +25,8 @@ msgid "Supported sound formats"
msgstr "Υποστηριζόμενοι τύποι ήχου"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Άλλα αρχεία (*)"
+msgstr "Όλα τα αρχεία (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -55,11 +54,11 @@ msgstr "Αποτυχία κατά τη φόρτωση του αρχείου βο
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Βοήθεια"
@@ -73,123 +72,126 @@ msgstr "Περί DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s ChangeLog"
-#: ../plugins/gtkui/callbacks.c:1116
-#, fuzzy, c-format
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
msgid "DeaDBeeF Translators"
-msgstr "DeaDBeeF τώρα αναπαράγει"
+msgstr "Μεταφραστές του DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Επεξεργασία λίστας αναπαραγωγής"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Τίτλος:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Μετονομασία λίστας αναπαραγωγής"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Αφαίρεση λίστας αναπαραγωγής"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Προσθήκη νέας λίστας αναπαραγωγής"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Αποθήκευση ρύθμισης DeaDBeeF EQ"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Αρχεία ρύθμισης DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Φόρτωση ρύθμισης DeaDBeeF EQ"
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Ρυθμίσεις DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Εισαγωγή ρυθμίσεων Foobar2000 EQ..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Ρυθμίσεις Foobar2000 EQ (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Αποθήκευση ρύθμισης"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Φόρτωση ρύθμισης"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Εισαγωγή ρύθμισης Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Ενεργό"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Όλα μηδέν"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Μηδέν προενίσχυση"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Μηδέν ζώνες"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Προκαθορισμένες ρυθμίσεις"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 μέρα %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d μέρες %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Διακοπή | %d κομμάτια | %s συνολικός χρόνος αναπαραγωγής"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Μονοφωνικό"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Στερεοφωνικό"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Παύση |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -197,736 +199,763 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d κομμάτια | %s συνολικός "
"χρόνος αναπαραγωγής"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Αποθήκευση λίστας αναπαραγωγής ως"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Αρχεία λίστας αναπαραγωγής DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Φόρτωση λίστας αναπαραγωγής"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Άλλα αρχεία (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Νέα λίστα αναπαραγωγής"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Νέα λίστα αναπαραγωγής (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Αρχείο"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Άνοιγμα αρχείου"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Προσθήκη αρχείου"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Προσθήκη φακέλου"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Προσθήκη τοποθεσίας"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Νέα λίστα αναπαραγωγής"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Φόρτωση λίστας αναπαραγωγής"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Αποθήκευση λίστας αναπαραγωγής"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Έξοδος"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Επεξεργασία"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Καθαρισμός"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Επιλογή όλων"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Αποεπιλογή όλων"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Αναστροφή επιλογής"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Επιλεγμένο"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Αφαίρεση"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Περικοπή"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Αναζήτηση"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Ταξινόμηση κατά"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Τίτλος"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr "Αριθμός αρχείου"
+msgstr "Αριθμός κομματιού"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Άλμπουμ"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Καλλιτέχνης"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "Ημερομηνία"
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Τυχαία"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Αυτοσχέδιο"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Ρυθμίσεις"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Προβολή"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Μπάρα κατάστασης"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Τίτλοι στύλων"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Καρτέλες"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ισοσταθμιστής"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Σειρά"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Γραμμικά"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Ανακατεμένα"
+msgstr "Ανακατεμένα κομμάτια"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Ανακατεμένα"
-
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Τυχαία"
+msgstr "Ανακατεμένα άλμπουμ"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Επανάληψη"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Επανάληψη όλων"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Επανάληψη κομματιού"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Χωρίς επανάληψη"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Η κύληση ακολουθεί την αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Ο δείκτης ποντικιού ακολουθεί την αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Διακοπή μετά το τρέχον"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "Μεταπήδηση στο τρέχον κομμάτι"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Βοήθεια"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
-msgstr ""
+msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
-msgstr ""
+msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Περί"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
-msgstr ""
+msgstr "_Μεταφραστές"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Αναζήτηση"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Διακοπή"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Παύση"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Προηγούμενο"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Επόμενο"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Αναπαραγωγή τυχαίου"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Περί"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Έξοδος"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Ιδιότητες κομματιού"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Επιλογές"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Εφαρμογή"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Κλείσιμο"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Μεταδεδομένα"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Ιδιότητες"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Εισαγωγή νέου τίτλου για τη στήλη"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Τύπος"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "Αριθμός αντικειμένου"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Σχέδιο άλπουμ"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Καλλιτέχνης - Άλμπουμ"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Διάρκεια"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Αριθμός κομματιού"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Συγκρότημα / Καλλιτέχνης άλμπουμ"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Μορφή:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Στοίχιση:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Αριστερά"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Δεξιά"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Άκυρο"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Εντάξει"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Πρόσθετο εξόδου:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Συσκευή εξόδου:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "Να γίνεται πάντα μετατροπή του 8 bit ήχου σε 16 bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Ήχος"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Λειτουργία Replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Ανενεργό"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Κομμάτι"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Κορυφή κλίμακας Replaygain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr "Λειτουργία Replaygain:"
+msgstr "Προενίσχυση Replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Καθολική προενίσχυση"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Προσθήκη αρχείων από την γραμμή εντολών (ή το διαχειριστή αρχείων) σε αυτή "
"τη λίστα αναπαραγωγής:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Συνέχεια προηγούμενης συνεδρίας στην εκκίνηση"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Να μη γίνεται προσθήκη από αρχειοθήκες κατά την προσθήκη φακέλων"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Διακοπή μετά το τρέχον"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Αναπαραγωγή"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Ρύθμιση"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Προκαθορισμένες ρυθμίσεις DSP Chain"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "_Φόρτωση"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Ελαχιστοποίηση στο πλαίσιο συστήματος στο κλείσιμο"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Το μεσαίο πλήκτρο του ποντικιού να κλείνει τη λίστα αναπαραγωγής"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Απόκρυψη εικονιδίου στο πλαίσιο συστήματος"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Χρήση έντονης γραμματοσειράς κομμάτι που αναπαράγεται"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Απόκρυψη του μενού \"Διαγραφή από το δίσκο\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
+"Αυτόματη απόδοση ονόματος στις λίστες αναπαραγωγής όταν φορτώνεται ένας "
+"κατάλογος"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "Ρυθμός ανανέωσης γραφικής διεπαφής (φορές το δευτερόλεπτο):"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Τίτλος παραθύρου κατά την αναπαραγωγή:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Τίτος παραθύρου κατά τη διακοπή:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr ""
+msgstr "Πρόσθετο γραφικής διεπαφής (αλλαγή απαιτεί επανεκκίνηση):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Γραφική Διεπαφή"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Παράκαμψη"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Προσκήνιο"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Παρασκήνιο"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Χρώματα μπάρας μετατόπισης/ήχου"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Μέση"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Φωτεινό"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Σκοτεινό"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Βάση"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Κείμενο"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Χρώματα στο χώρο καρτελών"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Παράκαμψη (χάνει το GTK treeview θέμα, αλλά επιταχύνει την απόδοση)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Ζυγή σειρά"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Μονή σειρά"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Επιλεγμένη σειρά"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Επιλεγμένο κείμενο"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Δείκτης ποντικιού"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Χρώματα λίστας αναπαραγωγής"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Χρώματα"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Ενεργοποίηση Proxy Server"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Διεύθυνση Proxy Server:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Πόρτα Proxy Server:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Τύπος Proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Όνομα χρήστη Proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Κωδικός Proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Δίκτυο"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "Έκδοση:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
-msgstr ""
+msgstr "Πνευματικά δικαιώματα"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Πρόσθετα"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Ομαδοποίηση κατά"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
+msgid "Sort by ..."
+msgstr "Ταξινόμηση κατά..."
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
-msgstr "Μορφή:"
+msgstr "Μορφή"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "Αύξουσα σειρά"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "Φθίνουσα σειρά"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Επιλεγμένο"
+msgstr "Επιλέξτε πρόσθετο DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr "Πρόσθετα"
+msgstr "Πρόσθετο"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr "Συγγραφέας ετικετών"
+msgstr "Επιλογές συγγραφέα ετικετών"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Εγγραφή ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Εγγραφή ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Εγγραφή APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Αφαίρεση ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Αφαίρεση ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Αφαίρεση APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Έκδοση ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Προτείνεται)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 κωδικοποίηση χαρακτήρων (προεπιλογή είναι iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Εγγραφή ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Καλλιτέχνης / Άλμπουμ"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Αριθμός κομματιού"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Διαγραφή αρχείων από το δίσκο"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -935,49 +964,48 @@ msgstr ""
"(Αυτό το παράθυρο μπορεί να απενεργοποιηθεί από τις ρυθμίσεις του πρόσθετου "
"GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Προειδοποίηση"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Προσθήκη στην ουρά αναπαραγωγής"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Αφαίρεση από την ουρά αναπαραγωγής"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Επαναφόρτωση μεταδεδομένων"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Αφαίρεση από τον δίσκο"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Προσθήκη στήλης"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Επεξεργασία στήλη"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Αφαίρεση στήλης"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Ομαδοποίηση κατά"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Κανένα"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Καλλιτέχνης/Ημερομηνία/Άλμπουμ"
@@ -985,28 +1013,32 @@ msgstr "Καλλιτέχνης/Ημερομηνία/Άλμπουμ"
msgid "Open file..."
msgstr "Άνοιγμα αρχείου..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, fuzzy, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
-msgstr "Ρύθμιση"
+msgstr "Ρύθμιση %s"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "Προεπιλεγμένη συσκευή ήχου"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Προσθήκη"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Συντομεύσεις πληκτρολογίου"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Θέση"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Τοποθεσία"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Συνδυασμός πλήκτρων"
@@ -1018,139 +1050,146 @@ msgstr "Προσθήκη αρχείων"
msgid "Initializing..."
msgstr "Αρχικοποίηση..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Έχετε τροποποιήσει στοιχεία του κομματιού."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Είστε σίγουροι πως θέλετε να κλείσετε το παράθυρο;"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr ""
+msgstr "[πολλαπλές τιμές]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Πλήκτρο"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Τιμή"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "Εγγραφή ετικετών..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "Όνομα:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "Τα πεδία ονόματος δεν πρέπει να ξεκινούν με : ή _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "Αποτυχία προσθήκης πεδίου"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
+"Υπάρχει ήδη πεδίο με αυτό το όνομα, παρακαλώ προσπαθήστε με ένα διαφορετικό "
+"όνομα."
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Είστε σίγουροι πως θέλετε να κλείσετε το παράθυρο;"
-
-#: ../plugins/gtkui/trkproperties.c:734
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr "Προσθήκη αρχείου"
+msgstr "Προσθήκη πεδίου"
-#: ../plugins/gtkui/trkproperties.c:737
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr "Αφαίρεση"
+msgstr "Αφαίρεση πεδίου"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Χρήση: deadbeef [επιλογές] [αρχεία]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Επιλογές:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ή -h Εμφάνιση κειμένου βοήθειας και έξοδος\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr "--quit Έξοδος\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr "--version Εμφάνιση πληροφοριών έκδοσης και έξοδος\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr "--play Εκκίνηση αναπαραγωγής\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr "--stop Διακοπή αναπαραγωγής\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr "--pause Παύση αναπαραγωγής\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr "--toggle-pause Εναλλαγή παύσης\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
+"--play-pause Εκκίνηση αναπαραγωγής αν είναι σταματημένο, αλλιώς εναλλαγή "
+"παύσης\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
-msgstr "--next Επόμενο τραγούδι στη λίστα αναπαραγωγής\n"
+msgstr "--next Επόμενο κομμάτι στη λίστα αναπαραγωγής\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
-msgstr "--prev Προηγούμενο τραγούδι στη λίστα αναπαραγωγής\n"
+msgstr "--prev Προηγούμενο κομμάτι στη λίστα αναπαραγωγής\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr "--random Τυχαίο κομμάτι στη λίστα αναπαραγωγής\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr "--queue Προσάρτηση αρχείου στην υπάρχουσα λίστα αναπαραγωγής\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr "--nowplaying FMT Εμφάνιση μορφοποιημένου ονόματος κομματιού\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1161,58 +1200,35 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr "π.χ.: --nowplaying \"%%a - %%t\" θα εμφανίσει \"artist - title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+"για περισσότερες πληροφορίες, δείτε το http://sourceforge.net/apps/mediawiki/"
+"deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Προεπιλογή"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ναί"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Όχι"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Προτείνεται)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Ανενεργό\n"
-"Κομμάτι\n"
-"Άλμπουμ"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
-#, fuzzy
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1226,7 +1242,7 @@ msgid ""
"Band / Album Artist\n"
"Custom"
msgstr ""
-"Αριθμός αρχείου\n"
+"Αριθμός αντικειμένου\n"
"Αναπαραγωγή\n"
"Εξώφυλλο\n"
"Καλλιτέχνης - Άλμπουμ\n"
@@ -1238,7 +1254,7 @@ msgstr ""
"Καλλιτέχνης Μπάντας / Άλμπουμ\n"
"Προσαρμοσμένο"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1246,13 +1262,40 @@ msgstr ""
"Αριστερα\n"
"Δεξιά"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Ανενεργό\n"
+"Κομμάτι\n"
+"Άλμπουμ"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Αύξουσα σειρά\n"
+"Φθίνουσα σειρά"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Προτείνεται)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Δε βρέθηκε το αρχείο pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1265,538 +1308,852 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Προσθήκη CD ήχου"
#: ../translation/extra.c:4
msgid "Lookup on Last.fm"
-msgstr ""
+msgstr "Αναζήτηση στο Last.fm"
#. ALSA output plugin
#: ../translation/extra.c:6
msgid "Use ALSA resampling"
-msgstr ""
+msgstr "Χρήση αναδειγματοληψίας ALSA"
#: ../translation/extra.c:7
-#, fuzzy
msgid "Release device while stopped"
-msgstr "Τίτος παραθύρου κατά τη διακοπή:"
+msgstr "Απελευθέρωση συσκευής κατά τη διακοπή:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
-msgstr ""
+msgstr "Προτεινόμενο μέγεθος ενδιάμεσης μνήμης"
#: ../translation/extra.c:9
msgid "Preferred period size"
-msgstr ""
+msgstr "Προτεινόμενο μέγεθος περιόδου"
#. Last.fm plugin
#: ../translation/extra.c:11
-#, fuzzy
msgid "Enable scrobbler"
-msgstr "Ενεργοποίηση Proxy Server"
+msgstr "Ενεργοποίηση scrobbler"
#: ../translation/extra.c:12
-#, fuzzy
msgid "Disable nowplaying"
-msgstr "DeaDBeeF τώρα αναπαράγει"
+msgstr "Απενεργοποίηση τρέχουσας-αναπαραγωγής"
#: ../translation/extra.c:13
-#, fuzzy
msgid "Username"
-msgstr "Όνομα χρήστη Proxy:"
+msgstr "Όνομα χρήστη:"
#: ../translation/extra.c:14
-#, fuzzy
msgid "Password"
-msgstr "Κωδικός Proxy:"
+msgstr "Κωδικός:"
#: ../translation/extra.c:15
msgid "Scrobble URL"
+msgstr "Scrobble URL"
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
msgstr ""
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
-msgstr ""
+msgstr "Αρχείο συσκευής"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "Επίλυση σφάλματος δειγματοληψίας OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr ""
+msgstr "Περίοδος ενημέρωσης προσωρινής μνήμης"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
-msgstr ""
+msgstr "Λήψη από τις ενσωματωμένες ετικέτες"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
-msgstr ""
+msgstr "Λήψη από τον τοπικό φάκελο"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
-msgstr ""
+msgstr "Αρχείο μάσκας τοπικού εξώφυλλου"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
-msgstr ""
+msgstr "Λήψη από το last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
-msgstr ""
+msgstr "Λήψη από το albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Κλιμάκωση εξώφυλλου ως προς τη μεγαλύτερη πλευρά"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
-msgstr ""
+msgstr "Χρήση CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "Προτίμηση κειμένου-CD έναντι CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
-msgstr ""
+msgstr "CDDB url (π.χ. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
-msgstr ""
+msgstr "Αριθμός θύρας CDDB (π.χ. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "Προτίμηση πρωτοκόλλου CDDB έναντι HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
-msgstr ""
+msgstr "Ενεργοποίηση αρχείων εικόνων NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
+msgstr "Ποιότητα αναδειγματοληψίας (0..2, μεγαλύτερο είναι καλύτερο)"
+
+#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
msgstr ""
#. Game_Music_Emu decoder plugin
-#: ../translation/extra.c:37
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
+msgstr "Μέγιστη διάρκεια τραγουδιού (σε λεπτά)"
+
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Προεπιλεγμένη διάρκεια τραγουδιού (δευτ)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
msgstr ""
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
-#, fuzzy
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
-msgstr "Διαγραφή αρχείων από το δίσκο"
+msgstr "Ερώτηση επιβεβαίωσης για τη διαγραφή αρχείων από το δίσκο"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
-msgstr ""
+msgstr "Ευαισθησία εικονιδίου κατάστασης ελέγχου έντασης"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
-msgstr ""
+msgstr "Προσαρμοσμένο εικονίδιο κατάστασης"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
-msgstr ""
+msgstr "Εκτέλεση gtk_init με --sync (λειτουργία αποσφαλμάτωσης)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "Προσθήκη διαχωριστικών μεταξύ αντικειμένων μενού πρόσθετων"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr ""
+msgstr "Μορφή τίτλου ειδοποίησης"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr ""
+msgstr "Μορφή περιεχομένου ειδοποίησης"
-#: ../translation/extra.c:47
-#, fuzzy
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr "Σχέδιο άλπουμ"
+msgstr "Εμφάνιση εξώφυλλου άλμπουμ"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Μέγεθος εξώφυλλου άλμπουμ (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
-msgstr ""
+msgstr "Διακομιστής PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
-msgstr ""
+msgstr "Δειγματοληψία"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
-msgstr ""
+msgstr "Διαδρομή πίνακα σχετικής αναζήτησης"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
-msgstr ""
+msgstr "Διαδρομή πίνακα απόλυτης αναζήτησης"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
-msgstr ""
+msgstr "Εναλλαγή bytes ήχου (επιλέξτε αν ακούτε μόνο κάτι στατικό)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr ""
+msgstr "Ενεργοποίηση HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlengths.txt (from HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Bits ανά δείγμα (8 or 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr ""
+msgstr "Προεπιλεγμένη διάρκεια τραγουδιού (δευτ)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
-msgstr ""
+msgstr "Αρχείο ρυθμίσεων Timidity++"
-#: ../translation/extra.c:66
-#, fuzzy
+#: ../translation/extra.c:70
msgid "Track Title"
-msgstr "Αριθμός κομματιού"
+msgstr "Τίτλος κομματιού"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
-msgstr ""
+msgstr "Εκτελεστής"
-#: ../translation/extra.c:72
-#, fuzzy
+#: ../translation/extra.c:76
msgid "Total Tracks"
-msgstr "Τίτλος / Καλλιτέχνης κομματιού"
+msgstr "Σύνολο κομματιών"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
-msgstr ""
+msgstr "Είδος"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
-msgstr ""
+msgstr "Συνθέτης"
-#: ../translation/extra.c:75
-#, fuzzy
+#: ../translation/extra.c:79
msgid "Disc Number"
-msgstr "Αριθμός αρχείου"
+msgstr "Αριθμός δίσκου"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
-msgstr ""
+msgstr "Σχόλιο"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
-msgstr ""
+msgstr "Κωδικοποίηση / Προμηθευτής"
-#: ../translation/extra.c:79
-#, fuzzy
+#: ../translation/extra.c:83
msgid "Location"
-msgstr "Προσθήκη τοποθεσίας"
+msgstr "Τοποθεσία"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
-msgstr ""
+msgstr "Δείκτης υποκομματιού"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Τύπος ετικέτας"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Ενσωματωμένα Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Κωδικοποιητής"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Επεκτάσεις αρχείων (διαχωρισμός με ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Μετατροπή"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
+msgstr "Στόχος δειγματοληψίας"
+
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "Ποιότητα / αλγόριθμος"
+
+#: ../translation/extra.c:95
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "Αυτόματη δειγματοληψία (υπερέχει του στόχου δειγματοληψίας)"
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../translation/extra.c:91
-msgid "Automatic Samplerate (overrides Target Samplerate)"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Ενεργοποίηση scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
-msgstr ""
+msgstr "Το αρχείο υπάρχει ήδη. Να αντικατασταθεί;"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
-msgstr ""
+msgstr "Προειδοποίηση μετατροπής"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "Παρακαλώ επιλέξτε κωδικοποιητή "
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Σφάλμα μετατροπέα"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Μετατροπή..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "Επιλογή όλων"
+msgstr "Επιλογή φακέλου"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "Αποτυχία αποθήκευσης προρύθμισης κωδικοποιητή "
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
+"Ελέγξτε τα δικαιώματα του φακέλου προρυθμίσεων, δοκιμάστε με ένα διαφορετικό "
+"όνομα, ή ελευθερώστε χώρο στο σκληρό δίσκο"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
+"Υπάρχει ήδη μια προρύθμιση με αυτό το όνομα. Δοκιμάστε να διαλέξετε ένα "
+"διαφορετικό όνομα."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Σφάλμα"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Προσθήκη κωδικοποιητή"
-#: ../plugins/converter/convgui.c:724
-#, fuzzy
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr "Επεξεργασία στήλη"
+msgstr "Επεξεργασία κωδικοποιητή"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Αφαίρεση προρύθμισης"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
+"Αυτή η ενέργεια θα διαγράψει την επιλεγμένη προρύθμιση. Είστε σίγουρος;"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "Κωδικοποιητές"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr ""
+msgstr "Προσθήκη πρόσθετου στην αλυσίδα DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "Αποτυχία αποθήκευσης προρύθμισης DSP"
-#: ../plugins/converter/convgui.c:1098
-#, fuzzy
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Νέα DSP προρύθμιση"
-#: ../plugins/converter/convgui.c:1183
-#, fuzzy
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Επεξεργασία DSP προρύθμισης"
-#: ../plugins/converter/convgui.c:1203
-#, fuzzy
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Προρυθμίσεις DSP"
-#: ../plugins/converter/interface.c:94
-#, fuzzy
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
-msgstr "Συσκευή εξόδου:"
+msgstr "Φάκελος εξόδου:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Διατήρηση δομής φακέλου, αρχής γενομένης από:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr "Πρόσθετο εξόδου:"
+msgstr "Όνομα αρχείου εξόδου:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"Η επέκταση (π.χ. .mp3) θα προστεθεί αυτόματα.\n"
+"Αφήστε το πεδίο κενό για την προεπιλογή (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "Κωδικοποιητής:"
-#: ../plugins/converter/interface.c:163
-#, fuzzy
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr "Αποθήκευση ρύθμισης"
+msgstr "Ρύθμιση DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "Αριθμός νημάτων:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "Μορφή δειγματοληψίας εξόδου:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "Διατήρηση μορφής εισόδου"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "Προσημασμένος ακέραιος 8 bit"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "Προσημασμένος ακέραιος 16 bit"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "Προσημασμένος ακέραιος 24 bit"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "Προσημασμένος ακέραιος 32 bit"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "Δεκαδικός 32 bit"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "Όταν το αρχείο υπάρχει ήδη:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "Ερώτηση"
-#: ../plugins/converter/interface.c:225
-#, fuzzy
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr "Παράκαμψη"
-
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
+msgstr "Αντικατάσταση"
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "Φόρτωση ρύθμισης"
+msgstr "Επεξεργασία ρύθμισης κωδικοποιητή"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "Ανώνυμος κωδικοποιητής"
-#: ../plugins/converter/interface.c:410
-#, fuzzy
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr "Πρόσθετο εξόδου:"
+msgstr "Επέκταση αρχείου εξόδου:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "Π.χ. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "Γραμμή εντολών:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"Παράδειγμα: lame - %o\n"
+"%i για το αρχείο εισόδου, %o για το αρχείο εξόδου, - για το stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>%o - όνομα αρχείου εξόδου\n"
+"%i - όνομα προσωρινού αρχείου εισόδου</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "Μέθοδος"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "Σωλήνωση"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "Προσωρινό αρχείο"
-#: ../plugins/converter/interface.c:480
-#, fuzzy
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
-msgstr "Εγγραφή APEv2"
+msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
-#, fuzzy
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
-msgstr "Εγγραφή ID3v1"
+msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
-#, fuzzy
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
-msgstr "Εγγραφή ID3v2"
+msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
-#, fuzzy
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr "Συγγραφέας ετικετών"
+msgstr "<b>Συγγραφέας ετικετών</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "Επεξεργαστής ρυθμίσεων DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "Ανώνυμη ρύθμιση DSP"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Αντικατάσταση"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Προσωρινό αρχείο"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Επεξεργασία"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Κλείσιμο"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Επεξεργασία στήλη"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Γραμμή εντολών:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Ανακατεμένα κομμάτια"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[πολλαπλές τιμές]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Τοποθεσία"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Αφαίρεση"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Νέα λίστα αναπαραγωγής"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Σχόλιο"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Προσθήκη στήλης"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+"Αυτή η ενέργεια θα διαγράψει την επιλεγμένη προρύθμιση. Είστε σίγουρος;"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Ρύθμιση"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
msgstr ""
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Επιλογές"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Γραφική Διεπαφή"
+
+#~ msgid "Slot"
+#~ msgstr "Θέση"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Είστε σίγουροι πως θέλετε να αφαιρέσετε το επιλεγμένο πεδίο;"
+
#~ msgid "Save playlist as"
#~ msgstr "Αποθήκευση λίστας αναπαραγωγής ως"
diff --git a/po/en_GB.po b/po/en_GB.po
index 9745ac5d..9c11cd5f 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0xDeadBeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-25 00:29+0200\n"
"Last-Translator: Steve <yorvik.ubunto@gmail.com>\n"
"Language-Team: English (United Kingdom) <yorvik.ubunto@gmail.com>\n"
@@ -53,9 +53,9 @@ msgstr "Failed to load help file"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Help"
@@ -69,846 +69,885 @@ msgstr "About DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s ChangeLog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF Translators"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Edit playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Title:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Rename Playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Remove Playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Add New Playlist"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Save DeaDBeeF EQ Preset"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ preset files (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Load DeaDBeeF EQ Preset..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ presets (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Import Foobar2000 EQ Preset..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ presets (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Save Preset"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Load Preset"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Import Foobar2000 Preset"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Enable"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Zero All"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Zero Preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Zero Bands"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Presets"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 day %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d days %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Stopped | %d tracks | %s total playtime"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Paused | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Save Playlist As"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF playlist files (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Load Playlist"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Other files (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "New Playlist"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "New Playlist (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_File"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Open file(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Add file(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Add folder(s)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Add location"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "New playlist"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Load playlist"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Save playlist"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Quit"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Edit"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Clear"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Select all"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Deselect all"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Invert selection"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selection"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Remove"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Crop"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Find"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sort By"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Title"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Track number"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artist"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Date"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Random"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Custom"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferences"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_View"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Status bar"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Column headers"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Tabs"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equaliser"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Playback"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Order"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linear"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Shuffle tracks"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Shuffle albums"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Random"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Looping"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Loop All"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Loop Single Song"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Don’t Loop"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Scroll follows playback"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Cursor follows playback"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stop after current"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Jump to current track"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Help"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_About"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Translators"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Search"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Play"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pause"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Previous"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Next"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Play Random"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "About"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Quit"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Track Properties"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Settings"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Apply"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Close"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Properties"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Enter new column title here"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Type:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Item Index"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Playing"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album Art"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artist - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duration"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Track Number"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Band / Album Artist"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alignment:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Left"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Right"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancel"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Output plugin:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Output device:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Always convert 8 bit audio to 16 bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Sound"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replay-gain mode:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Disable"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Track"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replay-gain peak scale"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Replay-gain preamp:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Global preamp:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Add files from command line (or file manager) to this playlist:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Resume previous session on startup"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Don't add from archives when adding folders"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stop after current"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "_Playback"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configure"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP Chain Preset"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Load"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Close minimises to tray"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Middle mouse button closes playlist"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Hide system tray icon"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Use bold font for currently playing track"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Hide \"Delete from disk\" in context menu"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Auto-name playlists when adding a single folder"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Interface refresh rate (times per second):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Titlebar text while playing:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Titlebar text while stopped:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI Plugin (changing requires restart):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Override"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Foreground"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Background"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Seek-bar/Volume-bar colours"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Middle"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Light"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Dark"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Tab strip colours"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Override (loses GTK tree-view theming, but speeds up rendering)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Even row"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Odd row"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Selected row"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Selected text"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Playlist colours"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Colours"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Enable Proxy Server"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Proxy Server Address:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Proxy Server Port:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Proxy Type:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Proxy User-name:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Proxy Password:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Network"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Version: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Group By"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Sort by..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Format"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Ascending"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descending"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Select DSP Plugin"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Plugin"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Tag Writer Settings"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Write ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Write ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Write APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Strip ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Strip ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Strip APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 version"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Recommended)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 character encoding (default is iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Write ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artist / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Track No."
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Delete files from disk"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -916,49 +955,48 @@ msgstr ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Warning"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Add to playback queue"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Remove from playback queue"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Reload metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Remove from disk"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Add column"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Edit column"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Remove column"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Group by"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "None"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artist/Date/Album"
@@ -966,7 +1004,7 @@ msgstr "Artist/Date/Album"
msgid "Open file..."
msgstr "Open file..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configure %s"
@@ -975,19 +1013,23 @@ msgstr "Configure %s"
msgid "Default Audio Device"
msgstr "Default Audio Device"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Add"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Global Hot-keys"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Location"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Key combination"
@@ -999,136 +1041,143 @@ msgstr "Adding files..."
msgid "Initializing..."
msgstr "Initialising..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "You’ve modified data for this track."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Really close the window?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Multiple values] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Key short-cuts"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Value"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Writing tags..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Name:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Field names must not start with : or _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Cannot add field"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Field with such name already exists, please try different name."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Really remove selected field?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Add field"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Remove field"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Usage: deadbeef [options] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Options:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Print help (this message) and exit\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Quit player\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Print version info and exit\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Start playback\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Stop playback\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pause playback\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Toggle pause\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Next song in playlist\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Previous song in playlist\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Random song in playlist\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Append file(s) to existing playlist\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Print formatted track name to stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1139,7 +1188,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1148,53 +1197,28 @@ msgstr ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " for more info, see http://sourceforge.net/apps/mediawi"
-"ki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Default"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Yes"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "No"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recommended)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Ascending\n"
-"Descending"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Disable\n"
-"Track\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1212,7 +1236,7 @@ msgstr ""
"PlayingAlbum ArtArtist - AlbumArtistAlbumTitleDurationTrack NumberBand / "
"Album ArtistCustom"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1220,13 +1244,40 @@ msgstr ""
"Left\n"
"Right"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Disable\n"
+"Track\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Ascending\n"
+"Descending"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recommended)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Couldn’t find pixmap file: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1238,7 +1289,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Add Audio CD"
#: ../translation/extra.c:4
@@ -1254,7 +1306,7 @@ msgstr "Use ALSA resampling"
msgid "Release device while stopped"
msgstr "Release device while stopped"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Preferred buffer size"
@@ -1283,265 +1335,303 @@ msgstr "Password"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Device file"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "OSS4 sample rate bug workaround"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Cache update period (hr)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Fetch from embedded tags"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Fetch from local folder"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Local cover file mask"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Fetch from last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Fetch from albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Scale artwork towards longer side"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Use CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Prefer CD-Text over CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (e.g. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB port number (e.g. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Prefer CDDB protocol over HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Enable NRG image support"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Re-sampling quality (0..2, higher is better)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maximum song length (in minutes)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Default song length (sec)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Ask for confirmation to delete files from disk"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Status icon volume control sensitivity"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Custom status icon"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Run gtk_init with --sync (debug mode)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Add separators between plugin context menu items"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Notification title format"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Notification content format"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Show album art"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Album art size (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio server"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Sample rate"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relative seek table path"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Absolute seek table path"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Swap audio bytes (toggle if all you hear is static)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Enable HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (from HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits per sample (8 or 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Default song length (sec)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ bank configuration file"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Track Title"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Artist"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Total Tracks"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Genre"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Composer"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Disc Number"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comment"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Encoder / Vendor"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Location"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Sub-track Index"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tag Type(s)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Embedded Cue-sheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "File Extensions (separate with ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Convert"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Target sample rate"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Quality / Algorithm"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Automatic sample rate (overrides Target sample rate)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Enable scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "The file already exists. Overwrite?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Converter warning"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Please select encoder"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Converter error"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Converting..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Select folder..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Failed to save encoder preset"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1549,63 +1639,78 @@ msgstr ""
"Check preset folder permissions, try to pick a different title, or free up "
"some disk space"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Preset with the same name already exists. Pick another title."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Error"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Add new encoder"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Edit encoder"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Remove preset"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "This action will delete the selected preset. Are you sure?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Encoders"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Add plugin to DSP chain"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Failed to save DSP preset"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "New DSP Preset"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Edit DSP Preset"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP Presets"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Output folder:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Preserve folder structure, starting from:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Output file name:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1613,84 +1718,91 @@ msgstr ""
"File extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for the default (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Encoder:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP preset:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Number of threads:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Output sample format:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Keep source format"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit signed integer"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit signed integer"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit signed integer"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit signed integer"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "When file exists:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Prompt"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Overwrite"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Preserve folder structure, starting from:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Edit Encoder Preset"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Untitled Encoder"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Output file extension:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "E.g. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Command line:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1698,8 +1810,9 @@ msgstr ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1707,50 +1820,317 @@ msgstr ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Method:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Pipe"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Temporary file"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Tag writer</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP Preset Editor"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Untitled DSP Preset"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Overwrite"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Temporary file"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Edit"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Close"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Edit column"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Command line:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Shuffle tracks"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Multiple values] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Location"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Remove"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "New Playlist"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Comment"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Add column"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "This action will delete the selected preset. Are you sure?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configure"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Settings"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Really remove selected field?"
+
#~ msgid "Save playlist as"
#~ msgstr "Save playlist as"
diff --git a/po/eo.po b/po/eo.po
index d961ba09..88da1f2b 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-09-25 17:37+0200\n"
"Last-Translator: Kristjan <kristjan.schmidt@googlemail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -56,9 +56,9 @@ msgstr "Eraro dum ŝargado de la helpdosiero"
msgid "help.txt"
msgstr "helpo.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Helpo"
@@ -72,893 +72,924 @@ msgstr "Pri DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Ŝanĝoprotokolo de DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Tradukintoj de DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Redakti la ludliston"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titolo:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Alinomi la ludliston"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Forigi la ludliston"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Aldoni novan ludliston"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr ""
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr ""
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr ""
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr ""
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Aliaj dosieroj (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr ""
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr ""
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr ""
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr ""
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr ""
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr ""
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr ""
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr ""
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr ""
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr ""
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr ""
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr ""
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr ""
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr ""
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr ""
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr ""
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr ""
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr ""
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr ""
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr ""
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr ""
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr ""
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr ""
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr ""
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr ""
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
msgstr ""
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
msgstr ""
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
msgstr ""
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr ""
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr ""
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr ""
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr ""
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr ""
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr ""
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr ""
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr ""
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr ""
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr ""
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr ""
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr ""
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr ""
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr ""
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr ""
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr ""
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr ""
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr ""
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr ""
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr ""
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr ""
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr ""
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr ""
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr ""
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr ""
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr ""
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr ""
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr ""
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr ""
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr ""
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr ""
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr ""
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr ""
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr ""
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr ""
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr ""
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr ""
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr ""
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr ""
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr ""
@@ -966,7 +997,7 @@ msgstr ""
msgid "Open file..."
msgstr ""
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr ""
@@ -975,19 +1006,22 @@ msgstr ""
msgid "Default Audio Device"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -999,136 +1033,142 @@ msgstr ""
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr ""
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr ""
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr ""
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr ""
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr ""
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1136,52 +1176,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1196,19 +1217,39 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1218,7 +1259,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1234,7 +1275,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1263,462 +1304,763 @@ msgstr ""
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr ""
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr ""
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr ""
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr ""
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr ""
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr ""
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr ""
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr ""
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr ""
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr ""
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr ""
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr ""
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr ""
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr ""
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr ""
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Alinomi la ludliston"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
diff --git a/po/es.po b/po/es.po
index 162e60bb..4d1fda3f 100644
--- a/po/es.po
+++ b/po/es.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-09 03:04+0200\n"
"Last-Translator: Hugo <sysadmin@cips.cu>\n"
"Language-Team: Spanish\n"
@@ -57,9 +57,9 @@ msgstr "Error al cargar el archivo de ayuda"
msgid "help.txt"
msgstr "ayuda.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ayuda"
@@ -73,848 +73,887 @@ msgstr "Acerca de DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Cambios en DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Traductores de DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Editar lista de reproducción"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Título:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Renombrar lista de reproducción"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Quitar lista de reproducción"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Nueva lista de reproducción"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Guardar Ajustes del EQ de DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Ajustes del EQ de DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Cargar Ajustes del EQ de DeaDBeef..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Ajustes del EQ de DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importar Ajustes del EQ de Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Ajustes de EQ de Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Guardar ajustes"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Cargar ajustes"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importar ajustes de Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Activar"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Restablecer todo"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Restablecer preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Restablecer bandas"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Preajustes"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 día y %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d días y %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Detenido | %d pistas | Tiempo total: %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Estéreo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausado | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d pistas | Tiempo total: %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Guardar lista de reproducción como..."
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Listas de reproducción de DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Cargar lista de reproducción"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Otros archivos (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nueva lista de reproducción"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nueva lista de reproducción (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Archivo"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Abrir archivo(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Añadir archivo(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Añadir carpeta(s)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Añadir dirección"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nueva lista de reproducción"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Cargar lista de reproducción"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Guardar lista de reproducción"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Salir"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Editar"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Limpiar"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Seleccionar todo"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Deseleccionar todo"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Invertir selección"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selección"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Quitar"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Recortar"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Buscar"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Ordenar por"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Título"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Número de la pista"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Álbum"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artista"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Fecha"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aleatorio"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizado"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferencias"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Ver"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra de estado"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Cabeceras de columnas"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Pestañas"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ecualizador"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reproducción"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Orden"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineal"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Barajar pistas"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Barajar álbumes"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Aleatorio"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Repetir"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Repetir todo"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Repetir una canción"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "No repetir"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Desplazar al cambiar de pista"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Seleccionar al cambiar de pista"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Detener al terminar la pista actual"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Saltar a la pista actual"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Ayuda"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Cambios"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Acerca de"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Traductores"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Buscar"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Parar"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Reproducir"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pausar"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Anterior"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Siguiente"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Aleatorio"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Acerca de"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Salir"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propiedades de la Pista"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Preferencias"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplicar"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Cerrar"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadatos"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propiedades"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Introduzca el título de la columna"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Índice del elemento"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Reproduciendo"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Portada"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artista - Álbum"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duración"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Número de la pista"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Banda / Artista"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alineación:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Izquierda"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Derecha"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancelar"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Aceptar"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Complemento de salida:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositivo de salida:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Siempre convertir audio de 8 bits a 16 bits"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Sonido"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Modo replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Desactivar"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Pista"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Normalizar con replaygain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Preamplificación replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Preamplificación global:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Agregar archivos desde la línea de comandos (o gestor de archivos) a la "
"lista de reproducción:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Reanudar la sesión anterior al inicio"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Al añadir carpetas, no añadir de archivos comprimidos"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Detener al terminar la pista actual"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reproducción"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurar"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Preajuste de la cadena DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Cargar"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Cerrar minimiza a la bandeja"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Botón central del ratón cierra la lista de reproducción"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Esconder icono de la bandeja del sistema"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Usar negrita para la pista en reproducción"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Esconder \"Borrar del disco\" del menú contextual"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Autonombrar listas de reproducción al añadir una carpeta"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Tasa de refresco de la interfaz (veces por segundo):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Texto a mostrar en la barra de título mientras se reproduce:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Texto a mostrar en la barra de título mientras no se reproduce:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Complemento de interfaz gráfica (cambiarlo requiere reiniciar):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Interfaz gráfica"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Anular"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Frente"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Fondo"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Colores de barras de tiempo/volumen"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Medio"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Claro"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Oscuro"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Texto"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Colores de pestañas"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Cambiar (ignora el tema GTK, pero acelera el renderizado)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Fila par"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Fila impar"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Fila seleccionada"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Texto Seleccionado"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Colores de lista de reproducción"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Colores"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Activar Servidor Proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Dirección:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Puerto:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Usuario:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Contraseña:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Red"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versión:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Agrupar Por"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Ordenar por..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formato"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Ascendente"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descendente"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Seleccionar complemente DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Complemento"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Preferencias del editor de etiquetas"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Escribir ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Escribir ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Escribir APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Recortar ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Recortar ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Recortar APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versión de ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Recomendada)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Codificación de ID3v1 (por defecto es iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Escribir ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artista / Álbum"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Pista"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Eliminar archivos del disco"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -922,49 +961,48 @@ msgstr ""
"Perderás los archivos. ¿Deseas continuar?\n"
"(Éste aviso puede desactivarse en las opciones del plugin GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Aviso"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Añadir a cola de reproducción"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Quitar de cola de reproducción"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Recargar metadatos"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Eliminar archivo del disco"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Añadir columna"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Editar columna"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Quitar columna"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Agrupar por"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nada"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artista/Fecha/Álbum"
@@ -972,7 +1010,7 @@ msgstr "Artista/Fecha/Álbum"
msgid "Open file..."
msgstr "Abrir archivo..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configurar %s"
@@ -981,19 +1019,23 @@ msgstr "Configurar %s"
msgid "Default Audio Device"
msgstr "Dispositivo de Audio por Defecto"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Añadir"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Teclas rápidas globales"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Comando"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Ubicación"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinación de teclas"
@@ -1005,139 +1047,146 @@ msgstr "Añadiendo archivos..."
msgid "Initializing..."
msgstr "Inicializando..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Ha modificado los datos de esta pista."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "¿Realmente desea cerrar la ventana?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Múltiples valores]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Clave"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valor"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Escribiendo etiquetas..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nombre:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Los nombres de campos no deben comenzar con : o _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Imposible añadir campo"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Ya existe un campo con ese nombre, por favor utilice otro diferente."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "¿Realmente desea quitar el campo seleccionado?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Añadir campo"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Quitar campo"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Uso: deadbeef [opciones] [archivo(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opciones:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help o -h Mostrar la ayuda (éste mensaje) y salir\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Cerrar reproductor\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Mostar la versión y salir\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Iniciar reproducción\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Parar reproducción\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausar reproducción\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Alternar pausa\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Iniciar la reproducción si está detenida, pausar en "
+msgstr ""
+" --play-pause Iniciar la reproducción si está detenida, pausar en "
"caso contrario\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Siguiente pista de la lista de reproducción\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Pista anterior de la lista de reproducción \n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Canción aleatoria de la lista de reproducción\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Añadir archivo(s) a la lista de reproducción\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Mostrar nombre de la pista formateado a través de "
"stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1148,7 +1197,7 @@ msgstr ""
" l: Duración, n: Pista, y: Año, c: Comentario,\n"
" r: Copyright, e: Tiempo restante\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1157,53 +1206,28 @@ msgstr ""
" ej.: --nowplaying \"%%a - %%t\" mostraría \"artista - "
"título\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " para más información, vea http://sourceforge.net/apps/"
+msgstr ""
+" para más información, vea http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Por defecto"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Sí"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "No"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recomendada)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Ascendente\n"
-"Descendente"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Deshabilitar\n"
-"\\Pista\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1229,7 +1253,7 @@ msgstr ""
"Banda / Artista del álbum\n"
"Personalizado"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1237,13 +1261,40 @@ msgstr ""
"Izquierda\n"
"Derecha"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Deshabilitar\n"
+"\\Pista\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Ascendente\n"
+"Descendente"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recomendada)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Imposible encontrar el archivo pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1256,7 +1307,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Añadir CD de audio"
#: ../translation/extra.c:4
@@ -1272,7 +1324,7 @@ msgstr "Usar remuestreo ALSA"
msgid "Release device while stopped"
msgstr "Liberar el dispositivo al detener"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Tamaño preferido del búfer"
@@ -1301,266 +1353,305 @@ msgstr "Contraseña"
msgid "Scrobble URL"
msgstr "URL de Scrobble"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Dispositivo de archivo"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Solución para error de muestreo de OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Periodo de actualización de la cache (hr)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Obtener de etiquetas incrustadas"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Obtener de carpeta local"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Máscara de archivo para portada local"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Obtener de Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Obtener de albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Escalar gráfico hacia el lado largo"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Usar CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferir CD-Text sobre CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "url CDDB (ej.: 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Número de puerto CDDB (ej.: '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferir protocolo CDDB sobre HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Habilitar soporte a imágenes NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "calidad de remuestreo (0..2, superior es mejor)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Duración máxima de la canción (en minutos)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Duración predeterminada de la canción (seg.)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Pedir confirmación para eliminar archivos del disco"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Sensibilidad del icono de control del volumen"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Icono de estado personalizado"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Ejecutar gtk_init with --sync (modo depuración)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr "Añadir separadores entre los elementos contextuales de los complementos"
+msgstr ""
+"Añadir separadores entre los elementos contextuales de los complementos"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Formato del título de notificación"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Formato del contenido de notificación"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Mostrar arte del álbum"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Tamaño del arte del álbum (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Servidor PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Tasa de muetreo"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Ruta de la tabla de búsqueda relativa"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Ruta de la tabla de búsqueda absoluta"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
"Intercambiar bytes de audio (alternar si lo único que escucha es estática)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Habilitar BBDD HVSC Songlength"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (de HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits por muestra (8 o 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Duración predeterminada de la canción (seg.)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Achivo de configuración del banco de Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Título de la pista"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "intérprete"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Total de pistas"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Género"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Compositor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Número del disco"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comentario"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Codificador / Proveedor"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Ubicación"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Índice de la subpista"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tipo de Etiqueta(s)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Hoja Cue incrustada"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Extensiones de archivos (delimitadas por ';' )"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Convertir"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Tasa de muestreo de destino"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Calidad / algoritmo"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Muestreo automático (anula la tasa de muestreo de destino)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Habilitar scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "El archivo ya existe. ¿Sobreescribir?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Alerta del convertidor"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Por favor, seleccione el codificador"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Error del convertidor"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Convirtiendo..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Seleccionar carpeta..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Fallo al guardar preajuste del codificador"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1568,64 +1659,79 @@ msgstr ""
"Verifique los permisos de la carpeta de preajustes, intente escoger otro "
"título, o libere algo de espacio en disco"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
"Ya existe un preajuste con el mismo nombre. Intente escoger otro título."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Error"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Añadir nuevo codificador"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Modificar codificador"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Quitar preajuste"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Esta acción eliminará el preajuste seleccionado. ¿Está seguro?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codificadores"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Añadir complemento a la cadena DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Fallo al guardar preajuste DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nuevo preajuste DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Modificar preajuste DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Preajustes DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Carpeta de salida:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Preservar la estructura de carpetas, comenzando desde:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Nombre del archivo de salida:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1633,84 +1739,91 @@ msgstr ""
"La extensión (p.ej. .mp3) se agregará automáticamente.\n"
"Deje el campo vacío para el valor predeterminado (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codificador:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Preajuste DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Número de hilos:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Formato de muestra de salida:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Mantener el formato de origen"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "entero 8 bit con signo"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "entero 16 bit con signo"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "entero 24 bit con signo"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "entero 32 bit con signo"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "flotante 32 bit"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Cuando el archivo exista:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Preguntar"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Sobreescribir"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Preservar la estructura de carpetas, comenzando desde:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Modificar preajuste del codificador"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Codificador sin nombre"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensión del archivo de salida:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "P. ej. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Línea de comando:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1718,8 +1831,9 @@ msgstr ""
"Ejemplo: lame - %o\n"
"%i para el archivo de entrada, %o para el archivo de salida, - para stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1727,50 +1841,317 @@ msgstr ""
"<small>%o - nombre del archivo de salida\n"
"%i - nombre del archivo de entrada temporal</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Método:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Tubería"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Archivo temporal"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Editor de etiquetas</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor de preajustes DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Preajuste DSP sin nombre"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Sobreescribir"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Archivo temporal"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Editar"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Cerrar"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Editar columna"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Línea de comando:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Barajar pistas"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Múltiples valores]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Ubicación"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Quitar"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nueva lista de reproducción"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Comentario"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Añadir columna"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Esta acción eliminará el preajuste seleccionado. ¿Está seguro?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configurar"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Preferencias"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interfaz gráfica"
+
+#~ msgid "Slot"
+#~ msgstr "Comando"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "¿Realmente desea quitar el campo seleccionado?"
+
#~ msgid "Save playlist as"
#~ msgstr "Guardar lista de reproducción como..."
diff --git a/po/et.po b/po/et.po
index 44fd9b98..46148e1a 100644
--- a/po/et.po
+++ b/po/et.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-22 18:43+0200\n"
"Last-Translator: Anari <anari.jalakas@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -54,9 +54,9 @@ msgstr "Abifaili laadimine ebaõnnestus"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Abi"
@@ -70,846 +70,885 @@ msgstr "DeaDBeeF %s teave"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s muudatuste logi"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF tõlkijad"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Muuda esitusloendit"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Tiitel:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Esitusloendi ümbernimetamine"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Esitusloendi eemaldamine"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Esitusloendi lisamine"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Salvesta DeaDBeeF EQ eelhäälestus"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ eelhäälestus failid (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Lae DeaDBeeF EQ eelhäälestus..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ eelhäälestus (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Impordi Foobar2000 EQ eelhäälestus..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ eelhäälestus (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Salvesta eelhäälestus"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Lae eelhäälestus"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Impordi Foobar2000 eelhäälestus"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Luba"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nulli kõik"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Nulli eelvõimendus"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Nulli ribad"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Eelhäälestused"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 päev %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d päeva %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Peatatud | %d lugu | %s kokku mängitud"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Paus | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d lugu | %s kokku mängitud"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Salvesta esitusloend kui"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF esitusloendi failid (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Lae esitusloend"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Muud failid (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Uus esitusloend"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Uus esitusloend (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fail"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Ava fail(e)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Lisa fail(e)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Lisa kaust(ad)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Lisa asukoht"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Uus esitusloend"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Lae esitusloend"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Salvesta esitusloend"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Välju"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Redigeerimine"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Puhasta"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Vali kõik"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Tühista kõik"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Pööra valik"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Valik"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Eemalda"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Kärbi"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Otsi"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sorteeri"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Tiitel"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Loo number"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artist"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Aeg"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Juhuslik"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Muu"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Eelistused"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Vaade"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Olekuriba"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Tulba päised"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Kaardid"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekvalaiser"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Taasesitus"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Järjestus"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Järjest"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Lugude juhuesitus"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Albumite juhuesitus"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Juhuslik"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Kordamine"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Korda kõiki"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Korda lugu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Ära korda"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Kerimisriba järgib taasesitust"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Kursor järgib taasesitust"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Peata pärast praegust"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Hüppa praeguse loo juurde"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Abi"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Muudatuste logi"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Teave"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Tõlkijad"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Otsi"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Seiska"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Esita"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Peata"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Eelmine"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Järgmine"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Mängi juhuslikult"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Teave"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Välju"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Loo omadused"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Seaded"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Rakenda"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Sulge"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metaandmed"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Omadused"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Sisesta siia uue veeru pealkiri"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tüüp:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Register"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Mängib"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albumikujundus"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Esitaja - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Kestvus"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Loo number"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Bänd / Albumi esitaja"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formaat:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Paigutus:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Vasakul"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Paremal"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Tühista"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Väljund plugin:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Väljund seade:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Alati teisendada 8 bitine heli 16 bitiseks"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Heli"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Helitugevuse parandus:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Keela"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Lugu"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Helitugevuse paranduse piigi väärtus"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Taasesituse eelvõimendus:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Globaalne eelvõimendus:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Lisa faile käsurealt (või failihaldurist) sellese esitusloendisse:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Jätka käivitamisel eelmist seanssi"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Ära lisa kaustade lisamisel arhiivide sisu"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Peata pärast praegust"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Taasesitus"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Seadistamine"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP eelseadistus"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Lae"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Sulgemine minimeerib akna"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Hiire keskmine nupp sulgeb esitusloendi"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Süsteemisalve ikooni peitmine"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Kuva parajasti mängitav pala paksus kirjas"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Peida menüüst kirje \"Kustuta kettalt\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Esitusloendi automaatne nimetamine üksiku kausta lisamisel"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Kasutajaliidese värskendussagedus (korda sekundis):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Tiitelriba tekst esitamise ajal:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Tiitelriba tekst peatamise ajal:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Graafiline plugin (muutus nõuab taaskäivitust):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Graafiline kasutajaliides (GUI)"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Eira parameetreid"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Esiplaan"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Taust"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Heli- ja esitlusliuguri värvid"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Keskel"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Hele"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tume"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Alus"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Tabeli värv"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Tühista (kaotab GTK puuvaate teema, kuid kiirendab renderdamist)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Paaris rida"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Paaritu rida"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Valitud rida"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Valitud tekst"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Esitusloendi värvid"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Värvid"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Puhverserveri lubamine"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Puhverserveri aadress:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Puhverserveri port:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Puhverserveri tüüp:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Puhverserveri kasutajanimi:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Puhverserveri parool:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Võrk"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versioon: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Autoriõigused"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Pluginad"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupeerimine"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Sorteerimine..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formaat"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Kasvav"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Kahanev"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Vali DSP plugin"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Plugin"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Sildikirjutaja seaded"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Kirjuta ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Kirjuta ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Kirjuta APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 eemaldamine"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 eemaldamine"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 eemaldamine"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 versioon"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Soovitatav)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 märgikodeering (vaikimisi iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Kirjuta ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Esitaja / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Loo number"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Kustuta failid kettalt"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -917,49 +956,48 @@ msgstr ""
"Failid lähevad kaduma. Kas soovid jätkata?\n"
"(Selle teate saab keelata GTKUI plugina seadetes)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Hoiatus"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Lisa esitusnimekirja"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Eemalda esitusnimekirjast"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Uuestilae metaandmed"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Eemalda kettalt"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Lisa veerg"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Muuda veergu"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Eemalda veerg"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Rühmitamise alus"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Mitte ükski"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Esitaja/Aeg/Album"
@@ -967,7 +1005,7 @@ msgstr "Esitaja/Aeg/Album"
msgid "Open file..."
msgstr "Faili avamine..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Konfigureeri %s"
@@ -976,19 +1014,23 @@ msgstr "Konfigureeri %s"
msgid "Default Audio Device"
msgstr "Vaikimisi audioseade"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Lisa"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globaalsed kiirklahvid"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Pesa"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Asukoht"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Klahvikombinatsioon"
@@ -1000,137 +1042,144 @@ msgstr "Failide lisamine..."
msgid "Initializing..."
msgstr "Algväärtustamine..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Sa oled selle loo andmeid muutnud."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Kas soovid akna sulgeda?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Mitu väärtust] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Võti"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Väärtus"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Siltide kirjutamine..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nimi:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Väljanimi ei tohi alata sümboliga : või _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Ei õnnestu välja lisada"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Sellise nimega väli on juba olemas, proovi teist ​​nime."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Kas soovid kindlasti valitud välja kustutada?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Lisa väli"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Eemalda väli"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Kasutamine: deadbeef [valikud] [fail(id)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Valikud:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help või -h Prindib abi (praeguse sõnumi) ja väljub\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Mängijast väljumine\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Väljastab versiooniteabe ja väljub\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Alustab taasesitlust\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Peatab taasesitluse\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Taasesituse paus\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Pausi lülitamine\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Kui peatatud siis alustab taasesitlust, muidu lülitab "
+msgstr ""
+" --play-pause Kui peatatud siis alustab taasesitlust, muidu lülitab "
"pausi ümber\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Järgmine lugu esitlusloendist\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Eelmine lugu esitlusloendist\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Juhuslik lugu esitlusloendist\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Lisab faili(e) esitlusloendisse\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Prindib loo andmed etteantud formaadis\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1141,61 +1190,37 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-msgstr " näide.: --nowplaying \"%%a - %%t\" peaks väljastama "
+msgstr ""
+" näide.: --nowplaying \"%%a - %%t\" peaks väljastama "
"\"artist - loo nimi\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " lisainfot leiab lehelt http://sourceforge.net/apps/med"
-"iawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" lisainfot leiab lehelt http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Vaikimisi"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Jah"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ei"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Soovitatav)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Kasvav\n"
-"Kahanev"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Keela\n"
-"Lugu\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1221,7 +1246,7 @@ msgstr ""
"Bänd / Albumi Artist\n"
"Muu"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1229,13 +1254,40 @@ msgstr ""
"Vasak\n"
"Parem"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Keela\n"
+"Lugu\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Kasvav\n"
+"Kahanev"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Soovitatav)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Ei leitud pixmap faili: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1247,7 +1299,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Lisa audio CD"
#: ../translation/extra.c:4
@@ -1263,7 +1316,7 @@ msgstr "Kasuta ALSA ümberdiskreetimist"
msgid "Release device while stopped"
msgstr "Vabasta seade, kui peatatud"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Eelistatud puhvri suurus"
@@ -1292,266 +1345,304 @@ msgstr "Parool"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Seadmefail"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "OSS4 diskreetimissageduse vea vältimine"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Vahemälu uuendamise periood (tund)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Hangi põimitud siltidest"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Hangi lokaalsest kaustast"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Lokaalne faili mask"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Hangi Last.fm lehelt"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Hangi albumart.org lehelt"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Albumikunst skaleeritakse pikema külje järgi"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB kasutamine"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "CD-Teksti eelistamine CDDB ees"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB aadress (näiteks 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB pordi number (näiteks '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Eelista CDDB protokolli HTTP-le"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Võimalda NRG piltide toetus"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Ümberdiskreetimise kvaliteet (0..2, suurem on parem)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maksimaalne loo pikkus (minutites)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Vaikimis loo pikkus (sek.)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Küsi failide kustutamise kohta kinnitust"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Staatusikooni helitugevuse kontrolli tundlikus"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Kohandatud staatusikoon"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Käivita gtk_init koos --sync (debug reziim)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Lisa plugina menüüde vahele eraldajaid"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Teate tiitli formaat"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Teate sisu formaat"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Albumikunsti näitamine"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Albumikunsti suurus (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio server"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Diskreetimissagedus"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Otsimistabeli relatiivne aadress"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Otsimistabeli absoluutne aadress"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Audiobittide vahetamine (vali, kui kuuled ühtlast signaali)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Võimalda HVSC lugude pikkuste andmebaas"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (HVSC-st)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bitte sampli kohta (8 või 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Vaikimis loo pikkus (sek.)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ konfiguratsioonifail"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Loo nimi"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Esitaja"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Lugusid kokku"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Žanr"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Helilooja"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Plaadi number"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Kommentaar"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Helikodeerija / Tootja"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Asukoht"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Subtrack Indeks"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Sildi tüüp(id)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Põimitud kavaleht"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Koodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Faililaiendid (eralda sümboliga ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Teisenda"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Tulemuse diskreetimissagedus"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Kvaliteet / Algoritm"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
"Automaatne diskreetimissagedus ('Tulemuse diskreetimissagedus' tühistatakse)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Luba scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Fail on juba olemas. Kas kirjutada see üle?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Konverteri hoiatus"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Palun vali kodeerija"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Konverteerimise viga"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Konvertimine..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Kausta valimine..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Kodeerija eelseadistuse salvestamine ebaõnnestus"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1559,64 +1650,79 @@ msgstr ""
"Kontrolli seadistuste kausta õiguseid, proovi valida teistsugune nimi või "
"vabasta kettapinda"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
"Sama nimega seadistus juba eksisteerib. Vali seadistusele teistsugune nimi."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Viga"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Lisa uus kodeerija"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Muuda kodeerijat"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Eemalda eelseadistus"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "See kustutab valitud seadistuse. Oled sa kindel?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Kodeerijad"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Lisa DSP plugin"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "DSP seadistuse salvestamine ebaõnnestus"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Uus DSP seadistus"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "DSP seadistuse muutmine"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP seadistused"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Väljundkaust:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Kausta struktuuri säilitamine, alates:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Väljundfaili nimi:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1624,84 +1730,91 @@ msgstr ""
"Faililaiendused (näiteks .mp3) lisatakse automaatselt.\n"
"Vaikimisi väärtuse jaoks jäta väli tühjaks (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Enkooder:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP seadistus:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Lõimede arv:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Väljundsämpli formaat:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Säilita allika formaat"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit signed int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit signed int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Kui fail on olemas:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Küsi"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Kirjuta üle"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Kausta struktuuri säilitamine, alates:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Kodeerija seadistuste muutmine"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Ilma nimeta kodeerija"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Väljundfaili laiend:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Näiteks mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Käsurida:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1709,8 +1822,9 @@ msgstr ""
"Näide: lame - %o\n"
"%i sisendfail, %o väljundfail, - stdin jaoks"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1718,46 +1832,313 @@ msgstr ""
"<small>%o - väljundfaili nimi\n"
"%i - ajutise sisendfaili nimi</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Meetod:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Toru"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Ajutine fail"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Sildi kirjutaja</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP seadistuse redaktor"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Ilma nimeta DSP seadistus"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Kirjuta üle"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Ajutine fail"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Redigeerimine"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Sulge"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Muuda veergu"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Käsurida:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Lugude juhuesitus"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Mitu väärtust] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Asukoht"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Eemalda"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Uus esitusloend"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Kommentaar"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Lisa veerg"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "See kustutab valitud seadistuse. Oled sa kindel?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Seadistamine"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Seaded"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Graafiline kasutajaliides (GUI)"
+
+#~ msgid "Slot"
+#~ msgstr "Pesa"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Kas soovid kindlasti valitud välja kustutada?"
diff --git a/po/eu.po b/po/eu.po
new file mode 100644
index 00000000..e475a70c
--- /dev/null
+++ b/po/eu.po
@@ -0,0 +1,1778 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"PO-Revision-Date: 2012-08-17 02:20+0200\n"
+"Last-Translator: Asier_Iturralde_Sarasola <asier.iturralde@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: eu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
+
+#: ../plugins/gtkui/callbacks.c:123
+msgid "Supported sound formats"
+msgstr "Onartutako soinu-formatuak"
+
+#: ../plugins/gtkui/callbacks.c:134
+msgid "All files (*)"
+msgstr "Fitxategi guztiak (*)"
+
+#: ../plugins/gtkui/callbacks.c:144
+msgid "Open file(s)..."
+msgstr "Ireki fitxategia(k)..."
+
+#: ../plugins/gtkui/callbacks.c:179
+msgid "Add file(s) to playlist..."
+msgstr "Gehitu fitxategia(k) erreprodukzio-zerrendara..."
+
+#: ../plugins/gtkui/callbacks.c:220
+msgid "Add folder(s) to playlist..."
+msgstr "Gehitu karpeta(k) erreprodukzio-zerrendara..."
+
+#: ../plugins/gtkui/callbacks.c:225
+msgid "Follow symlinks"
+msgstr "Jarraitu esteka sinbolikoak"
+
+#: ../plugins/gtkui/callbacks.c:711
+msgid "Failed while reading help file"
+msgstr "Hutsegitea laguntza fitxategia irakurtzean"
+
+#: ../plugins/gtkui/callbacks.c:721
+msgid "Failed to load help file"
+msgstr "Hutsegitea laguntza fitxategia kargatzean"
+
+#: ../plugins/gtkui/callbacks.c:736
+msgid "help.txt"
+msgstr "laguntza.txt"
+
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
+#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
+#: ../plugins/converter/convgui.c:1248
+msgid "Help"
+msgstr "Laguntza"
+
+#: ../plugins/gtkui/callbacks.c:747
+#, c-format
+msgid "About DeaDBeeF %s"
+msgstr "DeadBeeF %s-(r)i buruz"
+
+#: ../plugins/gtkui/callbacks.c:760
+#, c-format
+msgid "DeaDBeeF %s ChangeLog"
+msgstr "DeadBeeF %s-(r)en aldaketa egunkaria"
+
+#: ../plugins/gtkui/callbacks.c:1116
+#, c-format
+msgid "DeaDBeeF Translators"
+msgstr "DeadBeeF itzultzaileak"
+
+#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+msgid "Edit playlist"
+msgstr "Editatu erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
+#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
+#: ../plugins/converter/interface.c:395
+msgid "Title:"
+msgstr "Izenburua:"
+
+#: ../plugins/gtkui/ddbtabstrip.c:814
+msgid "Rename Playlist"
+msgstr "Berrizendatu erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/ddbtabstrip.c:821
+msgid "Remove Playlist"
+msgstr "Kendu erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/ddbtabstrip.c:828
+msgid "Add New Playlist"
+msgstr "Gehitu erreprodukzio-zerrenda berria"
+
+#: ../plugins/gtkui/eq.c:136
+msgid "Save DeaDBeeF EQ Preset"
+msgstr "Gorde DeaDBeeF EQ aurrezarpena"
+
+#: ../plugins/gtkui/eq.c:143
+msgid "DeaDBeeF EQ preset files (*.ddbeq)"
+msgstr "DeaDBeeF EQ aurrezarpen-fitxategiak (*.ddbeq)"
+
+#: ../plugins/gtkui/eq.c:182
+msgid "Load DeaDBeeF EQ Preset..."
+msgstr "Kargatu DeaDBeeF EQ aurrezarpena..."
+
+#: ../plugins/gtkui/eq.c:186
+msgid "DeaDBeeF EQ presets (*.ddbeq)"
+msgstr "DeaDBeeF EQ aurrezarpenak (*.ddbeq)"
+
+#: ../plugins/gtkui/eq.c:247
+msgid "Import Foobar2000 EQ Preset..."
+msgstr "Inportatu Foobar2000 EQ aurrezarpena..."
+
+#: ../plugins/gtkui/eq.c:251
+msgid "Foobar2000 EQ presets (*.feq)"
+msgstr "Foobar2000 EQ aurrezarpenak (*.feq)"
+
+#: ../plugins/gtkui/eq.c:316
+msgid "Save Preset"
+msgstr "Gorde aurrezarpena"
+
+#: ../plugins/gtkui/eq.c:324
+msgid "Load Preset"
+msgstr "Kargatu aurrezarpena"
+
+#: ../plugins/gtkui/eq.c:332
+msgid "Import Foobar2000 Preset"
+msgstr "Inportatu Foobar 2000 aurrezarpena"
+
+#: ../plugins/gtkui/eq.c:357
+msgid "Enable"
+msgstr "Gaitu"
+
+#: ../plugins/gtkui/eq.c:366
+msgid "Zero All"
+msgstr "Zerotu guztia"
+
+#: ../plugins/gtkui/eq.c:373
+msgid "Zero Preamp"
+msgstr "Zerotu aurreanplifikazioa"
+
+#: ../plugins/gtkui/eq.c:380
+msgid "Zero Bands"
+msgstr "Zerotu bandak"
+
+#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+msgid "Presets"
+msgstr "Aurrezarpenak"
+
+#: ../plugins/gtkui/gtkui.c:137
+#, c-format
+msgid "1 day %d:%02d:%02d"
+msgstr "Egun 1 %d:%02d:%02d"
+
+#: ../plugins/gtkui/gtkui.c:140
+#, c-format
+msgid "%d days %d:%02d:%02d"
+msgstr "%d egun %d:%02d:%02d"
+
+#: ../plugins/gtkui/gtkui.c:149
+#, c-format
+msgid "Stopped | %d tracks | %s total playtime"
+msgstr "Geldituta | %d pista | guztizko erreprodukzio-denbora: %s"
+
+#: ../plugins/gtkui/gtkui.c:162
+msgid "Mono"
+msgstr "Mono"
+
+#: ../plugins/gtkui/gtkui.c:162
+msgid "Stereo"
+msgstr "Estereo"
+
+#: ../plugins/gtkui/gtkui.c:187
+#, c-format
+msgid "| %4d kbps "
+msgstr "| %4d kb/s "
+
+#: ../plugins/gtkui/gtkui.c:193
+msgid "Paused | "
+msgstr "Pausatuta | "
+
+#: ../plugins/gtkui/gtkui.c:198
+#, c-format
+msgid ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgstr ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d pista | guztizko "
+"erreprodukzio-denbora: %s"
+
+#: ../plugins/gtkui/gtkui.c:644
+msgid "Save Playlist As"
+msgstr "Gorde erreprodukzio-zerrenda honela"
+
+#: ../plugins/gtkui/gtkui.c:655
+msgid "DeaDBeeF playlist files (*.dbpl)"
+msgstr "DeaDBeeF erreprodukzio-zerrenda fitxategiak (*.dbpl)"
+
+#: ../plugins/gtkui/gtkui.c:773
+msgid "Load Playlist"
+msgstr "Kargatu erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/gtkui.c:788
+msgid "Other files (*)"
+msgstr "Beste fitxategiak (*)"
+
+#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+msgid "New Playlist"
+msgstr "Erreprodukzio-zerrenda berria"
+
+#: ../plugins/gtkui/gtkui.c:929
+#, c-format
+msgid "New Playlist (%d)"
+msgstr "Erreprodukzio-zerrenda berria (%d)"
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+msgid "_File"
+msgstr "_Fitxategia"
+
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+msgid "_Open file(s)"
+msgstr "_Ireki fitxategia(k)"
+
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+msgid "Add file(s)"
+msgstr "Gehitu fitxategia(k)"
+
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+msgid "Add folder(s)"
+msgstr "Gehitu karpeta(k)"
+
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
+#: ../plugins/gtkui/deadbeef.glade.h:9
+msgid "Add location"
+msgstr "Gehitu kokapena"
+
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+msgid "New playlist"
+msgstr "Erreprodukzio-zerrenda berria"
+
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+msgid "Load playlist"
+msgstr "Kargatu erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+msgid "Save playlist"
+msgstr "Gorde erreprodukzio-zerrenda"
+
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+msgid "_Quit"
+msgstr "_Irten"
+
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+msgid "_Edit"
+msgstr "_Editatu"
+
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "_Clear"
+msgstr "_Garbitu"
+
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+msgid "Select all"
+msgstr "Hautatu dena"
+
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+msgid "Deselect all"
+msgstr "Desautatu dena"
+
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+msgid "Invert selection"
+msgstr "Alderantzikatu hautapena"
+
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Selection"
+msgstr "Hautapena"
+
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
+#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
+#: ../plugins/converter/interface.c:645
+msgid "Remove"
+msgstr "Kendu"
+
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+msgid "Crop"
+msgstr "Moztu"
+
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+msgid "_Find"
+msgstr "_Aurkitu"
+
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "Sort By"
+msgstr "Ordenatu honela"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
+#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
+#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
+#: ../plugins/converter/interface.c:622
+msgid "Title"
+msgstr "Izenburua"
+
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+msgid "Track number"
+msgstr "Pista zenbakia"
+
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
+#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
+#: ../translation/extra.c:69
+msgid "Album"
+msgstr "Albuma"
+
+#. Track properties dialog
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
+#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
+#: ../translation/extra.c:65
+msgid "Artist"
+msgstr "Artista"
+
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
+#: ../translation/extra.c:70
+msgid "Date"
+msgstr "Data"
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
+#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+msgid "Custom"
+msgstr "Pertsonalizatua"
+
+#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
+#: ../plugins/gtkui/deadbeef.glade.h:95
+msgid "Preferences"
+msgstr "Hobespenak"
+
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+msgid "_View"
+msgstr "_Ikusi"
+
+#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+msgid "Status bar"
+msgstr "Egoera-barra"
+
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+msgid "Column headers"
+msgstr "Zutabe-goiburuak"
+
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+msgid "Tabs"
+msgstr "Fitxak"
+
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Equalizer"
+msgstr "Ekualizadorea"
+
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+msgid "_Playback"
+msgstr "_Erreproduzitu"
+
+#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
+#: ../plugins/gtkui/deadbeef.glade.h:83
+msgid "Order"
+msgstr "Ordena"
+
+#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+msgid "Linear"
+msgstr "Lineala"
+
+#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+msgid "Shuffle tracks"
+msgstr "Nahastu pistak"
+
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+msgid "Shuffle albums"
+msgstr "Nahastu albumak"
+
+#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Random"
+msgstr "Ausazkoa"
+
+#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+msgid "Looping"
+msgstr "Errepikapenak"
+
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
+msgid "Loop All"
+msgstr "Errepikatu guztiak"
+
+#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
+msgid "Loop Single Song"
+msgstr "Errepikatu kanta bat"
+
+#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
+msgid "Don't Loop"
+msgstr "Ez errepikatu"
+
+#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+msgid "Scroll follows playback"
+msgstr "Korritzeak erreprodukzioa jarraitzen du"
+
+#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+msgid "Cursor follows playback"
+msgstr "Kurtsoreak erreprodukzioa jarraitzen du"
+
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+msgid "Stop after current"
+msgstr "Gelditu unekoaren ondoren"
+
+#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+msgid "Jump to current track"
+msgstr "Jauzi uneko pistara"
+
+#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
+#: ../plugins/gtkui/deadbeef.glade.h:159
+msgid "_Help"
+msgstr "_Laguntza"
+
+#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+msgid "_ChangeLog"
+msgstr "_Aldaketa-egunkaria"
+
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+msgid "_GPLv2"
+msgstr "_GPLv2"
+
+#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+msgid "_LGPLv2.1"
+msgstr "_LGPLv2.1"
+
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+msgid "_About"
+msgstr "_Honi buruz"
+
+#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+msgid "_Translators"
+msgstr "_Itzultzaileak"
+
+#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+msgid "Search"
+msgstr "Bilatu"
+
+#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+msgid "Stop"
+msgstr "Gelditu"
+
+#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+msgid "Play"
+msgstr "Erreproduzitu"
+
+#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+msgid "Pause"
+msgstr "Pausatu"
+
+#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+msgid "Previous"
+msgstr "Aurrekoa"
+
+#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+msgid "Next"
+msgstr "Hurrengoa"
+
+#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+msgid "Play Random"
+msgstr "Erreproduzitu ausazkoa"
+
+#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+msgid "About"
+msgstr "Honi buruz"
+
+#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+msgid "Quit"
+msgstr "Irten"
+
+#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+msgid "Track Properties"
+msgstr "Pistaren propietateak"
+
+#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+msgid "Settings"
+msgstr "Ezarpenak"
+
+#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+msgid "_Apply"
+msgstr "_Aplikatu"
+
+#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
+#: ../plugins/gtkui/deadbeef.glade.h:154
+msgid "_Close"
+msgstr "_Itxi"
+
+#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+msgid "Metadata"
+msgstr "Metadatuak"
+
+#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
+#: ../plugins/gtkui/deadbeef.glade.h:97
+msgid "Properties"
+msgstr "Propietateak"
+
+#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Enter new column title here"
+msgstr "Sartu zutabe berriaren goiburua hemen"
+
+#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+msgid "Type:"
+msgstr "Mota:"
+
+#: ../plugins/gtkui/interface.c:1510
+msgid "Item Index"
+msgstr "Elementuaren indizea"
+
+#. create default set of columns
+#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+msgid "Playing"
+msgstr "Erreproduzitzen"
+
+#: ../plugins/gtkui/interface.c:1512
+msgid "Album Art"
+msgstr "Albumaren azala"
+
+#: ../plugins/gtkui/interface.c:1513
+msgid "Artist - Album"
+msgstr "Artista - Albuma"
+
+#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
+#: ../plugins/gtkui/search.c:394
+msgid "Duration"
+msgstr "Iraupena"
+
+#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+msgid "Track Number"
+msgstr "Pista zenbakia"
+
+#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+msgid "Band / Album Artist"
+msgstr "Taldea / Albuma Artista"
+
+#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
+#: ../plugins/gtkui/deadbeef.glade.h:44
+msgid "Format:"
+msgstr "Formatua:"
+
+#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+msgid "Alignment:"
+msgstr "Lerrokatzea:"
+
+#: ../plugins/gtkui/interface.c:1559
+msgid "Left"
+msgstr "Ezkerrean"
+
+#: ../plugins/gtkui/interface.c:1560
+msgid "Right"
+msgstr "Eskuinean"
+
+#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
+#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
+#: ../plugins/gtkui/deadbeef.glade.h:151
+msgid "_Cancel"
+msgstr "_Utzi"
+
+#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
+#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
+#: ../plugins/gtkui/deadbeef.glade.h:162
+msgid "_OK"
+msgstr "_Ados"
+
+#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+msgid "Output plugin:"
+msgstr "Irteera plugina:"
+
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+msgid "Output device:"
+msgstr "Irteera gailua:"
+
+#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+msgid "Always convert 8 bit audio to 16 bit"
+msgstr "Bihurtu beti 8 biteko audioa 16 bitera"
+
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+msgid "Sound"
+msgstr "Soinua"
+
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+msgid "Replaygain mode:"
+msgstr "Replaygain modua:"
+
+#: ../plugins/gtkui/interface.c:1873
+msgid "Disable"
+msgstr "Desgaitu"
+
+#: ../plugins/gtkui/interface.c:1874
+msgid "Track"
+msgstr "Pista"
+
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+msgid "Replaygain peak scale"
+msgstr "Replaygain gailurraren eskala"
+
+#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
+#: ../plugins/gtkui/deadbeef.glade.h:2
+msgid "-12 dB"
+msgstr "-12 dB"
+
+#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
+#: ../plugins/gtkui/deadbeef.glade.h:1
+msgid "+12 dB"
+msgstr "+12 dB"
+
+#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+msgid "Replaygain preamp:"
+msgstr "Replaygain aurre-anplifikazioa:"
+
+#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+msgid "Global preamp:"
+msgstr "Aurreanplifikazio orokorra:"
+
+#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+msgid "Add files from command line (or file manager) to this playlist:"
+msgstr ""
+"Gehitu fitxategiak erreprodukzio-zerrenda honetara komando-lerrotik (edo "
+"fitxategi-kudeatzailetik):"
+
+#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+msgid "Resume previous session on startup"
+msgstr "Berrezarri aurreko saioa abiatzean"
+
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+msgid "Don't add from archives when adding folders"
+msgstr "Ez gehitu fitxategietatik karpetak gehitzean"
+
+#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+msgid "Playback"
+msgstr "Erreproduzitu"
+
+#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
+#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+msgid "Configure"
+msgstr "Konfiguratu"
+
+#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+msgid "DSP Chain Preset"
+msgstr "DSP katearen aurrezarpenak"
+
+#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+msgid "_Load"
+msgstr "_Kargatu"
+
+#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+msgid "DSP"
+msgstr "DSP"
+
+#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Close minimizes to tray"
+msgstr "Ixteak erretilura minimizatzen du"
+
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+msgid "Middle mouse button closes playlist"
+msgstr "Saguaren erdiko botoiak erreprodukzio-zerrenda ixten du"
+
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+msgid "Hide system tray icon"
+msgstr "Ezkutatu sistemaren erretiluko ikonoa"
+
+#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+msgid "Use bold font for currently playing track"
+msgstr "Erabili letra-tipo lodia unean erreproduzitzen ari den pistarentzat"
+
+#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+msgid "Hide \"Delete from disk\" context menu item"
+msgstr "Ezkutatu \"Ezabatu diskotik\" laster-menuko elementua"
+
+#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+msgid "Auto-name playlists when adding a single folder"
+msgstr ""
+"Izendatu erreprodukzio-zerrendak automatikoki karpeta bakar bat gehitzean"
+
+#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+msgid "Interface refresh rate (times per second):"
+msgstr "Interfazearen freskatze-maiztasuna (zenbatetan segundoko)"
+
+#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+msgid "Titlebar text while playing:"
+msgstr "TItulu-barraren testua erreproduzitzean:"
+
+#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+msgid "Titlebar text while stopped:"
+msgstr "Titulu-barraren testua gelditutakoan:"
+
+#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+msgid "GUI Plugin (changing requires restart):"
+msgstr "GUI plugina (aldatzeak berrabiaraztea eskatzen du):"
+
+#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
+msgid "GUI"
+msgstr "GUI"
+
+#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
+#: ../plugins/gtkui/deadbeef.glade.h:86
+msgid "Override"
+msgstr "Indargabetu"
+
+#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+msgid "Foreground"
+msgstr "Aurreko planoa"
+
+#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+msgid "Background"
+msgstr "Atzeko planoa"
+
+#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+msgid "Seekbar/Volumebar colors"
+msgstr "Bilaketa-barra/Bolumen-barraren koloreak"
+
+#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+msgid "Middle"
+msgstr "Ertaina"
+
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+msgid "Light"
+msgstr "Argia"
+
+#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+msgid "Dark"
+msgstr "Iluna"
+
+#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+msgid "Base"
+msgstr "Oinarrizkoa"
+
+#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
+#: ../plugins/gtkui/deadbeef.glade.h:134
+msgid "Text"
+msgstr "Testua"
+
+#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+msgid "Tab strip colors"
+msgstr "Fitxen koloreak"
+
+#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+msgid "Override (looses GTK treeview theming, but speeds up rendering)"
+msgstr ""
+"Indargabetu (GTK zuhaitz-ikuspegien gaiak galtzen dira, baina errendatzea "
+"azkartzen da)"
+
+#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Even row"
+msgstr "Errenkada bikoitia"
+
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+msgid "Odd row"
+msgstr "Errenkada bakoitia"
+
+#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Selected row"
+msgstr "Hautatutako errenkada"
+
+#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Selected text"
+msgstr "Hautatutako testua"
+
+#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Cursor"
+msgstr "Kurtsorea"
+
+#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+msgid "Playlist colors"
+msgstr "Erreprodukzio-zerrenda koloreak"
+
+#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+msgid "Colors"
+msgstr "Koloreak"
+
+#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+msgid "Enable Proxy Server"
+msgstr "Gaitu proxy zerbitzaria"
+
+#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+msgid "Proxy Server Address:"
+msgstr "Proxy zerbitzariaren helbidea:"
+
+#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+msgid "Proxy Server Port:"
+msgstr "Proxy zerbitzaria ataka:"
+
+#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+msgid "Proxy Type:"
+msgstr "Proxy mota:"
+
+#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+msgid "Proxy Username:"
+msgstr "Proxy erabiltzaile-izena:"
+
+#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+msgid "Proxy Password:"
+msgstr "Proxy pasahitza:"
+
+#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+msgid "Network"
+msgstr "Sarea"
+
+#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+msgid "Version: "
+msgstr "Bertsioa: "
+
+#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:78
+msgid "Copyright"
+msgstr "Copyright-a"
+
+#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+msgid "Plugins"
+msgstr "Pluginak"
+
+#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+msgid "URL:"
+msgstr "URLa:"
+
+#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
+msgid "Group By"
+msgstr "Taldekatzeko irizpidea"
+
+#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
+msgid "Sort by..."
+msgstr "Ordenatzeko irizpidea..."
+
+#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+msgid "Format"
+msgstr "Formatua"
+
+#: ../plugins/gtkui/interface.c:3305
+msgid "Ascending"
+msgstr "Gorakorra"
+
+#: ../plugins/gtkui/interface.c:3306
+msgid "Descending"
+msgstr "Beherakorra"
+
+#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
+#: ../plugins/converter/interface.c:750
+msgid "Select DSP Plugin"
+msgstr "Hautatu DSP plugina"
+
+#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
+#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
+#: ../plugins/gtkui/dspconfig.c:139
+msgid "Plugin"
+msgstr "Plugina"
+
+#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+msgid "Tag Writer Settings"
+msgstr "Etiketa-idazlearen ezarpenak"
+
+#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "Write ID3v2"
+msgstr "Idatzi ID3v2"
+
+#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
+#: ../plugins/gtkui/deadbeef.glade.h:146
+msgid "Write ID3v1"
+msgstr "Idatzi ID3v1"
+
+#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
+#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+msgid "Write APEv2"
+msgstr "Idatzi APEv2"
+
+#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
+#: ../plugins/gtkui/deadbeef.glade.h:130
+msgid "Strip ID3v2"
+msgstr "Soildu ID3v2"
+
+#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
+#: ../plugins/gtkui/deadbeef.glade.h:129
+msgid "Strip ID3v1"
+msgstr "Soildu ID3v1"
+
+#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
+#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+msgid "Strip APEv2"
+msgstr "Soildu APEv2"
+
+#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+msgid "ID3v2 version"
+msgstr "ID3v2 bertsioa"
+
+#: ../plugins/gtkui/interface.c:3531
+msgid "2.3 (Recommended)"
+msgstr "2.3 (Gomendatua)"
+
+#: ../plugins/gtkui/interface.c:3532
+msgid "2.4"
+msgstr "2.4"
+
+#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+msgid "ID3v1 character encoding (default is iso8859-1)"
+msgstr "ID3v1 karaktere-kodeketa (lehenetsia iso8859-1 da)"
+
+#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+msgid "Write ID3v2.4"
+msgstr "Idatzi ID3v2.4"
+
+#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+msgid "Artist / Album"
+msgstr "Artista / Albuma"
+
+#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+msgid "Track No"
+msgstr "Pista zbk"
+
+#: ../plugins/gtkui/plcommon.c:338
+msgid "Delete files from disk"
+msgstr "Fitxategiak ezabatzen ditu diskotik"
+
+#: ../plugins/gtkui/plcommon.c:339
+msgid ""
+"Files will be lost. Proceed?\n"
+"(This dialog can be turned off in GTKUI plugin settings)"
+msgstr ""
+"Fitxategiak galduko dira. Jarraitu?\n"
+"(Elkarrizketa-koadro hau kendu daiteke GTKUI pluginaren ezarpenak erabiliz)"
+
+#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
+#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
+#: ../plugins/converter/convgui.c:1136
+msgid "Warning"
+msgstr "Abisua"
+
+#: ../plugins/gtkui/plcommon.c:444
+msgid "Add to playback queue"
+msgstr "Gehitu erreprodukzio-ilarara"
+
+#: ../plugins/gtkui/plcommon.c:449
+msgid "Remove from playback queue"
+msgstr "Kendu erreprodukzio-ilaratik"
+
+#: ../plugins/gtkui/plcommon.c:457
+msgid "Reload metadata"
+msgstr "Birkargatu metadatuak"
+
+#: ../plugins/gtkui/plcommon.c:476
+msgid "Remove from disk"
+msgstr "Kendu diskotik"
+
+#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+msgid "Add column"
+msgstr "Gehitu zutabea"
+
+#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+msgid "Edit column"
+msgstr "Editatu zutabea"
+
+#: ../plugins/gtkui/plcommon.c:988
+msgid "Remove column"
+msgstr "Kendu zutabea"
+
+#: ../plugins/gtkui/plcommon.c:998
+msgid "Group by"
+msgstr "Taldekatzeko irizpidea"
+
+#: ../plugins/gtkui/plcommon.c:1005
+msgid "None"
+msgstr "Bat ere ez"
+
+#: ../plugins/gtkui/plcommon.c:1009
+msgid "Artist/Date/Album"
+msgstr "Artista/Data/Albuma"
+
+#: ../plugins/gtkui/pluginconf.c:42
+msgid "Open file..."
+msgstr "Ireki fitxategia..."
+
+#: ../plugins/gtkui/pluginconf.c:217
+#, c-format
+msgid "Configure %s"
+msgstr "Konfiguratu %s"
+
+#: ../plugins/gtkui/prefwin.c:82
+msgid "Default Audio Device"
+msgstr "Audio gailu lehenetsia"
+
+#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+msgid "Add"
+msgstr "Gehitu"
+
+#: ../plugins/gtkui/prefwin.c:328
+msgid "Global Hotkeys"
+msgstr "Laster-tekla orokorrak"
+
+#: ../plugins/gtkui/prefwin.c:390
+msgid "Slot"
+msgstr "Ekintza"
+
+#: ../plugins/gtkui/prefwin.c:391
+msgid "Key combination"
+msgstr "Gako konbinazioa"
+
+#: ../plugins/gtkui/progress.c:56
+msgid "Adding files..."
+msgstr "Fitxategiak gehitzen..."
+
+#: ../plugins/gtkui/progress.c:90
+msgid "Initializing..."
+msgstr "Hasieratzen..."
+
+#: ../plugins/gtkui/trkproperties.c:159
+msgid "You've modified data for this track."
+msgstr "Pista honen datuak aldatu dituzu."
+
+#: ../plugins/gtkui/trkproperties.c:161
+msgid "Really close the window?"
+msgstr "Ziur leihoa itxi nahi duzula?"
+
+#. get value to edit
+#: ../plugins/gtkui/trkproperties.c:254
+msgid "[Multiple values] "
+msgstr "[Hainbat balio] "
+
+#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+msgid "Key"
+msgstr "Gakoa"
+
+#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+msgid "Value"
+msgstr "Balioa"
+
+#: ../plugins/gtkui/trkproperties.c:594
+msgid "Writing tags..."
+msgstr "Etiketak idazten..."
+
+#: ../plugins/gtkui/trkproperties.c:621
+msgid "Name:"
+msgstr "Izena:"
+
+#: ../plugins/gtkui/trkproperties.c:633
+msgid "Field names must not start with : or _"
+msgstr "Ezin dituzu : edo _ erabili eremu-izenen hasieran"
+
+#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+msgid "Cannot add field"
+msgstr "Ezin da eremua gehitu"
+
+#: ../plugins/gtkui/trkproperties.c:667
+msgid "Field with such name already exists, please try different name."
+msgstr ""
+"Izen hori duen eremua existitzen da dagoeneko, mesedez erabili izen "
+"desberdin bat."
+
+#: ../plugins/gtkui/trkproperties.c:692
+msgid "Really remove selected field?"
+msgstr "Ziur hautatutako eremua ezabatu nahi duzula?"
+
+#: ../plugins/gtkui/trkproperties.c:734
+msgid "Add field"
+msgstr "Gehitu eremua"
+
+#: ../plugins/gtkui/trkproperties.c:737
+msgid "Remove field"
+msgstr "Kendu eremua"
+
+#: ../main.c:91
+#, c-format
+msgid "Usage: deadbeef [options] [file(s)]\n"
+msgstr "Erabilera: deadbeef [aukerak] [fitxategia(k)]\n"
+
+#: ../main.c:92
+#, c-format
+msgid "Options:\n"
+msgstr "Aukerak:\n"
+
+#: ../main.c:93
+#, c-format
+msgid " --help or -h Print help (this message) and exit\n"
+msgstr " --help or -h Inprimatu laguntza (mezu hau) eta irten\n"
+
+#: ../main.c:94
+#, c-format
+msgid " --quit Quit player\n"
+msgstr " --quit Irten erreproduzitzailetik\n"
+
+#: ../main.c:95
+#, c-format
+msgid " --version Print version info and exit\n"
+msgstr " --version Inprimatu bertsio-informazioa eta irten\n"
+
+#: ../main.c:96
+#, c-format
+msgid " --play Start playback\n"
+msgstr " --play Hasi erreprodukzioa\n"
+
+#: ../main.c:97
+#, c-format
+msgid " --stop Stop playback\n"
+msgstr " --stop Gelditu erreprodukzioa\n"
+
+#: ../main.c:98
+#, c-format
+msgid " --pause Pause playback\n"
+msgstr " --pause Pausatu erreprodukzioa\n"
+
+#: ../main.c:99
+#, c-format
+msgid " --toggle-pause Toggle pause\n"
+msgstr " --toggle-pause Txandakatu pausatzea\n"
+
+#: ../main.c:100
+#, c-format
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr " --play-pause Hasi erreproduzitzen geldituta badago, bestela "
+"txandakatu pausa\n"
+
+#: ../main.c:101
+#, c-format
+msgid " --next Next song in playlist\n"
+msgstr " --next Erreprodukzio-zerrendako hurrengo kanta\n"
+
+#: ../main.c:102
+#, c-format
+msgid " --prev Previous song in playlist\n"
+msgstr " --prev Erreprodukzio-zerrendako aurreko kanta\n"
+
+#: ../main.c:103
+#, c-format
+msgid " --random Random song in playlist\n"
+msgstr " --random Erreprodukzio-zerrendako ausazko kanta\n"
+
+#: ../main.c:104
+#, c-format
+msgid " --queue Append file(s) to existing playlist\n"
+msgstr " --queue Gehitu fitxategia(k) existitzen den erreprodukzio-"
+"zerrendara\n"
+
+#: ../main.c:105
+#, c-format
+msgid " --nowplaying FMT Print formatted track name to stdout\n"
+msgstr " --nowplaying FMT Inprimatu formatudun pista-izena irteera estandarrera\n"
+
+#: ../main.c:106
+#, c-format
+msgid ""
+" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
+" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
+" copy[r]ight, [e]lapsed\n"
+msgstr ""
+" FMT %%-sintaxia: a: artista, t: izenburua, b: albuma,\n"
+" l: iraupena, n: pista zenbakia, y: urtea, c: iruzkina,\n"
+" r: copyright-a, e: igarotakoa\n"
+
+#: ../main.c:109
+#, c-format
+msgid ""
+" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
+"- title\"\n"
+msgstr " adibidez.: --nowplaying \"%%a - %%t\" erabiliz gero "
+"\"artista - titulua\" inprimatuko du\n"
+
+#: ../main.c:110
+#, c-format
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr " Informazio gehiagorako, begiratu http://sourceforge.ne"
+"t/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+
+#: ../playlist.c:454 ../playlist.c:2398
+msgid "Default"
+msgstr "Lehenetsia"
+
+#: ../playlist.c:3664
+msgid "Yes"
+msgstr "Bai"
+
+#: ../playlist.c:3664
+msgid "No"
+msgstr "Ez"
+
+#: ../plugins/gtkui/deadbeef.glade.h:3
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Gomendatua)\n"
+"2.4"
+
+#: ../plugins/gtkui/deadbeef.glade.h:14
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Gorakorra\n"
+"Beherakorra"
+
+#: ../plugins/gtkui/deadbeef.glade.h:33
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Desgaitu\n"
+"Pista\n"
+"Albuma"
+
+#: ../plugins/gtkui/deadbeef.glade.h:56
+msgid ""
+"Item Index\n"
+"Playing\n"
+"Album Art\n"
+"Artist - Album\n"
+"Artist\n"
+"Album\n"
+"Title\n"
+"Duration\n"
+"Track Number\n"
+"Band / Album Artist\n"
+"Custom"
+msgstr ""
+"Elementuaren indizea\n"
+"Erreproduzitzen\n"
+"Albumaren azala\n"
+"Artista - Albuma\n"
+"Artista\n"
+"Albuma\n"
+"Izenburua\n"
+"Iraupena\n"
+"Pista zenbakia\n"
+"Taldea / Albuma Artista\n"
+"Pertsonalizatua"
+
+#: ../plugins/gtkui/deadbeef.glade.h:68
+msgid ""
+"Left\n"
+"Right"
+msgstr ""
+"Ezkerra\n"
+"Eskuina"
+
+#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr "Ezin izan da pixmap fitxategia aurkitu: %s"
+
+#: ../plugins/wildmidi/wildmidiplug.c:162
+#, c-format
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+"wildmidi: ez da aurkitu freepats konfigurazio-fitxategia. Mesedez instalatu "
+"timidity-freepats paketea edo zehaztu freepats.cfg fitxategirako bidea "
+"pluginaren ezarpenetan."
+
+#. this file should list extra translatable strings that are not referenced
+#. directly in source code, e.g. scripted plugin configuration strings
+#: ../translation/extra.c:3
+msgid "Add Audio CD"
+msgstr "Gehitu audio CDa"
+
+#: ../translation/extra.c:4
+msgid "Lookup on Last.fm"
+msgstr "Bilatu Last.fm-n"
+
+#. ALSA output plugin
+#: ../translation/extra.c:6
+msgid "Use ALSA resampling"
+msgstr "Erabili ALSA berlaginketa"
+
+#: ../translation/extra.c:7
+msgid "Release device while stopped"
+msgstr "Askatu gailua geldituta dagoen bitartean"
+
+#: ../translation/extra.c:8 ../translation/extra.c:51
+msgid "Preferred buffer size"
+msgstr "Hobetsitako buffer tamaina"
+
+#: ../translation/extra.c:9
+msgid "Preferred period size"
+msgstr "Hobetsitako epe-tamaina"
+
+#. Last.fm plugin
+#: ../translation/extra.c:11
+msgid "Enable scrobbler"
+msgstr "Gaitu scrobbler"
+
+#: ../translation/extra.c:12
+msgid "Disable nowplaying"
+msgstr "Desgaitu orain erreproduzitzen"
+
+#: ../translation/extra.c:13
+msgid "Username"
+msgstr "Erabiltzaile-izena"
+
+#: ../translation/extra.c:14
+msgid "Password"
+msgstr "Pasahitza"
+
+#: ../translation/extra.c:15
+msgid "Scrobble URL"
+msgstr "Scrobble URLa"
+
+#. OSS output plugin
+#: ../translation/extra.c:17
+msgid "Device file"
+msgstr "Gailu-fitxategia"
+
+#: ../translation/extra.c:18
+msgid "OSS4 samplerate bug workaround"
+msgstr "OSS4 lagintze-maiztasun errorearen konponbidea"
+
+#. Album Artwork plugin
+#: ../translation/extra.c:20
+msgid "Cache update period (hr)"
+msgstr "Cache-aren eguneraketaren epea (ordu)"
+
+#: ../translation/extra.c:21
+msgid "Fetch from embedded tags"
+msgstr "Eskuratu txertatutako etiketetatik"
+
+#: ../translation/extra.c:22
+msgid "Fetch from local folder"
+msgstr "Eskuratu karpeta lokaletik"
+
+#: ../translation/extra.c:23
+msgid "Local cover file mask"
+msgstr "Azal-fitxategi lokalen maskara"
+
+#: ../translation/extra.c:24
+msgid "Fetch from last.fm"
+msgstr "Eskuratu last.fm-tik"
+
+#: ../translation/extra.c:25
+msgid "Fetch from albumart.org"
+msgstr "Eskuratu albumart.org-etik"
+
+#: ../translation/extra.c:26
+msgid "Scale artwork towards longer side"
+msgstr "Eskalatu azala alderik handieneruntz"
+
+#. Audio CD player
+#: ../translation/extra.c:28
+msgid "Use CDDB/FreeDB"
+msgstr "Erabili CDDB/FreeDB"
+
+#: ../translation/extra.c:29
+msgid "Prefer CD-Text over CDDB"
+msgstr "Hobetsi CD-Text CDDBren aurrean"
+
+#: ../translation/extra.c:30
+msgid "CDDB url (e.g. 'freedb.org')"
+msgstr "CDDB url-a (adibidez, 'freedb.org')"
+
+#: ../translation/extra.c:31
+msgid "CDDB port number (e.g. '888')"
+msgstr "CDDB ataka zenbakia (adibidez, '888')"
+
+#: ../translation/extra.c:32
+msgid "Prefer CDDB protocol over HTTP"
+msgstr "Hobetsi CDDB protokoloa HTTPren aurrean"
+
+#: ../translation/extra.c:33
+msgid "Enable NRG image support"
+msgstr "Gaitu NRG irudien euskarria"
+
+#. DUMB module player plugin
+#: ../translation/extra.c:35
+msgid "Resampling quality (0..2, higher is better)"
+msgstr "Birlaginketa kalitatea (0..2, altuagoa hobea da)"
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:37
+msgid "Max song length (in minutes)"
+msgstr "Kantuen gehienezko iraupena (minututan)"
+
+#. Standard GTK2 user interface plugin
+#: ../translation/extra.c:39
+msgid "Ask confirmation to delete files from disk"
+msgstr "Eskatu berrespena diskotik fitxategiak ezabatzeko"
+
+#: ../translation/extra.c:40
+msgid "Status icon volume control sensitivity"
+msgstr "Bolumen-kontrola egoera-ikonoaren sentikortasuna"
+
+#: ../translation/extra.c:41
+msgid "Custom status icon"
+msgstr "Egoera-ikono pertsonalizatua"
+
+#: ../translation/extra.c:42
+msgid "Run gtk_init with --sync (debug mode)"
+msgstr "Exekutatu gtk_init --sync aukerarekin (arazketa modua)"
+
+#: ../translation/extra.c:43
+msgid "Add separators between plugin context menu items"
+msgstr "Gehitu banatzaileak pluginen laster-menuetako elementuen artean"
+
+#. OSD Notify plugin
+#: ../translation/extra.c:45
+msgid "Notification title format"
+msgstr "Jakinarazpenen izenburuaren formatua"
+
+#: ../translation/extra.c:46
+msgid "Notification content format"
+msgstr "Jakinarazpenen edukiaren formatua"
+
+#: ../translation/extra.c:47
+msgid "Show album art"
+msgstr "Erakutsi albumen azalak"
+
+#: ../translation/extra.c:48
+msgid "Album art size (px)"
+msgstr "Albumen azalen tamaina (px)"
+
+#. PulseAudio output plugin
+#: ../translation/extra.c:50
+msgid "PulseAudio server"
+msgstr "PulseAudio zerbitzaria"
+
+#: ../translation/extra.c:52
+msgid "Samplerate"
+msgstr "Lagintze-maiztasuna"
+
+#. SHN player plugin
+#: ../translation/extra.c:54
+msgid "Relative seek table path"
+msgstr "Bilaketa taularen bide erlatiboa"
+
+#: ../translation/extra.c:55
+msgid "Absolute seek table path"
+msgstr "Bilaketa taularen bide absolutua"
+
+#: ../translation/extra.c:56
+msgid "Swap audio bytes (toggle if all you hear is static)"
+msgstr ""
+"Trukatu audio bytak (txandakatu entzuten duzun gauza bakarra soinu estatikoa "
+"bada)"
+
+#. SID decoder plugin
+#: ../translation/extra.c:58
+msgid "Enable HVSC Songlength DB"
+msgstr "Gaitu HVSC Songlength DB"
+
+#: ../translation/extra.c:59
+msgid "Songlengths.txt (from HVSC)"
+msgstr "Songlengths.txt (HVSC-tik)"
+
+#: ../translation/extra.c:60
+msgid "Bits per sample (8 or 16)"
+msgstr "Bitak lagineko (8 ala 16)"
+
+#: ../translation/extra.c:61
+msgid "Default song length (sec)"
+msgstr "Kanten iraupen lehenetsia (seg)"
+
+#. WildMidi player plugin
+#: ../translation/extra.c:63
+msgid "Timidity++ bank configuration file"
+msgstr "Timidity++ bankuaren konfigurazio-fitxategia"
+
+#: ../translation/extra.c:66
+msgid "Track Title"
+msgstr "Pistaren izenburua"
+
+#: ../translation/extra.c:67
+msgid "Performer"
+msgstr "Interpretatzailea"
+
+#: ../translation/extra.c:72
+msgid "Total Tracks"
+msgstr "Pistak guztira"
+
+#: ../translation/extra.c:73
+msgid "Genre"
+msgstr "Generoa"
+
+#: ../translation/extra.c:74
+msgid "Composer"
+msgstr "Konpositorea"
+
+#: ../translation/extra.c:75
+msgid "Disc Number"
+msgstr "Disko zenbakia"
+
+#: ../translation/extra.c:76
+msgid "Comment"
+msgstr "Iruzkina"
+
+#: ../translation/extra.c:77
+msgid "Encoder / Vendor"
+msgstr "Kodetzailea / Saltzailea"
+
+#: ../translation/extra.c:79
+msgid "Location"
+msgstr "Kokapena"
+
+#: ../translation/extra.c:80
+msgid "Subtrack Index"
+msgstr "Azpi-pista indizea"
+
+#: ../translation/extra.c:81
+msgid "Tag Type(s)"
+msgstr "Etiketa mota(k)"
+
+#: ../translation/extra.c:82
+msgid "Embedded Cuesheet"
+msgstr "Txertatutako cue-orria"
+
+#: ../translation/extra.c:83
+msgid "Codec"
+msgstr "Kodeka"
+
+#. FFmpeg deocder plugin
+#: ../translation/extra.c:85
+msgid "File Extensions (separate with ';')"
+msgstr "Fitxategi-luzapenak (';'-z banatuta)"
+
+#. Converter GUI
+#: ../translation/extra.c:87
+msgid "Convert"
+msgstr "Bihurtu"
+
+#. Resampler (Secret Rabbit Code)
+#: ../translation/extra.c:89
+msgid "Target Samplerate"
+msgstr "Helburuko lagintze-maiztasuna"
+
+#: ../translation/extra.c:90
+msgid "Quality / Algorythm"
+msgstr "Kalitatea / Algoritmoa"
+
+#: ../translation/extra.c:91
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr ""
+"Lagintze-maiztasun automatikoa (helburuko lagintze-maiztasuna indargabetzen "
+"du)"
+
+#: ../plugins/converter/convgui.c:108
+msgid "The file already exists. Overwrite?"
+msgstr "Fitxategia dagoeneko existitzen da. Gainidatzi?"
+
+#: ../plugins/converter/convgui.c:110
+msgid "Converter warning"
+msgstr "Bihurtzailearen abisua"
+
+#: ../plugins/converter/convgui.c:222
+msgid "Please select encoder"
+msgstr "Mesedez hautatu kodetzailea"
+
+#: ../plugins/converter/convgui.c:224
+msgid "Converter error"
+msgstr "Bihurtzailearen errorea"
+
+#: ../plugins/converter/convgui.c:248
+msgid "Converting..."
+msgstr "Bihurtzen..."
+
+#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+msgid "Select folder..."
+msgstr "Hautatu karpeta..."
+
+#: ../plugins/converter/convgui.c:635
+msgid "Failed to save encoder preset"
+msgstr "Huts egin du kodetzailearen aurrezarpena gordetzean"
+
+#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
+msgstr ""
+"Egiaztatu aurrezarpenen karpetaren baimenak, erabili beste izen bat edo egin "
+"leku librea diskoan"
+
+#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+msgid "Preset with the same name already exists. Try to pick another title."
+msgstr ""
+"Izen bereko aurrezarpen bat existitzen da dagoeneko. Aukeratu beste izenburu "
+"bat."
+
+#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+msgid "Error"
+msgstr "Errorea"
+
+#: ../plugins/converter/convgui.c:692
+msgid "Add new encoder"
+msgstr "Gehitu kodetzaile berria"
+
+#: ../plugins/converter/convgui.c:724
+msgid "Edit encoder"
+msgstr "Editatu kodetzailea"
+
+#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+msgid "Remove preset"
+msgstr "Kendu aurrezarpena"
+
+#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+msgid "This action will delete the selected preset. Are you sure?"
+msgstr "Ekintza honek hautatutako aurrezarpena ezabatuko du. Ziur zaude?"
+
+#: ../plugins/converter/convgui.c:782
+msgid "Encoders"
+msgstr "Kodetzaileak"
+
+#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+msgid "Add plugin to DSP chain"
+msgstr "Gehitu plugina DSP kateari"
+
+#: ../plugins/converter/convgui.c:1034
+msgid "Failed to save DSP preset"
+msgstr "Hutsegitea DSP aurrezarpena gordetzean"
+
+#: ../plugins/converter/convgui.c:1098
+msgid "New DSP Preset"
+msgstr "DSP aurrezarpen berria"
+
+#: ../plugins/converter/convgui.c:1183
+msgid "Edit DSP Preset"
+msgstr "Editatu DSP aurrezarpena"
+
+#: ../plugins/converter/convgui.c:1203
+msgid "DSP Presets"
+msgstr "DSP aurrezarpenak"
+
+#: ../plugins/converter/interface.c:94
+msgid "Output folder:"
+msgstr "Irteerako karpeta:"
+
+#: ../plugins/converter/interface.c:115
+msgid "Output file name:"
+msgstr "Irteerako fitxategi-izena:"
+
+#: ../plugins/converter/interface.c:126
+msgid ""
+"Extension (e.g. .mp3) will be appended automatically.\n"
+"Leave the field empty for default (%a - %t)."
+msgstr ""
+"Luzapena (adibidez, .mp3) automatikoki gehituko da.\n"
+"Utzi eremua hutsik balio lehenetsia erabiltzeko (%a - %t)."
+
+#: ../plugins/converter/interface.c:139
+msgid "Encoder:"
+msgstr "Kodetzailea:"
+
+#: ../plugins/converter/interface.c:163
+msgid "DSP preset:"
+msgstr "DSP aurrezarpena:"
+
+#: ../plugins/converter/interface.c:186
+msgid "Number of threads:"
+msgstr "Hari kopurua:"
+
+#: ../plugins/converter/interface.c:199
+msgid "Output sample format:"
+msgstr "Irteerako lagin-formatua:"
+
+#: ../plugins/converter/interface.c:206
+msgid "Keep source format"
+msgstr "Mantendu iturburuko formatua"
+
+#: ../plugins/converter/interface.c:207
+msgid "8 bit signed int"
+msgstr "8 biteko zeinudun osokoa"
+
+#: ../plugins/converter/interface.c:208
+msgid "16 bit signed int"
+msgstr "16 biteko zeinudun osokoa"
+
+#: ../plugins/converter/interface.c:209
+msgid "24 bit signed int"
+msgstr "24 biteko zeinudun osokoa"
+
+#: ../plugins/converter/interface.c:210
+msgid "32 bit signed int"
+msgstr "32 biteko zeinudun osokoa"
+
+#: ../plugins/converter/interface.c:211
+msgid "32 bit float"
+msgstr "32 biteko koma mugikorreko zenbakia"
+
+#: ../plugins/converter/interface.c:217
+msgid "When file exists:"
+msgstr "Fitxategia existitzen denean:"
+
+#: ../plugins/converter/interface.c:224
+msgid "Prompt"
+msgstr "Gonbita"
+
+#: ../plugins/converter/interface.c:225
+msgid "Overwrite"
+msgstr "Gainidatzi"
+
+#: ../plugins/converter/interface.c:227
+msgid "Preserve folder structure, starting from:"
+msgstr "Mantendu karpeta-egitura, hemendik hasita:"
+
+#: ../plugins/converter/interface.c:379
+msgid "Edit Encoder Preset"
+msgstr "Editatu kodetzailearen aurrezarpena"
+
+#: ../plugins/converter/interface.c:402
+msgid "Untitled Encoder"
+msgstr "Kodetzaile izengabeak"
+
+#: ../plugins/converter/interface.c:410
+msgid "Output file extension:"
+msgstr "Irteerako fitxategiaren luzapena:"
+
+#: ../plugins/converter/interface.c:417
+msgid "E.g. mp3"
+msgstr "Adibidez, mp3"
+
+#: ../plugins/converter/interface.c:425
+msgid "Command line:"
+msgstr "Komando-lerroa:"
+
+#: ../plugins/converter/interface.c:436
+#, c-format
+msgid ""
+"Example: lame - %o\n"
+"%i for input file, %o for output file, - for stdin"
+msgstr ""
+"Adibidea: lame - %o\n"
+"%i sarrerako fitxategiarentzat, %o irteerako fitxategiarentzat, - irteera "
+"estandarrarentzat"
+
+#: ../plugins/converter/interface.c:446
+#, c-format
+msgid ""
+"<small>%o - output file name\n"
+"%i - temporary input file name</small>"
+msgstr ""
+"<small>%o - irteerako fitxategi-izena\n"
+"%i - aldi baterako sarrerako fitxategi-izena</small>"
+
+#: ../plugins/converter/interface.c:455
+msgid "Method:"
+msgstr "Metodoa:"
+
+#: ../plugins/converter/interface.c:462
+msgid "Pipe"
+msgstr "Kanalizazioa"
+
+#: ../plugins/converter/interface.c:463
+msgid "Temporary file"
+msgstr "Aldi baterako fitxategia"
+
+#: ../plugins/converter/interface.c:480
+msgid "APEv2"
+msgstr "APEv2"
+
+#: ../plugins/converter/interface.c:486
+msgid "ID3v1"
+msgstr "ID3v1"
+
+#: ../plugins/converter/interface.c:492
+msgid "OggVorbis"
+msgstr "OggVorbis"
+
+#: ../plugins/converter/interface.c:498
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../plugins/converter/interface.c:510
+msgid "ID3v2"
+msgstr "ID3v2"
+
+#: ../plugins/converter/interface.c:520
+msgid "<b>Tag writer</b>"
+msgstr "<b>Etiketa idazlea</b>"
+
+#: ../plugins/converter/interface.c:606
+msgid "DSP Preset Editor"
+msgstr "DSP aurrezarpenen editorea"
+
+#: ../plugins/converter/interface.c:629
+msgid "Untitled DSP Preset"
+msgstr "Izenbururik gabeko DSP aurrezarpena"
diff --git a/po/fa.po b/po/fa.po
index 2caabc5d..f0918e10 100644
--- a/po/fa.po
+++ b/po/fa.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-10-18 07:33+0200\n"
"Last-Translator: Ali <aysabzevar@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -55,9 +55,9 @@ msgstr "شکست در بارگذاری فایل کمک"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "کمک"
@@ -71,857 +71,894 @@ msgstr "درباره DeaDBeef %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "گزارش تغییرات %s DeaDBeeF"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, fuzzy, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF هم اکنون در حال پخش است"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "ویرایش لیست پخش"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "عنوان:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "تغییر نام لیست پخش"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "حذف لیست پخش"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "افزودن لیست پخش جدید"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "ذخیره اکولایزر از پیش مرتب شده DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "فایل‌های اکولایزر از پیش مرتب شده DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "بارگذاری اکولایزر از پیش مرتب شده DeaDBeeF ..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "اکولایزر از پیش مرتب شده DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "وارد کردن اکولایزر از پیش تنطیم شده Foobar2000 ..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "اکولایزر از پیش تعیین شده Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "بارگذاری از پیش تنظیم شده"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "وارد کردن Foobar2000 از پیش تنظیم شده "
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "فعال"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "صفر کردن همگی"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "صفر کردن پیش تقویت کننده"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "نوارهای صفر"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "۱ روز %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d روز %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "متوقف| %d آهنگ| %s کل زمان پخش"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "تک کاناله"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "استریو"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d کیلو بیت بر ثانیه"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "مکث کرده|"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dهرتز | %d بیت | %s | %d:%02d / %s | %d آهنگ | %s کل زمان پخش"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "ذخیره لیست پخش به صورت"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "فایل‌های لیست پخش DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "بارگذاری لیست پخش"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "دیگر پرونده‌ها (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "لیست پخش جدید"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "لیست پخش جدید (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_ پرونده"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_باز کردن پرونده(ها)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "افزودن پرونده(ها)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "افزودن پوشه(ها)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "افزودن محل"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "لیست پخش جدید"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "بارگذاری لیست پخش"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "ذخیره لیست پخش"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_ خروج"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_ویرایش"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_ پاک سازی"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "انتخاب همگی"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "از انتخاب درآوردن همگی"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "انتخاب معکوس"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "انتخاب"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "حذف"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "محصول"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_یافتن"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "عنوان"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "شماره پرونده"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "آلبوم"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "هنرمند"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "اتفاقی"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "شخصی"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "تنظیمات"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_نما"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "نوار وضعیت"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "سرآیندهای ستونی"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "لبه‌ها"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "اکولایزر"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_پخش"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "ترتیب"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "خطی"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "بُر زنی"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "بُر زنی"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "اتفاقی"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "حلقه‌ زنی"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "حلقه زنی همگی"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "حلقه زنی تک آهنگ"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "حلقه‌ نکن"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "پیمایش،پخش را دنبال می‌کند"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "مکان نما پخش را دنبال می‌کند"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "توقف پس از کنونی"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_ کمک"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_تغییرات"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_درباره"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "جستجوی"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "توقف"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "پخش"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "مکث"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "قبلی"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "بعدی"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "پخش اتفاقی"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "درباره"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "خروج"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "ویژگی آهنگ"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "ـ اعمال"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "ـ بستن"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "فرا داده"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "ویژگی‌ها"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "ستون عنوان جدید را اینجا وارد کنید"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "نوع:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "در حال پخش"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "آلبوم هنری"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "هنرمند-آلبوم"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "مدت زمان"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "شماره آهنگ"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "هنرمند آلبوم/گروه"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "قالب:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "هم‌ترازی:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "چپ"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "راست"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "ـ لغو"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "ـ قبول"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "افزونه خروجی:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "دستگاه خروجی:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "صوت"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "حالت پخش مجدد:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "غیرفعال"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "آهنگ"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "پخش مجدد مقیاس قله"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "حالت پخش مجدد:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "افزودن فایل‌ها از خط فرمان (‌یا مدیر فایل) به این فهرست پخش:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "ادامه نشست قبلی در این آغاز به کار"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "توقف پس از کنونی"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "پخش"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "پیکره‌بندی:"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "بستن حداقل شده‌ها برای رفتن به سینی"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "کلید وسط ماوس لیست پخش را می‌بندد"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "مخفی کردن آیکون سینی سیستم"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "استفاده از قلم‌های ضخیم برای آهنگ در حال پخش"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "مخفی کردن متن «حذف از دیسک» از منو"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "متن نوار عنوان در زمان پخش:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "متن نوار عنوان در زمان توقف:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "رابط گرافیکی کاربر"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "غلبه"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "پیش زمینه"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "پس‌زمینه"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "رنگ‌های نوار پویش/ حجم صدا"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "متوسط"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "روشن"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "تیره"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "پایه"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "متن"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "رنگ‌های نوار لبه"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "غلبه (درختواره GTK ضعیف می‌شود اما سرعت نمایش افزایش می‌یابد)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "ردیف زوج"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "ردیف فرد"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "ردیف انتخاب شده"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "متن انتخاب شده"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "مکان‌نما"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "رنگ‌های فهرست پخش"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "رنگ‌ها"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "فعال سازی خادم پروکسی"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "آدرس سرویس دهنده پروکسی:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "درگاه سرویس دهنده پروکسی:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "نوع پروکسی:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "نام کاربری پروکسی:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "گذرواژه پروکسی:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "شبکه"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "افزونه‌ها"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "آدرس اینترنتی:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "گروه با"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "قالب:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "انتخاب"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "افزونه‌ها"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "نویسنده برچسب"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "بنویسید ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "بنویسید ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "بنویسید APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 را پاک کنید"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 را پاک کنید"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 را پاک کنید"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "نسخه ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "۲٫۳ (پیشنهاد شده)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "۲٫۴"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "کدگشایی کاراکتر ID3v1 (پیش‌فرض iso8859-1 است)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "بنویسید ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "هنرمند/آلبوم"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "شماره آهنگ"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "حذف فایل‌ها از روی دیسک"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -929,49 +966,48 @@ msgstr ""
"پرونده‌ها از دست خواهند رفت. این چنین شود؟ \n"
"(این کادر محاوره‌ای می‌تواند در تنظیمات افزونه GTKUI خاموش شود)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "هشدار"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "افزودن به صف پخش"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "حذف از صف پخش"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "بارگذاری مجدد ابرداده"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "حذف از دیسک"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "افزودن ستون"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "ویرایش ستون"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "حذف ستون"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "گروه با"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "هیچ"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "هنرمند/تاریخ/آلبوم"
@@ -979,7 +1015,7 @@ msgstr "هنرمند/تاریخ/آلبوم"
msgid "Open file..."
msgstr "باز کردن پرونده..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "پیکره‌بندی:"
@@ -988,19 +1024,23 @@ msgstr "پیکره‌بندی:"
msgid "Default Audio Device"
msgstr "دستگاه صوتی پیش‌فرض"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "افزودن"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "کلید‌های داغ عمومی"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "شکاف"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "افزودن محل"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "ترکیب کلیدی"
@@ -1012,139 +1052,144 @@ msgstr "افزودن فایل‌ها..."
msgid "Initializing..."
msgstr "آماده سازی اولیه..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "شما اطلاعات این آهنگ را تغییر داده‌اید."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "واقعا می‌خواهید پنجره را ببندید؟"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "کلید"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "مقدار"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "واقعا می‌خواهید پنجره را ببندید؟"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "افزودن پرونده(ها)"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "حذف"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "استفاده: deadbeef [گزینه‌ها] [پرونده(ها)] \n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "گزینه‌ها: \n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr "--help یا -h کمک(این پیام) را نشان می‌دهد و خارج می‌شود \n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr "--quit از پخش کننده خارج می‌شود \n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr "--version اطلاعات نسخه را نمایش می‌دهد و خارج می‌شود \n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr "--play پخش را آغاز می‌کند\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr "--stop پخش را متوقف می‌کند\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr "--pause پخش را مکث می‌دهد\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr "--next آهنگ بعدی در فهرست پخش\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr "--prev آهنگ قبلی در فهرست پخش\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr "--random آهنگ اتفاقی در فهرست پخش\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr "--queue پیوست کردن پرونده(ها) به فهرست پخش موجود\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr "--nowplaying FMT چاپ نام آهنگ قالب‌بندی شده در خروجی استاندارد\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1155,57 +1200,33 @@ msgstr ""
" [م]دت زمان، شم[ا]ره آهنگ، [س]ال،[ن]ظر،\n"
" حق[ن]شر،[س]پری شده\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr "مثال: \"%%a - %%t\" باید \"هنرمند-عنوان\" را چاپ کند\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "پیش‌فرض"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "بله"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "خیر"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"۲٫۳ (توصیه شده)\n"
-"۲٫۴"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"غیرفعال\n"
-"آهنگ\n"
-"آلبوم"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1232,7 +1253,7 @@ msgstr ""
"هنرمند آلبوم/گروه\n"
"شخصی"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1240,13 +1261,38 @@ msgstr ""
"چپ\n"
"راست"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"غیرفعال\n"
+"آهنگ\n"
+"آلبوم"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"۲٫۳ (توصیه شده)\n"
+"۲٫۴"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "پرونده تصویر بیتی پیدا نشد:%s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1258,7 +1304,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "افزودن دیسک صوتی"
#: ../translation/extra.c:4
@@ -1275,7 +1322,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "متن نوار عنوان در زمان توقف:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1308,488 +1355,810 @@ msgstr "گذرواژه پروکسی:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "حذف فایل‌ها از روی دیسک"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "آلبوم هنری"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "شماره آهنگ"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "عنوان/آهنگ هنرمند"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "شماره پرونده"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "افزودن محل"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "نوع(های) برچسب"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "برگه راهنمایی توکار"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "کدک‌"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "فعال سازی خادم پروکسی"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "انتخاب همگی"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "ویرایش ستون"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "دستگاه خروجی:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "افزونه خروجی:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "ذخیره از پیش تنظیم شده"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "غلبه"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "بارگذاری از پیش تنظیم شده"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "افزونه خروجی:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "بنویسید APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "بنویسید ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "بنویسید ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "نویسنده برچسب"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "غلبه"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_ویرایش"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "ـ بستن"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "ویرایش ستون"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "بُر زنی"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "عنوان/آهنگ هنرمند"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "افزودن محل"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "حذف"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "لیست پخش جدید"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "افزودن ستون"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "پیکره‌بندی:"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "رابط گرافیکی کاربر"
+
+#~ msgid "Slot"
+#~ msgstr "شکاف"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "واقعا می‌خواهید پنجره را ببندید؟"
+
#~ msgid "Save playlist as"
#~ msgstr "ذخیره لیست پخش به صورت"
diff --git a/po/fi.po b/po/fi.po
index 2c3f7612..593d549f 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2012-03-11 10:13+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-06-06 16:50+0200\n"
"Last-Translator: Juhani <juhaninumminen0@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: fi\n"
@@ -54,9 +54,9 @@ msgstr "Ohjetiedoston avaaminen epäonnistui"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ohje"
@@ -70,850 +70,891 @@ msgstr "Tietoja ohjelmasta DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s:n muutosloki"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeFin kääntäjät"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Muokkaa soittolistaa"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Nimi:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Uudelleennimeä soittolista"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Poista soittolista"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Luo uusi soittolista"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Tallenna DeaDBeeF EQ esiasetus"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ esiasetustiedostot (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Lataa DeaDBeeF EQ esiasetus..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ esiasetukset (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Tuo Foobar2000 EQ esiasetus..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ esiasetukset (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
-msgstr "Tallenna esiasetus..."
+msgstr "Tallenna esiasetus"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
-msgstr "Lataa esiasetus..."
+msgstr "Lataa esiasetus"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Tuo Foobar2000 EQ Esiasetus"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Kytke päälle"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nolla kaikki"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Nollaa esivahvistin"
# Tällä viitataan selvästikkin niihin muihin liukusäätimiin, jotka muuttavat eri taajuus asteiden vahvistusta
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Nollaa kanavat"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Esiasetukset"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 päivä %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d päivää %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Pysäytetty | %d raitaa | kokonaiskesto %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d Kb/s "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Keskeytetty | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bittiä | %s | %d:%02d / %s | %d raitaa | kokonaiskesto %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Tallenna soittolista nimellä"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeef soittolistatiedosto (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Lataa soittolista"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Muut tiedostot (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Uusi soittolista"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Uusi soittolista (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Tiedosto"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Avaa tiedosto(ja)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Lisää tiedosto(ja)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Lisää hakemisto(ja)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Lisää sijainti"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Uusi soittolista"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Avaa soittolista"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Tallenna soittolista"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Lopeta"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Muokkaa"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Tyhjennä"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Valitse kaikki"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Poista valinta"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Käännä valinta"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Valinta"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Poista"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
-msgstr ""
+msgstr "Rajaa"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Etsi"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Lajittele"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Nimi"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Raidan numero"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Albumi"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artisti"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Päivämäärä"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Satunnainen"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Mukautettu"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Asetukset"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Näytä"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Tilapalkki"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Sarakkeiden otsikot"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Välilehdet"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Taajuuskorjain"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "T_oisto"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
-msgstr ""
+msgstr "Järjestys"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineaarinen"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Sekoita raitoja"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Sekoita albumeita"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Satunnainen"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
-msgstr ""
+msgstr "Toisto"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
-msgstr ""
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
+msgstr "Toista kaikki"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
-msgstr ""
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
+msgstr "Toista yksi kappale"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
-msgstr ""
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
+msgstr "Älä toista"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
-msgstr ""
+msgstr "Vieritys seuraa toistoa"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
-msgstr ""
+msgstr "Hiiri seuraa toistoa"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
-msgstr ""
+msgstr "Pysäytä tämän kappaleen jälkeen"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "Hyppää nykyiseen raitaan"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Ohje"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Muutosloki"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Tietoja"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Kääntäjät"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Etsi"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Pysäytä"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Soita"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Tauko"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Edellinen"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Seuraava"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Toista satunnainen"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Tietoja"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Lopeta"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Raidan ominaisuudet"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Asetukset"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Käytä"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Sulje"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metatiedot"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Ominaisuudet"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Anna uuden rivin otsikko"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tyyppi:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "KOhteen indeksi"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
-msgstr ""
+msgstr "Soitetaan"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albumin Kuvitus"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artisti - Albumi"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Kesto"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Raidan Numero"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr ""
+msgstr "Yhtye / Albumin artisti"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Tiedostomuoto:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
-msgstr ""
+msgstr "Kohdistus:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Vasen"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Oikea"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Peruuta"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
-msgstr ""
+msgstr "Ulostuloliitännäinen:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
-msgstr ""
+msgstr "Ulostulolaite:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Muunna aina 8-bittinen ääni 16-bittiseksi"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
-msgstr ""
+msgstr "Ääni"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
-msgstr ""
+msgstr "Replaygain-tila:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
-msgstr ""
+msgstr "Pois päältä"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Raita"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
-msgstr ""
+msgstr "Replaygain-huippuskaala"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr ""
+msgstr "Replaygain-esivahvistus:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Yleinen esivahvistus:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Lisää tiedostoja komentoriviltä (tai tiedostonhallinnasta) tähän "
"soittolistaan:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
-msgstr ""
+msgstr "Palauta edellinen istunto käynnistyksessä"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Älä lisää arkistoista lisättäessä kansioita"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Pysäytä tämän kappaleen jälkeen"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
-msgstr ""
+msgstr "Toisto"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Tee asetukset"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "Tallenna esiasetus..."
+msgstr "DSP ketjuesiasetus"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Lataa"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Pienennä ilmaisinalueelle suljettaessa"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Hiiren keskipainike sulkee soittolistan"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Piilota ilmaisinalueen kuvake"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Käytä lihavoitua kirjasinta soitettavalle raidalle"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Piilota \"Poista levyltä\"-kontekstivalinta"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Nimeä soittolista automaattisesti lisättäessä yksittäinen kansio"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
-msgid "Titlebar text while playing:"
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "Käyttöliittymän päivitysnopeus (kertaa sekunnissa):"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
+msgid "Titlebar text while playing:"
+msgstr "Otsikkopalkin teksti toistettaessa:"
+
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
-msgstr ""
+msgstr "Otsikkopalkin teksti, kun toisto on pysäytetty:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
+"Käyttöliittymäliitännäinen (vaihtaminen vaatii ohjelman "
+"uudellenkäynnistyksen):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Käyttöliittymä"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
-msgstr ""
+msgstr "Ohita"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
-msgstr ""
+msgstr "Etuala"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
-msgstr ""
+msgstr "Tausta"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
-msgstr ""
+msgstr "Etsintä-/äänenvoimakkuuspalkin värit"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Keski"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Kevyt"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tumma"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
-msgstr ""
+msgstr "Pohja"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Teksti"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
-msgstr ""
+msgstr "Välilehden värit"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
+"Ohita asetus (GTKn treeview-teema menetetään, mutta nopeuttaa renderöintiä)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
-msgstr ""
+msgstr "Parillinen rivi"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
-msgstr ""
+msgstr "Pariton rivi"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Valittu rivi"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Valittu teksti"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Hiiriosoitin"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Soittolistojen värit"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Värit"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Ota käyttöön välityspalvelin"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Välityspalvelimen osoite:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Välityspalvelimen portti:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Välityspalvelimen tyyppi:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Välityspalvelimen käyttäjänimi:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Välityspalvelimen salasana:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Verkko"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versio: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Tekijänoikeus"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Liitännäiset"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
-msgstr ""
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
+msgstr "Ryhmittele"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Järjestä..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Tiedostomuoto"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Nouseva"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Laskeva"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Valitse DSP-liitännäinen"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Liitännäinen"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr ""
+msgstr "Tagikirjoittajan asetukset"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Kirjoita ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Kirjoita ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Kirjoita APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
-msgstr ""
+msgstr "Poista ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
-msgstr ""
+msgstr "Poista ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
-msgstr ""
+msgstr "Poista APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 versio"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (suositeltu)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1-merkistökoodaus (oletus: iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Kirjoita ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artisti / Albumi"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Raita nro"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Poista tiedostot levyltä"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -922,49 +963,48 @@ msgstr ""
"(Tämä valintaikkuna voidaan kytkeä pois päältä GTKUI-liitännäisen "
"asetuksissa)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Varoitus"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Lisää toistojonoon"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Poista toistojonosta"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Lataa metatiedot uudelleen"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Poista levyltä"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Lisää sarake"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Muokkaa saraketta"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Poista sarake"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
-msgstr ""
+msgstr "Ryhmittele"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ei mitään"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artisti/Pvm/Albumi"
@@ -972,30 +1012,34 @@ msgstr "Artisti/Pvm/Albumi"
msgid "Open file..."
msgstr "Avaa tiedosto..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
-msgstr ""
+msgstr "Tee asetukset %s"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "Oletusäänilaite"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Lisää"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
-msgstr ""
+msgstr "Yleiset pikanäppäimet"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Sijainti"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
-msgstr ""
+msgstr "Näppäinyhdistelmä"
#: ../plugins/gtkui/progress.c:56
msgid "Adding files..."
@@ -1005,193 +1049,186 @@ msgstr "Lisätään tiedostoja..."
msgid "Initializing..."
msgstr "Alustetaan..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
-msgstr ""
+msgstr "Olet muokannut tämän raidan dataa."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Haluatko varmasti sulkea tämän ikkunan?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Useita arvoja] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Avain"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Arvo"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Kirjoitetaan tageja..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nimi:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Tiedostonimet eivät voi alkaa merkeillä : tai _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Kenttää ei voi lisätä"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
+msgstr "Samanniminen kenttä on jo olemassa, yritä toista nimeä."
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr ""
+msgstr "Lisää kenttä"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr ""
+msgstr "Poista kentät"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Käyttö: deadbeef [valinnat] [tiedosto(t)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Valitsimet:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help tai -h Näytä ohje (tämä viesti) ja poistu\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
-msgstr ""
+msgstr " --quit Sulje soitin\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Näytä versiotiedot ja poistu\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
-msgstr ""
+msgstr " --play Aloita toisto\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
-msgstr ""
+msgstr " --stop Pysäytä toisto\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
-msgstr ""
+msgstr " --pause Keskeytä toisto\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause Vaihda keskeytyksen ja toiston välillä\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
+" --play-pause Aloita toisto, jos pysäytetty, muuten vaihda "
+"keskeytyksen ja toiston välillä\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
-msgstr ""
+msgstr " --next Seuraava kappale soittolistalla\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
-msgstr ""
+msgstr " --prev Edellinen kappale soittolistalla\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
-msgstr ""
+msgstr " --random Satunnainen kappale soittolistalla\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
+" --queue Lisää tiedosto(t) olemassa olevaan soittolistaan\n"
-#: ../main.c:105
+#: ../main.c:98
#, c-format
-msgid " --nowplaying FMT Print formatted track name to stdout\n"
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:99
+#, c-format
+msgid " --nowplaying FMT Print formatted track name to stdout\n"
+msgstr " --nowplaying FMT Tulosta muotoiltu raidan nimi stdoutiin\n"
+
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
+" FMT %%-syntaksi: [a]rtist, [t]itle, al[b]um,\n"
+" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
+" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
+" esim.: --nowplaying \"%%a - %%t\" tulostaa \"artisti - "
+"otsikko\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+" lisätietoja osoitteessa http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Oletus"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Kyllä"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ei"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (suositeltu)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Nouseva\n"
-"Laskeva"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1205,8 +1242,19 @@ msgid ""
"Band / Album Artist\n"
"Custom"
msgstr ""
+"Kohteen indeksi\n"
+"Soitetaan\n"
+"Albumin kansikuva\n"
+"Artisti - Albumi\n"
+"Artisti\n"
+"Albumi\n"
+"Otsikko\n"
+"Kesto\n"
+"Raidan numero\n"
+"Bändi / Albumin artisti\n"
+"Mukautettu"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1214,23 +1262,54 @@ msgstr ""
"Vasen\n"
"Oikea"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Pois käytöstä\n"
+"Raita\n"
+"Albumi"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Nouseva\n"
+"Laskeva"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (suositeltu)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Bittikarttatiedostoa ei löydetty: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
"package, or specify path to freepats.cfg in the plugin settings."
msgstr ""
+"wildmidi: freepats-asetustiedostoa ei löydetty. Asenna paketti timidity-"
+"freepats tai määrittele tiedoston freepats.cfg sijainti liitännäisten "
+"asetuksissa."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Lisää ääni-CD"
#: ../translation/extra.c:4
@@ -1244,9 +1323,9 @@ msgstr ""
#: ../translation/extra.c:7
msgid "Release device while stopped"
-msgstr ""
+msgstr "Vapauta laite, kun toisto on lopetettu"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1257,11 +1336,11 @@ msgstr ""
#. Last.fm plugin
#: ../translation/extra.c:11
msgid "Enable scrobbler"
-msgstr ""
+msgstr "Ota käyttöön scrobbler"
#: ../translation/extra.c:12
msgid "Disable nowplaying"
-msgstr ""
+msgstr "Ota nowplaying pois käytöstö"
#: ../translation/extra.c:13
msgid "Username"
@@ -1273,414 +1352,473 @@ msgstr "Salasana"
#: ../translation/extra.c:15
msgid "Scrobble URL"
+msgstr "Scrobble URL"
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
msgstr ""
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Laitetiedosto"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr ""
+msgstr "Välimuistin päivitysväli"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
-msgstr ""
+msgstr "Nouda sisällytetyistä tageista"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
-msgstr ""
+msgstr "Nouda paikallisesta kansiosta"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Hae last.fm -palvelusta"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Hae albumart.org -palvelusta"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Skaalaa albumin kuva pidempää sivua kohti"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Käytä CDDB/FreeDB:tä"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "Suosi CD-Textiä CDDB:n yli"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
-msgstr ""
+msgstr "CDDB:n url (esim. \"freedb.org\")"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
-msgstr ""
+msgstr "CDDB:n portin numero (esim. \"888\")"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "Suosi CDDB-protokollaa HTTP:n yli"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
-msgstr ""
+msgstr "Ota käyttöön tuki NRG-levykuville"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
+msgstr "Kappaleen maksimipituus (minuuteissa)"
+
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Kappaleen oletuspituus (sek)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
msgstr ""
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
-msgstr ""
+msgstr "Kysy vahvistus ennen kuin tiedostoja poistetaan levyltä"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
-msgstr ""
+msgstr "Oma tilakuvake"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
-msgstr ""
+msgstr "Suorita gtk_init --sync-valitsimen kanssa (virheenjäljitystila)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr ""
+msgstr "Näytä albumin kansi"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Albumin kannen koko (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
-msgstr ""
+msgstr "PulseAudio-palvelin"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
-msgstr ""
+msgstr "Näytetaajuus"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Bittiä/näyte (8 tai 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr ""
+msgstr "Kappaleen oletuspituus (sek)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Raidan otsikko"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Esittäjä"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Raitoja yhteensä"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Tyylilaji"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Säveltäjä"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Levyn numero"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Kommentti"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
-msgstr ""
+msgstr "Enkooderi / toimittaja"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Sijainti"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
-msgstr ""
+msgstr "Sisällytetty cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Koodekki"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Tiedostopäätteet (erota \";\"-merkillä)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Muunna"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Laatu / algoritmi"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Ota käyttöön scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Tiedosto on jo olemassa. Ylikirjoita?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Valitse koodekki"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Muunnetaan..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Valitse kansio..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Virhe"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Poista esiasetus"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Uusi DSP-esiasetus"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Muokkaa DSP-esiasetusta"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP-esiasetukset"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr ""
-#: ../plugins/converter/interface.c:126
-#, fuzzy
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
-msgstr "Tiedoston pääte (esim. .mp3) lisätään automaattisesti.\n"
+msgstr ""
+"Tiedoston pääte (esim. .mp3) lisätään automaattisesti.\n"
+"Jätettäessä tyhjäksi oletus on (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP-esiasetus:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Kun tiedosto on jo olemassa:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Kysy"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Ylikirjoita"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "Lataa esiasetus..."
+msgstr "Muokkaa enkooderin esiasetusta"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr ""
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Esim. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Komentorivi:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1688,53 +1826,320 @@ msgstr ""
"Esimerkki: lame - %o\n"
"%i on sisääntulotiedosto, %o on ulostulotiedosto, - on stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Tilapäinen tiedosto"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "Ogg Vorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Ylikirjoita"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Tilapäinen tiedosto"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Muokkaa"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Sulje"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Muokkaa saraketta"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Komentorivi:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Sekoita raitoja"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Useita arvoja] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Sijainti"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Poista"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Uusi soittolista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Kommentti"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Lisää sarake"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Tee asetukset"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Asetukset"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Käyttöliittymä"
+
+#~ msgid "Slot"
+#~ msgstr "Toiminto"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Poistetaanko valittu kenttä todella?"
diff --git a/po/fr.po b/po/fr.po
index 50e6ab56..a111de01 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef devel\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-05 13:38+0200\n"
"Last-Translator: Cilyan <gaknar@gmail.com>\n"
"Language-Team: French\n"
@@ -56,9 +56,9 @@ msgstr "Échec à l'ouverture du fichier d'aide"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Aide"
@@ -72,125 +72,129 @@ msgstr "À propos de DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Notes de version pour DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Traducteurs de DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Éditer la liste de lecture"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titre :"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Renommer la liste de lecture"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Supprimer la liste de lecture"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Ajouter une nouvelle liste de lecture"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Enregistrer les paramètres prédéfinis de l'égaliseur DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Paramètres prédéfinis d'égaliseur DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Charger des paramètres prédéfinis pour l'égaliseur DeaDBeeF..."
# Duplicate?
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Paramètres prédéfinis d'égaliseur DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importer des paramètres EQ Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Paramètres d'égaliseur Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Enregistrer"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Charger"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importer des paramètres Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Activer"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Tout à zéro"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Pré-ampli à zéro"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Bandes à zéro"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Enregistrer"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 jour %d:%02d:%02d"
# Possible to use ngettext?
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d jours %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Arrêté | %d pistes | %s de temps d'écoute total"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stéréo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "En pause | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -198,738 +202,771 @@ msgstr ""
"%s%s %s| %d Hz | %d bit | %s | %d:%02d / %s | %d pistes | %s de temps "
"d'écoute total"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Sauvegarder la liste de lecture sous"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Fichiers de listes de lecture DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Charger une liste de lecture"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Autres fichiers (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nouvelle liste de lecture"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nouvelle liste de lecture (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fichier"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Ouvrir un (des) fichier(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Ajouter un (des) fichier(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Ajouter un (des) dossier(s)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Ajouter un emplacement"
# Duplicate?
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nouvelle liste de lecture"
# Duplicate?
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Charger une liste de lecture"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Enregistrer la liste de lecture"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Quitter"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "Édit_er"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Effacer"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Tout sélectionner"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Tout désélectionner"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverser la sélection"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Sélection"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Enlever"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Découper"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Rechercher"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titre"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "Numéro de fichier"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artiste"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aléatoire"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personnalisé"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Préférences"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Affichage"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barre d'état"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Entête des colonnes"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Onglets"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Égaliseur"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Lecture"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordre"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linéaire"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Mélanger"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Mélanger"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Aléatoire"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Boucler"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Tout répéter"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Répéter une seule piste"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Pas de répétition"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Le défilement suit la lecture"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "La sélection suit la lecture"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Arrêter après la piste actuelle"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Aide"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Notes de version"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "À pr_opos"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Rechercher"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Lire"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pause"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Précédent"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Suivant"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Lecture aléatoire"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "À propos"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Quitter"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propriétés de la piste"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Appliquer"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Fermer"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Métadonnée"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propriétés"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Entrez le nom de la nouvelle colonne ici"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Type :"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Lecture"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Couverture de l'album"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artiste - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Durée"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "N° piste"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Groupe / Artiste de l'album"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format :"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alignement :"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Gauche"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Droite"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "A_nnuler"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Valider"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Greffon de sortie :"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Périphérique de sortie :"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Son"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Mode du ReplayGain (ajustement du volume) :"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Désactiver"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Piste"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Ajustement des crêtes par ReplayGain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "Mode du ReplayGain (ajustement du volume) :"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Ajouter des fichiers à cette liste de lecture depuis la ligne de commande "
"(ou le gestionnaire de fichier) :"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Charger la session précédente au démarrage"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Arrêter après la piste actuelle"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Lecture"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurer"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Enregistrer"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Fermer la fenêtre la réduit dans la zone de notification"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Le bouton du milieu de la souris ferme la liste de lecture"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Masquer l'icône de notification"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Utiliser une police grasse pour la piste en cours de lecture"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Masquer l'entrée \"Supprimer du disque\" du menu contextuel"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Barre de titre en lecture :"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Barre de titre à l'arrêt :"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Interface"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Redéfinir"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Premier plan"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Arrière-plan"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Couleurs de la barre de lecture/échelle du volume"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Fond"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Clair"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Sombre"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Texte"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Couleur des onglets"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Redéfinir (perd le thème des listes GTK, mais accélère le rendu)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Lignes paires"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Lignes impaires"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Ligne sélectionnée"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Texte sélectionné"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Curseur"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Couleurs des listes de lecture"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Couleurs"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Activer le serveur mandataire"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresse du serveur mandataire :"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port du serveur mandataire :"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Type de serveur mandataire :"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nom d'utilisateur sur le serveur mandataire :"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Mot de passe sur le serveur mandataire :"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Réseau"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Greffons"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL :"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grouper par"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format :"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Sélection"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Greffons"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Éditeur de tags"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Écrire ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Écrire ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Écrire APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Effacer ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Effacer ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Effacer APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Version ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Recommandé)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Encodage des caractères ID3v1 (iso8859-1 par défaut)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Écrire ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artiste / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "N° piste"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Supprimer les fichiers du disque"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -938,49 +975,48 @@ msgstr ""
"(Cette boîte de dialogue peut être désactivée dans les préférences du "
"greffon GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Avertissement"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Ajouter à la file d'attente de lecture"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Enlever de la file d'attente de lecture"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Recharger les métadonnées"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Supprimer du disque"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Ajouter une colonne"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Éditer la colonne"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Enlever la colonne"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grouper par"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Aucun"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artiste/Date/Album"
@@ -988,7 +1024,7 @@ msgstr "Artiste/Date/Album"
msgid "Open file..."
msgstr "Ouvrir un fichier..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Configurer"
@@ -997,19 +1033,23 @@ msgstr "Configurer"
msgid "Default Audio Device"
msgstr "Périphérique audio par défaut"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Ajouter"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Raccourcis globaux"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Action"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Ajouter un emplacement"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinaison de touches"
@@ -1021,140 +1061,145 @@ msgstr "Ajout des fichiers..."
msgid "Initializing..."
msgstr "Initialisation..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Vous avez modifié des données pour cette piste."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Fermer réellement la fenêtre ?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Clé"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valeur"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Fermer réellement la fenêtre ?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Ajouter un (des) fichier(s)"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Enlever"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Usage : deadbeef [options] [fichier(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Options :\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ou -h Affiche l'aide (ce message) et quitte\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Fermer le lecteur\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Affiche les informations de version et quitte\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Démarre la lecture\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Arrête la lecture\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Suspend la lecture\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Musique suivante dans la liste de lecture\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Musique précédente dans la liste de lecture\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Musique aléatoire dans la liste de lecture\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Ajoute le(s) fichier(s) dans la liste existante\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Envoi le nom de la piste format dans stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1166,7 +1211,7 @@ msgstr ""
"ommentaire,\n"
" copy[r]ight, [e]coulé\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1175,50 +1220,26 @@ msgstr ""
" ex : --nowplaying \"%%a - %%t\" affiche \"artiste - "
"titre\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Défaut"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Oui"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Non"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recommandé)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Désactivé\n"
-"Piste\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1245,7 +1266,7 @@ msgstr ""
"Groupe / Artiste de l'album\n"
"Personnalisé"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1253,13 +1274,38 @@ msgstr ""
"Gauche\n"
"Droite"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Désactivé\n"
+"Piste\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recommandé)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Impossible de trouver le fichier pixmap : %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1272,7 +1318,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Ajouter un CD Audio"
#: ../translation/extra.c:4
@@ -1289,7 +1336,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Barre de titre à l'arrêt :"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1322,488 +1369,810 @@ msgstr "Mot de passe sur le serveur mandataire :"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Supprimer les fichiers du disque"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Couverture de l'album"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "N° piste"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Titre / Artiste de la piste"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Numéro de fichier"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Ajouter un emplacement"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Type(s) de tags"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Cuesheet incorporée"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Activer le serveur mandataire"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Tout sélectionner"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Éditer la colonne"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Enregistrer"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Enregistrer"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Enregistrer"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Enregistrer"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Périphérique de sortie :"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Greffon de sortie :"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Enregistrer"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Redéfinir"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Charger"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Greffon de sortie :"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Écrire APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Écrire ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Écrire ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Éditeur de tags"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Redéfinir"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "Édit_er"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Fermer"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Éditer la colonne"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Mélanger"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Titre / Artiste de la piste"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Ajouter un emplacement"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Enlever"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nouvelle liste de lecture"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Ajouter une colonne"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configurer"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interface"
+
+#~ msgid "Slot"
+#~ msgstr "Action"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Fermer réellement la fenêtre ?"
+
#~ msgid "Save playlist as"
#~ msgstr "Enregistrer la liste de lecture sous"
diff --git a/po/gl.po b/po/gl.po
index 60a59fdb..87e84fb4 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: lxde.deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-24 13:48+0200\n"
"Last-Translator: mbouzada <mbouzada@gmail.com>\n"
"Language-Team: Galician <proxecto@trasno.net>\n"
@@ -55,9 +55,9 @@ msgstr "Produciuse un fallo ao cargar o ficheiro de axuda"
msgid "help.txt"
msgstr "axuda.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Axuda"
@@ -71,849 +71,888 @@ msgstr "Sobre DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Cambios en DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Tradutores de DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Editar a lista de reprodución"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Título:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Renomear a lista de reprodución"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Retirar a lista de reprodución"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Engadir unha nova lista de reprodución"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Gardar os axustes de ecualización de DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Ficheiros de axustes de ecualización de DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Cargar os axustes de ecualización de DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Axustes de ecualización de DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importar os axustes de ecualización de Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Axustes de ecualización de Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Gardar os axustes"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Cargar os axustes"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importar os axustes de Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Activar"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Restabelecer todo"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Restabelecer o preamplificador"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Restabelecer as bandas"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Axustes"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 día %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d días %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Detido | %d pistas | Tempo total: %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Estéreo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausado | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d pistas | Tempo total: %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Gardar a lista de reprodución como"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Ficheiros de listas de reprodución DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Cargar a lista de reprodución"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Outros ficheiros (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nova lista de reprodución"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nova lista de reprodución (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Ficheiro"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Abrir ficheiro(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Engadir ficheiro(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Engadir cartafol(es)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Engadir localización"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova lista de reprodución"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Cargar a lista de reprodución"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Gardar a lista de reprodución"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Saír"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Editar"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Limpar"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Seleccionar todo"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Desmarcar todo"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverter a selección"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selección"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Retirar"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Cortar"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Buscar"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Ordenar por"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Título"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Número de pista"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Álbum"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Interprete"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Data"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Ao chou"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizado"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferencias"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Ver"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra de estado"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Cabeceiras de columna"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Lapelas"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ecualizador"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reproducir"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Orden"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineal"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Barallar pistas"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Barallar álbums"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Ao chou"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Repetir"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Repetir todo"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Repetir unha canción"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Non repetir"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Desprazar á seguinte reprodución"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Punteiro na seguinte reprodución"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Deter ao rematar a pista actual"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Ir á pista actual"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Axuda"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Cambios"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Sobre"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Tradutores"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Buscar"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Deter"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Reproducir"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pausa"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Anterior"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Seguinte"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Reproducir ao chou"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Sobre"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Saír"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propiedades da pista"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Configuración"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplicar"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Pechar"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadatos"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propiedades"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Escriba aquí o novo título da columna"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Índice de elementos"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Reproducindo"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Portada"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Interprete - Álbum"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duración"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Pista numero"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Banda / Interprete do álbum"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Aliñamento"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Esquerda"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Dereita"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancelar"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Aceptar"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Engadido de saída:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositivo de saída:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Converter sempre o son de 8 bits a 16 bits"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Son"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Modo de normalización de volume"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Desactivar"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Pista"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Escala de límite de normalización de volume"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Normalización de volume do preamplificador:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Preamplificación global:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Engadir ficheiros desde a liña de ordes (ou xestor de ficheiros) a esta "
"lista de reprodución:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Continuar a sesión anterior no inicio"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Non engadir desde ficheiros cando se engaden cartafoles"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Deter ao rematar a pista actual"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reprodución"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurar"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Cadeas DSP predefinidas"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Cargar"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Pechar minimizado na área de notificación"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "O botón do medio do rato pecha a lista de reprodución"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Agochar a icona da área de notificación"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Usar tipo de letra en negra para a pista en reprodución"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Agochar o elemento «Eliminar do disco» do menú contextual "
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
"Nomear automaticamente as listas de reprodución ao engadir un só cartafol"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Frecuencia de actualización da interface (veces por segundo):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Texto da barra de título cando se reproduce:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Texto da barra de título cando está detido:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Engadido de interface de usuario (require reiniciar):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Interface de usuario"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Anular"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Fronte"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Fondo"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Cores das barras de busca/volume"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Medio"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Claro"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Escuro"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Texto"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Cores das lapelas"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Cambiar (ignora o tema GTK, mais acelera o debuxado)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Fila par"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Fila impar"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Fila seleccionada"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Texto seleccionado"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Cores da lista de reprodución"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Cores"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Activar o servidor proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Enderezo do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Porto do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tipo de proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nome de usuario do proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Contrasinal do proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Rede"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versión: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Dereitos de autor"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Engadidos"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Agrupar por"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Ordenar por"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formato"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Ascendente"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descendente"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Escolla o engadido DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Engadido"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Configuración do editor de etiquetas"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Escribir ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Escribir ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Escribir APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Eliminar ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Eliminar ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Eliminar APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versión de ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (recomendado)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Codificación de caracteres de ID3v1 (por omisión é iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Escribir ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Interprete / Álbum"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Pista num."
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Eliminar ficheiros do disco"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -921,49 +960,48 @@ msgstr ""
"Vai perder os ficheiros. Quere continuar?\n"
"(Este aviso pode desactivarse nas opcións do engadido GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Aviso"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Engadir na cola de reprodución"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Retirar da cola de reprodución"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Recargar os metadatos"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Retirar do disco"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Engadir columna"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Editar columna"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Retirar columna"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Agrupar por"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ningún"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Interprete/Data/Álbum"
@@ -971,8 +1009,8 @@ msgstr "Interprete/Data/Álbum"
msgid "Open file..."
msgstr "Abrir ficheiro..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, c-format, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
msgstr "Configurar %s"
@@ -980,19 +1018,23 @@ msgstr "Configurar %s"
msgid "Default Audio Device"
msgstr "Dispositivo de son predeterminado"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Engadir"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Teclas rápidas globais"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Rañura"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Lugar"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinación de teclas"
@@ -1004,138 +1046,145 @@ msgstr "Engadindo ficheiros,,,"
msgid "Initializing..."
msgstr "Iniciando..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Vostede modificou os datos desta pista."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Ten certeza de que quere pechas esta xanela?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Valores múltiples] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Tecla"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valor"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Escribindo etiquetas"
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nome:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Os nomes dos campos non deben comezar con «:» ou «_»"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Non é posíbel engadir o campo"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Xa existe un campo con este nome, tente con outro diferente."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Ten certeza de que quere retirar o campo seleccionado?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Engadir campo"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Retirar campo"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Uso: deadbeef [opcións] [ficheiro(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opcións:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ou -h Amosar a axuda (esta mensaxe) e saír\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Pechar o reprodutor\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Amosar a versión e saír\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Iniciar a reprodución\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Deter a reprodución\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausar a reprodución\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Inverter a pausa\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Iniciar a reprodución se se detén, ou pola contra "
+msgstr ""
+" --play-pause Iniciar a reprodución se se detén, ou pola contra "
"inverter a pausa\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Seguinte canción da lista de reprodución\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Canción anterior da lista de reprodución\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Canción ao chou da lista de reprodución\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Engadir ficheiro(s) á lista de reprodución existente\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Amosar o nome da pista formatado por stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1146,61 +1195,37 @@ msgstr ""
" l: Duración, n: Pista, y: Ano, c: Comentario,\n"
" r: Copyright, e: Tempo restante\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-msgstr " e.g.: --nowplaying «%%a - %%t» amosaría: «interprete - "
+msgstr ""
+" e.g.: --nowplaying «%%a - %%t» amosaría: «interprete - "
"título»\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " para obter máis información, vexa http://sourceforge.n"
-"et/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" para obter máis información, vexa http://sourceforge."
+"net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Predeterminado"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Si"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Non"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (recomendado)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Ascendente\n"
-"Descendente"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Desactivar\n"
-"Pista\n"
-"Álbum"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1226,7 +1251,7 @@ msgstr ""
"Banda / Intreprete do álbum\n"
"Personalizado"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1234,13 +1259,40 @@ msgstr ""
"Esquerda\n"
"Dereita"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Desactivar\n"
+"Pista\n"
+"Álbum"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Ascendente\n"
+"Descendente"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (recomendado)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Non se atopou o ficheiro de imaxe: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1253,7 +1305,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Engadir CD de son"
#: ../translation/extra.c:4
@@ -1269,7 +1322,7 @@ msgstr "Utilizar unha nova mostraxe ALSA"
msgid "Release device while stopped"
msgstr "Liberar o dispositivo cando está detido:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Tamaño preferido do búfer"
@@ -1298,265 +1351,304 @@ msgstr "Contrasinal"
msgid "Scrobble URL"
msgstr "URL de «Compartir escoitas»"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Ficheiro de dispositivo"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Solución de erros de mostraxe OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Período de actualización (hr)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Obter a partir das etiquetas"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Obter dun cartafol local"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Máscara de portada local"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Obter en Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Obter en albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Cara máis longa das portadas a escala"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Usar CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferir CD-Text a CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (p.ex. «freedb.org»)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Número do porto CDDB (p.ex. «888»)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferir o protocolo CDDB ao HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Activar compatibilidade coas imaxes NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Calidade de sobremostraxe (0..2, maior é mellor)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Duración máxima da canción (en minutos)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Duración predeterminada da canción (segs.)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Pedir confirmación para eliminar ficheiros do disco"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Sensibilidade ao control de volume na icona de estado"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Icona de estado personalizada"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Executar gtk_init com --sync (modo de depuración)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr "Engadir separadores entre os engadidos nos elementos do menú contextual"
+msgstr ""
+"Engadir separadores entre os engadidos nos elementos do menú contextual"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Formato do título de notificación"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Formato do contido de notificación"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Amosar a portada"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Tamaño da portada (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Servidor PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Taxa de mostraxe"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Ruta relativa da táboa de referencia"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Ruta absoluta da táboa de referencia"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Intercambio de bytes de son (cambie só se a escoita é estática)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Activar HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (para HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits por mostra (8 ou 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Duración predeterminada da canción (segs.)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Ficheiro de configuración do banco Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Título da pista"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Interprete"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Total de pistas"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Xénero"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Compositor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Número de disco"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comentario"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Codificador / Provedor"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Lugar"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Índice de subpista"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tipo de etiqueta(s)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Folla de información incrustada"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Códec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Extensións de ficheiros (separadas por «;»)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Converter"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Destino da mostraxe"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Calidade / Algoritmo"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Mostraxe automática (sobrescribe o destinos das mostraxes)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Activar «Compartir escoitas»"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Este ficheiro xa existe. Quere sobrescribilo?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Aviso do convertedor"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Escolla o codificador"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Produciuse un erro no convertedor"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Convertendo"
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Seleccionar cartafol"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Produciuse un fallo ao gardar os axustes do codificador"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1564,63 +1656,78 @@ msgstr ""
"Comprobe os permisos predeterminados do cartafol, tente escoller outro "
"título, ou liberar algo de espazo no disco"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Xa existe un axuste con este título. Tente escoller outro título."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Erro"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Engadir un novo codificador"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Editar o codificador"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Retirar o axuste"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Esta acción elimina o axuste seleccionado. Está vostede seguro?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codificadores"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Engadir un «engadido» á cadea DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Non foi posíbel gardar o axuste DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Novo axuste DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Editar o axuste DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Axustes DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Cartafol de saída:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Preservar a estrutura de cartafoles, a partir de:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Nome do ficheiro de saída:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1628,84 +1735,91 @@ msgstr ""
"A extensión (p.ex. mp3) engadirase automaticamente.\n"
"Deixar o campo baleiro de xeito predeterminado (%a -%t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codificador"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Axuste DSP"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Número de fíos:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Formato da mostra de saída"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Manter o formato da orixe"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit asinados int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit asinados int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit asinados int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit asinados int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit flotantes"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Cando o ficheiro xa existe:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Preguntar"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Sobrescribir"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Preservar a estrutura de cartafoles, a partir de:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Editar os axustes do codificador"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Codificador sen título"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensión do ficheiro de saída:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "P.ex. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Liña de ordes:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1714,8 +1828,9 @@ msgstr ""
"%i para o ficheiro de entrada, %o para o ficheiro de saída, - para a entrada "
"estándar"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1723,50 +1838,317 @@ msgstr ""
"<small>%o - nome do ficheiro de saída\n"
"%i - nome do ficheiro temporal de entrada</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Método:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Canalización"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Ficheiro temporal"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Escritor de etiquetas</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor de axustes DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Axuste DSP sen título"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Sobrescribir"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Ficheiro temporal"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Editar"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Pechar"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Editar columna"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Liña de ordes:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Barallar pistas"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Valores múltiples] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Lugar"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Retirar"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nova lista de reprodución"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Comentario"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Engadir columna"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Esta acción elimina o axuste seleccionado. Está vostede seguro?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configurar"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Configuración"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interface de usuario"
+
+#~ msgid "Slot"
+#~ msgstr "Rañura"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Ten certeza de que quere retirar o campo seleccionado?"
+
#~ msgid "Save playlist as"
#~ msgstr "Gardar a lista de reprodución como"
diff --git a/po/he.po b/po/he.po
index 34db979a..93a382cf 100644
--- a/po/he.po
+++ b/po/he.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeeF\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-16 12:49+0200\n"
"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
"Language-Team: Gezer <sh.yaron@gmail.com>\n"
@@ -57,9 +57,9 @@ msgstr "אירע כשל בטעינת קובץ העזרה"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "עזרה"
@@ -73,122 +73,126 @@ msgstr "על אודות DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "יומן השינויים של DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "מתרגמי DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "עריכת רשימת ההשמעה"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "כותרת:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "שינוי שם רשימת ההשמעה"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "הסרת רשימת ההשמעה"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "הוספת רשימת השמעה חדשה"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "שמירת תצורת האקוולייזר של DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "קובץ תצורת אקוולייזר של DeaDBeeF ‏(‎*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "טעינת תצורת אקוולייזר של DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "תצורות אקוולייזר של DeaDBeeF ‏(‎*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "ייבוא קובץ תצורת אקוולייזר של Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "תצורות אקוולייזר של Foobar2000‏ (‎*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "שמירת תצורה"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "טעינת תצורה"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "ייבוא תצורה של Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "הפעלה"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "הכל אפס"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "איפוס מגבר קדם"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "איפוס הערוצים"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "תצורות"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "יום אחד %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d ימים %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "נעצר | %d רצועות | %s סך כל זמן הנגינה"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "מונו"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "סטריאו"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d קסל״ש "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "מושהה |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -196,724 +200,759 @@ msgstr ""
"%s%s %s| %d הרץ | %d סיביות | %s | %d:%02d / %s | %d רצועות | %s סך כל זמן "
"הנגינה"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "שמירת רשימת ההשמעה בשם"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "קובצי רשימת השמעה של DeaDBeeF‏ (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "טעינת רשימת השמעה"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "קבצים אחרים (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "רשימת השמעה חדשה"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "רשימת השמעה חדשה (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_קובץ"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_פתיחת קובץ/ים"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "הוספת קובץ/ים"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "הוספת תיקייה/ות"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "הוספת מיקום"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "רשימת השמעה חדשה"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "טעינת רשימת השמעה"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "שמירת רשימת השמעה"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "י_ציאה"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "ע_ריכה"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_מחיקה"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "בחירת הכל"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "ביטול בחירת הכול"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "הפיכת הבחירה"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "בחירה"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "הסרה"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "חיתוך"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_חיפוש"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "סידור לפי"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "כותרת"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "מספר הרצועה"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "אלבום"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "אומן"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "תאריך"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "אקראי"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "מותאם אישית"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "העדפות"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_תצוגה"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "שורת מצב"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "כותרות העמודות"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "לשוניות"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "אקוולייזר"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "ה_שמעה"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "סדר"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "קווי"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "ערבול בין הרצועות"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "ערבול בין האלבומים"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "אקראי"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "נגינה בלולאה"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "לולאה על הכול"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "לולאה על שיר בודד"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "ללא לולאה"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "הגלילה עוקבת אחר ההשמעה"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "הסמן עוקב אחר ההשמעה"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "עצירה לאחר הנוכחי"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "מעבר לרצועה הנוכחית"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "ע_זרה"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "יומן _שינויים"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "על _אודות"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "מ_תרגמים"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "חיפוש"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "עצירה"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "נגינה"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "השהיה"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "הקודם"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "הבא"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "נגינה אקראית"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "על אודות"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "יציאה"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "מאפייני הרצועה"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "הגדרות"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "ה_חלה"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_סגירה"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "נתוני על"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "מאפיינים"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "יש להזין את הכותרת החדשה כאן"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "סוג:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "אינדקס הפריט"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "מתנגן"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "עטיפת האלבום"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "אומן – אלבום"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "משך"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "רצועה מספר"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "להקה / אומן האלבום"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "מבנה:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "יישור:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "שמאל"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "ימין"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_ביטול"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_אישור"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "תוסף פלט:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "התקן הפלט:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "תמיד להמיר שמע של 8 סיביות ל־16 סיביות"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "שמע"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "מצב הגברת נגינה חוזרת:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "לא פעיל"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "רצועה"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "מידת הגברת הנגינה החוזרת"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "הגברת נגינה חוזרת:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "הגברת נגינה כללית:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "הוספת קבצים משורת הפקודה (או ממנהל הקבצים) לרשימת ההשמעה:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "המשך ההפעלה הקודמת עם התחלת התכנית"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "אין להוסיף מארכיונים בעת הוספת תיקיות"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "עצירה לאחר הנוכחי"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "השמעה"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "הגדרה"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "תצורת שרשרת DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_טעינה"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "סגירה ממזערת לאזור המערכת"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "לחצן אמצעי סוגר את רשימת ההשמעה"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "הסתרת הסמל באזור הדיווחים"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "שימוש בגופן מודגש עבור הרצועה המתנגנת כעת"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "הסתרת פריט ההקשר \"מחיקה מהכונן\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "מתן שם אוטומטית לרשימות השמעה בעת הוספת תיקייה בודדת"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "קצב רענון המנשק (פעמים בשנייה):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "טקסט הכותרת בעת ההשמעה:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "טקסט הכותרת בעת עצירה:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "תוסף מנשק משתמש (שינויים דורשים הפעלה מחדש):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "מנשק משתמש"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "דריסה"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "קידמה"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "רקע"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "צבעי פס גלילת ההשמעה/פס עוצמת השמע"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "בינוני"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "בהיר"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "כהה"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "בסיסי"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "טקסט"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "צבעי ראשי הלשוניות"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "דריסה (רכיבי העיצוב של ה־GTK יאבדו אך העיבוד יהיה מהיר יותר)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "שורה זוגית"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "שורה אי־זוגית"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "שורה נבחרת"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "טקסט שנבחר"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "סמן"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "צבעי רשימת ההשמעה"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "צבעים"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "הפעלת שרת מתווך"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "כתובת שרת התיווך:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "פתחת שרת התיווך:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "סוג שרת התיווך:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "שם המשתמש במתווך:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "הססמה במתווך:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "רשת"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "גרסה:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "זכויות יוצרים"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "תוספים"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "כתובת:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "קיבוץ לפי"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "סידור לפי..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "מבנה"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "סדר עולה"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "סדר יורד"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "בחירת תוסף DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "תוסף"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "הגדרות כותב התגיות"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "כתיבת ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "כתיבת ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "כתיבת APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "הסרת ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "הסרת ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "הסרת APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "גרסת ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (מומלץ)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "קידוד התווים של ID3v1 (בררת המחדל היא iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "כתיבת ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "אומן / אלבום"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "רצועה מספר"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "מחיקת הקובץ מהכונן"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -921,49 +960,48 @@ msgstr ""
"הקבצים יאבדו. להמשיך?\n"
"(ניתן לכבות תיבת דו־שיח זו בהגדרות התוסף GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "אזהרה"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "הוספה לתור ההשמעה"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "הסרה מתור ההשמעה"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "טעינת נתוני העל מחדש"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "הסרה מהכונן"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "הוספת עמודה"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "עריכת עמודה"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "הסרת עמודה"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "קיבוץ לפי"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "ללא"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "אומן/תאריך/אלבום"
@@ -971,7 +1009,7 @@ msgstr "אומן/תאריך/אלבום"
msgid "Open file..."
msgstr "פתיחת קובץ..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "הגדרת %s"
@@ -980,19 +1018,23 @@ msgstr "הגדרת %s"
msgid "Default Audio Device"
msgstr "התקן השמע כברירת מחדל"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "הוספה"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "מקשי קיצור גלובליים"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "חריץ"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "מיקום"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "צירוף מקשים"
@@ -1004,137 +1046,143 @@ msgstr "מתבצעת הוספת קבצים..."
msgid "Initializing..."
msgstr "בהפעלה..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "השתנו נתונים ברצועה זו."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "האם באמת לסגור את החלון?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[ערכים מרובים]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "מפתח"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "ערך"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "התגיות נכתבות..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "שם:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "שמות השדות לא יכולים להתחיל בתווים : או _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "לא ניתן להוסיף שדה"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "שדה בשם זה כבר קיים, נא לנסות שם אחר."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "האם אכן להסיר את השדה הנבחר?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "הוספת שדה"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "הסרת שדה"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Usage: deadbeef [options] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Options:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Print help (this message) and exit\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Quit player\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Print version info and exit\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Start playback\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Stop playback\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pause playback\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Toggle pause\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Next song in playlist\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Previous song in playlist\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Random song in playlist\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Append file(s) to existing playlist\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Print formatted track name to stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1145,7 +1193,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1154,7 +1202,7 @@ msgstr ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
@@ -1163,45 +1211,19 @@ msgstr ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "בררת מחדל"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "כן"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "לא"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (מומלץ)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"סדר עולה\n"
-"סדר יורד"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"נטרול\n"
-"רצועה\n"
-"אלבום"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1227,7 +1249,7 @@ msgstr ""
"להקה / אמן האלבום\n"
"מותאם אישית"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1235,13 +1257,40 @@ msgstr ""
"שמאל\n"
"ימין"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"נטרול\n"
+"רצועה\n"
+"אלבום"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"סדר עולה\n"
+"סדר יורד"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (מומלץ)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "לא ניתן למצוא את קובץ ה־pixmap:‏ %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1253,7 +1302,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "הוספת תקליטור שמע"
#: ../translation/extra.c:4
@@ -1269,7 +1319,7 @@ msgstr "שימוש בדגימה חוזרת של ALSA"
msgid "Release device while stopped"
msgstr "שחרור ההתקן בעת עצירה"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "גודל האוגר המועדף"
@@ -1298,266 +1348,304 @@ msgstr "ססמה"
msgid "Scrobble URL"
msgstr "הכתובת של Scrobble"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "קובץ ההתקן"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "מעקף לתקלת קצב הדגימה ב־OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "ההפרש בין מועדי עדכון המטמון (שעות)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "קבלה מתגיות מובנות"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "קבלה מתיקייה מקומית"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "מסכת קבצים של עטיפות מקומיות"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "קבלה מ־Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "קבלה מ־albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "מתיחת העטיפה לעבר הצד הארוך יותר"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "שימוש ב־CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "העדפת CD-Text על פני CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "כתובת ה־CDDB (לדוגמה: 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "מס׳ הפתחה של ה־CDDB (לדוגמה: '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "העדפת הפרוטוקול CDDB על פני HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "הפעלת תמיכה בתמונות NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "איכות הדגימה החוזרת (0..2, גבוה יותר - איכותי יותר)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "אורך השיר המרבי (בדקות)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "אורך שיר כברירת מחדל (שניות)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "בקשת אישור למחיקת קבצים מהכונן"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "רגישות בקרת העצמה דרך סמל המצב"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "סמל מצב מותאם אישית"
# אם המחרוזת הזאת מופיעה במסוף והתבלבלתי נא להעתיק את המחרוזת המקורית לתרגום
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "הפעלת gtk_init עם הפרמטר ‎--sync (מצב ניפוי שגיאות)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "הוספת הפרדה בין פריטי תפריט ההקשר של התוסף"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "מבנה כותרת ההתרעה"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "מבנה תוכן ההתרעה"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "הצגת עטיפת האלבום"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "גודל עטיפת האלבום (פיקסלים)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "שרת PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "קצב דגימה"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "נתיב טבלת חיפוש יחסי"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "נתיב טבלת חיפוש מוחלט"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "החלפת בתים של שמע (יש להחליף מצב אם שומעים רעש סטטי)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "הפעלת מסד נתונים של אורך שירים - HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (מהשירות HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "סיביות לדגימה (8 או 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "אורך שיר כברירת מחדל (שניות)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "קובץ מאגר התצורה של Timidity++‎"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "כותרת הרצועה"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "מבצע/ת"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "סך כל הרצועות"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "סגנון"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "מלחין/ה"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "דיסק מספר"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "הערה"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "קידוד / יצור"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "מיקום"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "אינדקס תת־הרצועה"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "סוג/י התגים"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "רשימת Cue מוטמעת"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "קודק"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "סיומות קבצים (יש להפריד ב־';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "המרה"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "קצב דגימת היעד"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "איכות / אלגוריתם"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "קצב דגימה אוטומטי (דורס את קצב דגימת היעד)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "הפעלת Scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "הקובץ כבר קיים. האם לשכתב?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "אזהרה מהממיר"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "נא לבחור מצפין"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "שגיאת ממיר"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "בהמרה..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "בחירת תיקייה..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "אירע כשל בשמירת ערכת ההצפנה"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1565,63 +1653,78 @@ msgstr ""
"נא לבדוק את הרשאות תיקיית התצורות, יש לנסות לבחור בכותרת אחרת או לפנות קצת "
"מקום בכונן"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "תצורה באותו השם כבר קיימת. נא לנסות לבחור בשם אחר."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "שגיאה"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "הוספת מצפין חדש"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "עריכת מצפין"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "הסרת תצורה"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "הפעולה תמחק את התצורה הנבחרת. האם לעשות זאת?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "מצפינים"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "הוספת התוסף לשרשרת ה־DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "שמירת תצורת ה־DSP נכשלה"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "תצורת DSP חדשה"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "עריכת תצורת DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "תצורות DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "תיקיית הפלט:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "שמירת מבנה התיקיות, החל מ־:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "שם קובץ הפלט:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1629,84 +1732,91 @@ msgstr ""
"סיומות (לדוגמה: .mp3) יתווספו אוטומטית.\n"
"יש להשאיר את השדה ריק לקבלת שם בררת המחדל ‎(%a - %t)‎."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "מצפין:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "תצורת DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "מספר התהליכים:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "מבנה דגימת הפלט:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "שמירה על מבנה המקור"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "מספר שלם עם סימן ב־8 סיביות"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "מספר שלם עם סימן ב־16 סיביות"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "מספר שלם עם סימן ב־24 סיביות"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "מספר שלם עם סימן ב־32 סיביות"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "מספר עם נקודה צפה ב־32 סיביות"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "כאשר הקובץ קיים:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "הצגת בקשה"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "שכתוב"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "שמירת מבנה התיקיות, החל מ־:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "עריכת תצורת המצפין"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "מצפין ללא שם"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "סיומת קובץ הפלט:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "לדוגמה: mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "שורת הפקודה:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1714,8 +1824,9 @@ msgstr ""
"לדוגמה: lame - %o\n"
"%i לציון קובץ קלט, %o לציון קובץ קלט, - עבור הקלט מ־stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1723,50 +1834,325 @@ msgstr ""
"<small>%o - שם קובץ הפלט\n"
"%i - השם הזמני לקובץ הקלט</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "שיטה:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "שרשור"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "קובץ זמני"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>כותב תגיות</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "ערוך תצורות DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "תצורת DSP ללא שם"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"שמירה על מבנה המקור\n"
+"מספר שלם עם סימן ב־8 סיביות\n"
+"מספר שלם עם סימן ב־16 סיביות\n"
+"מספר שלם עם סימן ב־24 סיביות\n"
+"מספר שלם עם סימן ב־32 סיביות\n"
+"מספר עם נקודה צפה ב־32 סיביות"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"הצגת בקשה\n"
+"שכתוב"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"שרשור\n"
+"קובץ זמני"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "ע_ריכה"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_סגירה"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "עריכת עמודה"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "שורת הפקודה:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "ערבול בין הרצועות"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[ערכים מרובים]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "מיקום"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "הסרה"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "רשימת השמעה חדשה"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "הערה"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "הוספת עמודה"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "הפעולה תמחק את התצורה הנבחרת. האם לעשות זאת?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "הגדרה"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "הגדרות"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "מנשק משתמש"
+
+#~ msgid "Slot"
+#~ msgstr "חריץ"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "האם אכן להסיר את השדה הנבחר?"
+
#~ msgid "Save playlist as"
#~ msgstr "שמירת רשימת השמעה בשם"
@@ -1895,32 +2281,3 @@ msgstr "תצורת DSP ללא שם"
#~ msgid "Sound (adv.)"
#~ msgstr "שמע (מתקדם)"
-
-#~ msgid ""
-#~ "Keep source format\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-#~ msgstr ""
-#~ "שמירה על מבנה המקור\n"
-#~ "מספר שלם עם סימן ב־8 סיביות\n"
-#~ "מספר שלם עם סימן ב־16 סיביות\n"
-#~ "מספר שלם עם סימן ב־24 סיביות\n"
-#~ "מספר שלם עם סימן ב־32 סיביות\n"
-#~ "מספר עם נקודה צפה ב־32 סיביות"
-
-#~ msgid ""
-#~ "Pipe\n"
-#~ "Temporary file"
-#~ msgstr ""
-#~ "שרשור\n"
-#~ "קובץ זמני"
-
-#~ msgid ""
-#~ "Prompt\n"
-#~ "Overwrite"
-#~ msgstr ""
-#~ "הצגת בקשה\n"
-#~ "שכתוב"
diff --git a/po/hr.po b/po/hr.po
index c87eead7..51e5eff8 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -7,16 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-12-20 15:45+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-05-06 11:45+0200\n"
"Last-Translator: zvacet <ikoli@yahoo.com>\n"
"Language-Team: Croatian <>\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
@@ -53,11 +53,11 @@ msgstr "Neuspjeh u učitavanju datoteke pomoći"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Pomoć"
@@ -71,122 +71,126 @@ msgstr "O DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF prevoditelji"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Uredi listu izvođenja"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Naslov:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Preimenuj listu izvođenja"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Ukloni listu izvođenja"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Dodaj novu listu izvođenja"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Spremi unaprijed postavljeno"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Učitaj unaprijed postavljeno"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Omogući"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nula sve"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr ""
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr ""
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Unaprijed postavljeno"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dan %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dana %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Zustavljeno | %d zapisi| %s ukupno vrijeme sviranja"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pauzirano | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -194,726 +198,758 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d zapisi | %s ukupno vrijeme "
"sviranja"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Spremi listu izvođenja kao"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF datoteke liste izvođenja (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Učitaj listu izvođenja"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Ostale datoteke (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nova lista izvođenja"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nova lista izvođenja (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Datoteka"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Otvori datoteku(e)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dodaj datoteku(e)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Dodaj mapu(e)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Dodaj lokaciju"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova lista izvođenja"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Učitaj listu izvođenja"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Spremi listu izvođenja"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Iskjluči"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Uredi"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Očisti"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Odaberi sve"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Poništi odabrano"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Obrnuti odabir"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Odabir"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Ukloni"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr ""
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Nađi"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Posloži po"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Naslov"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Broj zapisa"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Umjetnik"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Nasumično"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Prolagođeno"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Svojstva"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Pogled"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusna traka"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Zaglavlja stupaca"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Kartice"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ujednačivač"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reprodukcija"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Redoslijed"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linearni"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr ""
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr ""
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Nasumično"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr ""
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
msgstr ""
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
msgstr ""
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
msgstr ""
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Klizač slijedi reprodukciju"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Pokazivač slijedi reprodukciju"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stop nakon trenutne"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Skoči na trenutni zapis"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Pomoć"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr ""
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_O programu"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Traži"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Sviraj"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pauza"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Prethodno"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Slijedeće"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Sviraj nasumično"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "O programu"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Isključi"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Svojstva zapisa"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Postavke"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Primjeni"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Zatvori"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr ""
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Svojstva"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Unesi naziv novog stupca"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tip:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Svira"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album Umjetnik"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Umjetnik _ album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Trajanje"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Broj zapisa"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Grupa / album umjetnik"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Poravnanje:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Lijevo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Desno"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Odustani"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Izlazni priključak:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Izlazni uređaj:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Uvijek pretvori 8 bit audio u 16 bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Zvuk"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Onemogući"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Zapis"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Dodaj datoteke iz naredbanog retka (ili upravljača datotekama) na uvu listu "
"izvođenja:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stop nakon trenutne"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reprodukcija"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Konfiguriraj"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr ""
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Učitaj"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Srednje dugme miša zatvara listu izvođenja"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Koristi podebljani font za zapis koji trenutno svira"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Tekst naslovne trake dok svira:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Tekst naslovne trake kad je zaustavljeno:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Grafičko sučelje"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Pozadina"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Srednje"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Svijetlo"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tamno"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Odabrani red"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Odabrani tekst"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Pokazivač"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Boje liste izvođenja"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Boje"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Omogući proxy poslužitelj"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresa proxy poslužitelja:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port proxy poslužitelja:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Vrsta proxy-a:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Proxy korisničko ime:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Proxy lozinka:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Mreža"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Verzija: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Autorska prava"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Priključci"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupiraj po"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Poredaj po..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Format"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Odaberi DSP priključak"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Priključak"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Piši ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Piši ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Piši APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 verzija"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (preporučeno)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Umjetnik / album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Broj zapisa"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Izbriši datoteke sa diska"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -921,49 +957,48 @@ msgstr ""
"Datoteke će biti izgubljene. Nastavi?\n"
"(Ovaj dijalog može biti iskjlučen u GTKUI postavkama prikjlučaka)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Upozorenje"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Ukloni sa diska"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Dodaj stupac"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Uredi stupac"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Ukloni stupac"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grupiraj po"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ništa"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Umjetnik/datum/album"
@@ -971,7 +1006,7 @@ msgstr "Umjetnik/datum/album"
msgid "Open file..."
msgstr "Otvori datoteku..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Konfiguriraj %s"
@@ -980,19 +1015,23 @@ msgstr "Konfiguriraj %s"
msgid "Default Audio Device"
msgstr "Zadani audio uređaj"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Dodaj"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Lokacija"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -1004,136 +1043,142 @@ msgstr "Dodavanje datoteka..."
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Stvarno zatvoriti prozor?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Vrijednost"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Ime:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Imena polja ne smiju započinjati sa : ili _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Ne mogu dodati polje"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Polje sa tim imenom već postoji,molim pokušajte s drugim imenom."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Stvarno ukloniti odabrana polje?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Dodaj polje"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Ukloni polje"
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opcije:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Ispisuje pomoć (ova poruka) i izlazi\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Isključi svirač\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Ispis info verzije i izlaz\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Početak reprodukcije\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zaustavlja reprodukciju\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Zaustavlja reprodukciju\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Slijedaća pjesma na listi izvođenja\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Prethodna pjesma na listi izvođenja\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random nasumična pjesma na listi izvođenja\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1141,7 +1186,7 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1150,47 +1195,26 @@ msgstr ""
" e.g.: sada svira \"%%a - %%t\" treba ispisati "
"\"umjetnik - naslov\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Zadano"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Da"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ne"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (preporučeno)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1216,7 +1240,7 @@ msgstr ""
"Grupa / Album Umjetnik\n"
"Prilagođeno"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1224,13 +1248,35 @@ msgstr ""
"LIjevo\n"
"Desno"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Preporučeno)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1240,7 +1286,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Dodaj audio CD"
#: ../translation/extra.c:4
@@ -1256,7 +1303,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Oslobodi uređaj kada se zaustavi"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1285,466 +1332,785 @@ msgstr "Lozinka"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Pitaj za potvrdu za brisanje datoteka sa diska"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr ""
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Naslov zapisa"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Izvođač"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Ukupno zapisa"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Broj diska"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Komentar"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Lokacija"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Proširenja datoteke (odvojeno pomoću ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Pretvori"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Odaberi mapu..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Greška"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Ukloni unaprijed postavljeno"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP unaprijed postavljeno"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Izlazna mapa:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Ime izlazne datoteke:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP unaprijed postavljeno:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr ""
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Proširenje izlazne datoteke:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Naredbeni redak:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Metoda:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Privremena datoteka"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Privremena datoteka"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Uredi"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Zatvori"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Uredi stupac"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Naredbeni redak:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Ukupno zapisa"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Ukupno zapisa"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Lokacija"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Ukloni"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nova lista izvođenja"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Komentar"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Dodaj stupac"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Konfiguriraj"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Postavke"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Grafičko sučelje"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Stvarno ukloniti odabrana polje?"
+
#~ msgid "Save playlist as"
#~ msgstr "Spremi listu izvođenja kao"
diff --git a/po/hu.po b/po/hu.po
index 96871dad..5fb237c4 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -7,14 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef 0.4.3\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2010-11-10 19:45+0100\n"
-"Last-Translator: Peter Polonkai <polesz@nedudu.hu>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-09-02 15:58+0200\n"
+"Last-Translator: Bendegúz <gyonkibendeguz@gmail.com>\n"
"Language-Team: ned <polesz@nedudu.hu>\n"
-"Language: \n"
+"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Language: Hungarian\n"
"X-Poedit-Country: HUNGARY\n"
@@ -23,9 +25,8 @@ msgid "Supported sound formats"
msgstr "Támogatott hang formátumok"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Egyéb fájlok (*)"
+msgstr "Összes fájl (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -55,9 +56,9 @@ msgstr "Súgó fájl betöltése sikertelen"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Súgó"
@@ -71,123 +72,127 @@ msgstr "DeaDBeeF %s névjegye"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s Változás napló"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF Fordítók"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Lejátszólista szerkesztése"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Cím:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Lejátszólista átnevezése"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Lejátszólista törlése"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Új lejátszólista hozzáadása"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF EQ Hangszín mentése"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ hangszín fájlok (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF EQ Hangszín betöltése..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ hangszínek (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ Hangszín importálása..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ hangszínek (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Hangszín mentés"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Hangszín betöltés"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 Hangszín betöltése"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Engedélyezve"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Mind nulla"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Preamp nulla"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Sávok nulla"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Hangszín mentés"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 nap %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d nap %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Megállítva | %d sáv | %s teljes lejátszási idő"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Monó"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Sztereó"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Szünet |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -195,735 +200,762 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d sáv | %s teljes lejátszási "
"idő"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Lejátszólista mentése másként"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeadBeeF lejátszólista fájlok (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Lejátszólista betöltése"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Egyéb fájlok (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Új lejátszólista"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Új lejátszólista (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fájl"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Fájl(ok) megnyitása"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Fájl(ok) hozzáadása"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Könyvtár(ak) hozzáadása"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Hely hozzáadása"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Új lejátszólista"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Lejátszólista betöltése"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Lejátszólista mentése"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Kilépés"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "Sz_erkesztés"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Törlés"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Mind kiválaszt"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Minden kiválasztást megszüntet"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Kiválasztás megfordítása"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Választás"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Eltávolítás"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Vágás"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Keresés"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Rendezés"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Cím"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr "Sáv száma"
+msgstr "Zeneszám száma"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Előadó"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Dátum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Véletlenszerű"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Egyéb"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Beállítások"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Nézet"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Státusz sor"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Oszlop fejlécek"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Fülek"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Hangszínszabályzó"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Lejátszás"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Sorrend"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineáris"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Kevert"
+msgstr "Számok keverése"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Kevert"
-
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Véletlenszerű"
+msgstr "Albumok keverése"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Ismétlés"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Mind ismétlése"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Egyedi dal ismétlése"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Nincs ismétlés"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "A lapozás követi a lejátszást"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "A kurzor követi a lejátszást"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Az aktuális szám után megállít"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Ugrás az aktuális számra"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Súgó"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Változás napló"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Névjegy"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "Fordí_tók"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Keresés"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Megállítás"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Lejátszás"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Szünet"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Előző"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Következő"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Véletlenszerű lejátszás"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Névjegy"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Kilépés"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
-msgstr "Sáv Tulajdonságok"
+msgstr "A sáv tulajdonságai"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Beállítások"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Alkalmaz"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Bezár"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metaadat"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Tulajdonságok"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Adja meg a fejléc új címét"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Típus"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Elem index"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Lejátszás"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album kép"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Előadó - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Időtartam"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Sáv száma"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Zenekar / Album előadó"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formátum"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Igazítás"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Balra"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Jobbra"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Mégsem"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Kimeneti bővítmény:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Kimeneti eszköz:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "A 8 bites audiót mindig konvertálja át 16 bitessé"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Hang"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Újrajátszási mód:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Letiltva"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Sáv"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Újrajátszási csúcs skála"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr "Újrajátszási mód:"
+msgstr "Újrajátszás előerősítése:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Általanos előerősítés:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Fájlok hozzáadása parancssorból (vagy fájl kezelőből) a lejátszólistához"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Előző állapot helyreállítása indításkor"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Ne adja hozzá az archívumok tartalmát mappák hozzáadásakor"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Az aktuális szám után megállít"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Lejátszás"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Beállítás"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Hangszín mentés"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "_Betöltés"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Bezáráskor a tálcára kerül"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Középső egérgomb zárja be a lejátszólistát"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Rendszertálca ikon elrejtése"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Kövér betűtípus használata a most játszott számnál"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Elrejti a \"Törlés a lemezről\" menü elemet"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
+msgstr "Lejátszási listák automatikus elnevezése egyetlen mappa hozzáadásakor"
+
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "Felhasználói felület képfrissítési rátája ( / mp ):"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Címsáv szöveg szám lejátszásakor:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Címsáv szöveg ha nincs lejátszás:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr ""
+msgstr "GUI beépülő (újraindítás szükséges):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Felhasználói felület"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Felülírás"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Előtér"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Háttér"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Idősáv/Hangerő színek"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Közép"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Világos"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Sötét"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Alap"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Szöveg"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Fülek színe"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Felülírás (elveszti a GTK treeview témát, de gyorsul a rajzolás sebessége)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Páros sor"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Páratlan sor"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Kiválasztott sor"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Kiválasztott szöveg"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kurzor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Lejátszólista színek"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Színek"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Proxy szerver engedélyezése"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Proxy szerver cím:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Proxy szerver port:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Proxy típusa:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Proxy felhasználónév:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Proxy jelszó:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Hálózat"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "Verzió:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
-msgstr "Szerzői jog"
+msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Bővítmények"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
-msgstr "Csoport"
-
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
+msgstr "Csoportosítás"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
+msgid "Sort by ..."
+msgstr "Rendezés"
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formátum"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "Növekvő"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "Csökkenő"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Választás"
+msgstr "DSP beépülő kiválasztása"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr "Bővítmények"
+msgstr "Beépülő"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr "Címke író"
+msgstr "Címkeíró beállításai"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 írása"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 írása"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 írása"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 vágása"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 vágása"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 vágása"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 verzió"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Ajánlott)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v2 karakter kódolás (alapértelmezés iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 írása"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Előadó / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Sáv száma"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Fájlok törlése a lemezről"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -931,49 +963,48 @@ msgstr ""
"A fájlok el fognak veszni. Folytatja?\n"
"(Ez a párbeszédablak kikapcsolható a GTKUI bővítmény beállításaiban)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Figyelemeztetés"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Hozzáadás a lejátszási sorhoz"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Törlés a lejátszási sorból"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Metaadat újratöltése"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Törlés a lemezről"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Oszlop hozzáadása"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Oszlop szerkesztése"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Öszlop törlése"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Csoport"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nincs"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Előadó/Dátum/Album"
@@ -981,28 +1012,32 @@ msgstr "Előadó/Dátum/Album"
msgid "Open file..."
msgstr "Fájl megnyitása..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, fuzzy, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
-msgstr "Beállítás"
+msgstr "%s beállítása"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "Alapértelmezett Audio Eszköz"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Hozzáadés"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globális billentyű kombinációk"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
msgstr "Hely"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Billentyű kombináció"
@@ -1014,139 +1049,144 @@ msgstr "Fájlok hzzáadása..."
msgid "Initializing..."
msgstr "Inicializálás..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Már módosított adatokat ezen a számon."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Valóban bezárja az ablakot?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Billentyű"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Érték"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "Címkék írása..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "Név:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "A szövegmezők tartalma nem kezdődhet kettősponttal vagy aláhúzásjellel"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "Mező hozzáadása sikertelen"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
+"Egy azonos névvel rendelkező mező már létezik, adj meg egy másik nevet."
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Valóban bezárja az ablakot?"
-
-#: ../plugins/gtkui/trkproperties.c:734
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr "Fájl(ok) hozzáadása"
+msgstr "Mező hozzáadása"
-#: ../plugins/gtkui/trkproperties.c:737
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr "Eltávolítás"
+msgstr "Mező eltávolítása"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Használat: deadbeef [opciók] [fájl(ok)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opciók:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help vagy -h Súgó megjelenítése (ez az üzenet) és kilépt\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Kilépés a lejátszóból\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Verzió információ megjelenítése és kilépés\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Lejátszás indítása\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Lejátszás megállítása\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Lejátszás szüneteltetése\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause Lejátszás/Szüneteltetés\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
+" --play-pause Lejátszás indítása, lejátszás közben szüneteltetés\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Ugrás a következő számra a lejátszólistában\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Ugrás az előző számra a lejátszólistában\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Véletlenszerű szám a lejátszólistáról\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Fájl(ok) hozzáadása a létező lejátszólistához\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Szám nevének formázott kiírása az stdout-ra\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1157,7 +1197,7 @@ msgstr ""
" [l]hossz, [n]sávszáma, [y]év, [c]megjegyzés,\n"
" copy[r]ight, [e]ltelt idő\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1166,51 +1206,28 @@ msgstr ""
" pl.: --nowplaying \"%%a - %%t\" kiírása kerül \"előadó "
"- cím\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+" további információ: http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Alapértelmezett"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Igen"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nem"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Ajánlott)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Letiltás\n"
-"Sáv\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
-#, fuzzy
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1226,7 +1243,7 @@ msgid ""
msgstr ""
"Elem Index\n"
"Lejátszás\n"
-"Album borító\n"
+"Albumborító\n"
"Előadó - Album\n"
"Előadó\n"
"Album\n"
@@ -1236,7 +1253,7 @@ msgstr ""
"Zenekar / Album Előadó\n"
"Egyéb"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1244,13 +1261,40 @@ msgstr ""
"Balra\n"
"Jobbra"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Letiltás\n"
+"Sáv\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Növekvő\n"
+"Csökkenő"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Ajánlott)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Nem található a képfájl: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1263,7 +1307,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Audio CD hozzádása"
#: ../translation/extra.c:4
@@ -1279,7 +1324,7 @@ msgstr "ALSA újramintavételezés használata"
msgid "Release device while stopped"
msgstr "Eszköz felszabadítása amíg megállított a lejátszás"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Preferált puffer méret"
@@ -1308,488 +1353,807 @@ msgstr "Jelszó"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "OSS4 mintavételezési ráta bug megoldása"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Átmeneti tár frissítési periódus (óra)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Beágyazott címkék olvasása"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Olvasás helyi könyvtárból"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Helyi borító fájl maszk"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Olvasás a last.fm-ről"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Olvasás az albumart.org-ról"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB használata"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Előnyben részesíti a CD-Text olvasást a CDDB szerverről"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (pl. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB port száma (pl. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "CDDB protokoll HTTP felett előnyben részesítése"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "NRG képfájl támogatás engedélyezése"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Újramintavételezés minősége (0..2, a nagyobb a jobb)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maximális szám hossz (percben)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Maximális szám hossz (percben)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Fájlok lemezről való törlésekor megerősítést kér"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Az állapot ikon hangerőszabályzóként viselkedik"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Egyedi státuszikon"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "gtk_init futtatása --sync kapcsolóval (hibakereső mód)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
-#, fuzzy
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr "Értesítési formátum"
+msgstr "Értesítés címének formátuma"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
#, fuzzy
msgid "Notification content format"
msgstr "Értesítési formátum"
-#: ../translation/extra.c:47
-#, fuzzy
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr "Album kép"
+msgstr "Albumborító mutatása"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Albumborító mérete (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio szerver"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Mintavétel"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relatív keresési útvonal"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Abszolút keresési útvonal"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Audio bájtok cseréje (váltás ha minden amit hallasz statikus)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
#, fuzzy
msgid "Enable HVSC Songlength DB"
msgstr "HVSC engedélyezése"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlengths.txt (HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Bitek száma mintánként (8 / 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
#, fuzzy
msgid "Default song length (sec)"
msgstr "Maximális szám hossz (percben)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ bank konfigurációs állomány"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Sáv címe"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Előadó"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Összes sáv"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Műfaj"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Zeneszerző"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Lemez száma"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Megjegyzés"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Kódoló / Eladó"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Hely"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Alsáv Index"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Címke típus(ok)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Beépített Cue támogatás"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Fájlkiterjesztések (elválasztó jel: ;)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Átalakítás"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
-#, fuzzy
+#: ../translation/extra.c:93
msgid "Target Samplerate"
-msgstr "Mintavétel"
+msgstr "Cél mintavételezési rátája"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
-msgstr ""
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "Minőség / Algoritmus"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "Automatikus mintavételezi ráta (minden beállítást felülír)"
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../plugins/converter/convgui.c:108
-msgid "The file already exists. Overwrite?"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../plugins/converter/convgui.c:110
-msgid "Converter warning"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Scrobbler engedélyezése"
+
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr "Azonos nevű fájl már létezik. Felülírjam?"
+
+#: ../plugins/converter/convgui.c:119
+msgid "Converter warning"
+msgstr "Konvertálási figyelmeztetés"
+
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "Kérlek, válassz egy enkódert"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Konvertálási hiba"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Konvertálás..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "Mind kiválaszt"
+msgstr "Mappa kiválasztása..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Hiba"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Új enkóder hozzáadása"
-#: ../plugins/converter/convgui.c:724
-#, fuzzy
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr "Oszlop szerkesztése"
+msgstr "Enkóder szerkesztése"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "Hangszín mentés"
+msgstr "Mentett hangszín törlése"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Hangszín mentés"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Hangszín mentés"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Hangszín mentés"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Kimeneti eszköz:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Kimeneti bővítmény:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Hangszín mentés"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Felülírás"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Hangszín betöltés"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Kimeneti bővítmény:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "APEv2 írása"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "ID3v1 írása"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "ID3v2 írása"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Címke író"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Felülírás"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "Sz_erkesztés"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Bezár"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Oszlop szerkesztése"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Megjegyzés"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Számok keverése"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Összes sáv"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Hely"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Eltávolítás"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Új lejátszólista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Megjegyzés"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Oszlop hozzáadása"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Beállítás"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Beállítások"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Felhasználói felület"
+
+#~ msgid "Slot"
+#~ msgstr "Hely"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Valóban eltávolítja a kiválasztott mezőt?"
+
#~ msgid "Save playlist as"
#~ msgstr "Lejátszólista mentése másként"
diff --git a/po/id.po b/po/id.po
index d7dc6964..98adbb4f 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,9 +7,9 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-03-14 10:56+0200\n"
-"Last-Translator: Rahman Yusri Aftian <aftian@yahoo.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-04-09 20:54+0200\n"
+"Last-Translator: andika <andika@gmail.com>\n"
"Language-Team: Indonesian Translation Team <id@li.org>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
@@ -23,9 +23,8 @@ msgid "Supported sound formats"
msgstr "Format suara yang didukung"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Berkas lain (*)"
+msgstr "Semua berkas (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -55,9 +54,9 @@ msgstr "Gagal memuat berkas bantuan"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Bantuan"
@@ -71,906 +70,941 @@ msgstr "Tentang DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "ChangeLog DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
-msgstr ""
+msgstr "Penerjemah DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Sunting daftar putar"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Judul:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Ubah Nama Daftar Putar"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Hapus Daftar Putar"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Tambah Daftar Putar Baru"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Simpan Preset EQ DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ preset files (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Memuat DeaDBeeF EQ Preset..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ presets (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Impor Foobar2000 EQ Preset..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ presets (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Simpan Preset"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Memuat Preset"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Impor Foobar2000 Preset"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Aktifkan"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nolkan Semua"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Nolkan Preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Zero Bands"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Simpan Preset"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 hari %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d hari %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Berhenti | %d trek | %s waktu putar total"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Jeda | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d trek | %s waktu putar total"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Simpan Daftar Putar Sebagai"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF playlist files (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Muat Daftar Putar"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Berkas lain (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Daftar Putar Baru"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Daftar Putar Baru (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Berkas"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Buka berkas"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Tambah berkas"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Tambah folder"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Tambah lokasi"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Daftar putar baru"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Muat daftar putar"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Simpan daftar putar"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Keluar"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Sunting"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Bersihkan"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Pilih semua"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Pilih tak satupun"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Balik pilihan"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Pilihan"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Buang"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Crop"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Cari"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Urut Berdasarkan"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Judul"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr "Nomor berkas"
+msgstr "Nomor trek"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artis"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "Tanggal"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Acak"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Ubahan"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferensi"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Tilik"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Bilah status"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Header kolom"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Tab"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Putar"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Urutan"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linier"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Kocok"
+msgstr "Acak trek"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Kocok"
-
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Acak"
+msgstr "Acak album"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Perulangan"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Ulang Semua"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Ulang Satu Lagu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Tidak ulang"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Gulir berikut pemutaran"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Kursor berikut pemutaran"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Berhenti setelah ini"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "Ba_ntuan"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "Tent_ang"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Cari"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Berhenti"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Putar"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Jeda"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Sebelumnya"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Selanjutnya"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Putar Acak"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Tentang"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Keluar"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Properti Trek"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "Ter_apkan"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Tutup"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Properti"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Masukkan judul kolom baru disini"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Jenis:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Memutar"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album Seni"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artis - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Durasi"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "No Trek"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Band / Artis Album"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Perataan:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Kiri"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Kanan"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Batal"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Keluaran plugin:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Perangkat keluaran:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Suara"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Matikan"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Trek"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Berhenti setelah ini"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
#, fuzzy
msgid "Playback"
msgstr "_Putar"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
#, fuzzy
msgid "Configure"
msgstr "Konfigurasi"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Simpan Preset"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Latar depan"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Latar belakang"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Tengah"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Terang"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Gelap"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Basis"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Teks"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Baris genap"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Baris ganjil"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Baris yang dipilih"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Teks yang dipilih"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Warna daftar putar"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Aktifkan Server Proksi"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Alamat Server Proksi:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port Server Proksi:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Jenis Proksi:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nama Pengguna Proksi:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Sandi Proksi:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Jaringan"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
#, fuzzy
msgid "Plugins"
msgstr "Pengaya"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Kelompokkan Berdasarkan"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Urut Berdasarkan"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Pilihan"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Pengaya"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Tulis ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Tulis ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Tulis APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versi ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Tulis ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artis / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "No Trek"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Hapus berkas dari disk"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Peringatan"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Tambahkan ke antrian daftar putar"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Hapus dari antrian putar"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Muat ulang metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Hapus dari disk"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Tambah kolom"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Sunting kolom"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Hapus kolom"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Kelompokkan berdasarkan"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Tak ada"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artis/Tanggal/Album"
@@ -978,7 +1012,7 @@ msgstr "Artis/Tanggal/Album"
msgid "Open file..."
msgstr "Buka berkas..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Konfigurasi"
@@ -987,20 +1021,24 @@ msgstr "Konfigurasi"
msgid "Default Audio Device"
msgstr "Perangkat Suara Bawaan"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Tambah"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
#, fuzzy
msgid "Global Hotkeys"
msgstr "Tombol Global"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Tambah lokasi"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kombinasi kunci"
@@ -1012,139 +1050,145 @@ msgstr "Menambah berkas..."
msgid "Initializing..."
msgstr "Menginisialisasi..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Kunci"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Nilai"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Tambah berkas"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Buang"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Cara pakai: deadbeef [opsi] [berkas]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opsi:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Cetak bantuan (pesan ini) dan keluar\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Keluar dari pemutar\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Cetak info versi dan keluar\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Mulai memutar\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Berhenti memutar\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Jeda memutar\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Lagu selanjutnya di daftar putar\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Lagu sebelumnya di daftar putar\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Acak lagu di daftar main\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Tambahkan berkas ke daftar putar yang telah ada\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1152,54 +1196,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Bawaan"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ya"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Tidak"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Disarankan)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1214,7 +1237,7 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1222,13 +1245,35 @@ msgstr ""
"Kiri\n"
"Kanan"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Disarankan)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1238,7 +1283,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Tambahkan CD Audio"
#: ../translation/extra.c:4
@@ -1254,7 +1300,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1286,485 +1332,802 @@ msgstr "Sandi Proksi:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Hapus berkas dari disk"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Album Seni"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "No Trek"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Nomor berkas"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Tambah lokasi"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Aktifkan Server Proksi"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Pilih semua"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Sunting kolom"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Simpan Preset"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Simpan Preset"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Simpan Preset"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Simpan Preset"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Perangkat keluaran:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Keluaran plugin:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Simpan Preset"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Memuat Preset"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Keluaran plugin:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Tulis APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Tulis ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Tulis ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Sunting"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Tutup"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Sunting kolom"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Acak trek"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Acak trek"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Tambah lokasi"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Buang"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Daftar Putar Baru"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Tambah kolom"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Konfigurasi"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
#~ msgid "Save playlist as"
#~ msgstr "Simpan daftar putar sebagai"
diff --git a/po/it.po b/po/it.po
index a855b584..abb8e567 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DeadBeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-03-09 17:43+0200\n"
"Last-Translator: Alessandro <alex@amiran.it>\n"
"Language-Team: Italian\n"
@@ -57,9 +57,9 @@ msgstr "Fallito il caricamento del file di aiuto"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Aiuto"
@@ -73,857 +73,894 @@ msgstr "A proposito di DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeadBeeF %s Changelog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, fuzzy, c-format
msgid "DeaDBeeF Translators"
msgstr "DeadBeeF sta riproducendo"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Modifica playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titolo:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Rinonima playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Rimuovi playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Aggiungi nuova playlist"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Salva parametri predefiniti equalizzatore DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeadBeeF EQ preset files (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Carica DeaDBeeF EQ Preset..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeadBeeF EQ presets (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importa Foobar2000 EQ Preset"
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ presets (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Salva preset"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Carica preset"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importa Foobar2000 Preset"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Abilita"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Tutto a zero"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Pre-ampl a zero"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Bande a zero"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Salva preset"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 giorno %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d giorni %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Stop | %d tracce | %s tempo totale"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausa |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracce | %s tempo totale"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Salva playlist come"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeadBeeF playlist files (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Carica Playlist"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Altri files (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nuova playlist"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nuova Playlist (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_File"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Apri file"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Aggiungi file"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Aggiungi cartella/e"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Aggiungi locazione"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nuova playlist"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Carica playlist"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Salva playlist"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Esci"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Modifica"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Pulisci"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Seleziona tutto"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Deseleziona tutto"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverti selezione"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selezione"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Rimuovi"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Raccolte"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Cerca"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titolo"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "File numero"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artista"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Casuale"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizza"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferenze"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Visualizza"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra di stato"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Colonna intestazione"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Schede"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizzatore"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Riproduzione"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordina"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineare"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Mescolato"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Mescolato"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Casuale"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Looping"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Loop tutte"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Loop singola canzone"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Non fare il Loop"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Scorri seguente riproduzione"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "La selezione segue la riproduzione"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stop finita la canzone"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Aiuto"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Changelog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_About"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Cerca"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Riproduci"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pausa"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Precedente"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Prossima"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Riproduzione casuale"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "About"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Esci"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Proprietà traccia"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Applica"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Chiudi"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Proprietà"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Inserisci nuovo titolo colonna qui"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Riproduzione"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Album Art"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artista - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Durata"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "Traccia N°"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Band / Album Artista"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Allineamento:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Sinistra"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Destra"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "A_nnulla"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Plugin d'uscita:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositivo d'uscita:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Suono"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Modalità ripetizione:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Disabilita"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Traccia"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Modalità di ReplayGain (volume regolabile)"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "Modalità ripetizione:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Aggiungi files da linea di comando (o file manager) a questa playlist:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Riprendi sessione precedente all'avvio"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stop finita la canzone"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Riproduzione"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configura"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Salva preset"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Chiudi minimizza nel vassoio di sistema"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Il pulsante centrale del mouse chiude la playlist"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Nasconde l'icona nel vassoio di sistema"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Usa il grassetto per la canzone in riproduzione"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Nascondi \"Cancella dal disco\" dal menù contestuale"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Testo della titlebar mentre riproduce:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Testo della titlebar quando fermata:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Sovrascrivere"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Primo piano"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Di fondo"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Colori della Seekbar/Barra del volume"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Centrale"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Chiaro"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Scuro"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Testo"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Colore delle schede"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Sovrascrivi (perdita del tema GTK ma rendering più veloce)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Righe pari"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Righe dispari"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Riga selezionata"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Testo selezionato"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursore"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Colori della playlist"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Colori"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Abilita il server proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Indirizzo del server proxy:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Porta del server proxy:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tipo proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nome utente del proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Password del proxy"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Rete"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Raggruppamento"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Selezione"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Scrivi etichetta"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Scrivi ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Scrivi ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Scrivi APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Strip ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Strip ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Strip APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versione ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (raccomandato)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 codifica caratteri (predefinito iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Scrivi ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artista / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Traccia N°"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Cancella files dal disco"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -931,49 +968,48 @@ msgstr ""
"I files andranno persi. Procedere?\n"
" (Questo dialogo può essere spento in Opzioni plugin --> GTKUI"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Attenzione"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Aggiungi alla coda di riproduzione"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Rimuovi dalla coda di riproduzione"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Ricarica metadati"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Rimuovi dal disco"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Aggiungi colonna"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Modifica colonna"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Rimuovi colonna"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Raggruppamento"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nessuno"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artista/Data/Album"
@@ -981,7 +1017,7 @@ msgstr "Artista/Data/Album"
msgid "Open file..."
msgstr "Apri file..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Configura"
@@ -990,19 +1026,23 @@ msgstr "Configura"
msgid "Default Audio Device"
msgstr "Dispositivo audio predefinito"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Aggiungi"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Scorciatoie da tastiera globali"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Aggiungi locazione"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinazioni di tasti"
@@ -1014,140 +1054,145 @@ msgstr "Sto aggiungendo i files..."
msgid "Initializing..."
msgstr "Inizializzazione..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Hai modificato i dati per questa traccia."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Vuoi davvero chiudere la finestra?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Tasti"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valore"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Vuoi davvero chiudere la finestra?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Aggiungi file"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Rimuovi"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Uso: deadbeef [opzioni] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opzioni:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Stampa l'aiuto ed esce\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Esce dal player\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Stampa la versione ed esce\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Inizia la riproduzione\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Ferma la riproduzione\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausa nella riproduzione\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Canzone successiva nella playlist\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Canzone precedente nella playlist\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Canzone casuale nella playlist\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Aggiunge file(s) ad una playlist esistente\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Stampa il nome della traccia formattato in stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1158,7 +1203,7 @@ msgstr ""
" [l]unghezza, traccia[n]umero, [y]anno, [c]ommento,\n"
" copy[r]ight, [e]trascorso\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1167,50 +1212,26 @@ msgstr ""
" es: --nowplaying \"%%a - %%t\" dovrebbe stampare "
"\"artista - titolo\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Predefinito"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Sì"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "No"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (raccomandato)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Disabilita\n"
-"Traccia\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1237,7 +1258,7 @@ msgstr ""
"Band / Album Artista\n"
"Personalizzato"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1245,13 +1266,38 @@ msgstr ""
"Sinistra\n"
"Destra"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Disabilita\n"
+"Traccia\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (raccomandato)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "File pixmap non trovato: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1264,7 +1310,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Aggiungi Audio CD"
#: ../translation/extra.c:4
@@ -1281,7 +1328,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Testo della titlebar quando fermata:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1314,488 +1361,810 @@ msgstr "Password del proxy"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Cancella files dal disco"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Album Art"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Traccia N°"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Titolo / Traccia Artista"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "File numero"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Aggiungi locazione"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tipo(i) di etichetta(e)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Cuesheet incorporato"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Abilita il server proxy"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Seleziona tutto"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Modifica colonna"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Salva preset"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Salva preset"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Salva preset"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Salva preset"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Dispositivo d'uscita:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Plugin d'uscita:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Salva preset"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Sovrascrivere"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Carica preset"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Plugin d'uscita:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Scrivi APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Scrivi ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Scrivi ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Scrivi etichetta"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Sovrascrivere"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Modifica"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Chiudi"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Modifica colonna"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Mescolato"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Titolo / Traccia Artista"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Aggiungi locazione"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Rimuovi"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nuova playlist"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Aggiungi colonna"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configura"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Vuoi davvero chiudere la finestra?"
+
#~ msgid "Save playlist as"
#~ msgstr "Salva playlist come"
diff --git a/po/ja.po b/po/ja.po
index e2fa2af3..348f47a1 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef devel\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-06-29 17:37+0900\n"
"Last-Translator: Hironao Komatsu <hironao@users.sourceforge.net>\n"
"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -22,9 +22,9 @@ msgstr ""
msgid "Supported sound formats"
msgstr "サポートされている音声フォーマット"
-#, fuzzy
-#~ msgid "All files (*)"
-#~ msgstr "他のファイル (*)"
+#: ../plugins/gtkui/callbacks.c:134
+msgid "All files (*)"
+msgstr "すべてのファイル (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -38,8 +38,9 @@ msgstr "ファイルをプレイリストに追加..."
msgid "Add folder(s) to playlist..."
msgstr "フォルダをプレイリストに追加..."
-#~ msgid "Follow symlinks"
-#~ msgstr ""
+#: ../plugins/gtkui/callbacks.c:225
+msgid "Follow symlinks"
+msgstr "Symlink を追跡する"
#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
@@ -49,12 +50,13 @@ msgstr "ヘルプファイルの読み込み中に失敗しました"
msgid "Failed to load help file"
msgstr "ヘルプファイルの読み込みに失敗しました"
-#~ msgid "help.txt"
-#~ msgstr ""
+#: ../plugins/gtkui/callbacks.c:736
+msgid "help.txt"
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "ヘルプ"
@@ -68,810 +70,887 @@ msgstr "DeaDBeeF %s について"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s の更新履歴"
-#, fuzzy, c-format
-#~ msgid "DeaDBeeF Translators"
-#~ msgstr "DeaDBeeF は現在演奏中です"
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
+msgid "DeaDBeeF Translators"
+msgstr "DeaDBeeF の翻訳者"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "プレイリストの編集"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "タイトル:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "プレイリストの名前変更"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "プレイリストの削除"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "プレイリストの新規追加"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF イコライザ設定の保存"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF イコライザ設定 (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF イコライザ設定を読み込む..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF イコライザ設定 (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 イコライザ設定をインポート..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 イコライザ設定 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "イコライザ設定を保存"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "イコライザ設定の読み込み"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 イコライザ設定をインポート"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "有効にする"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "すべてゼロに"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "プリアンプをゼロに"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "バンドをゼロに"
-#, fuzzy
-#~ msgid "Presets"
-#~ msgstr "イコライザ設定を保存"
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
+msgid "Presets"
+msgstr "プリセット"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 日 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d 日 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "停止 | %d トラック | %s 合計演奏時間"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "ポーズ | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d トラック | %s 合計演奏時間"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "名前をつけてプレイリストを保存"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF プレイリストファイル (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "プレイリストをロード"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "他のファイル (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "新規プレイリスト"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "新規プレイリスト (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "ファイル(_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "ファイルを開く(_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "ファイルを追加"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "フォルダを追加"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "場所を追加"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "新規プレイリスト"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "プレイリストをロード"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "プレイリストを保存"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "終了(_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "編集(_E)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "クリア(_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "すべて選択"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "すべて選択解除"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "選択の反転"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "選択"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "取り除く"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "選択以外を取り除く"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "検索(_F)"
-#~ msgid "Sort By"
-#~ msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "ソートする:"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "タイトル"
-#, fuzzy
-#~ msgid "Track number"
-#~ msgstr "ファイル番号"
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
+msgid "Track number"
+msgstr "トラック番号"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "アルバム"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "アーティスト"
-#~ msgid "Date"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
+msgid "Date"
+msgstr "日付"
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "ランダム"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "カスタム"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "設定"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "表示(_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "ステータスバー"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "カラムのヘッダ"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "タブ"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "イコライザ"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "再生(_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "演奏順"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "順に"
-#, fuzzy
-#~ msgid "Shuffle tracks"
-#~ msgstr "シャッフル"
-
-#, fuzzy
-#~ msgid "Shuffle albums"
-#~ msgstr "シャッフル"
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
+msgid "Shuffle tracks"
+msgstr "トラックをシャッフル"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "ランダム"
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
+msgid "Shuffle albums"
+msgstr "アルバムをシャッフル"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "ループ"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "全体をループ"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "一つの曲をループ"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "ループしない"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "再生に従ってスクロール"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "再生に従ってカーソルを移動"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "現在の再生の終了後に停止"
-#~ msgid "Jump to current track"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
+msgid "Jump to current track"
+msgstr "現在のトラックへ飛ぶ"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "ヘルプ(_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "更新履歴(_C)"
-#~ msgid "_GPLv2"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
+msgid "_GPLv2"
+msgstr "_GPLv2"
-#~ msgid "_LGPLv2.1"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
+msgid "_LGPLv2.1"
+msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "情報(_A)"
-#, fuzzy
-#~ msgid "_Translators"
-#~ msgstr "DeaDBeeF は現在演奏中です"
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
+msgid "_Translators"
+msgstr "翻訳者(_T)"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "検索"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "停止"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "再生"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "ポーズ"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "前へ"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "次へ"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "ランダムに再生"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "情報"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "終了"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "トラックのプロパティ"
-#~ msgid "Settings"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
+msgid "Settings"
+msgstr "設定"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "適用(_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "閉じる(_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "メタデータ"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "プロパティ"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "新規カラムのタイトルをここに入力します"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "形式:"
-#~ msgid "Item Index"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1513
+msgid "Item Index"
+msgstr "アイテムのインデックス"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "再生"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "アルバムアート"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "アーティスト - アルバム"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "演奏時間"
-#, fuzzy
-#~ msgid "Track Number"
-#~ msgstr "トラック番号"
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
+msgid "Track Number"
+msgstr "トラック番号"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "バンド / アルバムのアーティスト"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "書式:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "配置:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "左"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "右"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "キャンセル(_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "OK(_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "出力プラグイン:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "出力デバイス:"
-#~ msgid "Always convert 8 bit audio to 16 bit"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
+msgid "Always convert 8 bit audio to 16 bit"
+msgstr "常に 8 bit オーディオを 16 bit に変換する"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "音声"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "リプレイゲインのモード:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "無効"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "トラック"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "リプレイゲインのピークを調整する"
-#~ msgid "-12 dB"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
+msgid "-12 dB"
+msgstr "-12 dB"
-#~ msgid "+12 dB"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
+msgid "+12 dB"
+msgstr "+12 dB"
-#, fuzzy
-#~ msgid "Replaygain preamp:"
-#~ msgstr "リプレイゲインのモード:"
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
+msgid "Replaygain preamp:"
+msgstr "リプレイゲインのプリアンプ:"
-#, fuzzy
-#~ msgid "Global preamp:"
-#~ msgstr "リプレイゲインのモード:"
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
+msgid "Global preamp:"
+msgstr "全体のプリアンプ:"
-#~ msgid "Add files from command line (or file manager) to this playlist:"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
+msgid "Add files from command line (or file manager) to this playlist:"
+msgstr ""
+"コマンドライン (あるいはファイルマネージャ) からこのプレイリストにファイルを"
+"追加"
-#~ msgid "Resume previous session on startup"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
+msgid "Resume previous session on startup"
+msgstr "立ち上げ時に前回のセッションを復元する"
-#~ msgid "Don't add from archives when adding folders"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
+msgid "Don't add from archives when adding folders"
+msgstr "フォルダを追加するときアーカイブを含まない"
-#, fuzzy
-#~ msgid "Playback"
-#~ msgstr "再生(_P)"
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr "現在の再生の終了後にリセット"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
+msgid "Playback"
+msgstr "再生"
+
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "設定"
-#, fuzzy
-#~ msgid "DSP Chain Preset"
-#~ msgstr "イコライザ設定を保存"
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
+msgid "DSP Chain Preset"
+msgstr "DSP チェインプリセット"
-#~ msgid "_Load"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
+msgid "_Load"
+msgstr "ロード(_L)"
-#~ msgid "DSP"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
+msgid "DSP"
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "ウィンドウを閉じたときシステムトレイに格納"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "マウスの中クリックでプレイリストを閉じる"
-#~ msgid "Hide system tray icon"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
+msgid "Hide system tray icon"
+msgstr "システムトレイのアイコンを隠す"
-#~ msgid "Use bold font for currently playing track"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
+msgid "Use bold font for currently playing track"
+msgstr "再生中のトラックには太字フォントを使う"
-#~ msgid "Hide \"Delete from disk\" context menu item"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
+msgid "Hide \"Delete from disk\" context menu item"
+msgstr "コンテキストメニューの \"ディスクから削除\" を隠す"
-#~ msgid "Auto-name playlists when adding a single folder"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
+msgid "Auto-name playlists when adding a single folder"
+msgstr "一つのフォルダから追加するときはプレイリストの名前を自動でつける"
-#~ msgid "Interface refresh rate (times per second):"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
-#~ msgid "Titlebar text while playing:"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
-#~ msgid "Titlebar text while stopped:"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "インタフェースの更新頻度 (毎秒):"
-#~ msgid "GUI Plugin (changing requires restart):"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
+msgid "Titlebar text while playing:"
+msgstr "再生中のタイトルバーの文字列:"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
+msgid "Titlebar text while stopped:"
+msgstr "停止中の文字列:"
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
+msgid "GUI Plugin (changing requires restart):"
+msgstr "GUI プラグイン (再スタートが必要です):"
+
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "デフォルトを上書きする"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "前景色"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "背景色"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "シークバーと音量バーの色"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "中間色"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "明色"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "暗色"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "基底色"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "文字色"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "タブの色"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"デフォルトを上書きする (GTKテーマが不適用になりますが描画が高速化します)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "偶数行"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "奇数行"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "選択の行"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "選択の文字色"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "カーソル"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "プレイリストの色"
-#~ msgid "Colors"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
+msgid "Colors"
+msgstr "色"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "プロクシサーバを有効にする"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "プロクシサーバのアドレス:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "プロクシサーバのポート番号:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "プロクシの形式:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "プロクシのユーザ名:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "プロクシのパスワード:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "ネットワーク"
-#~ msgid "Version: "
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
+msgid "Version: "
+msgstr "バージョン:"
-#~ msgid "Copyright"
-#~ msgstr ""
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
+msgid "Copyright"
+msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "プラグイン"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
-msgstr "グループ化"
-
-#~ msgid "Sort by..."
-#~ msgstr ""
-
-#, fuzzy
-#~ msgid "Format"
-#~ msgstr "書式:"
-
-#~ msgid "Ascending"
-#~ msgstr ""
-
-#~ msgid "Descending"
-#~ msgstr ""
-
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
#, fuzzy
-#~ msgid "Select DSP Plugin"
-#~ msgstr "選択"
+msgid "Group By ..."
+msgstr "グループ化"
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
-#~ msgid "Plugin"
-#~ msgstr "プラグイン"
+msgid "Sort by ..."
+msgstr "ソート"
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
+msgid "Format"
+msgstr "書式"
+
+#: ../plugins/gtkui/interface.c:3366
+msgid "Ascending"
+msgstr "昇順"
+
+#: ../plugins/gtkui/interface.c:3367
+msgid "Descending"
+msgstr "降順"
+
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
+msgid "Select DSP Plugin"
+msgstr "DSP プラグインの選択"
+
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
+msgid "Plugin"
+msgstr "プラグイン"
-#, fuzzy
-#~ msgid "Tag Writer Settings"
-#~ msgstr "タグ書き出し"
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
+msgid "Tag Writer Settings"
+msgstr "タグ書き出しの設定"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 の書き出し"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 の書き出し"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 の書き出し"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 の除去"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 の除去"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 の除去"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 のバージョン"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (推奨)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 の文字エンコーディング (デフォルトは iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 の書き出し"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "アーティスト / アルバム"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "トラック番号"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "ファイルをディスクから削除"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -879,49 +958,48 @@ msgstr ""
"ファイルは失われます。続けますか?\n"
"(このダイアログは GTKUI プラグインの設定で無効にできます)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "警告"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "再生キューへ追加"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "再生キューから削除"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "メタデータを再読み込み"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "ディスクから削除"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "カラムの追加"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "カラムの編集"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "カラムの削除"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "グループ化"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "なし"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "アーティスト/日付/アルバム"
@@ -929,27 +1007,32 @@ msgstr "アーティスト/日付/アルバム"
msgid "Open file..."
msgstr "ファイルを開く..."
-#, fuzzy, c-format
-#~ msgid "Configure %s"
-#~ msgstr "設定"
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
+msgid "Configure %s"
+msgstr "%s の設定"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "デフォルトの音声デバイス"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "追加"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "グローバルホットキー"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "スロット"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "場所"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "キーの組み合わせ"
@@ -961,128 +1044,144 @@ msgstr "ファイルの追加..."
msgid "Initializing..."
msgstr "初期化中..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "あなたはこのトラックのデータを変更しました。"
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "本当にウィンドウを閉じますか?"
-#~ msgid "[Multiple values] "
-#~ msgstr ""
+#. get value to edit
+#: ../plugins/gtkui/trkproperties.c:272
+msgid "[Multiple values] "
+msgstr "[複数の値] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "キー"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "値"
-#~ msgid "Writing tags..."
-#~ msgstr ""
+#: ../plugins/gtkui/trkproperties.c:623
+msgid "Writing tags..."
+msgstr "タグの書き出し中..."
-#~ msgid "Name:"
-#~ msgstr ""
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
-#~ msgid "Field names must not start with : or _"
-#~ msgstr ""
+#: ../plugins/gtkui/trkproperties.c:654
+msgid "Name:"
+msgstr "名前:"
-#, fuzzy
-#~ msgid "Cannot add field"
-#~ msgstr "ファイルを追加"
+#: ../plugins/gtkui/trkproperties.c:666
+msgid "Field names must not start with : or _"
+msgstr "フィールドは : や _ で始まることができません"
-#~ msgid "Field with such name already exists, please try different name."
-#~ msgstr ""
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
+msgid "Cannot add field"
+msgstr "フィールドを追加できません"
-#, fuzzy
-#~ msgid "Really remove selected field?"
-#~ msgstr "本当にウィンドウを閉じますか?"
+#: ../plugins/gtkui/trkproperties.c:705
+msgid "Field with such name already exists, please try different name."
+msgstr "同じ名前のフィールドがあります。別の名前で試してください。"
-#, fuzzy
-#~ msgid "Add field"
-#~ msgstr "ファイルを追加"
+#: ../plugins/gtkui/trkproperties.c:767
+msgid "Add field"
+msgstr "フィールドを追加"
-#, fuzzy
-#~ msgid "Remove field"
-#~ msgstr "取り除く"
+#: ../plugins/gtkui/trkproperties.c:770
+msgid "Remove field"
+msgstr "フィールドを削除"
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
-msgstr "使い方: deadbeef [オプション] [ファイル...]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
+msgstr "使い方: deadbeef [オプション] [--] [ファイル...]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "オプション:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h ヘルプ (このメッセージ) を表示して終了\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit プレイヤを終了する\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version バージョン情報を表示して終了\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play 再生を開始する\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop 再生を停止する\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause ポーズする\n"
+#: ../main.c:92
#, c-format
-#~ msgid " --toggle-pause Toggle pause\n"
-#~ msgstr ""
+msgid " --toggle-pause Toggle pause\n"
+msgstr " --toggle-pause ポーズのトグル\n"
+#: ../main.c:93
#, c-format
-#~ msgid ""
-#~ " --play-pause Start playback if stopped, toggle pause otherwise\n"
-#~ msgstr ""
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr " --play-pause 停止中なら再生開始し、でなければポーズします\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next プレイリストの次の曲へ\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev プレイリストの前の曲へ\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random プレイリストからランダムに選んだ曲へ\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue ファイルを既存のプレイリストに追加する\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+" --gui PLUGIN 使用する GUI プラグインを指定します。デフォルトは "
+"\"GTK2\"\n"
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying 書式 書式化されたトラック名を stdout に書き出します\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1094,7 +1193,7 @@ msgstr ""
" 長さ[l], トラック番号[n], 年[y], コメント[c],\n"
" 著作権[r], 経過時間[e]\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1103,38 +1202,62 @@ msgstr ""
" 例: --nowplaying \"%%a - %%t\" は \"アーティスト - タイ"
"トル\" と表示します\n"
+#: ../main.c:104
#, c-format
-#~ msgid ""
-#~ " for more info, see http://sourceforge.net/apps/"
-#~ "mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#~ msgstr ""
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" 詳しくはこちら: http://sourceforge.net/apps/mediawiki/"
+"deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "デフォルト"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "はい"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "いいえ"
-#: ../plugins/gtkui/deadbeef.glade.h:3
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
-"2.3 (Recommended)\n"
-"2.4"
+"Item Index\n"
+"Playing\n"
+"Album Art\n"
+"Artist - Album\n"
+"Artist\n"
+"Album\n"
+"Title\n"
+"Duration\n"
+"Track Number\n"
+"Band / Album Artist\n"
+"Custom"
msgstr ""
-"2.3 (推奨)\n"
-"2.4"
+"アイテム番号\n"
+"演奏中\n"
+"アルバムアート\n"
+"アーティスト - アルバム\n"
+"アーティスト\n"
+"アルバム\n"
+"タイトル\n"
+"長さ\n"
+"トラック番号\n"
+"バンド / アルバムのアーティスト\n"
+"カスタム"
-#~ msgid ""
-#~ "Ascending\n"
-#~ "Descending"
-#~ msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:86
+msgid ""
+"Left\n"
+"Right"
+msgstr ""
+"左\n"
+"右"
-#: ../plugins/gtkui/deadbeef.glade.h:33
+#: ../plugins/gtkui/deadbeef.glade.h:93
msgid ""
"Disable\n"
"Track\n"
@@ -1144,462 +1267,884 @@ msgstr ""
"トラック\n"
"アルバム"
-#, fuzzy
-#~ msgid ""
-#~ "Item Index\n"
-#~ "Playing\n"
-#~ "Album Art\n"
-#~ "Artist - Album\n"
-#~ "Artist\n"
-#~ "Album\n"
-#~ "Title\n"
-#~ "Duration\n"
-#~ "Track Number\n"
-#~ "Band / Album Artist\n"
-#~ "Custom"
-#~ msgstr ""
-#~ "ファイル番号\n"
-#~ "演奏中\n"
-#~ "アルバムアート\n"
-#~ "アーティスト - アルバム\n"
-#~ "アーティスト\n"
-#~ "アルバム\n"
-#~ "タイトル\n"
-#~ "長さ\n"
-#~ "トラック\n"
-#~ "バンド / アルバムのアーティスト\n"
-#~ "カスタム"
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"昇順\n"
+"降順"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:168
msgid ""
-"Left\n"
-"Right"
+"2.3 (Recommended)\n"
+"2.4"
msgstr ""
-"左\n"
-"右"
+"2.3 (推奨)\n"
+"2.4"
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Pixmap ファイルが見つかりません: %s"
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
-#~ msgid ""
-#~ "wildmidi: freepats config file not found. Please install timidity-freepats "
-#~ "package, or specify path to freepats.cfg in the plugin settings."
-#~ msgstr ""
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+"wildmidi: freepats 設定ファイルが見つかりません。timidity-freepats パッケージ"
+"をインストールするか、freepats.cfg へのパスをプラグインの設定で指定してくださ"
+"い。"
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
-msgstr "音楽 CD を追加"
-
-#~ msgid "Lookup on Last.fm"
-#~ msgstr ""
-
-#~ msgid "Use ALSA resampling"
-#~ msgstr ""
-
-#~ msgid "Release device while stopped"
-#~ msgstr ""
-
-#~ msgid "Preferred buffer size"
-#~ msgstr ""
-
-#~ msgid "Preferred period size"
-#~ msgstr ""
-
-#, fuzzy
-#~ msgid "Enable scrobbler"
-#~ msgstr "プロクシサーバを有効にする"
-
#, fuzzy
-#~ msgid "Disable nowplaying"
-#~ msgstr "DeaDBeeF は現在演奏中です"
-
-#, fuzzy
-#~ msgid "Username"
-#~ msgstr "プロクシのユーザ名:"
-
-#, fuzzy
-#~ msgid "Password"
-#~ msgstr "プロクシのパスワード:"
-
-#~ msgid "Scrobble URL"
-#~ msgstr ""
+msgid "Add audio CD"
+msgstr "音楽 CD を追加"
-#, fuzzy
-#~ msgid "Device file"
-#~ msgstr "取り除く"
+#: ../translation/extra.c:4
+msgid "Lookup on Last.fm"
+msgstr "Last.fm で検索する"
-#~ msgid "OSS4 samplerate bug workaround"
-#~ msgstr ""
+#. ALSA output plugin
+#: ../translation/extra.c:6
+msgid "Use ALSA resampling"
+msgstr "ALSA のリサンプリングを使う"
-#~ msgid "Cache update period (hr)"
-#~ msgstr ""
+#: ../translation/extra.c:7
+msgid "Release device while stopped"
+msgstr "停止中はデバイスを開放する"
-#~ msgid "Fetch from embedded tags"
-#~ msgstr ""
+#: ../translation/extra.c:8 ../translation/extra.c:55
+msgid "Preferred buffer size"
+msgstr "バッファサイズの指定"
-#~ msgid "Fetch from local folder"
-#~ msgstr ""
+#: ../translation/extra.c:9
+msgid "Preferred period size"
+msgstr "区分サイズの指定"
-#~ msgid "Local cover file mask"
-#~ msgstr ""
+#. Last.fm plugin
+#: ../translation/extra.c:11
+msgid "Enable scrobbler"
+msgstr "Scrobber を有効にする"
-#~ msgid "Fetch from last.fm"
-#~ msgstr ""
+#: ../translation/extra.c:12
+msgid "Disable nowplaying"
+msgstr "Nowplaying を無効にする"
-#~ msgid "Fetch from albumart.org"
-#~ msgstr ""
+#: ../translation/extra.c:13
+msgid "Username"
+msgstr "ユーザ名:"
-#~ msgid "Scale artwork towards longer side"
-#~ msgstr ""
+#: ../translation/extra.c:14
+msgid "Password"
+msgstr "パスワード:"
-#~ msgid "Use CDDB/FreeDB"
-#~ msgstr ""
+#: ../translation/extra.c:15
+msgid "Scrobble URL"
+msgstr "Scrobble URL"
-#~ msgid "Prefer CD-Text over CDDB"
-#~ msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
-#~ msgid "CDDB url (e.g. 'freedb.org')"
-#~ msgstr ""
+#. OSS output plugin
+#: ../translation/extra.c:18
+msgid "Device file"
+msgstr "デバイスファイル"
-#~ msgid "CDDB port number (e.g. '888')"
-#~ msgstr ""
+#: ../translation/extra.c:19
+msgid "OSS4 samplerate bug workaround"
+msgstr "OSS4 のサンプルレートのバグを回避する"
-#~ msgid "Prefer CDDB protocol over HTTP"
-#~ msgstr ""
+#. Album Artwork plugin
+#: ../translation/extra.c:21
+msgid "Cache update period (hr)"
+msgstr "キャッシュの更新間隔 (時)"
-#~ msgid "Enable NRG image support"
-#~ msgstr ""
+#: ../translation/extra.c:22
+msgid "Fetch from embedded tags"
+msgstr "埋め込みタグから取得する"
-#~ msgid "Resampling quality (0..2, higher is better)"
-#~ msgstr ""
+#: ../translation/extra.c:23
+msgid "Fetch from local folder"
+msgstr "ローカルのフォルダから取得する"
-#~ msgid "Max song length (in minutes)"
-#~ msgstr ""
+#: ../translation/extra.c:24
+msgid "Local cover file mask"
+msgstr "ローカルのカバーファイルのマスク"
-#, fuzzy
-#~ msgid "Ask confirmation to delete files from disk"
-#~ msgstr "ファイルをディスクから削除"
+#: ../translation/extra.c:25
+msgid "Fetch from last.fm"
+msgstr "Last.fm から取得する"
-#~ msgid "Status icon volume control sensitivity"
-#~ msgstr ""
+#: ../translation/extra.c:26
+msgid "Fetch from albumart.org"
+msgstr "Albumart.org から取得する"
-#~ msgid "Custom status icon"
-#~ msgstr ""
+#: ../translation/extra.c:27
+msgid "Scale artwork towards longer side"
+msgstr "ジャケット絵を引き伸ばす"
-#~ msgid "Run gtk_init with --sync (debug mode)"
-#~ msgstr ""
+#. Audio CD player
+#: ../translation/extra.c:29
+msgid "Use CDDB/FreeDB"
+msgstr "CDDB/FreeDB を使う"
-#~ msgid "Add separators between plugin context menu items"
-#~ msgstr ""
+#: ../translation/extra.c:30
+msgid "Prefer CD-Text over CDDB"
+msgstr "CD-Text より CDDB を優先する"
-#~ msgid "Notification title format"
-#~ msgstr ""
+#: ../translation/extra.c:31
+msgid "CDDB url (e.g. 'freedb.org')"
+msgstr "CDDB の URL ('freedb.org' など)"
-#~ msgid "Notification content format"
-#~ msgstr ""
+#: ../translation/extra.c:32
+msgid "CDDB port number (e.g. '888')"
+msgstr "CDDB のポート番号 ('888' など)"
-#, fuzzy
-#~ msgid "Show album art"
-#~ msgstr "アルバムアート"
+#: ../translation/extra.c:33
+msgid "Prefer CDDB protocol over HTTP"
+msgstr "CDDB プロトコルを HTTP より優先する"
-#~ msgid "Album art size (px)"
-#~ msgstr ""
+#: ../translation/extra.c:34
+msgid "Enable NRG image support"
+msgstr "NRG イメージのサポートを有効にする"
-#~ msgid "PulseAudio server"
-#~ msgstr ""
+#. DUMB module player plugin
+#: ../translation/extra.c:36
+msgid "Resampling quality (0..2, higher is better)"
+msgstr "リサンプリングを品質 (0..2, 大きい方が高品質)"
-#~ msgid "Samplerate"
-#~ msgstr ""
-
-#~ msgid "Relative seek table path"
-#~ msgstr ""
-
-#~ msgid "Absolute seek table path"
-#~ msgstr ""
-
-#~ msgid "Swap audio bytes (toggle if all you hear is static)"
-#~ msgstr ""
-
-#~ msgid "Enable HVSC Songlength DB"
-#~ msgstr ""
-
-#~ msgid "Songlengths.txt (from HVSC)"
-#~ msgstr ""
-
-#~ msgid "Bits per sample (8 or 16)"
-#~ msgstr ""
-
-#~ msgid "Default song length (sec)"
-#~ msgstr ""
+#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
-#~ msgid "Timidity++ bank configuration file"
-#~ msgstr ""
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
+msgid "Max song length (in minutes)"
+msgstr "最大の曲長 (分)"
+#: ../translation/extra.c:40
#, fuzzy
-#~ msgid "Track Title"
-#~ msgstr "トラック番号"
+msgid "Fadeout length (seconds)"
+msgstr "デフォルトの曲の長さ (秒)"
-#~ msgid "Performer"
-#~ msgstr ""
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
-#, fuzzy
-#~ msgid "Total Tracks"
-#~ msgstr "タイトル / トラックのアーティスト"
+#. Standard GTK2 user interface plugin
+#: ../translation/extra.c:43
+msgid "Ask confirmation to delete files from disk"
+msgstr "ファイルをディスクから削除する前に確認をとる"
-#~ msgid "Genre"
-#~ msgstr ""
+#: ../translation/extra.c:44
+msgid "Status icon volume control sensitivity"
+msgstr "ステータスアイコンの音量コントロールの感度"
-#~ msgid "Composer"
-#~ msgstr ""
+#: ../translation/extra.c:45
+msgid "Custom status icon"
+msgstr "ステータスアイコンの変更"
-#, fuzzy
-#~ msgid "Disc Number"
-#~ msgstr "ファイル番号"
+#: ../translation/extra.c:46
+msgid "Run gtk_init with --sync (debug mode)"
+msgstr "--sync の時 gtk_init する (デバッグ用)"
-#~ msgid "Comment"
-#~ msgstr ""
+#: ../translation/extra.c:47
+msgid "Add separators between plugin context menu items"
+msgstr "プラグインのコンテキストメニューのアイテムにセパレータを挟む"
-#~ msgid "Encoder / Vendor"
-#~ msgstr ""
+#. OSD Notify plugin
+#: ../translation/extra.c:49
+msgid "Notification title format"
+msgstr "通知のタイトルの書式"
-#, fuzzy
-#~ msgid "Location"
-#~ msgstr "場所を追加"
+#: ../translation/extra.c:50
+msgid "Notification content format"
+msgstr "通知の内容の書式"
-#~ msgid "Subtrack Index"
-#~ msgstr ""
+#: ../translation/extra.c:51
+msgid "Show album art"
+msgstr "アルバムアート を表示する"
-#: ../translation/extra.c:81
-msgid "Tag Type(s)"
-msgstr "タグの形式"
+#: ../translation/extra.c:52
+msgid "Album art size (px)"
+msgstr "アルバムアートのサイズ (ピクセル)"
-#: ../translation/extra.c:82
-msgid "Embedded Cuesheet"
-msgstr "埋め込みCUEシート"
+#. PulseAudio output plugin
+#: ../translation/extra.c:54
+msgid "PulseAudio server"
+msgstr "PulseAudio サーバー"
-#~ msgid "Codec"
-#~ msgstr ""
+#: ../translation/extra.c:56
+msgid "Samplerate"
+msgstr "サンプルレート"
-#~ msgid "File Extensions (separate with ';')"
-#~ msgstr ""
+#. SHN player plugin
+#: ../translation/extra.c:58
+msgid "Relative seek table path"
+msgstr "相対的なシークテーブルのパス"
-#~ msgid "Convert"
-#~ msgstr ""
+#: ../translation/extra.c:59
+msgid "Absolute seek table path"
+msgstr "絶対的なシークテーブルのパス"
-#~ msgid "Target Samplerate"
-#~ msgstr ""
+#: ../translation/extra.c:60
+msgid "Swap audio bytes (toggle if all you hear is static)"
+msgstr "オーディオのバイトを入れ替える (平坦な音しか聞こえない場合、有効に)"
-#~ msgid "Quality / Algorythm"
-#~ msgstr ""
+#. SID decoder plugin
+#: ../translation/extra.c:62
+msgid "Enable HVSC Songlength DB"
+msgstr "HVSC 曲長データベースを有効にする"
-#~ msgid "Automatic Samplerate (overrides Target Samplerate)"
-#~ msgstr ""
+#: ../translation/extra.c:63
+msgid "Songlengths.txt (from HVSC)"
+msgstr "Songlengths.txt (from HVSC)"
-#~ msgid "The file already exists. Overwrite?"
-#~ msgstr ""
+#: ../translation/extra.c:64
+msgid "Bits per sample (8 or 16)"
+msgstr "サンプルのビット数 (8 or 16)"
-#~ msgid "Converter warning"
-#~ msgstr ""
+#: ../translation/extra.c:65
+msgid "Default song length (sec)"
+msgstr "デフォルトの曲の長さ (秒)"
-#~ msgid "Please select encoder"
-#~ msgstr ""
+#. WildMidi player plugin
+#: ../translation/extra.c:67
+msgid "Timidity++ bank configuration file"
+msgstr "Timidity++ bank 設定ファイル"
-#~ msgid "Converter error"
-#~ msgstr ""
+#: ../translation/extra.c:70
+msgid "Track Title"
+msgstr "トラックのタイトル"
-#~ msgid "Converting..."
-#~ msgstr ""
+#: ../translation/extra.c:71
+msgid "Performer"
+msgstr "演奏者"
-#, fuzzy
-#~ msgid "Select folder..."
-#~ msgstr "すべて選択"
+#: ../translation/extra.c:76
+msgid "Total Tracks"
+msgstr "総トラック数"
-#, fuzzy
-#~ msgid "Failed to save encoder preset"
-#~ msgstr "イコライザ設定の読み込み"
+#: ../translation/extra.c:77
+msgid "Genre"
+msgstr "ジャンル"
-#~ msgid ""
-#~ "Check preset folder permissions, try to pick different title, or free up "
-#~ "some disk space"
-#~ msgstr ""
+#: ../translation/extra.c:78
+msgid "Composer"
+msgstr "作曲者"
-#~ msgid "Preset with the same name already exists. Try to pick another title."
-#~ msgstr ""
+#: ../translation/extra.c:79
+msgid "Disc Number"
+msgstr "ディスク番号"
-#~ msgid "Error"
-#~ msgstr ""
+#: ../translation/extra.c:80
+msgid "Comment"
+msgstr "コメント"
-#, fuzzy
-#~ msgid "Add new encoder"
-#~ msgstr "カラムの編集"
+#: ../translation/extra.c:81
+msgid "Encoder / Vendor"
+msgstr "エンコーダ / ベンダ"
-#, fuzzy
-#~ msgid "Edit encoder"
-#~ msgstr "カラムの編集"
+#: ../translation/extra.c:83
+msgid "Location"
+msgstr "場所"
-#, fuzzy
-#~ msgid "Remove preset"
-#~ msgstr "イコライザ設定を保存"
+#: ../translation/extra.c:84
+msgid "Subtrack Index"
+msgstr "サブトラックのインデックス"
-#~ msgid "This action will delete the selected preset. Are you sure?"
-#~ msgstr ""
+#: ../translation/extra.c:85
+msgid "Tag Type(s)"
+msgstr "タグの形式"
-#, fuzzy
-#~ msgid "Encoders"
-#~ msgstr "カラムの編集"
+#: ../translation/extra.c:86
+msgid "Embedded Cuesheet"
+msgstr "埋め込みCUEシート"
-#~ msgid "Add plugin to DSP chain"
-#~ msgstr ""
+#: ../translation/extra.c:87
+msgid "Codec"
+msgstr "コーデック"
-#, fuzzy
-#~ msgid "Failed to save DSP preset"
-#~ msgstr "イコライザ設定を保存"
+#. FFmpeg deocder plugin
+#: ../translation/extra.c:89
+msgid "File Extensions (separate with ';')"
+msgstr "ファイルの拡張子 (';'で区切る)"
-#, fuzzy
-#~ msgid "New DSP Preset"
-#~ msgstr "イコライザ設定を保存"
+#. Converter GUI
+#: ../translation/extra.c:91
+msgid "Convert"
+msgstr "変換する"
-#, fuzzy
-#~ msgid "Edit DSP Preset"
-#~ msgstr "イコライザ設定を保存"
+#. Resampler (Secret Rabbit Code)
+#: ../translation/extra.c:93
+msgid "Target Samplerate"
+msgstr "サンプルレートの指定"
+#: ../translation/extra.c:94
#, fuzzy
-#~ msgid "DSP Presets"
-#~ msgstr "イコライザ設定を保存"
+msgid "Quality / Algorithm"
+msgstr "音質 / アルゴリズム"
-#, fuzzy
-#~ msgid "Output folder:"
-#~ msgstr "出力デバイス:"
+#: ../translation/extra.c:95
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "サンプルレートの自動設定 (指定したサンプルレートを上書きします)"
+#. shellexecui
+#: ../translation/extra.c:97
#, fuzzy
-#~ msgid "Output file name:"
-#~ msgstr "出力プラグイン:"
+msgid "Configure custom shell commands"
+msgstr "シェルコマンドの編集と設定"
-#~ msgid ""
-#~ "Extension (e.g. .mp3) will be appended automatically.\n"
-#~ "Leave the field empty for default (%a - %t)."
-#~ msgstr ""
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
-#, fuzzy
-#~ msgid "Encoder:"
-#~ msgstr "カラムの編集"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+#: ../translation/extra.c:102
#, fuzzy
-#~ msgid "DSP preset:"
-#~ msgstr "イコライザ設定を保存"
+msgid "Enable surround"
+msgstr "Scrobber を有効にする"
-#~ msgid "Number of threads:"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr "そのファイルは既に存在します。上書きしますか?"
-#, fuzzy
-#~ msgid "Output sample format:"
-#~ msgstr "出力プラグイン:"
+#: ../plugins/converter/convgui.c:119
+msgid "Converter warning"
+msgstr "コンバータの警告"
-#~ msgid "Keep source format"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:271
+msgid "Please select encoder"
+msgstr "エンコーダを選択してください"
-#~ msgid "8 bit signed int"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:273
+msgid "Converter error"
+msgstr "変換エラー"
-#~ msgid "16 bit signed int"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:297
+msgid "Converting..."
+msgstr "変換中..."
-#~ msgid "24 bit signed int"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:459
+msgid "Select folder..."
+msgstr "フォルダの選択..."
-#~ msgid "32 bit signed int"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:681
+msgid "Failed to save encoder preset"
+msgstr "エンコーダのプリセットの保存に失敗しました"
-#~ msgid "32 bit float"
-#~ msgstr ""
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
+msgstr ""
+"フォルダのパーミッション、名前の重複、ディスクの空き容量を確認してください"
+
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid "Preset with the same name already exists. Try to pick another title."
+msgstr "同じ名前のプリセットが既にあります。別の名前で試してください。"
+
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
+msgid "Error"
+msgstr "エラー"
+
+#: ../plugins/converter/convgui.c:738
+msgid "Add new encoder"
+msgstr "新規エンコーダの追加"
+
+#: ../plugins/converter/convgui.c:768
+msgid "Edit encoder"
+msgstr "エンコーダの編集"
+
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
+msgid "Remove preset"
+msgstr "プリセットの削除"
+
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
+msgid "This action will delete the selected preset. Are you sure?"
+msgstr "選択中のプリセットを削除します。続けますか?"
+
+#: ../plugins/converter/convgui.c:826
+msgid "Encoders"
+msgstr "エンコーダ"
+
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
+msgid "Add plugin to DSP chain"
+msgstr "プラグインを DSP チェインに追加"
+
+#: ../plugins/converter/convgui.c:1156
+msgid "Failed to save DSP preset"
+msgstr "DSP プリセットの保存に失敗しました"
+
+#: ../plugins/converter/convgui.c:1220
+msgid "New DSP Preset"
+msgstr "新規の DSP プリセット"
+
+#: ../plugins/converter/convgui.c:1305
+msgid "Edit DSP Preset"
+msgstr "DSP プリセットの編集"
+
+#: ../plugins/converter/convgui.c:1325
+msgid "DSP Presets"
+msgstr "DSP プリセット"
+
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
+msgid "Output folder:"
+msgstr "出力先フォルダ:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr "元のトラックと同じフォルダに書く"
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr "フォルダ構造を保存する"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
+msgid "Output file name:"
+msgstr "出力ファイル名:"
+
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
+msgid ""
+"Extension (e.g. .mp3) will be appended automatically.\n"
+"Leave the field empty for default (%a - %t)."
+msgstr ""
+"拡張子 (.mp3など) は自動で追加されます。\n"
+"このフィールドを空にするとデフォルトを使います (%a - %t)。"
+
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
+msgid "Encoder:"
+msgstr "エンコーダ:"
+
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
+msgid "DSP preset:"
+msgstr "DSP のプリセット:"
+
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
+msgid "Number of threads:"
+msgstr "スレッドの数:"
+
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
+msgid "Output sample format:"
+msgstr "出力のサンプルのフォーマット:"
+
+#: ../plugins/converter/interface.c:212
+msgid "Keep source format"
+msgstr "元のままにする"
+
+#: ../plugins/converter/interface.c:213
+msgid "8 bit signed int"
+msgstr "8 bit 符号つき整数"
+
+#: ../plugins/converter/interface.c:214
+msgid "16 bit signed int"
+msgstr "16 bit 符号つき整数"
+
+#: ../plugins/converter/interface.c:215
+msgid "24 bit signed int"
+msgstr "24 bit 符号つき整数"
+
+#: ../plugins/converter/interface.c:216
+msgid "32 bit signed int"
+msgstr "32 bit 符号つき整数"
+
+#: ../plugins/converter/interface.c:217
+msgid "32 bit float"
+msgstr "32 bit 浮動小数点数"
+
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
+msgid "When file exists:"
+msgstr "ファイルが存在するとき:"
+
+#: ../plugins/converter/interface.c:230
+msgid "Prompt"
+msgstr "尋ねる"
+
+#: ../plugins/converter/interface.c:231
+msgid "Overwrite"
+msgstr "上書きする"
+
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
+msgid "Edit Encoder Preset"
+msgstr "エンコーダのプリセット設定"
+
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
+msgid "Untitled Encoder"
+msgstr "無題のエンコーダ"
+
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
+msgid "Output file extension:"
+msgstr "出力ファイルの拡張子:"
+
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
+msgid "E.g. mp3"
+msgstr "例: mp3"
+
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
+msgid "Command line:"
+msgstr "コマンドライン:"
+
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
+msgid ""
+"Example: lame - %o\n"
+"%i for input file, %o for output file, - for stdin"
+msgstr ""
+"例: lame - %o\n"
+"%i: 入力ファイル, %o: 出力ファイル, -: 標準入力"
-#~ msgid "When file exists:"
-#~ msgstr ""
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
+msgid ""
+"<small>%o - output file name\n"
+"%i - temporary input file name</small>"
+msgstr ""
+"<small>%o - 出力先のファイル名\n"
+"%i - 入力の一時ファイル名</small>"
+
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
+msgid "Method:"
+msgstr "経由する:"
+
+#: ../plugins/converter/interface.c:445
+msgid "Pipe"
+msgstr "パイプ"
+
+#: ../plugins/converter/interface.c:446
+msgid "Temporary file"
+msgstr "一時ファイル"
+
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
+msgid "APEv2"
+msgstr "APEv2"
+
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
+msgid "ID3v1"
+msgstr "ID3v1"
+
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
+msgid "OggVorbis"
+msgstr "OggVorbis"
+
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
+msgid "ID3v2"
+msgstr "ID3v2"
+
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
+msgid "<b>Tag writer</b>"
+msgstr "<b>タグ書き出し</b>"
+
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
+msgid "DSP Preset Editor"
+msgstr "DSP プリセットエディタ"
+
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
+msgid "Untitled DSP Preset"
+msgstr "無題の DSP プリセット"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"元のままにする\n"
+"8 bit 符号つき整数\n"
+"16 bit 符号つき整数\n"
+"24 bit 符号つき整数\n"
+"32 bit 符号つき整数\n"
+"32 bit 浮動小数点数"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"尋ねる\n"
+"上書きする"
-#~ msgid "Prompt"
-#~ msgstr ""
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"パイプ\n"
+"一時ファイル"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr "シェルのコマンド"
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr "編集"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr "閉じる"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr "コマンドの編集"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr "コマンド:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+"任意のシェルのコマンド。アプリケーションを立ち上げたシェルのコンテキストから"
+"実行されます。xdg-open %D のような書式が使えます"
-#, fuzzy
-#~ msgid "Overwrite"
-#~ msgstr "デフォルトを上書きする"
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr "ID:"
-#~ msgid "Preserve folder structure, starting from:"
-#~ msgstr ""
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr "\"My Shell Command\" のような自由な形式の名前"
-#, fuzzy
-#~ msgid "Edit Encoder Preset"
-#~ msgstr "イコライザ設定の読み込み"
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+"コマンド ID (\"youtube_open\" のような短い識別子)。一意である必要があります"
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr "単一トラック"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr "単一のトラックに対して動作します"
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr "複数トラック"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr "複数のトラックに対して動作します"
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr "ローカル"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr "ローカルのファイルに対して動作します"
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr "リモート"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr "リモートのファイル (http:// ストリームなど) に対して動作します"
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+msgid "Playlist"
+msgstr "プレイリスト"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr "アイテムはプレイリストタブのコンテキストメニューに現れます"
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr "共通"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr "アイテムはメインメニューに現れます"
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr "コマンドの追加"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr "削除"
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "選択中のシェルのコマンドを削除します。続けますか?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr "削除の確認"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr "IDは空でなく、一意である必要があります\n"
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr "タイトルは空にできません\n"
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr "シェルのコマンドは空にできません\n"
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr "不正な値"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
-#, fuzzy
-#~ msgid "Untitled Encoder"
-#~ msgstr "カラムの編集"
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
-#, fuzzy
-#~ msgid "Output file extension:"
-#~ msgstr "出力プラグイン:"
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "設定"
-#~ msgid "E.g. mp3"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
-#~ msgid "Command line:"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
#, c-format
-#~ msgid ""
-#~ "Example: lame - %o\n"
-#~ "%i for input file, %o for output file, - for stdin"
-#~ msgstr ""
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
#, c-format
-#~ msgid ""
-#~ "<small>%o - output file name\n"
-#~ "%i - temporary input file name</small>"
-#~ msgstr ""
+msgid "Not a launchable item"
+msgstr ""
-#~ msgid "Method:"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
-#~ msgid "Pipe"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
-#~ msgid "Temporary file"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
-#, fuzzy
-#~ msgid "APEv2"
-#~ msgstr "APEv2 の書き出し"
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
#, fuzzy
-#~ msgid "ID3v1"
-#~ msgstr "ID3v1 の書き出し"
+msgid "ID"
+msgstr "ID:"
-#~ msgid "OggVorbis"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
-#~ msgid "FLAC"
-#~ msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
-#, fuzzy
-#~ msgid "ID3v2"
-#~ msgstr "ID3v2 の書き出し"
+#~ msgid "GUI"
+#~ msgstr "GUI"
-#, fuzzy
-#~ msgid "<b>Tag writer</b>"
-#~ msgstr "タグ書き出し"
+#~ msgid "Slot"
+#~ msgstr "スロット"
-#, fuzzy
-#~ msgid "DSP Preset Editor"
-#~ msgstr "イコライザ設定を保存"
+#~ msgid "Really remove selected field?"
+#~ msgstr "本当にこのフィールドを削除しますか?"
-#, fuzzy
-#~ msgid "Untitled DSP Preset"
-#~ msgstr "イコライザ設定を保存"
+#~ msgid "Usage: deadbeef [options] [file(s)]\n"
+#~ msgstr "使い方: deadbeef [オプション] [ファイル...]\n"
#~ msgid "Save playlist as"
#~ msgstr "名前をつけてプレイリストを保存"
@@ -1626,7 +2171,6 @@ msgstr "埋め込みCUEシート"
#~ msgid "Length"
#~ msgstr "長さ"
-#, no-c-format
#~ msgid ""
#~ "Format conversions (start with %):\n"
#~ " [a]rtist, [t]itle, al[b]um, [B]and, [C]omposer\n"
@@ -1672,7 +2216,6 @@ msgstr "埋め込みCUEシート"
#~ msgid "Title / Track Artist"
#~ msgstr "タイトル / トラックのアーティスト"
-#, c-format
#~ msgid "Setup %s"
#~ msgstr "%s の設定"
@@ -1746,4 +2289,6 @@ msgstr "埋め込みCUEシート"
#~ msgid ""
#~ "Error writing stream to output. Output stream may be corrupted or "
#~ "truncated."
-#~ msgstr "ストリームの書き出し時にエラー。出力ストリームは破損もしくは欠損している可能性があります。"
+#~ msgstr ""
+#~ "ストリームの書き出し時にエラー。出力ストリームは破損もしくは欠損している可"
+#~ "能性があります。"
diff --git a/po/kk.po b/po/kk.po
index 4b6a3ebb..45915cc3 100644
--- a/po/kk.po
+++ b/po/kk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: master\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-26 12:59+0200\n"
"Last-Translator: sotrud_nik <baurthefirst@gmail.com>\n"
"Language-Team: Kazakh <kk_KZ@googlegroups.com>\n"
@@ -54,11 +54,9 @@ msgstr "Көмек файлын жүктеу сәтсіз"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737
-#: ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49
-#: ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Көмек"
@@ -72,1013 +70,886 @@ msgstr "DeaDBeeF %s туралы"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s өзгерістері"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF аудармашылары"
-#: ../plugins/gtkui/ddbtabstrip.c:755
-#: ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Ойнату тізімін түзету"
-#: ../plugins/gtkui/ddbtabstrip.c:758
-#: ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922
-#: ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Атауы:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Ойнату тізімінің атын ауыстыру"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Ойнату тізімін өшіру"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Жаңа ойнату тізімі"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF EQ баптауын сақтау"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ баптау файлдары (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF EQ баптауын жүктеу..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ баптаулары (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ баптауын импорттау..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ баптаулары (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Баптауды сақтау"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Баптауды жүктеу"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 EQ баптауын импорттау"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Іске қосу"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Барлығын нөлдеу"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Алдын-ала күшейтуді нөлдеу"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Жиіліктерді нөлдеу"
-#: ../plugins/gtkui/eq.c:387
-#: ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Сақталған баптаулар"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 күн %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d күн %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Тоқтатылған | %d трек | %s жалпы уақыты"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Моно"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стерео"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d кбит/с "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Аялдатылған | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
-msgid "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgid ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dГц | %d бит | %s | %d:%02d / %s | %d трек | %s жалпы уақыты"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Ойнату тізімін қалайша сақтау"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF ойнату тізім файлдары (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Ойнату тізімін жүктеу"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Басқа файлдар (*)"
-#: ../plugins/gtkui/gtkui.c:926
-#: ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Жаңа ойнату тізімі"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Жаңа ойнату тізімі (%d)"
-#: ../plugins/gtkui/interface.c:150
-#: ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Файл"
-#: ../plugins/gtkui/interface.c:157
-#: ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "Ф_айл(дар)ды ашу"
-#: ../plugins/gtkui/interface.c:173
-#: ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Файл(дар)ды қосу"
-#: ../plugins/gtkui/interface.c:181
-#: ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Бума(лар)ды қосу"
-#: ../plugins/gtkui/interface.c:189
-#: ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Орналасуы бойынша қосу"
-#: ../plugins/gtkui/interface.c:198
-#: ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Жаңа ойнату тізімі"
-#: ../plugins/gtkui/interface.c:205
-#: ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Ойнату тізімін жүктеу"
-#: ../plugins/gtkui/interface.c:209
-#: ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Ойнату тізімін сақтау"
-#: ../plugins/gtkui/interface.c:218
-#: ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Шығу"
-#: ../plugins/gtkui/interface.c:229
-#: ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "Тү_зету"
-#: ../plugins/gtkui/interface.c:236
-#: ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "Та_зарту"
-#: ../plugins/gtkui/interface.c:244
-#: ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Барлығын таңдау"
-#: ../plugins/gtkui/interface.c:251
-#: ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Таңдауды алып тастау"
-#: ../plugins/gtkui/interface.c:258
-#: ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Таңдауды терістеу"
-#: ../plugins/gtkui/interface.c:262
-#: ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Таңдалған"
-#: ../plugins/gtkui/interface.c:269
-#: ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323
-#: ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Өшіру"
-#: ../plugins/gtkui/interface.c:277
-#: ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Одан басқасын өшіру"
-#: ../plugins/gtkui/interface.c:281
-#: ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "Ізд_еу"
-#: ../plugins/gtkui/interface.c:288
-#: ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Қалайша сұрыптау"
-#: ../plugins/gtkui/interface.c:295
-#: ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318
-#: ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790
-#: ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Атауы"
-#: ../plugins/gtkui/interface.c:299
-#: ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Трек нөмірі"
-#: ../plugins/gtkui/interface.c:303
-#: ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875
-#: ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Альбом"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307
-#: ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Әртіс"
-#: ../plugins/gtkui/interface.c:311
-#: ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Күні"
-#: ../plugins/gtkui/interface.c:315
-#: ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017
-#: ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Кездейсоқ"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Таңдауыңызша"
-#: ../plugins/gtkui/interface.c:324
-#: ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Баптаулар"
-#: ../plugins/gtkui/interface.c:328
-#: ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Түрі"
-#: ../plugins/gtkui/interface.c:335
-#: ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Қалып-күй жолағы"
-#: ../plugins/gtkui/interface.c:339
-#: ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Бағандар аттары"
-#: ../plugins/gtkui/interface.c:343
-#: ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Беттер"
-#: ../plugins/gtkui/interface.c:347
-#: ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Эквалайзер"
-#: ../plugins/gtkui/interface.c:351
-#: ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "О_йнату"
-#: ../plugins/gtkui/interface.c:358
-#: ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Реті"
-#: ../plugins/gtkui/interface.c:365
-#: ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Қалыпты"
-#: ../plugins/gtkui/interface.c:370
-#: ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Тректерді араластыру"
-#: ../plugins/gtkui/interface.c:375
-#: ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Альбомдарды араластыру"
-#: ../plugins/gtkui/interface.c:380
-#: ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Кездейсоқ"
-
-#: ../plugins/gtkui/interface.c:386
-#: ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Қайталау"
-#: ../plugins/gtkui/interface.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Барлығын қайталау"
-#: ../plugins/gtkui/interface.c:398
-#: ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Бір тректі қайталау"
-#: ../plugins/gtkui/interface.c:403
-#: ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Қайталамау"
-#: ../plugins/gtkui/interface.c:409
-#: ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Ағымдағы трек атын айналдыру"
-#: ../plugins/gtkui/interface.c:414
-#: ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Ағымдағы тректі ерекшелеу"
-#: ../plugins/gtkui/interface.c:418
-#: ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Ағымдағысынан кейін тоқтату"
-#: ../plugins/gtkui/interface.c:430
-#: ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Ағымдағы трекке өту"
-#: ../plugins/gtkui/interface.c:437
-#: ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Көмек"
-#: ../plugins/gtkui/interface.c:452
-#: ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Өз_герістер"
-#: ../plugins/gtkui/interface.c:461
-#: ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465
-#: ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474
-#: ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "О_сы туралы"
-#: ../plugins/gtkui/interface.c:482
-#: ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "Ау_дармашылар"
-#: ../plugins/gtkui/interface.c:898
-#: ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Іздеу"
-#: ../plugins/gtkui/interface.c:973
-#: ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Тоқтату"
-#: ../plugins/gtkui/interface.c:981
-#: ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Ойнату"
-#: ../plugins/gtkui/interface.c:989
-#: ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Аялдату"
-#: ../plugins/gtkui/interface.c:997
-#: ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Алдыңғы"
-#: ../plugins/gtkui/interface.c:1005
-#: ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Келесі"
-#: ../plugins/gtkui/interface.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Кездейсоқты ойнату"
-#: ../plugins/gtkui/interface.c:1022
-#: ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Осы туралы"
-#: ../plugins/gtkui/interface.c:1035
-#: ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Шығу"
-#: ../plugins/gtkui/interface.c:1225
-#: ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Трек қасиеттері"
-#: ../plugins/gtkui/interface.c:1270
-#: ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Баптаулар"
-#: ../plugins/gtkui/interface.c:1296
-#: ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "Іс_ке асыру"
-#: ../plugins/gtkui/interface.c:1317
-#: ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Жабу"
-#: ../plugins/gtkui/interface.c:1321
-#: ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Метаақпарат"
-#: ../plugins/gtkui/interface.c:1367
-#: ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Қасиеттері"
-#: ../plugins/gtkui/interface.c:1494
-#: ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Жаңа баған атауын осында енгіңіз"
-#: ../plugins/gtkui/interface.c:1502
-#: ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Түрі:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Реттік нөмірі"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511
-#: ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Ойналуда"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Альбом суреті"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Әртіс - Альбом"
-#: ../plugins/gtkui/interface.c:1517
-#: ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Ұзақтығы"
-#: ../plugins/gtkui/interface.c:1518
-#: ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Трек нөмірі"
-#: ../plugins/gtkui/interface.c:1519
-#: ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Топ / Альбом әртісі"
-#: ../plugins/gtkui/interface.c:1526
-#: ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Пішімі:"
-#: ../plugins/gtkui/interface.c:1551
-#: ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Туралауы:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Сол жақ"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Оң жақ"
-#: ../plugins/gtkui/interface.c:1583
-#: ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065
-#: ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "Ба_с тарту"
-#: ../plugins/gtkui/interface.c:1604
-#: ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086
-#: ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_ОК"
-#: ../plugins/gtkui/interface.c:1825
-#: ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Шығыс плагин:"
-#: ../plugins/gtkui/interface.c:1838
-#: ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Шығыс құрылғы:"
-#: ../plugins/gtkui/interface.c:1847
-#: ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "8 биттік аудионы әрқашан 16 биттіке түрлендіру"
-#: ../plugins/gtkui/interface.c:1851
-#: ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Дыбыс"
-#: ../plugins/gtkui/interface.c:1864
-#: ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Дыбыс қаттылығын авто түзету:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Сөндірулі"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Трек"
-#: ../plugins/gtkui/interface.c:1877
-#: ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Пиктік мәнін қолдану"
-#: ../plugins/gtkui/interface.c:1892
-#: ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 дБ"
-#: ../plugins/gtkui/interface.c:1902
-#: ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 дБ"
-#: ../plugins/gtkui/interface.c:1906
-#: ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Дыбыс қаттылығын автотүзетудің алдын-ала күшейтілуі:"
-#: ../plugins/gtkui/interface.c:1913
-#: ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Дыбыс қаттылығын жалпы алдын-ала күшейту:"
-#: ../plugins/gtkui/interface.c:1944
-#: ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
-msgstr "Бұл ойнату тізіміне файлдарды командалық жолдан (не файлдар басқарушысынан) қосу:"
+msgstr ""
+"Бұл ойнату тізіміне файлдарды командалық жолдан (не файлдар басқарушысынан) "
+"қосу:"
-#: ../plugins/gtkui/interface.c:1953
-#: ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Қосылғанда, соңғы сессияны жалғастыру"
-#: ../plugins/gtkui/interface.c:1957
-#: ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Бумаларды қосқан кезде архивтерден қоспау"
-#: ../plugins/gtkui/interface.c:1961
-#: ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Ағымдағысынан кейін тоқтату"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Ойнату үрдісі"
-#: ../plugins/gtkui/interface.c:1982
-#: ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22
-#: ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Баптау"
-#: ../plugins/gtkui/interface.c:2017
-#: ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP тізбегінің баптауы"
-#: ../plugins/gtkui/interface.c:2029
-#: ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "Жү_ктеу"
-#: ../plugins/gtkui/interface.c:2033
-#: ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042
-#: ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Жабу орнына трейге орналастыру"
-#: ../plugins/gtkui/interface.c:2046
-#: ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Тышқан орта батырмасы ойнату тізімін жабады"
-#: ../plugins/gtkui/interface.c:2050
-#: ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Жүйелік сөре таңбашасын жасыру"
-#: ../plugins/gtkui/interface.c:2054
-#: ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Ағымдағы ойнатылып тұрған трек үшін жуан қаріпті қолдану"
-#: ../plugins/gtkui/interface.c:2058
-#: ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "\"Қатты дисктен өшіру\" нұсқасын контекст мәзірінде көрсетпеу"
-#: ../plugins/gtkui/interface.c:2062
-#: ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Бірлік буманы қосқан кезде ойнату тізімін автоатау"
-#: ../plugins/gtkui/interface.c:2070
-#: ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Интерфейсті жаңарту жиілігі (секундына рет)"
-#: ../plugins/gtkui/interface.c:2084
-#: ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Ойнатылған кездегі атау мәтіні:"
-#: ../plugins/gtkui/interface.c:2098
-#: ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Тоқтатылған кездегі атау мәтіні:"
-#: ../plugins/gtkui/interface.c:2112
-#: ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI плагині (ауыстырылса, қайта қосу керек):"
-#: ../plugins/gtkui/interface.c:2120
-#: ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135
-#: ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Алмастыру"
-#: ../plugins/gtkui/interface.c:2144
-#: ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Алдыңғы көрінісі"
-#: ../plugins/gtkui/interface.c:2151
-#: ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Фон"
-#: ../plugins/gtkui/interface.c:2170
-#: ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Үрдіс/дыбыс жолақтарының түстері"
-#: ../plugins/gtkui/interface.c:2188
-#: ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Ортасы"
-#: ../plugins/gtkui/interface.c:2195
-#: ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Ашық түсті"
-#: ../plugins/gtkui/interface.c:2202
-#: ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Күңгірт"
-#: ../plugins/gtkui/interface.c:2233
-#: ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Негізгі"
-#: ../plugins/gtkui/interface.c:2240
-#: ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Мәтін"
-#: ../plugins/gtkui/interface.c:2253
-#: ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Беттер"
-#: ../plugins/gtkui/interface.c:2262
-#: ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Алмастыру (GTK темасының баптаулары жоғалады, бірақ жылдамдығы артады)"
-#: ../plugins/gtkui/interface.c:2271
-#: ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Жұп жол"
-#: ../plugins/gtkui/interface.c:2278
-#: ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Тақ жол"
-#: ../plugins/gtkui/interface.c:2304
-#: ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Ерекшеленген жол"
-#: ../plugins/gtkui/interface.c:2323
-#: ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Ерекшеленген мәтін"
-#: ../plugins/gtkui/interface.c:2336
-#: ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Курсор"
-#: ../plugins/gtkui/interface.c:2349
-#: ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Ойнату тізім түстері"
-#: ../plugins/gtkui/interface.c:2353
-#: ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Түстер"
-#: ../plugins/gtkui/interface.c:2362
-#: ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Прокси серверді іске қосу"
-#: ../plugins/gtkui/interface.c:2370
-#: ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Прокси сервер адресі:"
-#: ../plugins/gtkui/interface.c:2384
-#: ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Прокси сервер порты:"
-#: ../plugins/gtkui/interface.c:2398
-#: ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Прокси түрі:"
-#: ../plugins/gtkui/interface.c:2417
-#: ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Прокси пайдаланушысы:"
-#: ../plugins/gtkui/interface.c:2430
-#: ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Прокси паролі:"
-#: ../plugins/gtkui/interface.c:2440
-#: ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Желі"
-#: ../plugins/gtkui/interface.c:2471
-#: ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Нұсқасы:"
-#: ../plugins/gtkui/interface.c:2535
-#: ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Copyright"
-#: ../plugins/gtkui/interface.c:2545
-#: ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Плагиндер"
-#: ../plugins/gtkui/interface.c:3033
-#: ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135
-#: ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Қалайша топтау"
-#: ../plugins/gtkui/interface.c:3259
-#: ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Қалайша сұрыптау..."
-#: ../plugins/gtkui/interface.c:3275
-#: ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Пішімі"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Өсу ретімен"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Кему ретімен"
-#: ../plugins/gtkui/interface.c:3359
-#: ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "DSP плагинін таңдау"
-#: ../plugins/gtkui/interface.c:3375
-#: ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016
-#: ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Плагин"
-#: ../plugins/gtkui/interface.c:3461
-#: ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Тег жазушысы баптаулары"
-#: ../plugins/gtkui/interface.c:3492
-#: ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 жазу"
-#: ../plugins/gtkui/interface.c:3496
-#: ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 жазу"
-#: ../plugins/gtkui/interface.c:3500
-#: ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619
-#: ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 жазу"
-#: ../plugins/gtkui/interface.c:3508
-#: ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 алып тастау"
-#: ../plugins/gtkui/interface.c:3512
-#: ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 алып тастау"
-#: ../plugins/gtkui/interface.c:3516
-#: ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631
-#: ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 алып тастау"
-#: ../plugins/gtkui/interface.c:3524
-#: ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 нұсқасы"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Ұсынылады)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538
-#: ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 таңбалар кодталуы (бастапқысы iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575
-#: ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 жазу"
-#: ../plugins/gtkui/mainplaylist.c:316
-#: ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Әртіс / Альбом"
-#: ../plugins/gtkui/mainplaylist.c:317
-#: ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Трек №"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Файлдарды дисктен өшіру"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -1086,53 +957,48 @@ msgstr ""
"Файлдар жоғалады. Жалғастырамыз ба?\n"
"(Бұл сұхбат терезесін GTKUI плагин баптауларында сөндіруге болады)"
-#: ../plugins/gtkui/plcommon.c:340
-#: ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693
-#: ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Ескерту"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Ойнату кезегіне қосу"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Ойнату кезегінен өшіру"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Метаақпаратты қайта жүктеп алу"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Дискіден өшіру"
-#: ../plugins/gtkui/plcommon.c:855
-#: ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Бағанды қосу"
-#: ../plugins/gtkui/plcommon.c:885
-#: ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Бағанды түзету"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Бағанды өшіру"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Қалайша топтау"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ешнәрсе"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Әртіс/Күні/Альбом"
@@ -1140,7 +1006,7 @@ msgstr "Әртіс/Күні/Альбом"
msgid "Open file..."
msgstr "Файлды ашу..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "%s баптау"
@@ -1149,20 +1015,23 @@ msgstr "%s баптау"
msgid "Default Audio Device"
msgstr "Негізгі дыбыс құрылғысы"
-#: ../plugins/gtkui/prefwin.c:318
-#: ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Қосу"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Ыстық пернелер"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Слот"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Орналасуы"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Пернелер комбинациясы"
@@ -1174,138 +1043,143 @@ msgstr "Файлдарды қосу..."
msgid "Initializing..."
msgstr "Іске қосылуда..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Осы трек үшін сіз ақпаратты түзеттіңіз."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Терезені шынымен жабу керек пе?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Бірнеше мәндер] "
-#: ../plugins/gtkui/trkproperties.c:407
-#: ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Кілт"
-#: ../plugins/gtkui/trkproperties.c:408
-#: ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Мәні"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Тегтерді жазу..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Аты:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Өріс атауы : не _ таңбаларынан басталмауы тиіс"
-#: ../plugins/gtkui/trkproperties.c:634
-#: ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Өрісті қосу мүмкін емес"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Ондай атымен өріс бар болып тұр, басқа атауын көрсетіңіз."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Таңдалған өрісті шынымен жабу керек пе?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Өрісті қосу"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Өрісті өшіру"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Қолданылуы: deadbeef [опциялар] [файл(дар)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опциялары:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help не -h Көмек ақпаратын (осы) шығару мен шығу\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Плеерді жабу\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Нұсқа ақпаратын шығару мен шығу\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Ойнатуды бастау\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Ойнатуды тоқтату\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Ойнатуды аялдату\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Паузаны ауыстыру\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
-msgid " --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Тоқтатылған болса, ойнату, болмаса, паузаны ауыстыру\n"
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr ""
+" --play-pause Тоқтатылған болса, ойнату, болмаса, паузаны ауыстыру\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Ойнату тізіміндегі келесі трек\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Ойнату тізіміндегі алдыңғы трек\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Ойнату тізіміндегі кездейсоқ трек\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Файл(дар)ды бар ойнату тізіміне қосу\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying ПШМ Шығысқа пішімделген трек атын шығару\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1316,56 +1190,37 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
-msgid " e.g.: --nowplaying \"%%a - %%t\" should print \"artist - title\"\n"
-msgstr " мыс.: --nowplaying \"%%a - %%t\" экранға \"artist - title\" шығаруы тиіс\n"
+msgid ""
+" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
+"- title\"\n"
+msgstr ""
+" мыс.: --nowplaying \"%%a - %%t\" экранға \"artist - "
+"title\" шығаруы тиіс\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
-msgid " for more info, see http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " көбірек білу үшін, http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting қараңыз\n"
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" көбірек білу үшін, http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting қараңыз\n"
-#: ../playlist.c:454
-#: ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Бастапқы"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Иә"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Жоқ"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Ұсынылады)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Өсу ретімен\n"
-"Кему ретімен"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Сөндірулі\n"
-"Трек\n"
-"Альбом"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1391,7 +1246,7 @@ msgstr ""
"Топ / Альбом әртісі\n"
"Таңдауыңызша"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1399,23 +1254,54 @@ msgstr ""
"Сол жақ\n"
"Оң жақ"
-#: ../plugins/gtkui/support.c:90
-#: ../plugins/gtkui/support.c:114
-#: ../plugins/converter/support.c:90
-#: ../plugins/converter/support.c:114
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Сөндірулі\n"
+"Трек\n"
+"Альбом"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Өсу ретімен\n"
+"Кему ретімен"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Ұсынылады)\n"
+"2.4"
+
+#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Сурет файлын табу мүмкін емес: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
-msgid "wildmidi: freepats config file not found. Please install timidity-freepats package, or specify path to freepats.cfg in the plugin settings."
-msgstr "wildmidi: freepats баптаулар файлы табылмады. timidity-freepats дестесін орнатыңыз, немесе плагин баптауларында freepats.cfg файлына дейінгі жолды көрсетіңіз."
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+"wildmidi: freepats баптаулар файлы табылмады. timidity-freepats дестесін "
+"орнатыңыз, немесе плагин баптауларында freepats.cfg файлына дейінгі жолды "
+"көрсетіңіз."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Аудио CD қосу"
#: ../translation/extra.c:4
@@ -1431,8 +1317,7 @@ msgstr "ALSA шығыс модулі"
msgid "Release device while stopped"
msgstr "Тоқтатылған кезде дыбыс құрылғысын босату"
-#: ../translation/extra.c:8
-#: ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Таңдамалы буфер өлшемі"
@@ -1461,334 +1346,382 @@ msgstr "Пароль"
msgid "Scrobble URL"
msgstr "Скробблинг сілтемесі"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Құрылғы файлы"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "OSS4 үшін дискреттеу жиілігінің қатесіне түзету"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Кэш жаңарту мерзімі (сағ)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Кеңейтілген тегтерден алу"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Жергілікті бумадан алу"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Жергілікті мұқаба үшін файл маскасы"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "last.fm сайтынан алу"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "albumart.org сайтынан алу"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Альбом мұқабасын ұзын жағы бойынша масштабтау"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB қолдану"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "CDDB алдында CD-Text таңдау"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB сілтемесі (мыс. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB порт нөмірі (мыс. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "HTTP алдында CDDB хаттамасын таңдау"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "NRG бейнелер қолдауын іске қосу"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Қайта дискретизация сапасы (0..2, жоғарырақ - жақсырақ)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Тректің макс. ұзындығы (мин)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Тректің үнсіз келісім б/ша ұзындығы (сек)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Файлдарды дисктен өшіру алдында растауды сұрау"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Жүйелік сөредегі таңбашаның дыбыс өзгерту сезімділігі"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Таңдауыңызша жүйелік сөредегі таңбаша"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "gtk_init --sync қосып, жөнелту (жөндеу режимі)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Контекст мәзірі элементтері арасына ажыратқышты қосу"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Хабарлама атауының пішімі"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Хабарлама құрамасының пішімі"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Альбом суретін көрсету"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Альбом суретінің өлшемі (пикс)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio сервері"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Дискреттеу жиілігі"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Іздеу кестесінің салыстырмалы жолы"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Іздеу кестесінің абсолюттік жолы"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Аудио байттар орнын ауыстыру"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "HVSC Songlength DB іске қосу"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (HVSC-дан)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Разрядтылығы (8 не 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Тректің үнсіз келісім б/ша ұзындығы (сек)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ банкінің баптау файлы"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Трек атауы"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Орындайтын"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Жалпы трек саны"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Композитор"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Диск нөмірі"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Комментарий"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Кодтауыш / Шығарушы"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Орналасуы"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Ішкі жолшықтың аты"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тег түр(лер)і"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Құрамындағы cue файлы"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодек"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Файл кеңейтулері (';' ажыратылады)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Түрлендіру"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Мақсаттың дискреттеу жиілігі"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Сапасы / Алгоритмі"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Дискреттеудің автожиілігі (дискреттеу жиілігін қайта анықтайды)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Скробблингті іске қосу"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Файл бар болып тұр. Оны үстінен жазу керек пе?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Түрлендіруші ескертуі"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Кодтауышты таңдаңыз"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Түрлендіруші қатесі"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Түрлендіру..."
-#: ../plugins/converter/convgui.c:394
-#: ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Буманы тандаңыз..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Кодтауыштың баптауын сақтау сәтсіз"
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
-msgid "Check preset folder permissions, try to pick different title, or free up some disk space"
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
msgstr ""
"Баптау сақталатын бума рұқсаттарын тексеріңіз, басқа атауды таңдаңыз не "
"біршама диск кеңістігін босатыңыз."
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Ондай атымен баптау бар болып тұр. Басқа атын көрсетіңіз."
-#: ../plugins/converter/convgui.c:638
-#: ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Қате"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Жаңа кодтауышты қосу"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Кодтауышты түзету"
-#: ../plugins/converter/convgui.c:756
-#: ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Баптауды өшіру"
-#: ../plugins/converter/convgui.c:758
-#: ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Бұл әрекет нәтижесінде таңдалған баптау өшіріледі. Осыны қалайсыз ба?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Кодтауыштар"
-#: ../plugins/converter/convgui.c:838
-#: ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Плагинді DSP тізбегіне қосу"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "DSP баптауын сақтау сәтсіз"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Жаңа DSP баптауы"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "DSP баптауын түзету"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP баптаулары"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Шығыс бумасы:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Бумалар құрылысын сақтау, бастап:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Шығыс файл аты:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1796,84 +1729,91 @@ msgstr ""
"Кеңейтуі (мыс. .mp3) автоқосылады.\n"
"Үнсіз келісім үшін бос қалдырыңыз (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Кодтауыш:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP баптауы:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Ағымдар саны:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Сэмплдердің шығыс пішімі:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Бастапқы пішімді қалдыру"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 биттік таңбалы бүтін"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 биттік таңбалы бүтін"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 биттік таңбалы бүтін"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 биттік таңбалы бүтін"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 биттік қалқымалы"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Файл бар болса:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Сұрау"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Үстінен жазу"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Бумалар құрылысын сақтау, бастап:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Кодтауыш баптауын түзету"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Атауысыз кодтауыш"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Шығыс файлдың кеңейтуі:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Мыс. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Командалық жол:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1881,8 +1821,9 @@ msgstr ""
"Мысалы: lame - %o\n"
"%i кіріс файлы, %o шығыс файлы үшін, - stdin үшін"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1890,50 +1831,317 @@ msgstr ""
"<small>%o - шығыс файлы аты\n"
"%i - уақытша кіріс файлының аты</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Тәсіл:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Pipe"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Уақытша файл"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Тег жазушысы</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP баптау түзетушісі"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Атаусыз DSP баптауы"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Үстінен жазу"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Уақытша файл"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "Тү_зету"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Жабу"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Бағанды түзету"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Командалық жол:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Тректерді араластыру"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Бірнеше мәндер] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Орналасуы"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Өшіру"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Жаңа ойнату тізімі"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Комментарий"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Бағанды қосу"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Бұл әрекет нәтижесінде таңдалған баптау өшіріледі. Осыны қалайсыз ба?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Баптау"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Баптаулар"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Слот"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Таңдалған өрісті шынымен жабу керек пе?"
+
#~ msgid "Save playlist as"
#~ msgstr "Ойнату тізімін қалайша сақтау"
diff --git a/po/km.po b/po/km.po
index a2f981c6..ad12e269 100644
--- a/po/km.po
+++ b/po/km.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-09-03 07:11+0200\n"
"Last-Translator: SatyaN <satyathavy@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -55,9 +55,9 @@ msgstr "មានកំហុសពេលផ្ទុកឯកសារជំន
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "ជំនួយ"
@@ -71,899 +71,934 @@ msgstr "អំពី DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF ផ្លាស់ប្តួរកំណត់ហេតុ"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "កែសំរួលបញ្ជីរ"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "ចំណងជើង"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "ប្តូរឈ្មោះបញ្ជីរ"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "លុបបញ្ជីរ"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "បន្ថែមបញ្ជីរថ្មី"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "រក្សា DeaDBeeF EQ Preset"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "ផ្ទុក DeaDBeeF EQ Preset"
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "បញ្ចូល Foobar2000 EQ Preset..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "ផ្ទុកកំណត់ជាមុន"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "បញ្ចូល Foobar2000 EQ Preset..."
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "អនុញ្ញាត"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "សូន្យទាំងអស់"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "គ្មានប្រដាប់បំពងសំលេង"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "គ្មានក្រុមតន្ត្រី"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "ម៉ូណូ"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "ស្តេរេអូ"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "ផ្អាក"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "រក្សាបញ្ជីរជា"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "ផ្ទុកបញ្ជីរ"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "ឯកសារផ្សេងទៀត (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "បង្កើតបញ្ជីរថ្មី"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr ""
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "ទិន្នន៍យ"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "បើកទិន្នន៍យ"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "បញ្ចួលទិន្នន៍យ"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "បង្កើតថត"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "បង្កើតទីតាំង"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "បញ្ជីរថ្មី"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "ផ្ទុកបញ្ជីរ"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "រក្សាទុកបញ្ជីរ"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "ចាកចេញ"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "កែសំរួល"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "ជម្រះ"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "ជ្រើសទាំងអស់"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "ដោះជម្រើសទាំងអស់"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "ដាក់បញ្ច្រាសជម្រើស"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "ជម្រើស"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "យកចេញ"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "ច្រឹប"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "សែ្វងរក"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "ចំណងជើង"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "លេខឯកសារ"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "អ៉ាល់បុ៑ម"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "អ្នកនិពន្ធ"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "ចៃដន្យ"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "ផ្ទាល់ខ្លួន"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "ចំណង់ចំណូលចិត្ត"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "មើល"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "របាស្ថានភាព"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "ក្បាលជួរឈរ"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "ផ្ទាំង"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "ធ្វើអោយស្មើគ្នា"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "ចាក់សារថ្មី"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "លំដាប់"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "លីនេអែ៑រ"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr ""
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr ""
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "ចៃដន្យ"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "ការរង្វិលជុំ"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "រង្វិលជុំទាំងអស់"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "រង្វិលជុំមួយបទម្តង"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "កុំរង្វិលជុំ"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "រមូរចាក់សារថ្មី"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "បញ្ចប់បន្ទាប់ពីបច្ចុប្បន្ន"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "ជំនួយ"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "ផ្លាស់ប្តួរកំណត់ហេតុ"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "អំពី"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "ស្វែងរក"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "ឈប់"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "ចាក់"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "ផ្អាក"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "មុន"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "បន្ទាប់"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "ចាក់ចែដន្យ"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "អំពី"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "លះបង់"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "ដានលក្ខណះសម្បត្តិ"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "អនុវត្ត"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "បិទ"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "មេតាទិន្នន៍យ"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "លក្ខណះសម្បត្តិ"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr ""
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "ប្រភេទ"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "កំពុងលេង"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "តាក់តែងអ៉ាល់បុ៑ម"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "ម្ចាស់អ៉ាល់បុ៑ម"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr ""
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr ""
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "ក្រុម/ម្ចាស់អ៉ាល់បុ៑ម"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "ទ្រង់ទ្រាយ"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "តម្រឹម"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "ឆ្វេង"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "ស្តាំ"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "បោះបង់"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "យល់ព្រម"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "ទិន្នផលកម្មវីធីជំនួយ"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "សំលេង"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr ""
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "ដាន"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "បញ្ចប់បន្ទាប់ពីបច្ចុប្បន្ន"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
#, fuzzy
msgid "Playback"
msgstr "ចាក់សារថ្មី"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr ""
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr ""
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr ""
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr ""
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr ""
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr ""
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr ""
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "ទ្រង់ទ្រាយ"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "ជម្រើស"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr ""
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr ""
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr ""
@@ -971,7 +1006,7 @@ msgstr ""
msgid "Open file..."
msgstr ""
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr ""
@@ -980,19 +1015,23 @@ msgstr ""
msgid "Default Audio Device"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "បង្កើតទីតាំង"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -1004,138 +1043,144 @@ msgstr "កំពុងផ្ទុកទិន្នន៍យ"
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "បញ្ចួលទិន្នន៍យ"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "យកចេញ"
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr ""
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr ""
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr ""
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr ""
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1143,52 +1188,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1203,19 +1229,39 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1225,7 +1271,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "បង្កើតអូឌីយូសីឌី"
#: ../translation/extra.c:4
@@ -1241,7 +1288,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1270,480 +1317,787 @@ msgstr ""
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr ""
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "តាក់តែងអ៉ាល់បុ៑ម"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "ចំណងជើង"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "លេខឯកសារ"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "បង្កើតទីតាំង"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "ជ្រើសទាំងអស់"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "ទិន្នផលកម្មវីធីជំនួយ"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "ទិន្នផលកម្មវីធីជំនួយ"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "រក្សាទុកកំណត់ជាមុន"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "ផ្ទុកកំណត់ជាមុន"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "ទិន្នផលកម្មវីធីជំនួយ"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr ""
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr ""
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr ""
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "កែសំរួល"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "បិទ"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "បង្កើតទីតាំង"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "យកចេញ"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "បង្កើតបញ្ជីរថ្មី"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "បង្កើតទីតាំង"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "យកចេញ"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
#~ msgid "Save playlist as"
#~ msgstr "រក្សាទុកបញ្ជីរជា"
diff --git a/po/lg.po b/po/lg.po
index cecc28d8..5c08b23e 100644
--- a/po/lg.po
+++ b/po/lg.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.4.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2012-01-09 15:01+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-03-01 15:04+0200\n"
"Last-Translator: kizito <kbirabwa@yahoo.co.uk>\n"
"Language-Team: LANGUAGE <kbirabwa@yahoo.co.uk>\n"
"Language: lg\n"
@@ -54,9 +54,9 @@ msgstr "Nnemedwa okubikkula fayiro ey'obuyambi"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Nyamba"
@@ -70,859 +70,898 @@ msgstr "Okwanjula DeaDBeef %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Olukalala lw'enyukakyuka eziri mu DeadBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Abaavvuunula DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Kyusa mu lukalala lw'enyimba"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Mutwe:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Kyusa erinnya ly'olukalala lw'enyimba"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Gyawo olukalala lw'ennyimba"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Kolawo olukalala lw'enyimba olupya"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "kaza koppi y'enteekateeka y'obwangufu bw'amaloboozi ag'omu DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr ""
"Fayiro z'enteekateeka z'obwangufu bw'amaloboozi ag'omu DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr ""
"Soma fayiro y'enteekateeka z'obwangufu bw'amaloboozi ag'omu DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
"Fayiro z'enteekateeka z'obwangufu bw'amaloboozi ag'omu DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr ""
"Nona fayiro y'enteekateeka z'obwangufu bw'amalaboozi ey'ekika kya "
"Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
"fayiro z'enteekateeka z'obwangufu bw'amaloboozi ez'ekika kya Foobar2000 (*."
"feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Soma koppi y'ebiteekateekedwa"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Nona koppi y'ebiteekateekedwa ey'ekika kya Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Zuukusa"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Byonna bidde ku zero"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Ekikangalazaddoboozi ekisooka kisse ku zero"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Amaloboozi gonna gadde ku zero"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Koppi ez'ebiteekateekedwa ezaaterekebwa"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "Lunaku 1 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "Nnaku %d %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Eyimirizidwa | Ntambi %d | Awamu zimala %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Siteriyo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| kb %4d bs "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Luyimirizidwamu | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s%s| Hz %d | bbiti %d | %s | %d:%02d /%s | ntambi %d | Awamu zimala %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Kolawo koppi y'olukalala eyitibwe"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Nkalalala z'enyimba ez'omu DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Soma olukalalala lw'enyimba"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Fayiro endala (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Kolawo olukalalala olupya"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Lukalalala olupya (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fayiro"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Bikkula fayiro"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Teekako fayiro"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Teekako (ma)terekero"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Teekako obusangiro"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Kolwo olukalala olupya"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Soma olukalala lw'enyimba"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Kaza olukalala lw'enyimba"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Mala"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Kyusa"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Bisiimulewo"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Londa byonna"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Ta byonna"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Vuunika okulonda"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Ebirondedwa"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Bigyewo"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Bisagalewo byokka"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Zuula"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sengekera ku"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Erinnya"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Namba y'olutambi"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Alubamu"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Muluyimba"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Ennaku"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Muwawa"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Bye weteekateekedde"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Enteekateeka"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Endabika"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Olubaawo olulaga ebifa ku biwulirizibwa"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Mitwe ku nkumbo"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Obukonda"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekiteekateeka entabula y'amaloboozi"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Eby'em_puliriza"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ensengeka"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Ku ziva kumukumu"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Vunga ntambi"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Vunga alubamu"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Muwawa"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Eby'okuddiŋana"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Zonna ziddiŋane"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Ddiŋana oluyimba lumu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Toddiŋana"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Akaseesa kagoberere empuliriza y'enyimba"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Akasonga kagoberere empuliriza y'enyimba"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Luno bwe luggwa yimirira"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "Genda ku lutambi olutangaazidwa"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Nyamba"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Enkyukakyuka"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Kwanjula"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Abaavvuunula"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Noonya"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Yimirira"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Wuliriza"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Yimirizamu"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Olukulembedde"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Oluddako"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Wuliriza muwawa"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Kwanjula"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Mala"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Ebikwata ku lutambi"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Enteekateeka"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Bikaze"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Ggala"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Ebinyonyola"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Ebirufaako"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Wandikawo omutwe g'olukumba"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Kika:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Lukalala lw'ebirimu"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Oluliko"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Bifaananyi bya ku alubamu"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Muluyimba - Alubamu"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Obwuwanvu bwa lwo"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Namba y'olutambi"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Kibiina / Muluyimba w'alubamu"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Empandika:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Okwekubirira:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Ku kkono"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Ku ddyo"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Sazamu"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Kale"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Puloguramu efulumya ebiwulirizibwa:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Ebiwulirizibwa gye bifulumira:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Ebiwulirizibwa ebya bbiti 8 bifuulibwenga bya bbiti 16"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Kwogeza"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Maanyi g'eddoboozi ly'ebiwulirizibwa:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Gyako"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Lutambi"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Ekigero ky'amaanyi ge'ddoboozi ly'ebiwulirizibwa"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Maanyi g'eddoboozi ly'ebiwulirizibwa:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Genda ku lutambi olutangaazidwa:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Olukalala lw'ongereko fayiro nga weyambisa kiwandikiro (oba "
"ekiteekateekafayiro):"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
"Puloguramu bw'etandikibwa etandikirenga gye yakoma ku mulundi ogwasemba"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Luno bwe luggwa yimirira"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Eby'empuliriza"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Teekateeka"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr ""
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
"Ggala kireetera puloguramu okufuuka kafaananyi mu kakuŋaanyizo ka ku lubaawo"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Eppeesa ary'okukasongesebwa erya wakati libikka olukalala lw'enyimba"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Kisa akafaananyi ak'omu kakuŋaanyizo ka ku lubaawo"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Ku lukalala oluyimba oluwulirizibwa lulabikire mu nnukuta nziggumivu"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Ekya \"Siimula ku disiki\" kikise"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Omutwe gw'eddirisa ng'oluyimba luwulirizibwa:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Omutwe gw'eddirisa nga puloguramu eyimirizidwa:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Ebirabikira awakolerwa"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Ssawo enteekateeka eyiyo"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Bwanjo"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Bwaliriro"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Langi eziraga oluyimba we lutuuse/bwangufu bw'eddoboozi"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Langi eyawakkatikati"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Langi entangaavu"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Langi enzirugarivu"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Langi ey'omulamwa"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Bigambo"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Langi ez'oku bukonda"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Ssawo enteekateeka eyiyo (kiva ku lulyo lwa langi olwa sisitemu naye "
"kyanguya puloguramu okulabika)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Nnyiriri kagabanyizikamubbiri"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Nnyiriri zinantagabanyizikamubbiri"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Olunyiriri olulondedwa"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Ebigambo ebirondedwa"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Akasonga"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Langi ez'oku lukalala lw'enyimba"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Langi"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Kozesa ekiwereza kimasanganzira"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Endagiriro y'ekiwereza kimasanganzira:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Pooti y'ekiwereza kimasanganzira:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Kika ky'ekiwereza:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Erinnya ery'okukozesa ku kiwereza:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Ekyama eky'oku kiwereza:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Kayungirizi"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Puloguramu enyambi"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Lengera ku:"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Sengekera ku"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Empandika"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Puloguramu enyambi"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Wandika ebya ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Wandika ebya ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Wandika ebya APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Gyamu ebya ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Gyamu ebya ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Gyamu ebya APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Oluwandika lwa ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Tukuwa magezi ga kukozesa luno)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Enkongojja y'ebiwandike eby'omu ID3v1 (iso8859-1 y'eya bulijjo)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Wandika ebya ID32.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Muluyimba / Alubamu"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Namba y'olutambi"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Siimula fayiro ku disiki"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -930,49 +969,48 @@ msgstr ""
"Fayiro tekijjakusoboka kuzikomyawo. Ŋende mu maaso?\n"
"(Akaboozi kano osobola okukasirisiza mu nteekateeka z'omu GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Kulabula"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Lwongere ku lukalala lw'ebinaawulirizibwa"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Lugye mu lukalala lw'ebinaawulirizibwa"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Ddamu okusoma ebinnyonyola"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Luggire ddala ku sisitemu"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Yongerako oukumbo"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Kyusa mu lukumbo"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Gyawo olukumbo"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Sengekera ku"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Tosengeka"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Muyimbi/Amafuluma/Alubamu"
@@ -980,7 +1018,7 @@ msgstr "Muyimbi/Amafuluma/Alubamu"
msgid "Open file..."
msgstr "Bikkula fayiro..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Teekateeka"
@@ -989,19 +1027,23 @@ msgstr "Teekateeka"
msgid "Default Audio Device"
msgstr "Ekyuma ekikola ku biwulirizibwa bulijjo"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Kaza"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Teekateeka amapeesa g'oyinza okukozesa okwanguya mirimu"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Kiragiro"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Teekako obusangiro"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Ppeesa oba mapeesa"
@@ -1013,153 +1055,158 @@ msgstr "Nyongerako fayiro..."
msgid "Initializing..."
msgstr "Nteekateeka..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Okyusizza mu data y'olutambi luno."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Eddirisa lino ddala liggalibwewo?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ppeesa"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Ekikongojje"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Eddirisa lino ddala liggalibwewo?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Teekako fayiro"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Bigyewo"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Enkozesa entuufu eri: deadbeef [buwayiro][fayiro]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Obuwayiro:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
" --help oba -h Bw'ossawo kamu ku buno, okoma ku kufuna bino "
"by'osoma\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Kano kaleetera puloguramu okumala\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
" --version Kano kaleetera puloguramu okukoma ku kukulaga "
"olwandika lwa yo\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Kano kaleetera pulguramu okutandika enyimba\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Kano kaleetera pulguramu okukomya oluyimba\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
" --pause Kano kaleetera puloguramu okuyimirizamu oluyimba\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
" --next Kano kaleetera puloguramu okutandika oluyimba oluddako "
"mu lukalala\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
" --prev Kano kaleetera puloguramu okutandika olukulembera "
"lw'ebadde ko mu lukalala\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
" --random Kano kaleetera puloguramu okuyita mu nyimba muwawa\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Kano kaleetera puloguramu okwongera nyimba ku "
"lukalala\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Kano kaleetera puloguramu okuwandikawo erinnya "
"ly'olutambi\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1173,7 +1220,7 @@ msgstr ""
" r: Ebikugizo by'obwa nannyini, e: Ekitundu ky'oluyimba "
"ekiwulirizidwako\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1182,50 +1229,26 @@ msgstr ""
" okugeza.: --nowplaying \"%%a - %%t\" kisuubirwa "
"okuvaamu \"muyibi - linnya lya luyimba\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Olukwatakifo"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ye"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nedda"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Tukuwa magezi kukozesa luno)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Gyako\n"
-"Lutambi\n"
-"Alubamu"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1252,7 +1275,7 @@ msgstr ""
"Kibiina / Muyimbi wa alubamu\n"
"Ebigambo ebibyo"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1260,13 +1283,38 @@ msgstr ""
"Kkono\n"
"Dyo"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Gyako\n"
+"Lutambi\n"
+"Alubamu"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Tukuwa magezi kukozesa luno)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Fayiro erimu ekifaananyi embuze: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1279,7 +1327,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1296,7 +1344,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Omutwe gw'eddirisa nga puloguramu eyimirizidwa:"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1329,488 +1377,810 @@ msgstr "Ekyama eky'oku kiwereza:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Siimula fayiro ku disiki"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Bifaananyi bya ku alubamu"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Namba y'olutambi"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Erinnya / Muluyimba w'olutambi"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Namba ya fayiro"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Teekako obusangiro"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Bika by'okunnyonyola"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Endagiriro y'entegeka y'enyimba ey'omunda"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Puloguramu ekola ku data enkongojje"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Kozesa ekiwereza kimasanganzira"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Londa byonna"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Kyusa mu lukumbo"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Ebiwulirizibwa gye bifulumira:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Puloguramu efulumya ebiwulirizibwa:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Tereka koppi y'ebiteekateekedwa"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Ssawo enteekateeka eyiyo"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Soma koppi y'ebiteekateekedwa"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Puloguramu efulumya ebiwulirizibwa:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Wandika ebya APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Wandika ebya ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Wandika ebya ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Ekiwandika okunnyonyola kw'enyimba"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Ssawo enteekateeka eyiyo"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Kyusa"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Ggala"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Kyusa mu lukumbo"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Vunga ntambi"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Erinnya / Muluyimba w'olutambi"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Teekako obusangiro"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Bigyewo"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Kolawo olukalalala olupya"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Yongerako oukumbo"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Teekateeka"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Enteekateeka"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Ebirabikira awakolerwa"
+
+#~ msgid "Slot"
+#~ msgstr "Kiragiro"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Eddirisa lino ddala liggalibwewo?"
+
#~ msgid "Save playlist as"
#~ msgstr "Kolayo koppi y'olukalala"
diff --git a/po/lt.po b/po/lt.po
index 22cd6d55..a8048e27 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -1,1186 +1,1226 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+# Algimantas <margevicius.algimantas@mail.ru>, 2012.
+# Algimantas Margevičius <margevicius.algimantas@gmail.com>, 2012.
#
msgid ""
msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-03-05 22:43+0200\n"
-"Last-Translator: Julius <zadintuvas@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-09-04 07:44+0300\n"
+"Last-Translator: Algimantas Margevičius <margevicius.algimantas@gmail.com>\n"
+"Language-Team: Lietuvių <>\n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
-"%100<10 || n%100>=20) ? 1 : 2);\n"
+"%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
msgid "Supported sound formats"
-msgstr ""
+msgstr "Palaikomi garso formatai"
#: ../plugins/gtkui/callbacks.c:134
msgid "All files (*)"
-msgstr ""
+msgstr "Visi failai (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
-msgstr ""
+msgstr "Atverti failą(-us)..."
#: ../plugins/gtkui/callbacks.c:179
msgid "Add file(s) to playlist..."
-msgstr ""
+msgstr "Pridėti failą(-us) į grojaraštį..."
#: ../plugins/gtkui/callbacks.c:220
msgid "Add folder(s) to playlist..."
-msgstr ""
+msgstr "Pridėti aplanką(-us) į grojaraštį..."
#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
-msgstr ""
+msgstr "Sekti simbolines nuorodas"
#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
-msgstr ""
+msgstr "Klaida skaitant pagalbos failą"
#: ../plugins/gtkui/callbacks.c:721
msgid "Failed to load help file"
-msgstr ""
+msgstr "Pagalbos failo įkelti nepavyko"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
-msgstr ""
+msgstr "Žinynas"
#: ../plugins/gtkui/callbacks.c:747
#, c-format
msgid "About DeaDBeeF %s"
-msgstr ""
+msgstr "Apie DeaDBeeF %s"
#: ../plugins/gtkui/callbacks.c:760
#, c-format
msgid "DeaDBeeF %s ChangeLog"
-msgstr ""
+msgstr "DeaDBeeF %s keitimų žurnalas"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
-msgstr ""
+msgstr "DeaDBeeF Vertėjai"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
-msgstr ""
-
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+msgstr "Keisti grojaraštį"
+
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
-msgstr ""
+msgstr "Pavadinimas:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
-msgstr ""
+msgstr "Pervadinti grojaraštį"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
-msgstr ""
+msgstr "Pašalinti grojaraštį"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
-msgstr ""
+msgstr "Pridėti naują grojaraštį"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
-msgstr ""
+msgstr "Išsaugoti DeadBeef EQ nustatymų rinkinį"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
-msgstr ""
+msgstr "DeaDBeeF EQ nustatymų rinkiniai (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
-msgstr ""
+msgstr "Įkelti DeaDBeeF EQ nustatymų rinkinį..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
-msgstr ""
+msgstr "DeaDBeeF EQ nustatymų rinkiniai (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
-msgstr ""
+msgstr "Importuoti Foobar2000 EQ nustatymų rinkinį..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
-msgstr ""
+msgstr "Foobar2000 EQ nustatymų rinkiniai (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
-msgstr ""
+msgstr "Įrašyti nustatymų rinkinį"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
-msgstr ""
+msgstr "Įkelti nustatymų rinkinį"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
-msgstr ""
+msgstr "Importutoi Foobar2000 nustatymų rinkinį"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
-msgstr ""
+msgstr "Įjungti"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
-msgstr ""
+msgstr "Atstatyti visus"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
-msgstr ""
+msgstr "Atstatyti Preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
-msgstr ""
+msgstr "Atstatyti Bands"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr ""
+msgstr "Nustatymų rinkiniai"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
-msgstr ""
+msgstr "1 diena %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
-msgstr ""
+msgstr "%d dienos %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
-msgstr ""
+msgstr "Sustabdyta | %d takeliai | %s bendras grojimo laikas"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
-msgstr ""
+msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
-msgstr ""
+msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
-msgstr ""
+msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
-msgstr ""
+msgstr "Sustabdyta | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d takeliai | %s bendras "
+"grojimo laikas"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
-msgstr ""
+msgstr "Išsaugoti grojaraštį kaip"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
-msgstr ""
+msgstr "DeaDBeeF grojaraščio failai (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
-msgstr ""
+msgstr "Įkelti grojaraštį"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
-msgstr ""
+msgstr "Kiti failai (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
-msgstr ""
+msgstr "Naujas grojaraštis"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
-msgstr ""
+msgstr "Naujas grojaraštis (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr "- Išbandyti atsijungimo funkcionalumą"
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
-msgstr ""
+msgstr "_Failas"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
-msgstr ""
+msgstr "_Atverti failą(-us)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
-msgstr ""
+msgstr "Pridėti failą (-us)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
-msgstr ""
+msgstr "Pridėti aplanką(-us)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
-msgstr ""
+msgstr "Pridėti vietą"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
-msgstr ""
+msgstr "Naujas grojaraštis"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
-msgstr ""
+msgstr "Įkelti grojaraštį"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
-msgstr ""
+msgstr "Išsaugoti grojaraštį"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
-msgstr ""
+msgstr "I_šeiti"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
-msgstr ""
+msgstr "K_eisti"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
-msgstr ""
+msgstr "Iš_valyti"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
-msgstr ""
+msgstr "Pasirinkti visus"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
-msgstr ""
+msgstr "Atžymėti viską"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
-msgstr ""
+msgstr "Atvirkštinis pasirinkimas"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+msgstr "Pasirinkimas"
+
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
-msgstr ""
+msgstr "Pašalinti"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
-msgstr ""
+msgstr "Apkirpti"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+msgstr "_Ieškoti"
+
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
+msgstr "Rikiuoti pagal"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
-msgstr ""
+msgstr "Pavadinimas"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr ""
+msgstr "Takelio numeris"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
-msgstr ""
+msgstr "Albumas"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
-msgstr ""
+msgstr "Atlikėjas"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "Data"
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Atsitiktine tvarka"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
-msgstr ""
+msgstr "Pasirinkta"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
-msgstr ""
+msgstr "Nustatymai"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
-msgstr ""
+msgstr "R_odymas"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
-msgstr ""
+msgstr "Būsenos juosta"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
-msgstr ""
+msgstr "Stulpelio antraštės"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
-msgstr ""
+msgstr "Kortelės"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
-msgstr ""
+msgstr "Ekvalaizeris"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
-msgstr ""
+msgstr "_Atkūrimas"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
-msgstr ""
+msgstr "Tvarka"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
-msgstr ""
+msgstr "Linijinis"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr ""
+msgstr "Maišyti takelius"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr ""
+msgstr "Maišyti albumus"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
-msgstr ""
+msgstr "Kartojimas"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
-msgstr ""
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
+msgstr "Kartoti visus"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
-msgstr ""
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
+msgstr "Kartoti vieną dainą"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
-msgstr ""
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
+msgstr "Nekartoti"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
-msgstr ""
+msgstr "Slinkimas seka atkūrimą"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
-msgstr ""
+msgstr "Žymeklis seka atkūrimą"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
-msgstr ""
+msgstr "Sustabdyti po dabartinės dainos"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "Peršokti į dabartinį takelį"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
-msgstr ""
+msgstr "_Žinynas"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
-msgstr ""
+msgstr "_Keitimų žurnalas"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
-msgstr ""
+msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
-msgstr ""
+msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
-msgstr ""
+msgstr "_Apie"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
-msgstr ""
+msgstr "_Vertėjai"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
-msgstr ""
+msgstr "Ieškoti"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
-msgstr ""
+msgstr "Stabdyti"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
-msgstr ""
+msgstr "Groti"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
-msgstr ""
+msgstr "Pristabdyti"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
-msgstr ""
+msgstr "Ankstesnis"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
-msgstr ""
+msgstr "Sekantis"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
-msgstr ""
+msgstr "Atsitiktinis grojimas"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
-msgstr ""
+msgstr "Apie"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
-msgstr ""
+msgstr "Išeiti"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
-msgstr ""
+msgstr "Takelio savybės"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Nustatymai"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
-msgstr ""
+msgstr "Prit_aikyti"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
-msgstr ""
+msgstr "_Užverti"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
-msgstr ""
+msgstr "Metaduomenys"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
-msgstr ""
+msgstr "Savybės"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
-msgstr ""
+msgstr "Įveskite naujo stulpelio pavadinimą čia"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
-msgstr ""
+msgstr "Tipas:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "Elementų rodyklė"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
-msgstr ""
+msgstr "Atkuriama"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
-msgstr ""
+msgstr "Albumo dizainas"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
-msgstr ""
+msgstr "Atlikėjas - Albumas"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
-msgstr ""
+msgstr "Trukmė"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
-msgstr ""
+msgstr "Takelio numeris"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr ""
+msgstr "Grupė / Albumo atlikėjas"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
-msgstr ""
+msgstr "Formatas:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
-msgstr ""
+msgstr "Lygiavimas:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
-msgstr ""
+msgstr "Kairė"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
-msgstr ""
+msgstr "Dešinė"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
-msgstr ""
+msgstr "_Atsisakyti"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
-msgstr ""
+msgstr "_Gerai"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
-msgstr ""
+msgstr "Išvesties įskiepis:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
-msgstr ""
+msgstr "Išvesties įrenginys:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "8 bitų audio visada konvertuoti į 16 bitų"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
-msgstr ""
+msgstr "Garsas"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
-msgstr ""
+msgstr "Garsinimo režimas:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
-msgstr ""
+msgstr "Išjungti"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
-msgstr ""
+msgstr "Takelis"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
-msgstr ""
+msgstr "Garsinimo mastelis"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr ""
+msgstr "Pagarsinimo lygis:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Bendras pagarsinimas:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
+"Į grojaraštį pridėti failus iš komandinės eilutės (ar failų tvarkyklės):"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
-msgstr ""
+msgstr "Paleidus programą tęsti ankstesnę sesiją"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Prideant aplankus, nepridėti failų iš archyvų"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr "Automatiškai atstatyti „Sustabdyti po dabartinės dainos“"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
-msgstr ""
+msgstr "Atkūrimas"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
-msgstr ""
+msgstr "Konfigūruoti"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr ""
+msgstr "DSP Chain nustatymų rinkinys"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "_Įkelti"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
-msgstr ""
+msgstr "Uždaryti į sistemos dėklą"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
-msgstr ""
+msgstr "Vidurinis pelės kalvišas užveria grojaraštį"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
-msgstr ""
+msgstr "Nerodyti sistemos dėklo piktogramos"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
-msgstr ""
+msgstr "Dabar grojančiam failui naudoti paryškintą šriftą"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
-msgstr ""
+msgstr "Kontekstiniame meniu nerodyti „Pašalinti iš disko“"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
-msgstr ""
+msgstr "Pridedant tik vieną aplanką, grojaraštį pavadinti automatiškai"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr "Įgalinti Rusiškos CP1251 koduotės aptikimą ir perkodavimą"
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr "Įgalinti Kinietiškos CP936 koduotės aptikimą ir perkodavimą"
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
-msgstr ""
+msgstr "Sąsajos atnaujinimo dažnis (kartai per sekundę):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
-msgstr ""
+msgstr "Pavadinimo juostos tekstas atkuriant:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
-msgstr ""
+msgstr "Pavadinimo juostos tekstas sustabdžius:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
+"Grafinės sąsajos įskiepis (pakeitimam įsigalioti, reikia paleisti iš naujo):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr ""
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr "GUI/Kita"
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
-msgstr ""
+msgstr "Perrašyti"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
-msgstr "Priekis"
+msgstr "Priekinis planas"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
-msgstr ""
+msgstr "Fonas"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
-msgstr ""
+msgstr "Prasukimo juostos/Garso juostos spalvos"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
-msgstr ""
+msgstr "Vidurinis"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
-msgstr ""
+msgstr "Šviesus"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
-msgstr ""
+msgstr "Tamsus"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
-msgstr ""
+msgstr "Bazinis"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
-msgstr ""
+msgstr "Tekstas"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
-msgstr ""
+msgstr "Kortelės spalvos"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
+"Perašyti (bus prarasta GTK medžio peržiūra, bet pagreitės atvaizdavimas)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
-msgstr ""
+msgstr "Lyginės eilutės"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
-msgstr ""
+msgstr "Nelyginės eilutės"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
-msgstr ""
+msgstr "Pasirinktos eilutės"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
-msgstr ""
+msgstr "Pažymėtas tekstas"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
-msgstr ""
+msgstr "Žymeklis"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
-msgstr ""
+msgstr "Grojaraščio spalvos"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
-msgstr ""
+msgstr "Spalvos"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
-msgstr ""
+msgstr "Įjungti tarpinį serverį"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
-msgstr ""
+msgstr "Tarpinis serveris:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
-msgstr ""
+msgstr "Tarpinio serverio prievadas:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
-msgstr ""
+msgstr "Tarpinio serverio tipas:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
-msgstr ""
+msgstr "Tarpinio serverio naudotojo vardas:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
-msgstr ""
+msgstr "Tarpinio serverio slaptažodis:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr "HTTP naudotojo agentas:"
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
-msgstr ""
+msgstr "Tinklas"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "Versija: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
-msgstr ""
+msgstr "Autorinės teisės"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
-msgstr ""
+msgstr "Įskiepiai"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
-msgstr ""
+msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
-msgstr ""
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
+msgstr "Grupuoti pagal"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Rikiuoti pagal..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
-msgstr ""
+msgstr "Formatas"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "Didėjantis"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "Mažėjantis"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr ""
+msgstr "Pasirinkti DSP įskeipį"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr ""
+msgstr "Įskiepis"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr ""
+msgstr "Žymių rašymo nustatymai"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
-msgstr ""
+msgstr "Rašyti ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
-msgstr ""
+msgstr "Rašyti ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
-msgstr ""
+msgstr "Rašyti APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
-msgstr ""
+msgstr "Šalinti ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
-msgstr ""
+msgstr "Šalinti ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
-msgstr ""
+msgstr "Šalinti APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
-msgstr ""
+msgstr "ID3v2 versija"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
-msgstr ""
+msgstr "2.3 (Rekomenduojama)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
-msgstr ""
+msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
-msgstr ""
+msgstr "ID3v1 simbolių koduotė (numatyta iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
-msgstr ""
+msgstr "Rašyti ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
-msgstr ""
+msgstr "Atlikėjas / Albumas"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
-msgstr ""
+msgstr "Takelio numeris"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
-msgstr ""
+msgstr "Šalinti failus iš disko"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
+"Failai bus prarasti. Tęsti?\n"
+"(Šis dialogas gali būti išjungtas GTKUI įskiepio nustatymuose)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
-msgstr ""
+msgstr "Įspėjimas"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
-msgstr ""
+msgstr "Pridėti į atkūrimo eilę"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
-msgstr ""
+msgstr "Pašalinti iš atkūrimo eilės"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
-msgstr ""
+msgstr "Iš naujo įkelti meta duomenis"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
-msgstr ""
+msgstr "Pašalinti iš disko"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
-msgstr ""
+msgstr "Pridėti stulpelį"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
-msgstr ""
+msgstr "Keisti stulpelį"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
-msgstr ""
+msgstr "Pašalinti stulpelį"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
-msgstr ""
+msgstr "Grupuoti pagal"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
-msgstr ""
+msgstr "Nieką"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
-msgstr ""
+msgstr "Atlikėjas/Data/Albumas"
#: ../plugins/gtkui/pluginconf.c:42
msgid "Open file..."
-msgstr ""
+msgstr "Atverti failą..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
-msgstr ""
+msgstr "Konfigūruoti %s"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
-msgstr ""
+msgstr "Numatytasis audio įrenginys"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
-msgstr ""
+msgstr "Pridėti"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
-msgstr ""
+msgstr "Bendri karštieji klavišai"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
+msgstr "Veiksmas"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
-msgstr ""
+msgstr "Klavišų kombinacija"
#: ../plugins/gtkui/progress.c:56
msgid "Adding files..."
-msgstr ""
+msgstr "Pridedami failai..."
#: ../plugins/gtkui/progress.c:90
msgid "Initializing..."
-msgstr ""
+msgstr "Inicializuojama..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
-msgstr ""
+msgstr "Jūs pakeitėte šio takelio duomenis."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
-msgstr ""
+msgstr "Tikrai užverti šį langą?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr ""
+msgstr "[Keletas reikšmių]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
-msgstr ""
+msgstr "Raktas"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
-msgstr ""
+msgstr "Reikšmė"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "Rašomos žymės..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "Pavadinimas:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "Laukelių vardai negali prasidėti: tarpu ar _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "Pridėti laukelio nepavyko"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
-msgstr ""
+msgstr "Laukelis su tokiu vardu jau yra, pabandykite kitą vardą."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr ""
+msgstr "Pridėti lauką"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr ""
+msgstr "Pašalinti lauką"
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
-msgstr ""
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
+msgstr "Naudojimas: deadbeef [parinktys][failai]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
-msgstr ""
+msgstr "Parinktys:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
-msgstr ""
+msgstr " --help ar -h Parodo pagalbos langą (šį) ir išeina\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
-msgstr ""
+msgstr " --quit Užverti grotuvą\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
-msgstr ""
+msgstr " --version Parodyti versijos informaciją ir išeiti\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
-msgstr ""
+msgstr " --play Atkūrti\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
-msgstr ""
+msgstr " --stop Sustabdyti\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
-msgstr ""
+msgstr " --pause Pristabdyti\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause Perjungti sustabdymą\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr ""
+msgstr " --play-pause Jei sustabdyta atkurti, jei grojama sustabdyti\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
-msgstr ""
+msgstr " --next Sekanti grojaraščio daina\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
-msgstr ""
+msgstr " --prev Ankstesnė grojaraščio daina\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
-msgstr ""
+msgstr " --random Atsitiktinė daina grojaraštyje\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
+msgstr " --queue Pridėti failą(-us) į esamą grojaraštį\n"
+
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
msgstr ""
+" --gui ĮSKIEPIS Nurodo kurį GUI įskiepį naudoti, numatytasis yra "
+"„GTK2“\n"
-#: ../main.c:105
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
-msgstr ""
+msgstr " --nowplaying FMT Nusiųsti formatuotą takelių sąrašą į stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
+" FMT %%-sintaksė: [a]rtist, [t]itle, al[b]um,\n"
+" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
+" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
+" pvz.: --nowplaying \"%%a - %%t\" turėtų atvaizduoti "
+"„atlikėjas - pavadinimas“\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+" plačiau http://sourceforge.net/apps/mediawiki/deadbeef/"
+"index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
-msgstr ""
+msgstr "Numatyta"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
-msgstr ""
+msgstr "Taip"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
+msgstr "Ne"
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1194,530 +1234,900 @@ msgid ""
"Band / Album Artist\n"
"Custom"
msgstr ""
+"Elementų rodyklė\n"
+"Atkuriama\n"
+"Albumo dizainas\n"
+"Atlikėjas - Albumas\n"
+"Atlikėjas\n"
+"Albumas\n"
+"Pavadinimas\n"
+"Trukmė\n"
+"Takelio numeris\n"
+"Grupė / Albumo atlikėjas\n"
+"Pasirinkta"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+"Kairė\n"
+"Dešinė"
+
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Išjungti\n"
+"Takelis\n"
+"Albumas"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Mažėjančiai\n"
+"Didėjančiai"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Rekomenduojama)\n"
+"2.4"
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
-msgstr ""
+msgstr "Pixmap failo rasti nepavyko: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
"package, or specify path to freepats.cfg in the plugin settings."
msgstr ""
+"wildmidi: freepats konfigūracijos failas nerastas. Įdiekite timidity-"
+"freepats paetą, arba įskiepio nustatymuose nurodykite kelią iki freepats.cfg."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
-msgstr ""
+msgid "Add audio CD"
+msgstr "Pridėti Audio CD"
#: ../translation/extra.c:4
msgid "Lookup on Last.fm"
-msgstr ""
+msgstr "Ieškoti Last.fm"
#. ALSA output plugin
#: ../translation/extra.c:6
msgid "Use ALSA resampling"
-msgstr ""
+msgstr "Naudoti ALSA diskretizaciją"
#: ../translation/extra.c:7
msgid "Release device while stopped"
-msgstr ""
+msgstr "Sustabdžius atlaisvinti įrenginį"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
-msgstr ""
+msgstr "Pageidaujamas buferio dydis"
#: ../translation/extra.c:9
msgid "Preferred period size"
-msgstr ""
+msgstr "Pageidaujamas periodo dydis"
#. Last.fm plugin
#: ../translation/extra.c:11
msgid "Enable scrobbler"
-msgstr ""
+msgstr "Įjungti „scrobbler“"
#: ../translation/extra.c:12
msgid "Disable nowplaying"
-msgstr ""
+msgstr "Išjungti „dabar grojama“"
#: ../translation/extra.c:13
msgid "Username"
-msgstr ""
+msgstr "Naudotojas"
#: ../translation/extra.c:14
msgid "Password"
-msgstr ""
+msgstr "Slaptažodis"
#: ../translation/extra.c:15
msgid "Scrobble URL"
-msgstr ""
+msgstr "Scrobble URL"
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr "Primenybę teikti albumo atlikėjo, o ne atlikėjo laukeliui"
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
-msgstr ""
+msgstr "Įrenginio failas"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "OSS4 diskretizacijos dažnio klaidos sprendimas"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr ""
+msgstr "Podėlio atnaujinimo dažnis (hr)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
-msgstr ""
+msgstr "Gauti iš įterptų žymių"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
-msgstr ""
+msgstr "Gauti iš vietinio aplanko"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
-msgstr ""
+msgstr "Vietinio viršelio failo kaukė"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
-msgstr ""
+msgstr "Gauti iš last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
-msgstr ""
+msgstr "Gauti iš albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Taikyti albumo dizainą prie ilgesnės pusės"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
-msgstr ""
+msgstr "Naudoti CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "Jei įmanoma naudoti CD-tekstą, o ne CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
-msgstr ""
+msgstr "CDDB url (pvz. „freedb.org“)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
-msgstr ""
+msgstr "CDDB prievadas (pvz. „888“)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "Jei įmanoma naudoti CDDB protokolą, o ne HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
-msgstr ""
+msgstr "Įjungti NRG atvaizdžių palaikymą"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
-msgstr ""
+msgstr "Diskretizacijos kokybė (0..2, didesnė yra geriau)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr "8-bitų išvestis (numatytoji yra 16)"
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
-msgstr ""
+msgstr "Didžiausia dainos trukmė (minutėmis)"
+
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr "Išblankimo trukmė (sekundėmis)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr "Kiek kartų kartoti ciklus (jei įmanoma)"
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
-msgstr ""
+msgstr "Šalinant failus iš disko prašyti patvirtinimo"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
-msgstr ""
+msgstr "Būsenos piktogramos garso valdymo jautrumas"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
-msgstr ""
+msgstr "Pasirinktinė būsenos piktograma"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
-msgstr ""
+msgstr "Vykdyti gtk_init su --sync (derinimo režimas)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "Tarp įskiepio kontekstinio meniu elementų pridėti skirtukus"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr ""
+msgstr "Pranešimų pavadinimo formatas"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr ""
+msgstr "Pranešimų turinio formatas"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr ""
+msgstr "Rodyti albumo dizainą"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Albumo dizaino dydis (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
-msgstr ""
+msgstr "PulseAudio serveris"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
-msgstr ""
+msgstr "Diskretizavimo dažnis"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
-msgstr ""
+msgstr "Reliatyvus prasukimo kortelės kelias"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
-msgstr ""
+msgstr "Absoliutus prasukimo kortelės kelias"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
-msgstr ""
+msgstr "Sukeisti audio bitus (perjunkite jei girdite trukdžių)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr ""
+msgstr "Įjungti HVSC dainų trukmių DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Dainutrukmes.txt (iš HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Bitai per diskretizaciją (8 arba 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr ""
+msgstr "Numatyta dainos trukmė (s)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
-msgstr ""
+msgstr "Timidity++ tuščias konfigūracijos failas"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
-msgstr ""
+msgstr "Takelio pavadinimas"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
-msgstr ""
+msgstr "Atlikėjas"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
-msgstr ""
+msgstr "Viso takelių"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
-msgstr ""
+msgstr "Žanras"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
-msgstr ""
+msgstr "Kompozitorius"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
-msgstr ""
+msgstr "Disko numeris"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
-msgstr ""
+msgstr "Komentaras"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
-msgstr ""
+msgstr "Koduotojas / Gamintojas"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
-msgstr ""
+msgstr "Vieta"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
-msgstr ""
+msgstr "Potakelio rodyklė"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
-msgstr ""
+msgstr "Žymių tipas(-ai)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
-msgstr ""
+msgstr "Įterptasis Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
-msgstr ""
+msgstr "Kodekas"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Failų plėtiniai (atskirti „;“)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Konvertuoti"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
-msgstr ""
+msgstr "Paskirties diskretizacijos dažnis"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
-msgstr ""
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
+msgstr "Kokybė / Algoritmas"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
-msgstr ""
+msgstr "Automatinis diskretizacijos dažnis (perrašo Paskirties dažnį)"
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr "Konfigūruoti pasirinktines shell komandas"
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr "Išjungti „gapless“ atkūrimą (greičiau skanuoja)"
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr "Pirmenybę teikti Ken emu, o ne Satoh (erdvinis garsas neveiks)"
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr "Įjungti erdvinį garsą"
-#: ../plugins/converter/convgui.c:108
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
-msgstr ""
+msgstr "Failas jau egzistuoja. Perrašyti?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
-msgstr ""
+msgstr "Konverterio įspėjimas"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "Prašome pasirinkti koduotoją"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Konverterio klaida"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Konvertuojama..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr ""
+msgstr "Pasirinkite aplanką..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "Koduotojo nustatymų rinkinio išsaugoti nepavyko"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
+"Patikrinkite nustatymų rinkinio leidimus, pabandykite kitą pavadinimą ar "
+"atlaisvinkite diske vietos"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
-msgstr ""
+msgstr "Nustatymų rinkinys su tokiu vardu jau yra. Pasirinkite kitą vardą."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Klaida"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Pridėti naują koduotoją"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr ""
+msgstr "Keisti koduotoją"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr ""
+msgstr "Pašalinti nustatymų rinkinį"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
-msgstr ""
+msgstr "Bus pašalintas pasirinktas nustatymų rinkinys. Ar jūs įsitikinę?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "Koduotojai"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr ""
+msgstr "Į DSP grandinę pridėti įskiepį"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "Naujo DSP nustatymų rinkinio išsaugoti nepavyko"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr ""
+msgstr "Naujas DSP nustatymų rinkinys"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr ""
+msgstr "Keisti DSP nustatymų rinkinį"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr ""
+msgstr "DSP nustatymų rinkiniai"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
-msgstr ""
+msgstr "Paskirties aplankas:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr "Rašyti į takelio šaltinio aplanką"
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr "Išlaikyti aplanko struktūrą"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr ""
+msgstr "Išvesties failas:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"Plėtinys (pvz. .mp3) bus pridėtas automatiškai.\n"
+"Jei paliksite tuščią laukelį, bus naudojamas numatytasis (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "Koduotojas:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr ""
+msgstr "DSP nustatymų rinkinys:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "Kopijų skaičius:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "Išvesties pavyzdžio formatas:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "Palikti šaltinio formatą"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "16 bit signed int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "24 bit signed int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "32 bit signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "32 bit float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "Kai failas jau yra:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "Paklausti"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr ""
+msgstr "Perrašyti"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr ""
+msgstr "Keisti koduotojo nustatymų rinkinį"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "Nepavadintas koduotojas"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr ""
+msgstr "Išvesties failo plėtinys:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "Pvz. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "Komandinė eilutė:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"Pavyzdys: lame - %o\n"
+"%i įvesties failui, %o išvesties failui, - stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>%o - išvesties failas\n"
+"%i - laikinas įvesties failas</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "Metodas:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "Kanalas"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "Laikinas failas"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
-msgstr ""
+msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
-msgstr ""
+msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
-msgstr ""
+msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr ""
+msgstr "<b>Žymių rašyklė</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "DSP nustatymų rinkinių redaktorius"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "Nepavadintas DSP nustatymų rinkinys"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"Išlaikyti šaltinio formatą\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
msgstr ""
+"Paklausti\n"
+"Perrašyti"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"Kanalas\n"
+"Laikinas failas"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr "Pasirinktinės shell komandos"
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr "Keisti"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr "Užverti"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr "Keisti komandą"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr "Komanda:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+"Sutartinė shell komanda. Bus įvykdyta tokiam shell kontekste kokiame buvo "
+"paleista programa. Galima naudoti pavadinimo formatą. Pvz. xdg-open %D"
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr "ID:"
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr "Laisva forma, pavyzdžiui „Mano shell komanda“"
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+"Komandos ID, tai turėtų būti kažkas trumpo, pvayzdžiui „youtube_atverti“. "
+"Negali kartotis."
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr "Pavieniai takeliai"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr "Veikia su vienu takeliu."
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr "Keletas takelių"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr "Veikia su keliais takeliais."
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr "Vietinis"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr "Veikia su vietiniais failais."
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr "Nutolęs"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr "Veikia su nutolusiais failais (pvz. http:// streams)"
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+msgid "Playlist"
+msgstr "Grojaraštis"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr "Elementas turėtų pasirodyti grojaraščio kortelės kontekstiniame meniu"
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr "Bendras"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr "Elementas turėtų atsirasti pagrindiniame meniu"
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr "Pridėti komandą"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr "Pašalinti"
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Bus pašalinta pasirinkta shell komanda. Ar jūs įsitikinę?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr "Patvirtinti pašalinimą"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr "ID negali būti tuščias ar kartotis.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr "Pavadinimas negali būti tuščias.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr "Shell komanda negali būti tuščia.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr "Netinkamos reikšmės"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr "Failas nėra tinkamas .desktop failas"
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr "Neatpažinta „desktop“ failo versija „%s“"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr "Paleidžiama %s"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr "Programa nepriema dokumentų per komandinę eilutę"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr "Neatpažinta paleidimo pasirinktis: %d"
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr "Perduoti dokumentų URI į 'Type=Link' darbastalio failo įrašą neįmanoma"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr "Nevykdomasis įrašas"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr "Išjungti prisijungimą prie sesijos tvarkyklės"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr "Nurodyti failą kuriame saugoma konfigūracija"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr "FAILAS"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr "Nurodykite seanso valdymo ID"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr "ID"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr "Sesijos valdymo parinktys:"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr "Rodyti sesijos valdymo pasirinktis"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Tikrai pašalinti pasirinktą laukelį?"
+
+#~ msgid "GUI"
+#~ msgstr "Grafinė sąsaja"
diff --git a/po/nb.po b/po/nb.po
index 4bfe5fd5..1ba55af4 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-12-10 14:09+0200\n"
"Last-Translator: Sam <wilsonsamm@hotmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -55,9 +55,9 @@ msgstr "Klarte ikke lese inn veilederfila"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Hjelp"
@@ -71,895 +71,926 @@ msgstr "Om DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s - endringslogg"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Rediger spilleliste"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Gi nytt navn til spillelista"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Fjern spillelista"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Legg til spilleliste"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Lagre DeaDBeeF EQ-forhåndstilling"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ-forhåndstillingsfiler (*.ddbeq)"
# har merka denne som fuzzy fordi jeg var litt usikker på orddelingsregelen her.
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
#, fuzzy
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Les inn DeaDBeeF EQ-forhåndstilling"
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr ""
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr ""
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr ""
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr ""
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Andre filer (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr ""
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr ""
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr ""
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr ""
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr ""
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr ""
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr ""
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr ""
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr ""
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr ""
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr ""
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr ""
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr ""
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr ""
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr ""
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr ""
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr ""
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr ""
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr ""
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr ""
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr ""
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr ""
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr ""
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr ""
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr ""
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
msgstr ""
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
msgstr ""
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
msgstr ""
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr ""
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr ""
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr ""
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr ""
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr ""
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr ""
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr ""
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr ""
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr ""
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr ""
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr ""
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr ""
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr ""
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr ""
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr ""
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr ""
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr ""
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr ""
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr ""
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr ""
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr ""
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr ""
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr ""
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr ""
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr ""
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr ""
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr ""
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr ""
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr ""
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr ""
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr ""
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr ""
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr ""
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr ""
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr ""
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr ""
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr ""
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr ""
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr ""
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr ""
@@ -967,7 +998,7 @@ msgstr ""
msgid "Open file..."
msgstr ""
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr ""
@@ -976,19 +1007,22 @@ msgstr ""
msgid "Default Audio Device"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -1000,136 +1034,142 @@ msgstr ""
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr ""
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr ""
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr ""
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr ""
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr ""
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1137,52 +1177,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1197,19 +1218,39 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1219,7 +1260,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1235,7 +1276,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1264,463 +1305,764 @@ msgstr ""
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr ""
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr ""
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr ""
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr ""
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr ""
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr ""
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Fjern spillelista"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr ""
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr ""
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr ""
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr ""
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr ""
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr ""
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr ""
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr ""
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Gi nytt navn til spillelista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
diff --git a/po/nl.po b/po/nl.po
index ad9b9568..dd404053 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,908 +8,954 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-12 18:17+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-09-08 22:41+0200\n"
"Last-Translator: Pjotr\n"
"Language-Team: Dutch\n"
+"Language: nl (Dutch)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: nl (Dutch)\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../plugins/gtkui/callbacks.c:121
+#: ../plugins/gtkui/callbacks.c:123
msgid "Supported sound formats"
msgstr "Ondersteunde soorten bestandopmaak voor geluid"
-#: ../plugins/gtkui/callbacks.c:132 ../plugins/gtkui/gtkui.c:776
-msgid "Other files (*)"
+#: ../plugins/gtkui/callbacks.c:134
+#, fuzzy
+msgid "All files (*)"
msgstr "Andere bestanden (*)"
-#: ../plugins/gtkui/callbacks.c:142
+#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
msgstr "Open bestand(en)..."
-#: ../plugins/gtkui/callbacks.c:177
+#: ../plugins/gtkui/callbacks.c:179
msgid "Add file(s) to playlist..."
msgstr "Voeg bestand(en) toe aan speellijst..."
-#: ../plugins/gtkui/callbacks.c:218
+#: ../plugins/gtkui/callbacks.c:220
msgid "Add folder(s) to playlist..."
msgstr "Voeg map(pen) toe aan speellijst..."
-#: ../plugins/gtkui/callbacks.c:223
+#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
msgstr "Volg symbolische koppelingen"
-#: ../plugins/gtkui/callbacks.c:697
+#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
msgstr "Fout bij het lezen van het hulpbestand"
-#: ../plugins/gtkui/callbacks.c:707
+#: ../plugins/gtkui/callbacks.c:721
msgid "Failed to load help file"
msgstr "Kon hulpbestand niet laden"
-#: ../plugins/gtkui/callbacks.c:722
+#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:723 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:48 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Hulp"
-#: ../plugins/gtkui/callbacks.c:733
+#: ../plugins/gtkui/callbacks.c:747
#, c-format
msgid "About DeaDBeeF %s"
msgstr "Over DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:746
+#: ../plugins/gtkui/callbacks.c:760
#, c-format
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s logboek van wijzigingen"
-#: ../plugins/gtkui/callbacks.c:1091
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
-msgstr "Glenn de Groot\n"
+msgstr ""
+"Glenn de Groot\n"
"Pjotr"
-#: ../plugins/gtkui/ddbtabstrip.c:689 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Bewerk speellijst"
-#: ../plugins/gtkui/ddbtabstrip.c:692 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2870 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/interface.c:402
-#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titel:"
-#: ../plugins/gtkui/ddbtabstrip.c:748
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Hernoem speellijst"
-#: ../plugins/gtkui/ddbtabstrip.c:752
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Verwijder speellijst"
-#: ../plugins/gtkui/ddbtabstrip.c:756
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Maak nieuwe speellijst"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Bewaar DeaDBeef EQ Voorinstelling"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeef EQ voorinstelling-bestanden (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Laden DeaDBeeF EQ Voorinstelling..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ-voorinstellingen (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importeer Foobar2000 EQ Voorinstelling.."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ voorinstellingen (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Opslaan voorinstelling"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Laden voorinstelling"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importeer Foobar2000 Voorinstelling"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Inschakelen"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Alles op nul"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Preamp op nul"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Banden op nul"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:826
-#: ../plugins/converter/converter.glade.h:40
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Voorinstellingen"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dag %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dagen %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Gestopt | %d sporen | %s totale speeltijd"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Gepauzeerd | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d sporen | %s totale speeltijd"
-#: ../plugins/gtkui/gtkui.c:632
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Speellijst opslaan als"
-#: ../plugins/gtkui/gtkui.c:643
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF speellijstbestanden (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:761
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Speellijst laden"
-#: ../plugins/gtkui/gtkui.c:914 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:791
+msgid "Other files (*)"
+msgstr "Andere bestanden (*)"
+
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nieuwe speellijst"
-#: ../plugins/gtkui/gtkui.c:917
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nieuwe speellijst (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Bestand"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Open bestand(en)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Voeg bestand(en) toe"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Voeg map(pen) toe"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:2970
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Voeg locatie toe"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nieuwe speellijst"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Laad speellijst"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Speellijst opslaan"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Afsluiten"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Bewerken"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Wissen"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:114
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Selecteer alles"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Deselecteer alles"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Selectie omkeren"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Selectie"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:453
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:104
-#: ../plugins/converter/interface.c:653
-#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Verwijderen"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Bijsnijden"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Zoeken"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:121
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Sorteren op"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:315 ../plugins/gtkui/prefwin.c:623
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:134
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:630
-#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titel"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Spoornummer"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1869 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:998 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artiest"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1002 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Willekeurig"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Aangepast"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1798
-#: ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Voorkeuren"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Beeld"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusbalk"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Kolomkoppen"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Tabbladen"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Afspelen"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3246
-#: ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordenen"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineair"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Sporen schuffelen"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Albums schuffelen"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:103
-msgid "Random"
-msgstr "Willekeurig"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:74
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Herhalend"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:72
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Alles herhalend"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Enkel nummer herhalend"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Niet herhalend"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Bladeren volgt afspelen"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Aanwijzer volgt afspelen"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stop na huidig"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:66
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Spring naar huidige spoor"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Hulp"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Logboek van wijzigingen"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Over"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Vertalers"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Zoeken"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stoppen"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Afspelen"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pauzeren"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Vorige"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Volgende"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Willekeurig afspelen"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Over"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Afsluiten"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Eigenschappen van spoor"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Instellingen"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Toepassen"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Sluiten"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Bijkomende gegevens"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:603
-#: ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Eigenschappen"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Voer hier een nieuwe kolomtitel in"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Type:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Index van elementen"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:312
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Aan het afspelen"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albumkunst"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artiest - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:316
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duur"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Spoornummer"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Groep / Album Artiest"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3098
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Opmaaktype:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Uitlijning:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Links"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Rechts"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2901
-#: ../plugins/gtkui/interface.c:3013 ../plugins/gtkui/interface.c:3139
-#: ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Annuleer"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2922
-#: ../plugins/gtkui/interface.c:3034 ../plugins/gtkui/interface.c:3160
-#: ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1819 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Uitvoerplugin:"
-#: ../plugins/gtkui/interface.c:1832 ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Uitvoerapparaat:"
-#: ../plugins/gtkui/interface.c:1841 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "8-bit-audio altijd omzetten naar 16-bit"
-#: ../plugins/gtkui/interface.c:1845 ../plugins/gtkui/deadbeef.glade.h:123
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Geluid"
-#: ../plugins/gtkui/interface.c:1858 ../plugins/gtkui/deadbeef.glade.h:105
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygain modus:"
-#: ../plugins/gtkui/interface.c:1867
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Uitschakelen"
-#: ../plugins/gtkui/interface.c:1868
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Spoor"
-#: ../plugins/gtkui/interface.c:1871 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replaygain piek schaal"
-#: ../plugins/gtkui/interface.c:1879 ../plugins/gtkui/deadbeef.glade.h:107
-msgid "Replaygain preamp:"
-msgstr "Replaygain voorversterking:"
-
-#: ../plugins/gtkui/interface.c:1883 ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1893 ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1901 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
+msgid "Replaygain preamp:"
+msgstr "Replaygain voorversterking:"
+
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
+#, fuzzy
+msgid "Global preamp:"
+msgstr "Replaygain voorversterking:"
+
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Voeg bestanden toe vanaf de opdrachtregel (of met de bestandbeheerder) aan "
"deze speellijst:"
-#: ../plugins/gtkui/interface.c:1910 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Hervat vorige sessie bij opstarten"
-#: ../plugins/gtkui/interface.c:1914 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Niet toevoegen vanuit archieven bij het toevoegen van mappen"
-#: ../plugins/gtkui/interface.c:1918 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stop na huidig"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Afspelen"
-#: ../plugins/gtkui/interface.c:1939 ../plugins/gtkui/interface.c:2471
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:657
-#: ../plugins/converter/converter.glade.h:8
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configureer"
-#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP Chain voorinstelling"
-#: ../plugins/gtkui/interface.c:1986 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Laden"
-#: ../plugins/gtkui/interface.c:1990 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Sluiten minimaliseert naar systeemvak"
-#: ../plugins/gtkui/interface.c:2003 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Middelste muisknop sluit speellijst"
-#: ../plugins/gtkui/interface.c:2007 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Verberg systeemvakpictogram"
-#: ../plugins/gtkui/interface.c:2011 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Gebruik vetgedrukt lettertype voor het thans afspelende spoor"
-#: ../plugins/gtkui/interface.c:2015 ../plugins/gtkui/deadbeef.glade.h:49
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Verberg \"Verwijder van schijf\"-element in het contekstmenu"
-#: ../plugins/gtkui/interface.c:2019 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
"Geef speellijsten automatisch een naam bij het toevoegen van een enkele map"
-#: ../plugins/gtkui/interface.c:2027 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Verversingssnelheid van gebruikersschil (keren per seconde):"
-#: ../plugins/gtkui/interface.c:2041 ../plugins/gtkui/deadbeef.glade.h:136
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Titelbalktekst gedurende afspelen:"
-#: ../plugins/gtkui/interface.c:2055 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Titelbalktekst wanneer gestopt:"
-#: ../plugins/gtkui/interface.c:2069 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI Plugin (wijzigen vereist herstart)"
-#: ../plugins/gtkui/interface.c:2077 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Gebruikersomgeving"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2092 ../plugins/gtkui/interface.c:2136
-#: ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Negeer"
-#: ../plugins/gtkui/interface.c:2101 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Voorgrond"
-#: ../plugins/gtkui/interface.c:2108 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Achtergrond"
-#: ../plugins/gtkui/interface.c:2127 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Kleuren zoekbalk/volumebalk"
-#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Midden"
-#: ../plugins/gtkui/interface.c:2152 ../plugins/gtkui/deadbeef.glade.h:69
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Licht"
-#: ../plugins/gtkui/interface.c:2159 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Donker"
-#: ../plugins/gtkui/interface.c:2190 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Basis"
-#: ../plugins/gtkui/interface.c:2197 ../plugins/gtkui/interface.c:2254
-#: ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
-#: ../plugins/gtkui/interface.c:2210 ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Tabstrook-kleuren"
-#: ../plugins/gtkui/interface.c:2219 ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Negeer (geen boomstructuurthema, maar snellere weergave)"
-#: ../plugins/gtkui/interface.c:2228 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Even rij"
-#: ../plugins/gtkui/interface.c:2235 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Oneven rij"
-#: ../plugins/gtkui/interface.c:2261 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Geselecteerde rij"
-#: ../plugins/gtkui/interface.c:2280 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Geselecteerde tekst"
-#: ../plugins/gtkui/interface.c:2293 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Aanwijzer"
-#: ../plugins/gtkui/interface.c:2306 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Speellijst-kleuren"
-#: ../plugins/gtkui/interface.c:2310 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Kleuren"
-#: ../plugins/gtkui/interface.c:2319 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Schakel Proxy Server in"
-#: ../plugins/gtkui/interface.c:2327 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Proxy Server adres:"
-#: ../plugins/gtkui/interface.c:2341 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Proxy Server poort:"
-#: ../plugins/gtkui/interface.c:2355 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Proxy type:"
-#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Proxy gebruikersnaam:"
-#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Proxy wachtwoord:"
-#: ../plugins/gtkui/interface.c:2397 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Netwerk"
-#: ../plugins/gtkui/interface.c:2428 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versie: "
-#: ../plugins/gtkui/interface.c:2492 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Auteursrecht"
-#: ../plugins/gtkui/interface.c:2502 ../plugins/gtkui/deadbeef.glade.h:93
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:2981 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3083 ../plugins/gtkui/deadbeef.glade.h:47
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Groeperen op"
-#: ../plugins/gtkui/interface.c:3207 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Sorteren op..."
-#: ../plugins/gtkui/interface.c:3223 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Opmaaktype:"
-#: ../plugins/gtkui/interface.c:3253
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Oplopend"
-#: ../plugins/gtkui/interface.c:3254
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Aflopend"
-#: ../plugins/gtkui/interface.c:3307 ../plugins/gtkui/deadbeef.glade.h:113
-#: ../plugins/converter/interface.c:758
-#: ../plugins/converter/converter.glade.h:44
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Selecteer DSP-plugin"
-#: ../plugins/gtkui/interface.c:3323 ../plugins/gtkui/deadbeef.glade.h:92
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:774
-#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:38
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Plugin"
-#: ../plugins/gtkui/interface.c:3409 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Instellingen van etiketschrijver"
-#: ../plugins/gtkui/interface.c:3440 ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 schrijven"
-#: ../plugins/gtkui/interface.c:3444 ../plugins/gtkui/interface.c:3571
-#: ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 schrijven"
-#: ../plugins/gtkui/interface.c:3448 ../plugins/gtkui/interface.c:3527
-#: ../plugins/gtkui/interface.c:3567 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 schrijven"
-#: ../plugins/gtkui/interface.c:3456 ../plugins/gtkui/interface.c:3535
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 verwijderen"
-#: ../plugins/gtkui/interface.c:3460 ../plugins/gtkui/interface.c:3583
-#: ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 verwijderen"
-#: ../plugins/gtkui/interface.c:3464 ../plugins/gtkui/interface.c:3539
-#: ../plugins/gtkui/interface.c:3579 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 verwijderen"
-#: ../plugins/gtkui/interface.c:3472 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 versie"
-#: ../plugins/gtkui/interface.c:3479
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (aangeraden)"
-#: ../plugins/gtkui/interface.c:3480
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3486 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 tekencodering (standaard is iso8859-1)"
-#: ../plugins/gtkui/interface.c:3523 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 schrijven"
-#: ../plugins/gtkui/mainplaylist.c:313 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artiest / Album"
-#: ../plugins/gtkui/mainplaylist.c:314 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Spoornr."
-#: ../plugins/gtkui/plcommon.c:325
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Verwijder bestanden van schijf"
-#: ../plugins/gtkui/plcommon.c:326
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -917,49 +963,48 @@ msgstr ""
"Bestanden zullen verloren gaan. Doorgaan?\n"
"(Dit venster kunt u uitschakelen in de GTKUI plugin-instellingen)"
-#: ../plugins/gtkui/plcommon.c:327 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Waarschuwing"
-#: ../plugins/gtkui/plcommon.c:429
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Aan de speelwachtrij toevoegen"
-#: ../plugins/gtkui/plcommon.c:434
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Uit speelwachtrij verwijderen"
-#: ../plugins/gtkui/plcommon.c:442
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Herlaad bijkomende gegevens"
-#: ../plugins/gtkui/plcommon.c:461
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Verwijder van schijf"
-#: ../plugins/gtkui/plcommon.c:840 ../plugins/gtkui/plcommon.c:965
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Kolom toevoegen"
-#: ../plugins/gtkui/plcommon.c:870 ../plugins/gtkui/plcommon.c:969
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Kolom bewerken"
-#: ../plugins/gtkui/plcommon.c:973
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Kolom verwijderen"
-#: ../plugins/gtkui/plcommon.c:983
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Groeperen op"
-#: ../plugins/gtkui/plcommon.c:990
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Geen"
-#: ../plugins/gtkui/plcommon.c:994
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artiest/Datum/Album"
@@ -967,7 +1012,7 @@ msgstr "Artiest/Datum/Album"
msgid "Open file..."
msgstr "Open bestand.."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configureer %s"
@@ -976,20 +1021,23 @@ msgstr "Configureer %s"
msgid "Default Audio Device"
msgstr "Standaard geluidapparaat"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:649
-#: ../plugins/converter/converter.glade.h:6
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Toevoegen"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globale sneltoetsen"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Gleuf"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Locatie"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Toetscombinatie"
@@ -1001,136 +1049,143 @@ msgstr "Bestanden aan het toevoegen..."
msgid "Initializing..."
msgstr "Aan het initialiseren..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "U heeft gegevens aangepast voor dit spoor."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Dit venster echt sluiten?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Meerdere waarden] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Toets"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Waarde"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Etiketten aan het schrijven..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Naam:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Veldnamen moeten niet beginnen met : of _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Kan veld niet toevoegen"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Veld met deze naam bestaat reeds, probeer a.u.b. andere naam."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Gekozen veld echt verwijderen?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Voeg veld toe"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Verwijder veld"
-#: ../main.c:90
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Gebruik: deadbeef [opties] [bestand(en)]\n"
-#: ../main.c:91
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opties:\n"
-#: ../main.c:92
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Drukt hulp af (dit bericht) en sluit af\n"
-#: ../main.c:93
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Speler afsluiten\n"
-#: ../main.c:94
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Versie-informatie afdrukken en sluiten\n"
-#: ../main.c:95
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Afspelen beginnen\n"
-#: ../main.c:96
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Afspelen stoppen\n"
-#: ../main.c:97
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Afspelen pauzeren\n"
-#: ../main.c:98
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Pauze schakelen\n"
-#: ../main.c:99
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Begin afspelen indien gestopt, anders pauze schakelen\n"
+msgstr ""
+" --play-pause Begin afspelen indien gestopt, anders pauze schakelen\n"
-#: ../main.c:100
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Volgend nummer in speellijst\n"
-#: ../main.c:101
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Vorig nummer in speellijst\n"
-#: ../main.c:102
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Willekeurig nummer in speellijst\n"
-#: ../main.c:103
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Bestand(en) toevoegen aan speellijst\n"
-#: ../main.c:104
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Afdrukken geformatteerde spoornaam naar stdout\n"
-#: ../main.c:105
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1141,7 +1196,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:108
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1150,53 +1205,28 @@ msgstr ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-#: ../main.c:109
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " voor meer infor, zie http://sourceforge.net/apps/media"
-"wiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" voor meer infor, zie http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:443 ../playlist.c:2609
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Standaard"
-#: ../playlist.c:3858
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ja"
-#: ../playlist.c:3858
+#: ../playlist.c:3793
msgid "No"
msgstr "Nee"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Aangeraden)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Oplopend\n"
-"Aflopend"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Zet uit\n"
-"Spoor\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1222,7 +1252,7 @@ msgstr ""
"Groep / Album Artiest\n"
"Aangepast"
-#: ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1230,13 +1260,40 @@ msgstr ""
"Links\n"
"Rechts"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Zet uit\n"
+"Spoor\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Oplopend\n"
+"Aflopend"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Aangeraden)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Kon geen pixmapbestand vinden: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1249,7 +1306,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Voeg geluid-CD toe"
#: ../translation/extra.c:4
@@ -1265,7 +1323,7 @@ msgstr "Gebruik ALSA-resampling"
msgid "Release device while stopped"
msgstr "Geef apparaat vrij wanneer gestopt"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Voorkeursomvang van de buffer"
@@ -1294,334 +1352,384 @@ msgstr "Wachtwoord"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Apparaatbestand"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Stoplap voor OSS4 samplerate-fout"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Periode voor bijwerken opslag (uur)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Haal op uit ingebedde etiketten"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Haal op uit plaatselijke map"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Plaatselijk masker voor hoesbestand"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Haal op van Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Haal op van albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Schaal kunstwerk naar langere kant"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Gebruik CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Verkies CD-tekst boven CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (bijv. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB poortnummer (bijv. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Verkies CDDB-protocol boven HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Schakel NRG-afbeeldingsondersteuning in"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Resampling-kwaliteit (0..2, hoger is beter)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maximale muziekstukduur (in minuten)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Standaard-liedduur (sec)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Vraag bevestiging voor het verwijderen van bestanden van de schijf"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Statuspictogram voor gevoeligheid van volumeknop"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Aangepast statuspictogram"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Draai gtk_init met --sync (debug-modus)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Voeg scheidingtekens toe tussen contextmenu-onderdelen van plugin"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Bestandtype voor meldingstitel"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Bestandtype voor meldingsinhoud"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Toon albumkunst"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Grootte van albumkunst (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio-server"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Samplerate"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relatief pad voor zoektabel"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Absoluut pad voor zoektabel"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
"Verwissel audio-bytes (schakel om indien u slechts statische ruis hoort)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Schakel HVSC Songlength DB in"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (vanuit HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits per sample (8 of 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Standaard-liedduur (sec)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Configuratiebestand voor Timidity++ bank"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Spoortitel"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Artiest"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Totaal aantal sporen"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Genre"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Componist"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Schijfnummer"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Commentaar"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Encodeur/Verkoper"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Locatie"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Subspoor-index"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Etiket-type(s)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Ingebedde informatietekst"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Bestandextensies (te scheiden met ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Omzetten"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Doel-samplerate"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Kwaliteit / Algoritme"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Automatische Samplerate (negeert Doel-Samplerate)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Schakel scrobbler in"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Het bestand bestaat al. Overschrijven?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Waarschuwing van omzetter"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Kies a.u.b. een codeerder"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Fout van omzetter"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Bezig met omzetten..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Selecteer map..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Kon codeerder-voorinstelling niet opslaan"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-"Controleer de maprechten voor voorinstelling, probeer een andere titel te kiezen, "
-"of maak wat schijfruimte vrij"
+"Controleer de maprechten voor voorinstelling, probeer een andere titel te "
+"kiezen, of maak wat schijfruimte vrij"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-"Voorinstelling met dezelfde naam bestaat al. Probeer een andere titel te kiezen."
+"Voorinstelling met dezelfde naam bestaat al. Probeer een andere titel te "
+"kiezen."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Fout"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Voeg nieuwe codeerder toe"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Codeerder bewerken"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Verwijder voorinstelling"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Dit zal de geselecteerde voorinstelling verwijderen. Weet u het zeker?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codeerders"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Voeg plugin toe aan DSP-ketting"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Kon DSP-voorinstelling niet opslaan"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nieuwe DSP-voorinstelling"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "DSP-voorinstelling bewerken"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP-voorinstellingen"
-#: ../plugins/converter/interface.c:97
-#: ../plugins/converter/converter.glade.h:34
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Uitvoermap:"
-#: ../plugins/converter/interface.c:118
-#: ../plugins/converter/converter.glade.h:33
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Behoud mapstructuur, te beginnen op:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Naam van uitvoerbestand:"
-#: ../plugins/converter/interface.c:129
-#: ../plugins/converter/converter.glade.h:18
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
@@ -1630,95 +1738,90 @@ msgstr ""
"Extensie (bijv. .mp3) zal automatisch worden toegevoegd.\n"
"Laat het veld leeg voor standaard (%a - %t)."
-#: ../plugins/converter/interface.c:142
-#: ../plugins/converter/converter.glade.h:13
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codeerder:"
-#: ../plugins/converter/interface.c:166
-#: ../plugins/converter/converter.glade.h:10
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP-voorinstelling:"
-#: ../plugins/converter/interface.c:189
-#: ../plugins/converter/converter.glade.h:30
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Aantal draadjes:"
-#: ../plugins/converter/interface.c:202
-#: ../plugins/converter/converter.glade.h:35
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Bestandtype van uitvoer-voorbeeld:"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Behoud bronbestandtype"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit signed int"
-#: ../plugins/converter/interface.c:212
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit signed int"
-#: ../plugins/converter/interface.c:213
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit signed int"
-#: ../plugins/converter/interface.c:214
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit float"
-#: ../plugins/converter/interface.c:220
-#: ../plugins/converter/converter.glade.h:49
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Wanneer het bestand bestaat:"
-#: ../plugins/converter/interface.c:227
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Vraag bevestiging"
-#: ../plugins/converter/interface.c:228
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Overschrijf"
-#: ../plugins/converter/interface.c:230
-#: ../plugins/converter/converter.glade.h:39
-msgid "Preserve folder structure, starting from:"
-msgstr "Behoud mapstructuur, te beginnen op:"
-
-#: ../plugins/converter/interface.c:386
-#: ../plugins/converter/converter.glade.h:12
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Bewerk voorinstelling van codeerder"
-#: ../plugins/converter/interface.c:409
-#: ../plugins/converter/converter.glade.h:48
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Naamloze codeerder"
-#: ../plugins/converter/interface.c:417
-#: ../plugins/converter/converter.glade.h:32
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensie van uitvoerbestand:"
-#: ../plugins/converter/interface.c:424
-#: ../plugins/converter/converter.glade.h:11
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Bijv. mp3"
-#: ../plugins/converter/interface.c:432
-#: ../plugins/converter/converter.glade.h:7
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Opdrachtregel:"
-#: ../plugins/converter/interface.c:443
-#: ../plugins/converter/converter.glade.h:15
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
#, no-c-format
msgid ""
"Example: lame - %o\n"
@@ -1727,8 +1830,8 @@ msgstr ""
"Voorbeeld: lame - %o\n"
"%i voor invoerbestand, %o voor uitvoerbestand, - for stdin"
-#: ../plugins/converter/interface.c:453
-#: ../plugins/converter/converter.glade.h:3
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
#, no-c-format
msgid ""
"<small>%o - output file name\n"
@@ -1737,60 +1840,60 @@ msgstr ""
"<small>%o - uitvoerbestandnaaam\n"
"%i - tijdelijke invoerbestandnaam</small>"
-#: ../plugins/converter/interface.c:462
-#: ../plugins/converter/converter.glade.h:29
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Methode:"
-#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Pijp"
-#: ../plugins/converter/interface.c:470
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Tijdelijk bestand"
-#: ../plugins/converter/interface.c:487
-#: ../plugins/converter/converter.glade.h:5
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:493
-#: ../plugins/converter/converter.glade.h:21
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:499
-#: ../plugins/converter/converter.glade.h:31
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:505
-#: ../plugins/converter/converter.glade.h:20
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:517
-#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:527
-#: ../plugins/converter/converter.glade.h:1
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Etiketschrijver</b>"
-#: ../plugins/converter/interface.c:614
-#: ../plugins/converter/converter.glade.h:9
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP voorinstellingbewerker"
-#: ../plugins/converter/interface.c:637
-#: ../plugins/converter/converter.glade.h:47
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Naamloze DSP voorinstelling"
-#: ../plugins/converter/converter.glade.h:23
+#: ../plugins/converter/converter.glade.h:12
msgid ""
"Keep source format\n"
"8 bit signed int\n"
@@ -1806,7 +1909,15 @@ msgstr ""
"32 bit signed int\n"
"32 bit float"
-#: ../plugins/converter/converter.glade.h:36
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"Vraag bevestiging\n"
+"Overschrijven"
+
+#: ../plugins/converter/converter.glade.h:34
msgid ""
"Pipe\n"
"Temporary file"
@@ -1814,13 +1925,239 @@ msgstr ""
"Pijp\n"
"Tijdelijk bestand"
-#: ../plugins/converter/converter.glade.h:41
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Bewerken"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Sluiten"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Kolom bewerken"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Opdrachtregel:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
msgid ""
-"Prompt\n"
-"Overwrite"
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
msgstr ""
-"Vraag bevestiging\n"
-"Overschrijven"
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Sporen schuffelen"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Meerdere waarden] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Locatie"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Verwijderen"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nieuwe speellijst"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Commentaar"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Kolom toevoegen"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Dit zal de geselecteerde voorinstelling verwijderen. Weet u het zeker?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configureer"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Instellingen"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Gebruikersomgeving"
+
+#~ msgid "Slot"
+#~ msgstr "Gleuf"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Gekozen veld echt verwijderen?"
#~ msgid "Save playlist as"
#~ msgstr "Speellijst opslaan als"
diff --git a/po/pl.po b/po/pl.po
index 613a92b1..8cbe701f 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-30 01:21+0200\n"
"Last-Translator: Sam <sam@lodsb.net>\n"
"Language-Team: Polish Translation Team <>\n"
@@ -57,9 +57,9 @@ msgstr "Wystąpił błąd przy wczytywaniu pliku pomocy"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Pomoc"
@@ -73,124 +73,128 @@ msgstr "O programie DeaDBeef %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Lista zmian w DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Tłumacze"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Edytuj listę odtwarzania"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Tytuł:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Zmień nazwę listy odtwarzania"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Usuń listę odtwarzania"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Utwórz listę odtwarzania"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Wybór pliku"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Pliki ustawień korektora DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Wybór pliku"
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Pliki ustawień korektora DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Wybór pliku"
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Pliki ustawień korektora Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Zapisz ustawienia..."
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Wczytaj ustawienia..."
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importuj ustawienia programu Foobar2000..."
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Włączenie"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Wyzeruj wszystkie"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Wyzeruj Preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Wyzeruj pojedyncze"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Zapisz ustawienia..."
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dzień %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dni %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr ""
"Zatrzymano odtwarzanie | %d ścieżek | całkowity czas trwania listy "
"odtwarzania: %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kb/s "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Wstrzymano odtwarzanie |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -198,731 +202,765 @@ msgstr ""
"%s%s %s| %d Hz | %d bitów | %s | %d:%02d / %s | %d ścieżek | całkowity czas "
"trwania listy odtwarzania: %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Wybór pliku"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Lista odtwarzania w formacie DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Wybór pliku"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Inne pliki (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nowa lista odtwarzania"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nowa lista odtwarzania (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Plik"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Otwórz..."
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dodaj..."
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Dodaj katalog..."
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Dodaj położenie..."
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nowa lista odtwarzania"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Wczytaj listę odtwarzania..."
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Zapisz listę odtwarzania"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "Za_kończ"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Edycja"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "Wy_czyść"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Zaznacz wszystkie"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Odznacz wszystkie"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Odwróć zaznaczenie"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Zaznaczenie"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Usuń"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Usuń pozostałe"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Znajdź"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Tytuł"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Numer utworu"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Wykonawca"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Data"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Losowo"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Własny"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferencje"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Widok"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Pasek stanu"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Nagłówki kolumn"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Karty"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Korektor dźwięku"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Odtwarzanie"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Kolejność"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Liniowa"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Losowo"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Losowo"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Losowo"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Powtarzanie"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Wszystkie ścieżki"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Pojedyncza ścieżka"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Brak"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Przewijanie podąża za odtwarzaniem"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Kursor podąża za odtwarzaniem"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Zatrzymaj po zaznaczonym utworze"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Przejdź do bieżącego nagrania"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "Pomo_c"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Lista zmian"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "O progr_amie"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Tłumacze"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Szukaj"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Zatrzymaj"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Odtwarzaj"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Wstrzymaj"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Poprzedni"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Następny"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Odtwarzaj losowo"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "O programie"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Zakończ"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Właściwości utworu"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Ustawienia"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "Z_astosuj"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "Zamknij"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadane"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Właściwości"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Wpisz nową nazwę kolumny"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Numer ścieżki"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Odtwarzanie"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Okładka albumu"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Wykonawca - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Długość"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Numer utworu"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Wykonawca albumu"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Wyrównanie:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Lewo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Prawo"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "An_uluj"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Wtyczka wyjścia:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Urządzenie wyjścia:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Dźwięk"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Tryb Replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Wyłącz"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Numer utworu"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Szczyt skali Replaygain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Przedwzmacniacz replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Przedwzmacniacz powszechny"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Domyślna lista odtwarzania:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Wznowienie odtwarzania po uruchomieniu programu"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Zatrzymaj po zaznaczonym utworze"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Odtwarzanie"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Konfiguracja"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Zapisz ustawienia... DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Ładuj"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Ukrywanie okna do obszaru powiadamiania zamiast zamykania"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Zamykanie list odtwarzania środkowym przyciskiem myszy"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Ukrycie ikony obszaru powiadamiania"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Wypisywanie nazwy bieżącego utworu pogrubioną czcionką"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Ukrycie polecenia „Usuń pliki z dysku” w menu podręcznym"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Zawartość paska tytułu podczas odtwarzania:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Zawartość paska tytułu po zatrzymaniu odtwarzania:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr "Wtyczka interfejsa graficznego (zmiana potrzebuje uruchomienia ponowia)"
+msgstr ""
+"Wtyczka interfejsa graficznego (zmiana potrzebuje uruchomienia ponowia)"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Interfejs użytkownika"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
# Grzegorz Gibas
# amigib@gmail.com
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Własne"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Pierwszoplanowy"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Drugoplanowy"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Pasek przewijania i głośności"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Środkowy"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Jasny"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Ciemny"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Baza"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Karty"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Podmień (traci motyw GTK treeview, ale przyspiesza renderowanie)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Parzysty wiersz"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Nieparzysty wiersz"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Zaznaczony wiersz"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Zaznaczony tekst"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Listy odtwarzania"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Kolory"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Serwer pośredniczący"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adres:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nazwa użytkownika:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Hasło:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Sieć"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Wersja:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Prawa autorskie"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Wtyczki"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupuj"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Wybieraj wtyczkę DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Wtyczki"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Etykiety"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Zapisywanie ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Zapisywanie ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Zapisywanie APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Usuwanie ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Usuwanie ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Usuwanie APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Wersja ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (rekomendowana)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Kodowanie znaków ID3v1 (domyślnie iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Zapisywanie ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Wykonawca / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Numer ścieżki"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Usuń pliki z dysku"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -930,49 +968,48 @@ msgstr ""
"Plik zostaną usunięte. Kontynuować?\n"
"(To ostrzeżenie może zostać wyłączone w ustawieniach GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Ostrzeżenie"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Dodaj do kolejki"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Usuń z kolejki"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Wczytaj ponownie metadane"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Usuń z dysku"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Dodaj kolumnę"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Edytuj kolumnę"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Usuń kolumnę"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grupowanie"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Brak"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artysta/Data/Album"
@@ -980,7 +1017,7 @@ msgstr "Artysta/Data/Album"
msgid "Open file..."
msgstr "Otwórz plik..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Konfiguracja %s"
@@ -989,19 +1026,23 @@ msgstr "Konfiguracja %s"
msgid "Default Audio Device"
msgstr "Domyślne urządzenie dźwiękowe"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Dodaj"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Skróty klawiszowe"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Dodawanie położenia"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kombinacja klawiszy"
@@ -1013,144 +1054,149 @@ msgstr "Dodawanie plików..."
msgid "Initializing..."
msgstr "Inicjalizowanie..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Dane dla tego utworu zostały zmodyfikowane."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Zamknąć okno?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
#, fuzzy
msgid "[Multiple values] "
msgstr "[różne opcji]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Klawisz"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Wartość"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
#, fuzzy
msgid "Writing tags..."
msgstr "Pisanie etykiety..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Imię:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
#, fuzzy
msgid "Field names must not start with : or _"
msgstr "Nie wolno zacząć z : albo _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
#, fuzzy
msgid "Cannot add field"
msgstr "Nie można dodać teren"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
#, fuzzy
msgid "Field with such name already exists, please try different name."
msgstr "Teren o takim imieniu już istnieje, prosimy spróbować inną"
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Poważnie chcesz usunąć tego teren?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Dodaj..."
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Usuń"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Użycie: deadbeef [OPCJA...] [PLIK...]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opcje:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
" --help lub -h Wyświetla pomoc (ten tekst) i wychodzi z programu\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Wychodzi z programu\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Wyświetla wersję programie i wychodzi\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Zaczyna odtwarzanie\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zatrzymuje odtwarzanie\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Wstrzymuje odtwarzanie\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Następny utwór na liście odtwarzania\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Poprzedni utwór na liście odtwarzania\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Losowy utwór na liście odtwarzania\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Dodaje plik(i) do istniejącej listy odtwarzania\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Wysyła sformatowaną nazwę utworu do stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1161,7 +1207,7 @@ msgstr ""
" [d]ługość, [n]umer utworu, [r]ok, [k]omentarz,\n"
" prawa auto[r]skie, [e]pozostało\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1170,51 +1216,28 @@ msgstr ""
" np.: --nowplaying \"%%a - %%t\" powinno wyświetlić "
"\"artysta - tytuł\"\n"
-#: ../main.c:110
-#, c-format, fuzzy
+#: ../main.c:104
+#, fuzzy, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr "aby czytać dalej, otwórz http://sourceforge.net/apps/mediawiki/deadbeef/inde"
-"x.php?title=Title_Formatting\n"
+msgstr ""
+"aby czytać dalej, otwórz http://sourceforge.net/apps/mediawiki/deadbeef/"
+"index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Domyślne"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Tak"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nie"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Rekomendowany)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Wyłącz\n"
-"Utwór\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1240,7 +1263,7 @@ msgstr ""
"Zespół / Wykonawca albumu\n"
"Własny"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1248,13 +1271,38 @@ msgstr ""
"Lewo\n"
"Prawo"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Wyłącz\n"
+"Utwór\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Rekomendowany)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Nie można znaleźć pliku pixmapy: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1267,7 +1315,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Dodaj płytę Audio CD"
#: ../translation/extra.c:4
@@ -1283,7 +1332,7 @@ msgstr "Przepróbkowywanie ALSA"
msgid "Release device while stopped"
msgstr "Zwolnij urządzenie po zatrzymaniu"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Preferowany rozmiar bufora"
@@ -1312,491 +1361,818 @@ msgstr "Hasło:"
msgid "Scrobble URL"
msgstr "Adres URL systemu składania informacji:"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Okres aktualizacji pamięci podręcznej (h)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Pozyskiwanie z etykiet"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Pozyskiwanie z lokalnego katalogu"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Wzór plików okładek:"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Pozyskiwanie z serwisu last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Pozyskiwanie z serwisu albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Używanie baz danych CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferowanie danych CD-Text zamiast baz danych CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "Adres URL bazy danych CDDB (np. „freedb.org”)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Numer portu bazy danych CDDB (np. „888”)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferuj protokół CDDB zamiast HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Obsługa obrazów płyt w formacie NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Jakość przepróbkowywania (0..2, wyższa jest lepsza)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Maksymalna długość utworu (min):"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Maksymalna długość utworu (min):"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Wyświetlanie pytania przed fizycznym usunięciem plików"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Czułość kontroli głośności ikony obszaru powiadamiania"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Własna ikona stanu"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Uruchom gtk_init z opcją --sync (tryb odpluskwiania)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
#, fuzzy
msgid "Notification title format"
msgstr "Format powiadomień:"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
#, fuzzy
msgid "Notification content format"
msgstr "Format powiadomień:"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Okładka albumu"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Serwer PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Częstotliwość próbkowania"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Względna ścieżka tablicy przeskoków"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Bezwzględna ścieżka tablicy przeskoków"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
"Odwróć kolejność bitów audio (przełącz jeśli słyszysz tylko ciągły dźwięk)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
#, fuzzy
msgid "Enable HVSC Songlength DB"
msgstr "Włączenie HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
#, fuzzy
msgid "Default song length (sec)"
msgstr "Maksymalna długość utworu (min):"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Plik konfiguracyjny banków Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Tytuł utworu"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Wykonawca"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Ilość utworów"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Gatunek"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Kompozytor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Numer płyty"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Komentarz"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Program kodujący / Dostawca"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Dodawanie położenia"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Numer pod-utworu"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Typy etykiet"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Wewnętrzny Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
#, fuzzy
msgid "Target Samplerate"
msgstr "Częstotliwość próbkowania"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Przesyłanie informacji o odtworzonych utworach"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Zaznacz wszystkie"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Edytuj kolumnę"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Zapisz ustawienia..."
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Zapisz ustawienia..."
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Zapisz ustawienia..."
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Zapisz ustawienia..."
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Urządzenie wyjścia:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Wtyczka wyjścia:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Zapisz ustawienia..."
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
# Grzegorz Gibas
# amigib@gmail.com
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Własne"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Wczytaj ustawienia..."
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Wtyczka wyjścia:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Zapisywanie APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Zapisywanie ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Zapisywanie ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Etykiety"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+# Grzegorz Gibas
+# amigib@gmail.com
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Własne"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Edycja"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "Zamknij"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Edytuj kolumnę"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Komentarz"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Losowo"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[różne opcji]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Dodawanie położenia"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Usuń"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nowa lista odtwarzania"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Komentarz"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Dodaj kolumnę"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Konfiguracja"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Ustawienia"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interfejs użytkownika"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Poważnie chcesz usunąć tego teren?"
+
#~ msgid "Save playlist as"
#~ msgstr "Zapisz listę odtwarzania jako..."
diff --git a/po/pt.po b/po/pt.po
index 77d29e61..69de37e3 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -1,20 +1,20 @@
# Portuguese translation of deadbeef package
# Copyright (C) 2010 THE deadbeef'S COPYRIGHT HOLDER
# This file is distributed under the same license as the deadbeef package.
-# Sérgio Marques <smarquespt@gmail.com>, 2010,2011.
+# Sérgio Marques <smarquespt@gmail.com>, 2010-2012.
#
msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-11-24 18:47-0000\n"
-"Last-Translator: Sérgio Marques <smarquespt@gmail.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-09-10 11:48+0200\n"
+"Last-Translator: Sérgio <smarquespt@gmail.com>\n"
"Language-Team: \n"
+"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: pt\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Language: Portuguese\n"
@@ -30,15 +30,15 @@ msgstr "Todos os ficheiros (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
-msgstr "Abrir ficheiro(s)..."
+msgstr "Abrir ficheiros..."
#: ../plugins/gtkui/callbacks.c:179
msgid "Add file(s) to playlist..."
-msgstr "Adicionar ficheiro(s) à lista de reprodução..."
+msgstr "Adicionar ficheiros à lista de reprodução..."
#: ../plugins/gtkui/callbacks.c:220
msgid "Add folder(s) to playlist..."
-msgstr "Adicionar pasta(s) à lista de reprodução..."
+msgstr "Adicionar pastas à lista de reprodução..."
#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
@@ -46,7 +46,7 @@ msgstr "Seguir ligações simbólicas"
#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
-msgstr "Falha ao ler a ajuda"
+msgstr "Falha ao abrir a ajuda"
#: ../plugins/gtkui/callbacks.c:721
msgid "Failed to load help file"
@@ -56,11 +56,9 @@ msgstr "Falha ao carregar a ajuda"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737
-#: ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49
-#: ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ajuda"
@@ -74,1013 +72,887 @@ msgstr "Sobre o DeaDBeef %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Alterações no DeadBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Tradutores do DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755
-#: ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Editar lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:758
-#: ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922
-#: ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Título:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Mudar nome da lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Remover lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Adicionar nova lista de reprodução"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Gravar pré-ajustes do EQ DeadBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Pré-ajustes do EQ DeadBeeF(*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Carregar pré-ajustes do EQ DeadBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Pré-ajustes do EQ DeadBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
-msgstr "Importar pré-ajustes Foobar2000..."
+msgstr "Importar pré-ajustes do Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
-msgstr "Pré-ajustes Foobar2000 (*.feq)"
+msgstr "Pré-ajustes do Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Gravar pré-ajustes"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Carregar pré-ajustes"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importar pré-ajustes do Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Ativar"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nulo"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Amplificador nulo"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Bandas nulas"
-#: ../plugins/gtkui/eq.c:387
-#: ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Pré-ajustes"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dia %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dias %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Parado | %d faixas | %s reproduções"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Estéreo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Em pausa | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
-msgid "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
-msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d faixas | %s reproduções"
+msgid ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgstr ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d faixas | %s reproduções"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Gravar lista de reprodução como"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Lista de reprodução DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Carregar lista de reprodução"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Outros ficheiros (*)"
-#: ../plugins/gtkui/gtkui.c:926
-#: ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nova lista de reprodução"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nova lista de reprodução (%d)"
-#: ../plugins/gtkui/interface.c:150
-#: ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Ficheiro"
-#: ../plugins/gtkui/interface.c:157
-#: ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
-msgstr "Abrir ficheir_o(s)"
+msgstr "Abrir ficheir_os"
-#: ../plugins/gtkui/interface.c:173
-#: ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
-msgstr "Adicionar ficheiro(s)"
+msgstr "Adicionar ficheiros"
-#: ../plugins/gtkui/interface.c:181
-#: ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
-msgstr "Adicionar pasta(s)"
+msgstr "Adicionar pastas"
-#: ../plugins/gtkui/interface.c:189
-#: ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Adicionar local"
-#: ../plugins/gtkui/interface.c:198
-#: ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova lista de reprodução"
-#: ../plugins/gtkui/interface.c:205
-#: ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Carregar lista de reprodução"
-#: ../plugins/gtkui/interface.c:209
-#: ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Gravar lista de reprodução"
-#: ../plugins/gtkui/interface.c:218
-#: ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Sair"
-#: ../plugins/gtkui/interface.c:229
-#: ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Editar"
-#: ../plugins/gtkui/interface.c:236
-#: ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Apagar"
-#: ../plugins/gtkui/interface.c:244
-#: ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Marcar tudo"
-#: ../plugins/gtkui/interface.c:251
-#: ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Desmarcar tudo"
-#: ../plugins/gtkui/interface.c:258
-#: ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverter seleção"
-#: ../plugins/gtkui/interface.c:262
-#: ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Seleção"
-#: ../plugins/gtkui/interface.c:269
-#: ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323
-#: ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Remover"
-#: ../plugins/gtkui/interface.c:277
-#: ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Cortar"
-#: ../plugins/gtkui/interface.c:281
-#: ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Procurar"
-#: ../plugins/gtkui/interface.c:288
-#: ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Ordenar por"
-#: ../plugins/gtkui/interface.c:295
-#: ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318
-#: ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790
-#: ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Título"
-#: ../plugins/gtkui/interface.c:299
-#: ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Número da faixa"
-#: ../plugins/gtkui/interface.c:303
-#: ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875
-#: ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Álbum"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307
-#: ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artista"
-#: ../plugins/gtkui/interface.c:311
-#: ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Data"
-#: ../plugins/gtkui/interface.c:315
-#: ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017
-#: ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aleatório"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizar"
-#: ../plugins/gtkui/interface.c:324
-#: ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferências"
-#: ../plugins/gtkui/interface.c:328
-#: ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Ver"
-#: ../plugins/gtkui/interface.c:335
-#: ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra de estado"
-#: ../plugins/gtkui/interface.c:339
-#: ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
-msgstr "Cabeçalhos de colunas"
+msgstr "Titulo das colunas"
-#: ../plugins/gtkui/interface.c:343
-#: ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Separadores"
-#: ../plugins/gtkui/interface.c:347
-#: ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizador"
-#: ../plugins/gtkui/interface.c:351
-#: ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reprodução"
-#: ../plugins/gtkui/interface.c:358
-#: ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Organização"
-#: ../plugins/gtkui/interface.c:365
-#: ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linear"
-#: ../plugins/gtkui/interface.c:370
-#: ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Desordenar faixas"
-#: ../plugins/gtkui/interface.c:375
-#: ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Desordenar álbuns"
-#: ../plugins/gtkui/interface.c:380
-#: ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Aleatório"
-
-#: ../plugins/gtkui/interface.c:386
-#: ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Repetição"
-#: ../plugins/gtkui/interface.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Repetir todas"
-#: ../plugins/gtkui/interface.c:398
-#: ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
-msgstr "Repetir uma música"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
+msgstr "Repetir uma faixa"
-#: ../plugins/gtkui/interface.c:403
-#: ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Não repetir"
-#: ../plugins/gtkui/interface.c:409
-#: ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Deslocamento segue a reprodução"
-#: ../plugins/gtkui/interface.c:414
-#: ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Cursor segue a reprodução"
-#: ../plugins/gtkui/interface.c:418
-#: ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Parar após a faixa atual"
-#: ../plugins/gtkui/interface.c:430
-#: ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Ir para a faixa atual"
-#: ../plugins/gtkui/interface.c:437
-#: ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "A_juda"
-#: ../plugins/gtkui/interface.c:452
-#: ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Alterações"
-#: ../plugins/gtkui/interface.c:461
-#: ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465
-#: ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474
-#: ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Sobre"
-#: ../plugins/gtkui/interface.c:482
-#: ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Tradutores"
-#: ../plugins/gtkui/interface.c:898
-#: ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Procurar"
-#: ../plugins/gtkui/interface.c:973
-#: ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Parar"
-#: ../plugins/gtkui/interface.c:981
-#: ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Reproduzir"
-#: ../plugins/gtkui/interface.c:989
-#: ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
-msgstr "Pausar"
+msgstr "Pausa"
-#: ../plugins/gtkui/interface.c:997
-#: ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Anterior"
-#: ../plugins/gtkui/interface.c:1005
-#: ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Seguinte"
-#: ../plugins/gtkui/interface.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Reprodução aleatória"
-#: ../plugins/gtkui/interface.c:1022
-#: ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Sobre"
-#: ../plugins/gtkui/interface.c:1035
-#: ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Sair"
-#: ../plugins/gtkui/interface.c:1225
-#: ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propriedades da faixa"
-#: ../plugins/gtkui/interface.c:1270
-#: ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Definições"
-#: ../plugins/gtkui/interface.c:1296
-#: ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplicar"
-#: ../plugins/gtkui/interface.c:1317
-#: ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "Fe_char"
-#: ../plugins/gtkui/interface.c:1321
-#: ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Detalhes"
-#: ../plugins/gtkui/interface.c:1367
-#: ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propriedades"
-#: ../plugins/gtkui/interface.c:1494
-#: ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Indique o novo título da coluna"
-#: ../plugins/gtkui/interface.c:1502
-#: ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Índice de itens"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511
-#: ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Reprodução"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Capa do álbum"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artista - Álbum"
-#: ../plugins/gtkui/interface.c:1517
-#: ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duração"
-#: ../plugins/gtkui/interface.c:1518
-#: ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Número da faixa"
-#: ../plugins/gtkui/interface.c:1519
-#: ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr "Banda / Artista do álbum"
+msgstr "Banda/Artista do álbum"
-#: ../plugins/gtkui/interface.c:1526
-#: ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:1551
-#: ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alinhamento:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Esquerda"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Direita"
-#: ../plugins/gtkui/interface.c:1583
-#: ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065
-#: ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancelar"
-#: ../plugins/gtkui/interface.c:1604
-#: ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086
-#: ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
-msgstr "_OK"
+msgstr "C_onfirmar"
-#: ../plugins/gtkui/interface.c:1825
-#: ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Sistema de som:"
-#: ../plugins/gtkui/interface.c:1838
-#: ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositivo de som:"
-#: ../plugins/gtkui/interface.c:1847
-#: ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr "Converter, sempre, 8 bits em 16 bits"
+msgstr "Converter áudio 8 bits para 16 bits"
-#: ../plugins/gtkui/interface.c:1851
-#: ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Som"
-#: ../plugins/gtkui/interface.c:1864
-#: ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Modo Replay Gain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Desativar"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Faixa"
-#: ../plugins/gtkui/interface.c:1877
-#: ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Escala Replay Gain"
-#: ../plugins/gtkui/interface.c:1892
-#: ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902
-#: ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906
-#: ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Amplificador Replaygain:"
-#: ../plugins/gtkui/interface.c:1913
-#: ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Amplificador:"
-#: ../plugins/gtkui/interface.c:1944
-#: ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
-msgstr "Adicionar ficheiros via linha de comandos (ou gestor de ficheiros) para esta lista de reprodução:"
+msgstr ""
+"Adicionar ficheiros via linha de comandos (ou gestor de ficheiros) para esta "
+"lista de reprodução:"
-#: ../plugins/gtkui/interface.c:1953
-#: ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
-msgstr "Ao iniciar, retomar a sessão anterior"
+msgstr "Retomar a sessão anterior ao iniciar"
-#: ../plugins/gtkui/interface.c:1957
-#: ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr "Não adicionar arquivos, ao adicionar pastas"
+msgstr "Ao adicionar pastas não adicionar arquivos"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Parar após a faixa atual"
-#: ../plugins/gtkui/interface.c:1961
-#: ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reprodução"
-#: ../plugins/gtkui/interface.c:1982
-#: ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22
-#: ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurar"
-#: ../plugins/gtkui/interface.c:2017
-#: ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Cadeia de pré-ajustes DSP"
-#: ../plugins/gtkui/interface.c:2029
-#: ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "Carr_egar"
-#: ../plugins/gtkui/interface.c:2033
-#: ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042
-#: ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Fechar minimiza para a área de notificação"
-#: ../plugins/gtkui/interface.c:2046
-#: ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Botão central do rato fecha a lista de reprodução"
-#: ../plugins/gtkui/interface.c:2050
-#: ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Ocultar ícone da área de notificação"
-#: ../plugins/gtkui/interface.c:2054
-#: ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Utilizar letra a negrito para a faixa atual"
-#: ../plugins/gtkui/interface.c:2058
-#: ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
-msgstr "Ocultar item do menu \"Apagar do disco\""
+msgstr "Ocultar item do menu \"Eliminar do disco\""
-#: ../plugins/gtkui/interface.c:2062
-#: ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
-msgstr "Nome automático das listas de reprodução, ao adicionar uma pasta"
+msgstr "Ao adicionar uma pasta dar nome às listas de reprodução"
-#: ../plugins/gtkui/interface.c:2070
-#: ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Taxa de atualização da interface (vezes por segundo):"
-#: ../plugins/gtkui/interface.c:2084
-#: ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Barra de título ao reproduzir:"
-#: ../plugins/gtkui/interface.c:2098
-#: ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Barra de título se parada:"
-#: ../plugins/gtkui/interface.c:2112
-#: ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr "\"Plug-in\" de GUI (tem que reiniciar o deadbeef):"
+msgstr "Plugin da interface (tem que reiniciar o deadbeef):"
-#: ../plugins/gtkui/interface.c:2120
-#: ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135
-#: ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Sobrepor"
-#: ../plugins/gtkui/interface.c:2144
-#: ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Principal"
-#: ../plugins/gtkui/interface.c:2151
-#: ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Secundária"
-#: ../plugins/gtkui/interface.c:2170
-#: ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Cor das barras de volume/procura"
-#: ../plugins/gtkui/interface.c:2188
-#: ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
-msgstr "Central"
+msgstr "Normal"
-#: ../plugins/gtkui/interface.c:2195
-#: ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Claro"
-#: ../plugins/gtkui/interface.c:2202
-#: ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Escuro"
-#: ../plugins/gtkui/interface.c:2233
-#: ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240
-#: ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Texto"
-#: ../plugins/gtkui/interface.c:2253
-#: ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Cores do separador"
-#: ../plugins/gtkui/interface.c:2262
-#: ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
-msgstr "Sobrepor (perde a vista em árvore, mas acelera o processamento)"
+msgstr "Sobrepor (perde a vista em árvore mas acelera o processamento)"
-#: ../plugins/gtkui/interface.c:2271
-#: ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Linha par"
-#: ../plugins/gtkui/interface.c:2278
-#: ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Linha ímpar"
-#: ../plugins/gtkui/interface.c:2304
-#: ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Linha selecionada"
-#: ../plugins/gtkui/interface.c:2323
-#: ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Texto selecionado"
-#: ../plugins/gtkui/interface.c:2336
-#: ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursor"
-#: ../plugins/gtkui/interface.c:2349
-#: ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Cores da lista de reprodução"
-#: ../plugins/gtkui/interface.c:2353
-#: ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Cores"
-#: ../plugins/gtkui/interface.c:2362
-#: ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Ativar servidor proxy"
-#: ../plugins/gtkui/interface.c:2370
-#: ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Endereço do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2384
-#: ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Porta do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2398
-#: ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tipo de proxy:"
-#: ../plugins/gtkui/interface.c:2417
-#: ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
-msgstr "Utilizador de proxy:"
+msgstr "Utilizador do proxy:"
-#: ../plugins/gtkui/interface.c:2430
-#: ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
-msgstr "Senha de proxy:"
+msgstr "Senha do proxy:"
-#: ../plugins/gtkui/interface.c:2440
-#: ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Rede"
-#: ../plugins/gtkui/interface.c:2471
-#: ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versão:"
-#: ../plugins/gtkui/interface.c:2535
-#: ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Direitos de autor"
-#: ../plugins/gtkui/interface.c:2545
-#: ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
-msgstr "\"Plug-ins\""
+msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033
-#: ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135
-#: ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Agrupar por"
-#: ../plugins/gtkui/interface.c:3259
-#: ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Organizar por..."
-#: ../plugins/gtkui/interface.c:3275
-#: ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formato"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Ascendente"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descendente"
-#: ../plugins/gtkui/interface.c:3359
-#: ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Selecione o \"plug-in\" DSP"
+msgstr "Selecione o plugin DSP"
-#: ../plugins/gtkui/interface.c:3375
-#: ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016
-#: ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr "\"Plug-in\""
+msgstr "Plugin"
-#: ../plugins/gtkui/interface.c:3461
-#: ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Definições do editor de detalhes"
-#: ../plugins/gtkui/interface.c:3492
-#: ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Gravar ID3v2"
-#: ../plugins/gtkui/interface.c:3496
-#: ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Gravar ID3v1"
-#: ../plugins/gtkui/interface.c:3500
-#: ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619
-#: ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Gravar APEv2"
-#: ../plugins/gtkui/interface.c:3508
-#: ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Remover ID3v2"
-#: ../plugins/gtkui/interface.c:3512
-#: ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Remover ID3v1"
-#: ../plugins/gtkui/interface.c:3516
-#: ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631
-#: ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Remover APEv2"
-#: ../plugins/gtkui/interface.c:3524
-#: ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versão ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Recomendado)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538
-#: ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
-msgstr "Codificação de caracteres ID3v1 (omissão é iso8859-1)"
+msgstr "Codificação de caracteres ID3v1 (por definição é iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575
-#: ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Gravar ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316
-#: ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
-msgstr "Artista / Álbum"
+msgstr "Artista/Álbum"
-#: ../plugins/gtkui/mainplaylist.c:317
-#: ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Faixa n.º"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
-msgstr "Apagar ficheiros no disco"
+msgstr "Eliminar ficheiros no disco"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -1088,53 +960,48 @@ msgstr ""
"Os ficheiros serão eliminados. Continuar?\n"
"(Esta janela pode ser desligada nas definições da GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340
-#: ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693
-#: ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Aviso"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
-msgstr "Juntar à fila de reprodução"
+msgstr "Adicionar à fila de reprodução"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Remover da fila de reprodução"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Recarregar detalhes"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Remover do disco"
-#: ../plugins/gtkui/plcommon.c:855
-#: ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Adicionar coluna"
-#: ../plugins/gtkui/plcommon.c:885
-#: ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Editar coluna"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Remover coluna"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Agrupar por"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nada"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artista/Data/Álbum"
@@ -1142,7 +1009,7 @@ msgstr "Artista/Data/Álbum"
msgid "Open file..."
msgstr "Abrir ficheiro..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configurar %s"
@@ -1151,20 +1018,23 @@ msgstr "Configurar %s"
msgid "Default Audio Device"
msgstr "Dispositivo áudio pré-definido"
-#: ../plugins/gtkui/prefwin.c:318
-#: ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Adicionar"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Teclas de atalho"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Local"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinação"
@@ -1176,138 +1046,144 @@ msgstr "A adicionar ficheiros..."
msgid "Initializing..."
msgstr "A iniciar..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Você modificou os dados desta faixa."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Fechar esta janela?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Valores múltiplos]"
-#: ../plugins/gtkui/trkproperties.c:407
-#: ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Tecla"
-#: ../plugins/gtkui/trkproperties.c:408
-#: ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valor"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "A escrever detalhes..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nome:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Os nomes não podem iniciar com : ou _"
-#: ../plugins/gtkui/trkproperties.c:634
-#: ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Incapaz de adicionar o campo"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Já existe um campo com este nome. Tente um nome diferente."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Remover o campo selecionado?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Adicionar campo"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Remover campo"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
-msgstr "Utilização: deadbeef [opções] [ficheiro(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
+msgstr "Utilização: deadbeef [opções] [ficheiros]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opções:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
-msgstr " --help ou -h Imprime a ajuda (esta mensagem) e sai\n"
+msgstr " --help ou -h Mostra a ajuda (esta mensagem) e sai\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Sai do DeadBeeF\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
-msgstr " --version Imprime informações da versão e sai\n"
+msgstr " --version Mostra as informações da versão e sai\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Inicia a reprodução\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Para a reprodução\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausa a reprodução\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Retomar/Pausar\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
-msgid " --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Inicia reprodução se parado, caso contrário coloca em pausa\n"
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr ""
+" --play-pause Inicia reprodução se parado, caso contrário coloca em "
+"pausa\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Avança uma música\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Recua uma música\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Música aleatória na lista\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
-msgstr " --queue Junta ficheiro(s) à lista existente\n"
+msgstr " --queue Junta os ficheiros à lista existente\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Grava o nome da faixa para stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1318,56 +1194,37 @@ msgstr ""
" [l]duração, [n]úmerodafaixa, [y]ano, [c]omentário,\n"
" di[r]eitosdeautor, d[e]corrido\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
-msgid " e.g.: --nowplaying \"%%a - %%t\" should print \"artist - title\"\n"
-msgstr " ex: --nowplaying \"%%a - %%t\" deve gravar \"artista - título\"\n"
+msgid ""
+" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
+"- title\"\n"
+msgstr ""
+" ex: --nowplaying \"%%a - %%t\" deve gravar \"artista - "
+"título\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
-msgid " for more info, see http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " para mais informações, consulte http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" para mais informações, consulte http://sourceforge.net/"
+"apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454
-#: ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
-msgstr "Pré-definição"
+msgstr "Pré-definida"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Sim"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Não"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recomendado)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Ascendente\n"
-"Descendente"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Desativar\n"
-"Faixa\n"
-"Álbum"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1393,7 +1250,7 @@ msgstr ""
"Banda / Artista do álbum\n"
"Personalizar"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1401,23 +1258,54 @@ msgstr ""
"Esquerda\n"
"Direita"
-#: ../plugins/gtkui/support.c:90
-#: ../plugins/gtkui/support.c:114
-#: ../plugins/converter/support.c:90
-#: ../plugins/converter/support.c:114
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Desativar\n"
+"Faixa\n"
+"Álbum"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Ascendente\n"
+"Descendente"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recomendado)\n"
+"2.4"
+
+#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Incapaz de encontrar o ficheiro: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
-msgid "wildmidi: freepats config file not found. Please install timidity-freepats package, or specify path to freepats.cfg in the plugin settings."
-msgstr "wildmidi: o ficheiro de configuração freepats não foi encontrado. Por favor, instale o pacote timidity-freepats ou especifique o caminho para freepats.cfg nas definições do \"plug-in\"."
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+"wildmidi: o ficheiro de configuração freepats não foi encontrado. Por favor "
+"instale o pacote timidity-freepats ou especifique o caminho para freepats."
+"cfg nas definições do plugin."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Adicionar CD áudio"
#: ../translation/extra.c:4
@@ -1433,8 +1321,7 @@ msgstr "Utilizar frequência ALSA"
msgid "Release device while stopped"
msgstr "Libertar dispositivo se parado"
-#: ../translation/extra.c:8
-#: ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Tamanho da memória"
@@ -1461,334 +1348,383 @@ msgstr "Senha"
#: ../translation/extra.c:15
msgid "Scrobble URL"
-msgstr "\"Scrobble\" URL"
+msgstr "URL de \"Scrobble\""
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Ficheiro"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Resolução para o erro OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr "Atualização de cache (hr)"
+msgstr "Atualização de cache (horas)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Obter a partir dos detalhes"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Obter numa pasta local"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Máscara de capa local"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Obter na last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Obter no albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr "Ajustar capa de álbum"
+msgstr "Ajustar tamanho da capa de álbum"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Utilizar CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferir CD-Text a CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "URL CDDB (ex: freedb.org)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Porta CDDB (ex: 888)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferir CDDB a HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Ativar suporte a imagens NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
-msgstr "Qualidade de frquência (0..2, quanto mais alto, melhor)"
+msgstr "Qualidade de frequência (0..2, quanto mais alto melhor)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
-msgstr "Duração máxima de músicas (minutos)"
+msgstr "Duração máxima das faixas (minutos)"
+
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Duração pré-definida das faixas (seg.)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Solicitar confirmação antes de eliminar"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Sensibilidade do ícone de volume na barra de estado"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Ícone de estado personalizado"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Execute gtk_init com --sync (modo de depuração)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Adicionar separadores entre os itens do menu de contexto"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Formato do título da notificação"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Formato do texto da notificação"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Mostrar capa do álbum"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Tamanho da capa de álbum (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Servidor PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Frequência"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Caminho da tabela de pesquisa relativa"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Caminho da tabela de pesquisa absoluta"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Trocar bytes áudio (apenas se ouvir defeitos)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr "Ativar base de dados de duração HVSC"
+msgstr "Ativar base de dados HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (de HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits por frequência (8 ou 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr "Duração pré-definida das músicas (seg)"
+msgstr "Duração pré-definida das faixas (seg.)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Ficheiro de configuração do Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Título da faixa"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Artista"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Total de faixas"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Género"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Compositor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Número do disco"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comentário"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Codificador/Fornecedor"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Local"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Índice de subfaixa"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
-msgstr "Tipo(s) de detalhes"
+msgstr "Tipo de detalhes"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Cuesheet incorporada"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codificador"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Extensões (separadas por \";\")"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Converter"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Frequência final"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Qualidade/Algoritmo"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Frequência automática (substitui frequência final)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Ativar \"scrobbler\""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "O ficheiro já existe. Substituir?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Aviso de conversão"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr "Por favor, escolha o codificador"
+msgstr "Por favor escolha o codificador"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Erro de conversão"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "A converter..."
-#: ../plugins/converter/convgui.c:394
-#: ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Selecione a pasta..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Falha ao gravar as definições do codificador"
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
-msgid "Check preset folder permissions, try to pick different title, or free up some disk space"
-msgstr "Verifique as permissões, escolha um nome diferente ou liberte espaço em disco"
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
+msgstr ""
+"Verifique as permissões, escolha um nome diferente ou liberte espaço em disco"
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Já existe um pré-ajuste com este nome. Escolha outro nome."
-#: ../plugins/converter/convgui.c:638
-#: ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Erro"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Adicionar novo codificador"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Editar codificador"
-#: ../plugins/converter/convgui.c:756
-#: ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Remover pré-ajuste"
-#: ../plugins/converter/convgui.c:758
-#: ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Esta ação eliminará o pré-ajuste selecionado. Tem a certeza?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codificadores"
-#: ../plugins/converter/convgui.c:838
-#: ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr "Adicionar \"plug-in\" à cadeia DSP"
+msgstr "Adicionar plugin à cadeia DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Falha ao gravar as definições DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Novo pré-ajuste DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Editar pré-ajuste DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Pré-ajustes DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Pasta de destino:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Manter estrutura da pasta, iniciando em:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Nome do ficheiro:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1796,84 +1732,91 @@ msgstr ""
"A extensão (ex: mp3) será adicionada automaticamente.\n"
"Deixe o campo vazio para utilizar (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codificador:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Pré-ajuste DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Número de processos:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Formato de destino:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Manter formato original"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bits signed int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bits signed int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bits signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bits float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Se o ficheiro existir:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Perguntar"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Substituir"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Manter estrutura da pasta, iniciando em:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Editar definições do codificador"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Codificador sem nome"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensão do ficheiro de destino:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Ex. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Linha de comandos:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1881,8 +1824,9 @@ msgstr ""
"Exemplo: lame - %o\n"
"%i para o ficheiro de origem, %o para o ficheiro de destino, - para stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1890,182 +1834,313 @@ msgstr ""
"<small>%o - nome do ficheiro de destino\n"
"%i - nome do ficheiro temporário</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Método:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Canal"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Ficheiro temporário"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Editor de detalhes</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor de DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Pré-ajuste DSP sem nome"
-#~ msgid "about.txt"
-#~ msgstr "about.txt"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+#: ../plugins/converter/converter.glade.h:19
#, fuzzy
-#~ msgid "ChangeLog"
-#~ msgstr "_Alterações"
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Substituir"
-#~ msgid "COPYING.GPLv2"
-#~ msgstr "COPYING.GPLv2"
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Ficheiro temporário"
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
#, fuzzy
-#~ msgid "COPYING.LGPLv2.1"
-#~ msgstr "_LGPLv2.1"
+msgid "Edit"
+msgstr "_Editar"
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
#, fuzzy
-#~ msgid "translators.txt"
-#~ msgstr "_Tradutores"
+msgid "Close"
+msgstr "Fe_char"
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
#, fuzzy
-#~ msgid "Save playlist as"
-#~ msgstr "Gravar lista de reprodução"
+msgid "Edit Command"
+msgstr "Editar coluna"
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
#, fuzzy
-#~ msgid "_Abort"
-#~ msgstr "_Sobre"
+msgid "Command:"
+msgstr "Linha de comandos:"
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
#, fuzzy
-#~ msgid "editcolumndlg"
-#~ msgstr "Editar coluna"
+msgid "Single Tracks"
+msgstr "Desordenar faixas"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
#, fuzzy
-#~ msgid "Length"
-#~ msgstr "Esquerda"
-
-#~ msgid ""
-#~ "Format conversions (start with %):\n"
-#~ " [a]rtist, [t]itle, al[b]um, [B]and, [C]omposer\n"
-#~ " track[n]umber, [N]totaltracks,\n"
-#~ " [l]ength, [y]ear, [g]enre, [c]omment,\n"
-#~ " copy[r]ight, [f]ilename, [F]ullPathname, [T]ags,\n"
-#~ " [d]irectory, [D]irectoryWithPath\n"
-#~ "Example: %a - %t [%l]"
-#~ msgstr ""
-#~ "Conversão de formatos (iniciam com %):\n"
-#~ "[a]rtista, [t]ítulo, ál[b]um, [B]anda, [C]ompositor\n"
-#~ "[n]úmerodefaixa, [N]totaldefaixas,\n"
-#~ "[l]duração, [y]ano, [g]énero, [c]omentário,\n"
-#~ "di[r]eitosdeautor, nomede[f]icheiro, [F]nomecompletodocaminho,\n"
-#~ "[T]detalhes [d]iretório, [D]iretóriocomcaminho\n"
-#~ "Exemplo: %a - %t [%l]"
-
-#~ msgid "Allow dynamic samplerate switching"
-#~ msgstr "Permitir troca dinâmica da frequência"
-
-#~ msgid "Samplerate conversion quality:"
-#~ msgstr "Qualidade de conversão:"
+msgid "Multiple Tracks"
+msgstr "[Valores múltiplos]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
#, fuzzy
-#~ msgid "Description:"
-#~ msgstr "Duração"
+msgid "Local"
+msgstr "Local"
-#~ msgid "Author(s):"
-#~ msgstr "Autor(es):"
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
-#~ msgid "Email:"
-#~ msgstr "Endereço eletrónico:"
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Remover"
-#~ msgid "Website:"
-#~ msgstr "Sítio web:"
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
#, fuzzy
-#~ msgid "editplaylistdlg"
-#~ msgstr "Editar lista de reprodução"
-
-#~ msgid ""
-#~ "Format conversions (start with %):\n"
-#~ " [a]rtist, [t]itle, al[b]um, [B]and, [C]omposer\n"
-#~ " track[n]umber, [N]totaltracks,\n"
-#~ " [l]ength, [y]ear, [g]enre, [c]omment,\n"
-#~ " copy[r]ight, [f]ilename, [T]ags\n"
-#~ "Example: %a - %t [%l]"
-#~ msgstr ""
-#~ "Conversão de formatos (iniciam com %):\n"
-#~ " [a]rtista, [t]ítulo, ál[b]um, [B]anda, [C]ompositor\n"
-#~ " [n]úmerodefaixa, [N]totaldefaixas,\n"
-#~ " [l]duração, [y]ano, [g]énero, [c]omentário,\n"
-#~ " di[r]eitosdeautor, nomede[f]icheiro, [T]detalhes\n"
-#~ "Exemplo: %a - %t [%l]"
+msgid "Playlist"
+msgstr "Nova lista de reprodução"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
#, fuzzy
-#~ msgid "Title / Track Artist"
-#~ msgstr "Total de faixas"
+msgid "Common"
+msgstr "Comentário"
-#~ msgid "Setup %s"
-#~ msgstr "Configurar %s"
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+#: ../plugins/shellexecui/shellexecui.c:94
#, fuzzy
-#~ msgid "ALSA output plugin"
-#~ msgstr "Sistema de som:"
+msgid "Add Command"
+msgstr "Adicionar coluna"
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
#, fuzzy
-#~ msgid "DeaDBeeF now playing"
-#~ msgstr "Desativar em reprodução"
-
-#~ msgid "HVSC path"
-#~ msgstr "Caminho HVSC"
-
-#~ msgid ""
-#~ "Keep source format\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-#~ msgstr ""
-#~ "Manter formato original\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-
-#~ msgid ""
-#~ "Pipe\n"
-#~ "Temporary file"
-#~ msgstr ""
-#~ "Canal\n"
-#~ "Ficheiro temporário"
-
-#~ msgid ""
-#~ "Prompt\n"
-#~ "Overwrite"
-#~ msgstr ""
-#~ "Perguntar\n"
-#~ "Substituição"
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Esta ação eliminará o pré-ajuste selecionado. Tem a certeza?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configurar"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Definições"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interface gráfica"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Remover o campo selecionado?"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 20ac63c4..629095a5 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-06 01:53+0200\n"
"Last-Translator: Henrique P. <zehrique@gmail.com>\n"
"Language-Team: Brazilian Portuguese <ldp-br@bazar2.conectiva.com.br>\n"
@@ -57,9 +57,9 @@ msgstr "Falha ao carregar o arquivo de ajuda"
msgid "help.txt"
msgstr "help.pt_BR.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ajuda"
@@ -73,122 +73,126 @@ msgstr "Sobre o DeaDBeef %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Registro de alterações - DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Tradutores do DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Editar lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Título:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Renomear lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Remover lista de reprodução"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Adicionar nova lista de reprodução"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Salvar predefinição do equalizador do DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Arquivos de predefinição do equalizador do DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Carregar predefinição do equalizador do DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Predefinições do equalizador do DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importar predefinição do equalizador do Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Predefinições do equalizador do Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Salvar predefinição"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Carregar predefinição"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importar predefinição do Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Habilitar"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Zerar tudo"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Pré-amplificação zero"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Bandas a zero"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Predefinições"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dia %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dias %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Parado | %d faixas | %s tempo total de reprodução"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Estéreo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausado | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -196,727 +200,762 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d faixas | %s tempo total de "
"reprodução"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Salvar lista como"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Arquivos de listas do DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Carregar lista"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Outros arquivos (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nova lista"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nova lista (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Arquivo"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Abrir arquivos(s)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Adicionar arquivo(s)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Adicionar pasta(s)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Adicionar local"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova lista de reprodução"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Carregar lista de reprodução"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Salvar lista de reprodução"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Sair"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Editar"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Limpar"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Selecionar tudo"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Desmarcar tudo"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Inverter seleção"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Seleção"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Remover"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Cortar"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Procurar"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Ordenar por"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Título"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Número da faixa"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Álbum"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artista"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Data"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aleatória"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizar"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferências"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Ver"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Barra de status"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Cabeçalhos das colunas"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Abas"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizador"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Reprodução"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordem"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linear"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Embaralhar faixas"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Embaralhar álbuns"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Aleatória"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Repetição"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Repetir tudo"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Repetir a música"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Não repetir"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Rolagem segue a reprodução"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Cursor segue a reprodução"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Parar após a atual"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Ir para a faixa atual"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "Aj_uda"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Registro de _alterações"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Sobre"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Tradutores"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Pesquisar"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Parar"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Reproduzir"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pausar"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Anterior "
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Próxima"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Reprodução aleatória"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Sobre"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Sair"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Propriedades da faixa"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Configuração"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplicar"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Fechar"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadados"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Propriedades"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Digite o novo título da coluna aqui"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tipo:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Índice de itens"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Em reprodução"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Capa do álbum"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artista - Álbum"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Duração"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Número da faixa"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Banda / Artista do álbum"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formato:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Alinhamento:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Esquerda"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Direita"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Cancelar"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Plugin de saída:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispositivo de saída:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Sempre converter áudio de 8 bits para 16 bits"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Som"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Modo de normalização:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Desabilitado"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Faixa"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Ajustar a normalização com o nível de pico"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Pré-amplificação da normalização:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Pré-amplificação global:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Adicionar arquivos pela linha de comando (ou gerenciador de arquivos) a esta "
"lista de reprodução:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Continuar a sessão anterior ao iniciar"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Não adicionar de arquivos ao adicionar pastas"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Parar após a atual"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reprodução"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurar"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Predefinição de corrente do DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Carregar"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Fechar minimiza para a área de notificação"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Botão do meio do mouse fecha a lista"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Ocultar o ícone na área de notificação"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Usar fonte em negrito para a faixa em reprodução"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Ocultar item \"Excluir do disco\" do menu de contexto"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Autonomear listas de reprodução ao adicionar uma única pasta"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Taxa de atualização da interface (vezes por segundo):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Texto na barra de título durante a reprodução:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Texto na barra de título quando parado:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Plugin da interface gráfica (mudança requer reinício):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Interface do usuário"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Sobrepujar"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Primeiro plano"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Segundo plano"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Cores das barras volume/pesquisa"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Meio"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Claro"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Escuro"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Texto"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Cores do separador"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Sobrepujar (perde o tema GTK na visão em árvore, mas acelera a renderização)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Linha par"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Linha ímpar"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Linha selecionada"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Texto selecionado"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Cursor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Cores da lista de reprodução"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Cores"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Habilitar servidor proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Endereço do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Porta do servidor proxy:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tipo de proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Nome de usuário do proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Senha do proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Rede"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versão: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Direitos autorais"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Agrupar por"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Ordenar por..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Formato"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Ascendente"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descendente"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Selecionar plugin do DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Plugin"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Configuração do editor de etiquetas"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Escrever ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Escrever ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Escrever APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Remover ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Remover ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Remover APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versão ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Recomendado)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Codificação de caracteres ID3v1 (padrão é iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Escrever ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artista / Álbum"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Nº da faixa"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Excluir arquivos do disco"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -924,49 +963,48 @@ msgstr ""
"Os arquivos serão perdidos. Continuar?\n"
"(Este diálogo pode ser desligado nas configurações do plugin GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Alerta"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Colocar na fila da lista de reprodução"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Remover da fila da lista de reprodução"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Recarregar metadados"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Remover do disco"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Adicionar coluna"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Editar coluna"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Remover coluna"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Agrupar por"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Nenhum"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artista/Data/Álbum"
@@ -974,7 +1012,7 @@ msgstr "Artista/Data/Álbum"
msgid "Open file..."
msgstr "Abrir arquivo..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configurar %s"
@@ -983,19 +1021,23 @@ msgstr "Configurar %s"
msgid "Default Audio Device"
msgstr "Dispositivo de áudio padrão"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Adicionar"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Teclas de atalho"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Ação"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Local"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinação de teclas"
@@ -1007,139 +1049,145 @@ msgstr "Adicionando arquivos..."
msgid "Initializing..."
msgstr "Inicializando..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Você modificou os dados desta faixa."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Deseja realmente fechar esta janela?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Valores múltiplos]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Chave"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valor"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Escrevendo etiquetas..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nome:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Os nomes dos campos não devem começar com : ou _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Incapaz de adicionar campo"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Um campo com esse nome já existe. Por favor, tente outro nome."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Deseja realmente remover o campo selecionado?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Adicionar campo"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Remover campo"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Uso: deadbeef [opções] [arquivo(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opções:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ou -h Imprime a ajuda (esta mensagem) e sai\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Fecha o DeaDBeeF\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Imprime informações da versão e sai\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Inicia a reprodução\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Para a reprodução\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausa a reprodução\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Pausa/reinicia\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
" --play-pause Inicia a reprodução se parado, senão pausa/reinicia\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Próxima música na lista de reprodução\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Música anterior na lista de reprodução\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Música aleatória na lista de reprodução\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
" --queue Acrescenta arquivos(s) à lista de reprodução "
"existente\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Imprime o nome da faixa para a saída padrão\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1150,7 +1198,7 @@ msgstr ""
" [l]duração, [n]úmero da faixa, [y]ano, [c]omentário,\n"
" di[r]eitos autorais, tempo d[e]corrido\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1159,7 +1207,7 @@ msgstr ""
" ex.: --nowplaying \"%%a - %%t\" deve imprimir\n"
" \"artista - título\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
@@ -1169,45 +1217,19 @@ msgstr ""
"http://sourceforge.net/apps/mediawiki/deadbeef/index.php?"
"title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Padrão"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Sim"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Não"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recomendado)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Ascendente\n"
-"Descendente"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Desativar\n"
-"Faixa\n"
-"Álbum"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1233,7 +1255,7 @@ msgstr ""
"Banda / Artista do álbum\n"
"Personalizar"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1241,13 +1263,40 @@ msgstr ""
"Esquerda\n"
"Direita"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Desativar\n"
+"Faixa\n"
+"Álbum"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Ascendente\n"
+"Descendente"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recomendado)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Não foi possível encontrar o arquivo pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1260,7 +1309,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Adicionar CD de áudio"
#: ../translation/extra.c:4
@@ -1276,7 +1326,7 @@ msgstr "Usar reamostragem ALSA"
msgid "Release device while stopped"
msgstr "Liberar dispositivo quando parado"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Tamanho preferido do buffer"
@@ -1305,265 +1355,303 @@ msgstr "Senha"
msgid "Scrobble URL"
msgstr "URL para scrobbling"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Arquivo de dispositivo"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Contornar falha da taxa de amostragem do OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Período para atualização do cache (h)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Buscar nas etiquetas embutidas"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Buscar numa pasta local"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Máscara de arquivo de capa local"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Buscar no last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Buscar no albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Escalar a capa do álbum pelo lado maior"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Usar CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferir CD-Text a CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "URL de CDDB (ex. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Número da porta CDDB (ex. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferir protocolo CDDB ao HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Habilitar suporte ao formato de imagem NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Qualidade de reamostragem (0..2, maior é melhor)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Duração máxima da música (em minutos)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Duração padrão das músicas (em segundos)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Pedir confirmação para excluir arquivos do disco"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Sensibilidade ao controle de volume no ícone de status"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Ícone de status personalizado"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Executar gtk_init com --sync (modo de depuração)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Adicionar separadores entre itens do menu de contexto dos plugins"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Formato de notificação do título"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Formato de notificação do conteúdo"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Mostrar a capa do álbum"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Tamanho da capa do álbum (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Servidor PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Taxa de amostragem"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Caminho relativo da tabela de referência"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Caminho absoluto da tabela de referência"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Intercâmbio de bytes de áudio (alterne se só ouve estática)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Habilitar banco de dados de duração da HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (da HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bits por amostra (8 ou 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Duração padrão das músicas (em segundos)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Arquivo de configuração para o banco Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Título da faixa"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Artista"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Total de faixas"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Gênero"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Compositor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Número do disco"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comentário"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Codificador / Fornecedor"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Local"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Índice de subfaixas"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tipo(s) de etiqueta"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Cuesheet embutida"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Extensões de arquivo (separadas por \";\")"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Converter"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Taxa de amostragem alvo"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Qualidade / Algoritmo"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Taxa de amostragem automática (sobrepuja a taxa de amostragem alvo)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Habilitar scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "O arquivo já existe. Sobrescrever?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Alerta do conversor"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Selecione o codificador, por favor"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Erro do conversor"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Convertendo..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Selecionar pasta..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Falha ao salvar predefinição do codificador"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1571,64 +1659,79 @@ msgstr ""
"Verifique as permissões da pasta de predefinições, tente com um título "
"diferente ou libere algum espaço no disco"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
"Uma predefinição com o mesmo nome já existe. Tente um título diferente."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Erro"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Adicionar novo codificador"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Editar codificador"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Remover predefinição"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Esta ação irá excluir a predefinição selecionada. Tem certeza?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codificadores"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Adicionar plugin à corrente do DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Falha ao salvar predefinição do DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nova predefinição do DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Editar predefinição do DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Predefinições do DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Pasta de saída:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Preservar a estrutura da pasta, começando por:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Nome do arquivo de saída:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1636,84 +1739,91 @@ msgstr ""
"A extensão (ex. .mp3) será adicionada automaticamente.\n"
"Deixe o campo vazio para o padrão (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codificador:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Predefinição do DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Número de linhas de execução"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Formato da amostra de saída:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Manter o formato original"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "Inteiro de 8 bits com sinal"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "Inteiro de 16 bits com sinal"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "Inteiro de 24 bits com sinal"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "Inteiro de 32 bits com sinal"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bits flutuante"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Quando o arquivo existir:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Perguntar"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Sobrescrever"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Preservar a estrutura da pasta, começando por:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Editar predefinição do codificador"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Codificador sem título"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensão do arquivo de saída:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Ex. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Linha de comando:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1722,8 +1832,9 @@ msgstr ""
"%i para arquivo de entrada, %o para arquivo de saída, - para entrada padrão "
"(stdin)"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1731,78 +1842,324 @@ msgstr ""
"<small>%o - nome do arquivo de saída\n"
"%i - nome do arquivo de entrada temporário</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Método:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Pipe"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Arquivo temporário"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Editor de etiquetas</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor de predefinições do DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Predefinição do DSP sem título"
-#~ msgid ""
-#~ "Keep source format\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-#~ msgstr ""
-#~ "Manter formato original\n"
-#~ "Inteiro de 8 bits com sinal\n"
-#~ "Inteiro de 16 bits com sinal\n"
-#~ "Inteiro de 24 bits com sinal\n"
-#~ "Inteiro de 32 bits com sinal\n"
-#~ "32 bits flutuante"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"Manter formato original\n"
+"Inteiro de 8 bits com sinal\n"
+"Inteiro de 16 bits com sinal\n"
+"Inteiro de 24 bits com sinal\n"
+"Inteiro de 32 bits com sinal\n"
+"32 bits flutuante"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"Perguntar\n"
+"Sobrescrever"
-#~ msgid ""
-#~ "Pipe\n"
-#~ "Temporary file"
-#~ msgstr ""
-#~ "Pipe\n"
-#~ "Arquivo temporário"
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"Pipe\n"
+"Arquivo temporário"
-#~ msgid ""
-#~ "Prompt\n"
-#~ "Overwrite"
-#~ msgstr ""
-#~ "Perguntar\n"
-#~ "Sobrescrever"
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Editar"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Fechar"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Editar coluna"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Linha de comando:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Embaralhar faixas"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Valores múltiplos]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Local"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Remover"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nova lista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Comentário"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Adicionar coluna"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Esta ação irá excluir a predefinição selecionada. Tem certeza?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Configurar"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Configuração"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Interface do usuário"
+
+#~ msgid "Slot"
+#~ msgstr "Ação"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Deseja realmente remover o campo selecionado?"
#~ msgid "about.txt"
#~ msgstr "about.txt"
diff --git a/po/ro.po b/po/ro.po
index 1a7d4f40..2059cb4c 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -2,13 +2,12 @@
# Copyright (C) 2012 THE DeaDBeeF'S COPYRIGHT HOLDER
# This file is distributed under the same license as the DeaDBeeF package.
# Mișu Moldovan <dumol@xfce.org>, 2012.
-#
msgid ""
msgstr ""
-"Project-Id-Version: DeaDBeeF 0.5.2-beta1\n"
-"Report-Msgid-Bugs-To: diacritice@googlegroups.com\n"
-"POT-Creation-Date: 2012-03-06 10:30+0200\n"
-"PO-Revision-Date: 2012-03-06 17:48+0200\n"
+"Project-Id-Version: DeaDBeeF 0.5.3-rc1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-06-04 14:24+0300\n"
"Last-Translator: Mișu Moldovan <dumol@xfce.org>\n"
"Language-Team: Romanian <diacritice@googlegroups.com>\n"
"Language: ro\n"
@@ -55,9 +54,9 @@ msgstr "Nu s-a putut încărca fișierul ce conține ajutorul"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1238
-#: ../plugins/converter/convgui.c:1246
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Ajutor"
@@ -71,152 +70,161 @@ msgstr "Despre DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Istoricul modificărilor DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Traducători DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:756 ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Editare listă de redare"
-#: ../plugins/gtkui/ddbtabstrip.c:759 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:70
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titlu:"
-#: ../plugins/gtkui/ddbtabstrip.c:948
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Redenumire listă de redare"
-#: ../plugins/gtkui/ddbtabstrip.c:955
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Ștergere listă de redare"
-#: ../plugins/gtkui/ddbtabstrip.c:962
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Adăugare listă de redare"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Salvare presetări DeaDBeeF EQ"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Fișiere cu presetări DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Încărcare presetări DeaDBeeF EQ..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Presetări DeaDBeeF EQ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Import de presetări EQ Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Presetări Foobar2000 EQ (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Salvare presetări"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Încărcare presetări"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Import de presetări Foobar2000..."
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Activare"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Zero tot"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Zero preamp"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Zero benzi"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Presetări"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "o zi %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d zile %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Oprit | %d piese | %s durată totală"
-#: ../plugins/gtkui/gtkui.c:162 ../playlist.c:3012
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162 ../playlist.c:3012
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pauză | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
-msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d piese | %s durată totală"
+msgstr ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d piese | %s durată totală"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Salvare listă de redare ca"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Fișiere cu liste de redare DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Încărcare listă de redare"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Alte fișiere (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Listă de redare nouă"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Listă de redare nouă (%d)"
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr "- Testați funcționalitatea de ieșire din sesiune"
+
#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Fișier"
@@ -233,7 +241,7 @@ msgstr "Adăugare fișiere"
msgid "Add folder(s)"
msgstr "Adăugare directoare"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Adăugare link"
@@ -278,9 +286,12 @@ msgstr "Inversare a selecției"
msgid "Selection"
msgstr "Selecție"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:16
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Ștergere"
@@ -293,14 +304,16 @@ msgid "_Find"
msgstr "_Căutare"
#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
-msgid "Sort By"
+msgid "Sort by"
msgstr "Sortare după"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:20
-#: ../plugins/converter/convgui.c:788 ../plugins/converter/convgui.c:1209
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titlu"
@@ -308,609 +321,630 @@ msgstr "Titlu"
msgid "Track number"
msgstr "Numărul piesei"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:22
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artist"
#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
-#: ../translation/extra.c:70
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Dată"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Aleatoare"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Personalizare..."
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Preferințe"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Vizualizare"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Bară de stare"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Titluri pentru coloane"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Taburi"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Egalizator"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Redare"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:33
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordine"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:34
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Liniară"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:35
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Piese amestecate"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Albume amestecate"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:37
-msgid "Random"
-msgstr "Aleatoare"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Repetare"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:39
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
msgstr "Repetare pentru listă"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:40
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
msgstr "Repetare pentru piesa curentă"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:41
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
msgstr "Fără repetare"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Lista se derulează la redare"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Selecția urmează redarea"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Oprire după piesa curentă"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:45
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Salt la piesa curentă"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Ajutor"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Istoric"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:48
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:49
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Despre"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Traducători"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Căutare"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stop"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Redare"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pauză"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Înapoi"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:57
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Înainte"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:58
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Aleator"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:59
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Despre"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:60
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Ieșire"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:62
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Proprietățile piesei"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:63
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Opțiuni"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:64
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Aplică"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "În_chide"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:66
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadate"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Proprietăți"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Introduceți aici un nou titlu pentru coloană"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Tip:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Index de elemente"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "În redare"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Copertă album"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artist - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Durată"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Numărul piesei"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Formație / Album Artist"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Aliniere:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Stânga"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Dreapta"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Renunță"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Modul de ieșire audio:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Dispozitiv de ieșire audio:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Convertire la 16-biți pentru piesele audio de 8-biți"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Sunet"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Mod ReplayGain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Dezactivat"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Piesă"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Scalare pentru vârfurile ReplayGain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Preamplificare ReplayGain"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Preamplificare globală:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Fișierele adăugate extern intră în lista de redare:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "La pornire se reîncarcă sesiunea precedentă"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "La adăugarea de directoare nu se adaugă fișiere din arhive"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:104
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr "Resetare automată pentru „Oprire după piesa curentă”"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Redare"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:105 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Configurare"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Presetări lanț DSP:"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "Înca_rcă"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "Procesare"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Minimizare în zona de notificare la închiderea ferestrei"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Butonul din mijloc al mausului închide lista de redare"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Fără iconiță în zona de notificare"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Caractere îngroșate pentru piesa curentă"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Fără „Ștergere de pe disc” în meniul contextual"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:114
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Denumire automată pentru liste la adăugarea unui singur director"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Frecvență de reîmprospătare a interfeței (per secundă):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Text în bara de titlu la redare:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Text în bara de titlu în pauză:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Modul GUI (modificările necesită repornire):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:119
-msgid "GUI"
-msgstr "Interfață"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Suprascriere"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Prim-plan"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:122
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Fundal"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:123
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Culorile barelor de redare și volum"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Între"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Deschis"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Închis"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Bază"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Culorile taburilor"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Suprascriere (se pierde tema „treeview” GTK, dar se accelerează randarea)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Rând par"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Rând impar"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Rând selectat"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Text selectat"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:135
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Selecție"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:136
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Culorile listei de redare"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Culori"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Activare server proxy"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresă server proxy:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port server proxy:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tip proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Utilizator proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Parolă proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Rețea"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Versiune:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:146
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Drepturi de autor"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Module"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:149
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupare după"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:150
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Sortare după..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Format"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Crescătoare"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Descrescătoare"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:154
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Selectare modul DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:155
-#: ../plugins/converter/convgui.c:1014 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Modul"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Opțiuni pentru scrierea etichetelor"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Scrie ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Scrie ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Scrie APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Șterge ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Șterge ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Șterge APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Versiune ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (recomandată)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Codare ID3v1 (implicit iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Scrie ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artist / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Nr. piesă"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Ștergere fișiere de pe disc"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -918,49 +952,48 @@ msgstr ""
"Fișierele vor fi șterse definitiv. Continuați?\n"
"(Această interogare poate fi dezactivată în opțiunile modulului GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:696 ../plugins/converter/convgui.c:757
-#: ../plugins/converter/convgui.c:1134
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Avertizare"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Adăugare în coada de redare"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Ștergere din coada de redare"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Reîncarcare metadate"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Ștergere de pe disc"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Adăugare coloană"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Editare coloană"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Ștergere coloană"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grupează după"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Fără"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artist/Dată/Album"
@@ -968,7 +1001,7 @@ msgstr "Artist/Dată/Album"
msgid "Open file..."
msgstr "Deschide fișier..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Configurare %s"
@@ -977,19 +1010,22 @@ msgstr "Configurare %s"
msgid "Default Audio Device"
msgstr "Dispozitiv audio implicit"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Adăugare"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Combinații de taste globale"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
+msgstr "Acțiune"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Combinație de taste"
@@ -1001,180 +1037,186 @@ msgstr "Adăugare fișiere..."
msgid "Initializing..."
msgstr "Inițializare..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Ați modificat datele acestei piese."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Sigur doriți să închideți fereastra?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Valori multiple]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Cheie"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Valoare"
-#: ../plugins/gtkui/trkproperties.c:597
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Se scriu etichetele..."
-#: ../plugins/gtkui/trkproperties.c:624
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Nume:"
-#: ../plugins/gtkui/trkproperties.c:636
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Numele câmpurilor nu pot începe cu : sau _"
-#: ../plugins/gtkui/trkproperties.c:637 ../plugins/gtkui/trkproperties.c:671
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Nu s-a putut adăuga câmpul"
-#: ../plugins/gtkui/trkproperties.c:670
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Un câmp cu acest nume există deja, încercați să-l redenumiți."
-#: ../plugins/gtkui/trkproperties.c:695
-msgid "Really remove selected field?"
-msgstr "Sigur doriți să ștergeți câmpul selectat?"
-
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Adăugare câmp"
-#: ../plugins/gtkui/trkproperties.c:740
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Ștergere câmp"
-#: ../main.c:83
+#: ../main.c:84
#, c-format
msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Utilizare: deadbeef [opțiuni] [--] [fișier(e)]\n"
-#: ../main.c:84
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opțiuni:\n"
-#: ../main.c:85
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help sau -h Arată acest mesaj de ajutor și ieși\n"
-#: ../main.c:86
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Ieșire din player\n"
-#: ../main.c:87
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Arată detaliile versiunii și ieși\n"
-#: ../main.c:88
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Pornește redarea\n"
-#: ../main.c:89
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Oprește redarea\n"
-#: ../main.c:90
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pune pauză redării\n"
-#: ../main.c:91
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Comută starea de pauză\n"
-#: ../main.c:92
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Pornește redarea dacă e cazul sau comută starea de "
+msgstr ""
+" --play-pause Pornește redarea dacă e cazul sau comută starea de "
"pauză\n"
-#: ../main.c:93
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Piesa următoare în lista de redare\n"
-#: ../main.c:94
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Piesa precedentă în lista de redare\n"
-#: ../main.c:95
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Piesă aleatoare din lista de redare\n"
-#: ../main.c:96
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Adaugă fișiere la lista de redare curentă\n"
-#: ../main.c:97
+#: ../main.c:98
#, c-format
msgid ""
" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
-msgstr " --gui MODUL Precizează ce modul GUI să fie utilizat, implicit "
+msgstr ""
+" --gui MODUL Precizează ce modul GUI să fie utilizat, implicit "
"\"GTK2\"\n"
-#: ../main.c:98
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
-msgstr " --nowplaying FMT Arată în ieșirea standard numele formatat al piesei\n"
+msgstr ""
+" --nowplaying FMT Arată în ieșirea standard numele formatat al piesei\n"
-#: ../main.c:99
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
-" Sintaxă FMT prefixată cu %%: [a]rtist, [t]itlu, "
-"al[b]um,\n"
-" [l]ungime, [n]umăr piesă, [y] pentru an, [c]omentariu,\n"
+" Sintaxă FMT prefixată cu %%: [a]rtist, [t]itlu, al[b]"
+"um,\n"
+" [l]ungime, [n]umăr piesă, [y] pentru an, [c]"
+"omentariu,\n"
" d[r]epturi de autor, durată r[e]dată\n"
-#: ../main.c:102
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-msgstr " de ex.: --nowplaying \"%%a - %%t\" va rezulta în \"artist "
-"- titlu\"\n"
+msgstr ""
+" de ex.: --nowplaying \"%%a - %%t\" va rezulta în "
+"\"artist - titlu\"\n"
-#: ../main.c:103
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " pentru mai multe detalii vedeți http://sourceforge.net"
-"/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" pentru mai multe detalii vedeți http://sourceforge.net/"
+"apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2403
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Implicit"
-#: ../playlist.c:3699
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Da"
-#: ../playlist.c:3699
+#: ../playlist.c:3793
msgid "No"
msgstr "Nu"
@@ -1222,7 +1264,7 @@ msgstr ""
"Piesă\n"
"Album"
-#: ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/deadbeef.glade.h:156
msgid ""
"Ascending\n"
"Descending"
@@ -1230,7 +1272,7 @@ msgstr ""
"Ascendent\n"
"Descendent"
-#: ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/deadbeef.glade.h:168
msgid ""
"2.3 (Recommended)\n"
"2.4"
@@ -1240,11 +1282,12 @@ msgstr ""
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Nu s-a putut găsi fișierul pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1257,7 +1300,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr "Adăugare CD audio"
#: ../translation/extra.c:4
@@ -1273,7 +1316,7 @@ msgstr "Utilizează reeșantionare ALSA"
msgid "Release device while stopped"
msgstr "Eliberează dispozitivul la oprirea redării"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Mărime preferată pentru memoria tampon"
@@ -1302,329 +1345,379 @@ msgstr "Parolă"
msgid "Scrobble URL"
msgstr "URL Scrobble"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr "Preferă câmpul Artist al albumului"
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Fișierul dispozitivului"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Soluție alternativă pentru problema ratei de eșantionare OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Perioadă de actualizare pentru cache (ore)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Extrage din etichetele încorporate"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Extrage din directorul local"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Mască pentru fișierele local cu coperte"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Extrage de la Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Extrage de la albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Scalează copertele după lungime"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Utilizează CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Preferă CD-Text înaintea CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "Server CDDB (de ex. „freedb.org”)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Port CDDB (de ex. „888”)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Preferă protocolul CDDB înaintea HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Activează suportul pentru imagini NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Calitatea reeșantionării (0-2, 2 e calitate maximă)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr "Output 8-bit (implicit e 16)"
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Durată maximă pentru o piesă (în minute)"
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr "Durata estompării audio (sec)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr "Numărul de repetări pentru un loop (dacă e cazul)"
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Cere confirmare pentru ștergerea fișierelor de pe disc"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Prag de control al volumului prin iconița din zona de notificare"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Iconiță personalizată pentru zona de notificare"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Execută gtk_init cu --sync (mod de depanare)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Adaugă separatori între elementele modulelor din meniul contextual"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Format pentru titlul notificării"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Format pentru conținutul notificării"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Arată copertele albumelor"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Mărime pentru copertele albumelor (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Server PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Rată de eșantionare"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Cale relativă pentru tabelul de căutare"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Cale absolută pentru tabelul de căutare"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Inversează biții audio (comutați dacă auziți doar zgomot alb)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Activare HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (din HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Biți per eșantion (8 sau 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Lungime implicită pentru piese (sec)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Fișier de configurare a bancurilor Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Titlu piesă"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Interpret"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Număr de piese"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Gen"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Compozitor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Număr de disc"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Comentariu"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Codor / Comerciant"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Locație"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Index sub-piesă"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tip(uri) de etichete"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Cuesheet încorporat"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Extensii de fișiere (separate prin ;)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Convertire"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Rată de eșantionare țintă"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr "Calitate / Algoritm"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Rată de eșantionare automată (suprascrie rata țintă)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+#, fuzzy
+msgid "Configure custom shell commands"
+msgstr "Comenzi shell personalizate"
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr "Dezactivează redarea continuă (scanare mai rapidă)"
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr "Preferă Ken emu înaintea Satoh (fără surround)"
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr "Activare surround"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Fișierul există deja. Doriți să îl suprascrieți?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Avertizare de la convertor"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Selectați un codor"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Eroare de convertire"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "În convertire..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Selectați un director..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Nu s-au putut salva presetările codorului"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1033
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-"Verificați drepturile pentru directorul cu presetări, alegeți un alt "
-"titlu sau eliberați mai mult spațiu pe disc"
+"Verificați drepturile pentru directorul cu presetări, alegeți un alt titlu "
+"sau eliberați mai mult spațiu pe disc"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1033
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Există deja o presetare cu acest nume. Alegeți un alt titlu."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Eroare"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Adăugare codor nou"
-#: ../plugins/converter/convgui.c:722
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Editare codor"
-#: ../plugins/converter/convgui.c:754 ../plugins/converter/convgui.c:1131
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Ștergere codor"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Această acțiune va șterge predefiniția selectată. Sigur doriți asta?"
-#: ../plugins/converter/convgui.c:780
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Codoare"
-#: ../plugins/converter/convgui.c:836 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Adaugare modul în lanțul DSP"
-#: ../plugins/converter/convgui.c:1032
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Nu s-a putut salva predefiniția DSP"
-#: ../plugins/converter/convgui.c:1096
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nouă presetare DSP"
-#: ../plugins/converter/convgui.c:1181
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Editare presetare DSP"
-#: ../plugins/converter/convgui.c:1201
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Presetări DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Director cu rezultate:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr "Scrie în directorul pieselor originale"
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr "Păstrează structura de directoare"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Nume fișier rezultat:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1632,84 +1725,91 @@ msgstr ""
"Extensia (de ex. .mp3) va fi adăugată automat.\n"
"Lăsați câmpul gol pentru valoarea implicită (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Codor:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Presetare DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Număr de fire de execuție:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Eșantionarea finală:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Păstrează formatul sursei"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 bit signed int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 bit signed int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 bit signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 bit float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Dacă fișierul există:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Întreabă"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Suprascrie"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Păstrează structura de directoare, începând de la:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Editare presetare codor"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Codor fără nume"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Extensie fișier rezultat:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "De ex. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Linie de comandă:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1717,8 +1817,9 @@ msgstr ""
"Exemplu: lame - %o\n"
"%i pentru fișierul input, %o pentru fișierul rezultat, - pentru stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1726,46 +1827,314 @@ msgstr ""
"<small>%o - nume fișier rezultat\n"
"%i - nume fișier temporar de input</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Metodă:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Conector „pipe”"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Fișier temporar"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Scriere de etichete</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Editor de presetări DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Presetare DSP fără nume"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"Păstrează formatul original\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"Întreabă\n"
+"Suprascrie"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"Pipă\n"
+"Fișier temporar"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr "Comenzi shell personalizate"
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr "Editare"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr "Închide"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr "Editare coloană"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr "Comandă:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+"O comandă shell oarecare ce va fi executată în interpretorul shell în care a "
+"fost pornit DeaDBeeF. Se poate utiliza formatarea titlului. De exemplu: xdg-"
+"open %D"
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr "Nume:"
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr "Nume arbitrar, de exemplu „Comanda mea shell”"
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+"Numele comenzii, în mod obișnuit ar trebui să fie ceva scurt, de exemplu "
+"\"youtube_open\". Trebuie să fie unic."
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr "Piese unice"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr "Funcționează doar pentru o piesă unică."
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr "Piese multiple"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr "Funcționează pentru piese multiple."
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr "Local"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr "Funcționează pentru fișiere locale."
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr "La distanță"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr "Funcționează pentru linkuri la distanță (de ex. fluxuri HTTP)"
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+msgid "Playlist"
+msgstr "Listă de redare"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr "Elementul va apărea în meniul contextual al tabului listei de redare"
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr "Comun"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr "Elementul va apărea în meniul principal"
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr "Adăugare coloană"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr "Ștergere"
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Această acțiune va șterge comanda shell selectată. Sigur doriți asta?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr "Confirmare eliminare"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr "Numele nu poate fi gol și trebuie să fie unic.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr "Titlu nu poate fi gol.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr "Comanda shell nu poate fi goală.\n"
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr "Valori nevalide"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr "Fișierul nu este un fișier valid .desktop"
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr "Nu s-a recunoscut fișierul desktop Version „%s”"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr "Se pornește %s"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr "Programul nu acceptă documente în linia de comandă"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr "Opțiune nerecunoscută de lansare: %d"
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+"Nu se pot înainta documente de tip URI către o intrare desktop „Type=Link”"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr "Elementul nu poate fi lansat"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr "Dezactivează conexiunea la managerul sesiunii"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr "Specificați fișierul ce conține configurația salvată"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr "FIȘIER"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr "Specificați ID-ul de management de sesiune"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr "ID"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr "Opțiuni pentru managementul de sesiune:"
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr "Arată opțiunile managementului de sesiune"
+
+#~ msgid "GUI"
+#~ msgstr "Interfață"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Sigur doriți să ștergeți câmpul selectat?"
+
+#~ msgid "Slot"
+#~ msgstr "Slot"
diff --git a/po/ru.po b/po/ru.po
index 531736c5..a5092c21 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.4.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-12-15 15:34+0200\n"
"Last-Translator: Max <mpui@tut.by>\n"
"Language-Team: ru <slpiv@mail.ru>\n"
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
@@ -55,9 +55,9 @@ msgstr "Не удалось загрузить файл справки"
msgid "help.txt"
msgstr "help.ru.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Справка"
@@ -71,858 +71,897 @@ msgstr "О программе DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Изменения в DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Переводчики DeaDBeeF "
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Редактировать плейлист"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Название:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Переименовать плейлист"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Удалить плейлист"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Добавить новый плейлист"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Сохранить предустановку эквалайзера DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Файлы предустановок DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Загрузить предустановку эквалайзера DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Предустановки эквалайзера DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Импортировать предустановку эквалайзера Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Предустановки эквалайзера Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Сохранить"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Загрузить"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Импортировать предустановку Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Включить"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Обнулить все"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Обнулить предусиление"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Обнулить частоты"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Предустановки"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 день %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d дней %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Стоп | %d дорожек | %s общее время"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Моно"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стерео"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d кбит/с "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Пауза | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dГц | %d бит | %s | %d:%02d / %s | %d дорожек | %s общее время"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Сохранить плейлист как"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Файлы плейлистов DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Загрузить плейлист"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Другие файлы (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Новый плейлист"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Новый плейлист (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Файл"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Открыть файл(ы)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Добавить файл(ы)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Добавить каталог(и)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Добавить расположение"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Новый плейлист"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Загрузить плейлист"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Сохранить плейлист"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Выход"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Правка"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Очистить"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Выделить всё"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Снять выделение"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Обратить выделение"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Выделенное"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Удалить"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Оставить выделенное"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Найти"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Сортировать по"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Название"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Номер дорожки"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Альбом"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Исполнитель"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Дата"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Случайно"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Пользовательский"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Настройки"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Вид"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Строка состояния"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Заголовки столбцов"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Вкладки"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Эквалайзер"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Воспр_оизведение"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Порядок"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "По очереди"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Перемешивать дорожки"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Перемешивать альбомы"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Случайно"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Повторять"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Все"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Дорожку"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Не повторять"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Прокручивать плейлист автоматически"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Выделять текущую дорожку"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Останавливать после текущей"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Перейти на текущую дорожку"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Справка"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Изменения"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_О программе"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Переводчики"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Поиск"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Стоп"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Воспроизвести"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Пауза"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Предыдущая"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Следующая"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Играть вразброс"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "О программе"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Выход"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Свойства дорожки"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Настройки"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Применить"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Закрыть"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Метаданные"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Свойства"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Введите название нового столбца"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Тип:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Порядковый номер"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Воспроизводится"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Обложка альбома"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Исполнитель - Альбом"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Продолжительность"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Номер дорожки"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Группа / Исполнитель альбома"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Формат:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Выравнивание:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "По левому краю"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "По правому краю"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Отмена"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_ОК"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Модуль вывода:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Устройство вывода:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Всегда преобразовывать 8-битный звук в 16-битный"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Звук"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Режим автовыравнивания громкости:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Отключён"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Дорожка"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Использовать пиковое значение"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 дБ"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 дБ"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Предусиление автовыравнивания громкости:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Общее предусиление громкости:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Добавлять файлы из командной строки\n"
"(или файлового менеджера) в этот плейлист:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Восстанавливать предыдущую сессию при запуске"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Не добавлять из архивов при добавлении каталогов"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Останавливать после текущей"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Воспроизведение"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Настроить"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Предустановка для цепочки DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Загрузить"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Сворачивать в трей при закрытии"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Средняя кнопка мыши закрывает плейлист"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Не показывать значок в трее"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Использовать жирный шрифт для текущей дорожки"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Убрать пункт \"Удалить с диска\" из контекстного меню"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Автоматически именовать плейлисты при добавлении одного каталога"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Частота обновления интерфейса (раз за секунду):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Текст заголовка при проигрывании:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Текст заголовка при остановке:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Графический интерфейс (для изменения необходим перезапуск):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Интерфейс"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Заменить"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Передний план"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Фон"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Основные цвета"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Средний"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Светлый"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Тёмный"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Базовый"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Текст"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Цвета вкладок"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Заменить (теряются настройки темы GTK , но увеличивается скорость "
"визуализации)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
" Чётная \n"
" строка"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
" Нечётная \n"
" строка"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
" Выделенная \n"
" строка"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
" Выделенный \n"
" текст"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Курсор"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Цвета плейлиста"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Цвета"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Включить прокси-сервер"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Адрес:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Порт:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Тип прокси:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Имя пользователя:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Пароль:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Сеть"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Версия:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Авторские права"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Расширения"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "Адрес:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Группировать по"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Сортировать по..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Формат"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "По возрастанию"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "По убыванию"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Выберите расширение DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Расширение"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Настройки редактора тегов"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Писать ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Писать ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Писать APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Вырезать ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Вырезать ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Вырезать APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Версия ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Рекомендуемая)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Кодировка ID3v1 (по умолчанию iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Писать ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Исполнитель / Альбом"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "№"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Удалить файлы с жёсткого диска"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -930,49 +969,48 @@ msgstr ""
"Файлы будут удалены. Продолжить?\n"
"(Этот диалог может быть отключён в настройках расширения GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Предупреждение"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Добавить в очередь"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Удалить из очереди"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Обновить метаданные"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Удалить с жёсткого диска"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Добавить столбец"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Редактировать столбец"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Удалить столбец"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Группировать по"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Отсутствует"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Исполнитель/Дата/Альбом"
@@ -980,7 +1018,7 @@ msgstr "Исполнитель/Дата/Альбом"
msgid "Open file..."
msgstr "Открыть файл..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Настроить %s"
@@ -989,19 +1027,23 @@ msgstr "Настроить %s"
msgid "Default Audio Device"
msgstr "Аудио устройство по умолчанию"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Добавить"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Горячие клавиши"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Слот"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Расположение"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Комбинация клавиш"
@@ -1013,108 +1055,108 @@ msgstr "Добавление файлов..."
msgid "Initializing..."
msgstr "Загрузка..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Данные для этой дорожки были изменены."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Закрыть окно?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Несколько значений] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ключ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Значение"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Запись тегов..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Название:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Имена полей не должны начинаться с \":\" или \"_\""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Не удаётся добавить поле"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Поле с таким же именем уже сущестует, пожалуйста, выберите другое имя."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Вы действительно хотите удалить выделенное поле?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Добавить поле"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Удалить поле"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Использование: deadbeef [опции] [файл(ы)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опции:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
" --help или -h Вывести на экран справку (это сообщение) и выйти\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Выйти из плеера\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
" --version Вывести на экран информацию о версии программы и "
"выйти\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Начать воспроизведение\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Остановить воспроизведение\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Приостановить воспроизведение\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Приостановить воспроизведение\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
@@ -1122,33 +1164,39 @@ msgstr ""
" --play-pause Начать воспроизведение если остановлено, в противном "
"случае - приостановить\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Следующая дорожка в плейлисте\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Предыдущая дорожка в плейлисте\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Воспроизведение случайной дорожки в плейлисте\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Добавить файл(ы) в существующий плейлист\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Вывести на экран форматированное название дорожки\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1161,7 +1209,7 @@ msgstr ""
"комментарий,\n"
" %%r-авторские права, %%e-время, которое прошло \n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1170,7 +1218,7 @@ msgstr ""
" Например: --nowplaying \"%%a - %%t\" должна вывести "
"на экран \"artist - title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
@@ -1179,45 +1227,19 @@ msgstr ""
" для дополнительной информации, смотрите http://"
"sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Плейлист"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Да"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Нет"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Рекомендуемая)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"По возрастанию\n"
-"По убыванию"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Отключить\n"
-"Дорожка\n"
-"Альбом"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1243,7 +1265,7 @@ msgstr ""
"Группа / Исполнитель альбома\n"
"Разное"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1251,13 +1273,40 @@ msgstr ""
"Левый\n"
"правый"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Отключить\n"
+"Дорожка\n"
+"Альбом"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"По возрастанию\n"
+"По убыванию"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Рекомендуемая)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Не удалось найти файл изображения : %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1270,7 +1319,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Добавить аудио CD"
#: ../translation/extra.c:4
@@ -1286,7 +1336,7 @@ msgstr "Использовать передискретизацию с помо
msgid "Release device while stopped"
msgstr "Освобождать устройство во время остановки"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Предпочитаемый размер буфера"
@@ -1315,266 +1365,304 @@ msgstr "Пароль"
msgid "Scrobble URL"
msgstr "Адрес для скробблинга"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Файл устройства"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Исправление для ошибки частоты дискретизации в OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Период обновления кэша (часы)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Получать из встроенных тегов"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Получать из локальной директории"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Файловая маска для локальных обложек"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Получать из last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Получать из albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Масштабировать обложку относительно более длинной стороны"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Использовать CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Использовать CD-Text вместо CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "Адрес CDDB (например, 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Номер порта CDDB (например, '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Использовать протокол CDDB вместо HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Включить поддержку образов NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Качество передискретизации (0..2, выше - лучше)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Максимальная длина дорожки (в минутах)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Длина дорожки по умолчанию (сек)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Запрашивать подтверждение на удаление файлов с жёсткого диска"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Чувствительность регулятора громкости в значке статуса"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Пользовательский значок статуса"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Запускать gtk_init с ключом --sync (режим отладки)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Добавить разделители между элементами контекстного меню"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Формат заголовка уведомления"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Формат содержимого уведомления"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Показывать обложку"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Размер обложки (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Сервер PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Частота дискретизации"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Относительный путь таблицы поиска"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Абсолютный путь таблицы поиска"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Переставить местами аудио байты"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Включить HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (из HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Разрядность (8 или 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Длина дорожки по умолчанию (сек)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Файл конфигурации для банка Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Название дорожки"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Исполнитель(и)"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Всего дорожек"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Композитор"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Номер диска"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Комментарий"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Кодер / Продавец"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Расположение"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Номер вложенной дорожки"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тип(ы) тегов"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Встроенный файл cue"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодек"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Расширения файлов (разделять с помощью ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Конвертировать"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Частота дискретизации"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Качество / Алгоритм"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
"Автоматическая частота дискретизации (переопределяет частоту дискретизации)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Включить скробблер"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Файл уже существует. Перезаписать?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Converter предупреждение"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Пожалуйста, выберите кодировщик"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Converter ошибка"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Конвертирование..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Выберите каталог..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Не удалось сохранить предустановку кодировщика"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1582,63 +1670,78 @@ msgstr ""
"Проверьте права доступа на папку, в которой находится предустановка, "
"выберите другое имя или освободите место на диске"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Предустановка с таким же именем уже существует. Выберите другое имя."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Ошибка"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Добавить кодировщик"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Редактировать кодировщик"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Удалить предустановку"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Это действие приведёт к удалению выбранной предустановки. Вы уверены? "
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Кодировщики"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Добавить расширение в цепочку DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Не удалось сохранить предустановку DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Новая предустановка DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Редактировать предустановку DSP "
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Предустановки DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Выходной каталог:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Сохранить структуру папок, начиная с:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Имя выходного файла:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1646,84 +1749,91 @@ msgstr ""
"Расширение (например, .mp3) будет добавлено автоматически.\n"
"Оставьте это поле пустым для использования настроек по умолчанию (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Кодировщик:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Предустановка DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Количество потоков:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Выходной формат сэмплов:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Оставить исходный формат"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 бит целочисленный"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 бит целочисленный"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 бит целочисленный"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 бит целочисленный"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 бит вещественный"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Если файл существует:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Спросить"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Заменить"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Сохранить структуру папок, начиная с:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Редактировать предустановки"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Безымянный кодировщик"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Расширение выходного файла:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Например mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Командная строка"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1731,8 +1841,9 @@ msgstr ""
"Пример: lame - %o\n"
"\"%i\" для входного файла, \"%o\" для выходного файла, \"-\" для stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1740,50 +1851,317 @@ msgstr ""
"<small>\"%o\" - имя выходного файла\n"
"\"%i\" - имя временного входного файла</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Метод:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Конвейер"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Временный файл"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Запись тегов</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Редактор предустановок DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Безымянная предустановка DSP"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Заменить"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Временный файл"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Правка"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Закрыть"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Редактировать столбец"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Командная строка"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Перемешивать дорожки"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Несколько значений] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Расположение"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Удалить"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Новый плейлист"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Комментарий"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Добавить столбец"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Это действие приведёт к удалению выбранной предустановки. Вы уверены? "
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Настроить"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Настройки"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Интерфейс"
+
+#~ msgid "Slot"
+#~ msgstr "Слот"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Вы действительно хотите удалить выделенное поле?"
+
#~ msgid "Converter"
#~ msgstr "Конвертер"
diff --git a/po/si.po b/po/si.po
index f1e025e8..0a2efc24 100644
--- a/po/si.po
+++ b/po/si.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-11-29 17:35+0200\n"
"Last-Translator: danishka <danishka@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -54,9 +54,9 @@ msgstr ""
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "උදව්"
@@ -70,893 +70,924 @@ msgstr ""
msgid "DeaDBeeF %s ChangeLog"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr ""
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr ""
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr ""
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr ""
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr ""
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr ""
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr ""
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr ""
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr ""
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr ""
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr ""
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr ""
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr ""
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr ""
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr ""
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr ""
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr ""
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr ""
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr ""
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr ""
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr ""
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr ""
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr ""
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr ""
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr ""
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr ""
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr ""
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr ""
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr ""
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr ""
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr ""
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr ""
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr ""
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr ""
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr ""
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr ""
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr ""
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr ""
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Loop all"
msgstr ""
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Loop single song"
msgstr ""
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Don't loop"
msgstr ""
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr ""
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr ""
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr ""
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr ""
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr ""
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr ""
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr ""
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr ""
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr ""
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr ""
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr ""
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr ""
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr ""
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr ""
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr ""
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr ""
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr ""
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr ""
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr ""
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr ""
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr ""
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr ""
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr ""
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr ""
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr ""
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr ""
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr ""
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr ""
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr ""
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr ""
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr ""
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Auto-reset \"Stop after current\""
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr ""
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr ""
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr ""
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr ""
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr ""
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr ""
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr ""
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr ""
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr ""
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr ""
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr ""
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr ""
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr ""
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr ""
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr ""
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr ""
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr ""
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr ""
@@ -964,7 +995,7 @@ msgstr ""
msgid "Open file..."
msgstr ""
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr ""
@@ -973,19 +1004,22 @@ msgstr ""
msgid "Default Audio Device"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
+#: ../plugins/gtkui/prefwin.c:416
+msgid "Action"
msgstr ""
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr ""
@@ -997,136 +1031,142 @@ msgstr ""
msgid "Initializing..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr ""
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr ""
-#: ../main.c:91
+#: ../main.c:84
#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr ""
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr ""
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr ""
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr ""
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr ""
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr ""
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr ""
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr ""
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr ""
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr ""
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1134,52 +1174,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr ""
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1194,19 +1215,39 @@ msgid ""
"Custom"
msgstr ""
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1216,7 +1257,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1232,7 +1273,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1261,462 +1302,762 @@ msgstr ""
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr ""
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr ""
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr ""
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr ""
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr ""
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr ""
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr ""
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+msgid "Enable surround"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr ""
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr ""
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr ""
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr ""
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr ""
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr ""
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr ""
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr ""
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr ""
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr ""
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr ""
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr ""
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+msgid "Edit"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+msgid "Close"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+msgid "Edit Command"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+msgid "Single Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+msgid "Multiple Tracks"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+msgid "Local"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+msgid "Remote"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+msgid "Playlist"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+msgid "Add Command"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+msgid "Confirm Remove"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
diff --git a/po/sk.po b/po/sk.po
index 94f464c5..9ec18b00 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-07-08 10:21+0100\n"
"Last-Translator: Ivan Masár <helix84@centrum.sk>\n"
"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -54,9 +54,9 @@ msgstr "Zlyhalo načítanie súboru Pomocníka"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Pomocník"
@@ -70,859 +70,896 @@ msgstr "O aplikácii DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Záznam zmien DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, fuzzy, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF teraz prehráva"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Upraviť zoznam stôp"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Názov:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Premenovať zoznam stôp"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Odstrániť zoznam stôp"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Pridať nový zoznam stôp"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Uložiť predvoľby ekvalizéru DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Predvoľby ekvalizéru DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Načítať Predvoľby ekvalizéru DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Predvoľby ekvalizéru DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importovať predvoľby ekvalizéru Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Predvoľby ekvalizéru Foobar2000 (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Uložiť predvoľby"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Načítať predvoľby"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importovať predvoľby Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Zapnúť"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Znulovať všetky"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Znulovať predzos"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Znulovať pásma"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Uložiť predvoľby"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 deň %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dní %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Zastavené | %d stôp | %s celkový čas"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pozastavené | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d stôp | %s celkový čas"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Uložiť zoznam stôp ako"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Zoznamy stôp DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Načítať zoznam stôp"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Ostatné súbory (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nový zoznam stôp"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nový zoznam stôp (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Súbor"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Otvoriť súbor(y)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Pridať súbor(y)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Pridať priečinok/priečinky"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Pridať umiestnenie"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nový zoznam stôp"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Načítať zoznam stôp"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Uložiť zoznam stôp"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Ukončiť"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Upraviť"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Vyčistiť"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Vybrať všetky"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Zrušiť výber"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Invertovať výber"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Výber"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Odstrániť"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Orezať"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Nájsť"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Názov"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "Číslo súboru"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Interpret"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Náhodné"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Vlastné"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Nastavenia"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Zobraziť"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Stavový panel"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Hlavičky stĺpcov"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Karty"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekvalizér"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Prehrávanie"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Poradie"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Lineárne"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Zamiešať"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Zamiešať"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Náhodné"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Opakovať"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Opakovať všetky"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Opakovať jedinú stopu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Neopakovať"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Posúvať podľa prehrávanej stopy"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Kurzor podľa prehrávanej stopy"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Zastaviť po tejto stope"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Pomocník"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Záznam zmien"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "O _aplikácii"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Hľadať"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Zastaviť"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Prehrať"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pozastaviť"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Predošlá"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Ďalšia"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Prehrať náhodnú"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "O aplikácii"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Ukončiť"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Vlastnosti stopy"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Použiť"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Zatvoriť"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadáta"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Vlastnosti"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Sem zadajte názov stĺpca"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Hrá"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Obal albumu"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Interpret - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Trvanie"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
#, fuzzy
msgid "Track Number"
msgstr "Č. stopy"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Skupina/interpret"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Formát:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Zarovnanie:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Vľavo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Vpravo"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Zrušiť"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Výstupný zásuvný modul:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Výstupné zariadenie:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Zvuk"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Režim replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Vypnúť"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Stopa"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Najvyšší replaygain:"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "Režim replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr ""
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Zastaviť po tejto stope"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
#, fuzzy
msgid "Playback"
msgstr "_Prehrávanie"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Nastaviť"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Uložiť predvoľby"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Zatvorenie minimalizuje do oznamovacej oblasti"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Stredné tlačidlo myši zatvára zoznam stôp"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Rozhranie"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Prekonať"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Popredie"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Pozadie"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Farby lišty pozície a hlasitosti"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Stredné"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Svetlé"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tmavé"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Základ"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Farby pruhu kariet"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Prekonať (nepoužije témy vzhľadu stromového zobrazenia GTK, ale urýchli "
"vykresľovanie)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Párny riadok"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Nepárny riadok"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Vybraný riadok"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Vybraný text"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kurzor"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Farby zoznamu stôp"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Zapnúť proxy server"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresa proxy servera:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port proxy servera:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Typ proxy:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Používateľ proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Heslo pre proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Sieť"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Zásuvné moduly"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Zoskupiť podľa"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Formát:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Výber"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Zásuvné moduly"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Zapisovať značiek"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Zapísať ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Zapísať ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Zapísať APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Odstrániť ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Odstrániť ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Odstrániť APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Verzia ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (odporúča sa)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Kódovanie znakov ID3v1 (predvolené je iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Zapísať ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Interpret/album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Č. stopy"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Zmazať súbory z disku"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -930,49 +967,48 @@ msgstr ""
"Súbory sa stratia. Pokračovať?\n"
"(Tento dialóg môžete vypnúť v nastaveniach zásuvných modulov GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Upozornenie"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Pridať do frontu prehrávaných"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Odstrániť z frontu prehrávaných"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Znovu načítať metadáta"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Odstrániť z disku"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Pridať stĺpec"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Upraviť stĺpec"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Odstrániť stĺpec"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Zoskupiť podľa"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Žiadne"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Interpret/dátum/album"
@@ -980,7 +1016,7 @@ msgstr "Interpret/dátum/album"
msgid "Open file..."
msgstr "Otvoriť súbor..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Nastaviť"
@@ -989,19 +1025,23 @@ msgstr "Nastaviť"
msgid "Default Audio Device"
msgstr "Predvolené zvukové zariadenie"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Pridať"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globálne klávesové skratky"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Miesto"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Pridať umiestnenie"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kombinácia klávesov"
@@ -1013,140 +1053,145 @@ msgstr "Pridávajú sa súbory..."
msgid "Initializing..."
msgstr "Inicializuje sa..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Zmenili ste dáta tejto stopy."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Naozaj zatvoriť toto okno?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Kľúč"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Hodnota"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Naozaj zatvoriť toto okno?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Pridať súbor(y)"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Odstrániť"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Použitie: deadbeef [možnosti] [súbor(y)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Možnosti:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help alebo -h Vypíše túto správu Pomocníka a skončí\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Ukončí prehrávač\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Vypíše informácie o verzii a skončí\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Začne prehrávanie\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zastaví prehrávanie\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pozastaví prehrávanie\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Ďalšia stopa v zozname\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Predošlá stopa v zozname\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Náhodná stopa v zozname\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Pridá súbory do existujúceho zoznamu stôp\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT Vypíše formátovaný názov stopy na štand. výstup\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1157,7 +1202,7 @@ msgstr ""
" [l] dĺžka, [n] č. stopy, [y] rok, [c] komentár,\n"
" [r] autorské práva, [e] uplynulo\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1166,50 +1211,26 @@ msgstr ""
" napr.: --nowplaying „%%a - %%t“ by malo vypísať "
"„interpret - názov“\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Predvolené"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Áno"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nie"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (odporúča sa)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Vypnúť\n"
-"Stopa\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1236,7 +1257,7 @@ msgstr ""
"Skupina/Interpret albumu\n"
"Vlastné"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1244,13 +1265,38 @@ msgstr ""
"Vľavo\n"
"Vpravo"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Vypnúť\n"
+"Stopa\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (odporúča sa)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Nepodarilo sa nájsť súbor pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1260,7 +1306,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Pridať zvukové CD"
#: ../translation/extra.c:4
@@ -1276,7 +1323,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1309,488 +1356,810 @@ msgstr "Heslo pre proxy:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Zmazať súbory z disku"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Obal albumu"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Č. stopy"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Názov/interpret stopy"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Číslo súboru"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Pridať umiestnenie"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Typ(y) značiek"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Vložený cue"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Zapnúť proxy server"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Vybrať všetky"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Upraviť stĺpec"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Uložiť predvoľby"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Uložiť predvoľby"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Uložiť predvoľby"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Uložiť predvoľby"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Výstupné zariadenie:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Výstupný zásuvný modul:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Uložiť predvoľby"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Prekonať"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Načítať predvoľby"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Výstupný zásuvný modul:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Zapísať APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Zapísať ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Zapísať ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Zapisovať značiek"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Prekonať"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Upraviť"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Zatvoriť"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Upraviť stĺpec"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Zamiešať"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Názov/interpret stopy"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Pridať umiestnenie"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Odstrániť"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nový zoznam stôp"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Pridať stĺpec"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Nastaviť"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Rozhranie"
+
+#~ msgid "Slot"
+#~ msgstr "Miesto"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Naozaj zatvoriť toto okno?"
+
#~ msgid "Save playlist as"
#~ msgstr "Uložiť zoznam stôp ako"
diff --git a/po/sl.po b/po/sl.po
index ebb551a7..81a28a71 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-01-22 22:12+0200\n"
"Last-Translator: Klemen <klemen.kosir@gmx.com>\n"
"Language-Team: Slovenian <lugos-slo@lugos.si>\n"
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
-"n%100==4 ? 3 : 0);;\n"
+"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
+"%100==4 ? 3 : 0);;\n"
"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
@@ -55,11 +55,9 @@ msgstr "Datoteke pomoči ni mogoče naložiti"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737
-#: ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49
-#: ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Pomoč"
@@ -73,1065 +71,933 @@ msgstr "O programu DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "Dnevnik sprememb programa DeaDBeeF %s"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Prevajalci programa DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755
-#: ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Uredi seznam predvajanja"
-#: ../plugins/gtkui/ddbtabstrip.c:758
-#: ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922
-#: ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Naslov:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Preimenuj seznam predvajanja"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Odstrani seznam predvajanja"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Dodaj nov seznam predvajanja"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Shrani predlogo nastavitev uravnalnika DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Predloge nastavitev uravnalnika DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Naloži predlogo nastavitev uravnalnika DeaDBeeF ..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Predloge nastavitev uravnalnika DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Uvozi predlogo nastavitev uravnalnika Foobar2000 ..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Predloge nastavitev uravnalnika Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Shrani predlogo nastavitev"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Naloži predlogo nastavitev"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Uvozi predlogo nastavitev za Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Omogočeno"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Ponastavi"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Ponastavi predojačevalnik"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Ponastavi pasove"
-#: ../plugins/gtkui/eq.c:387
-#: ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Predloge nastavitev"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dan %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dni %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Zaustavljeno | %d skladb | Skupni čas predvajanja: %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Premor | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
-msgid "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
-msgstr "%s%s %s| %d Hz | %d bitov | %s | %d:%02d / %s | %d skladb | Skupni čas predvajanja: %s"
+msgid ""
+"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgstr ""
+"%s%s %s| %d Hz | %d bitov | %s | %d:%02d / %s | %d skladb | Skupni čas "
+"predvajanja: %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Shrani seznam predvajanja kot"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Seznami predvajanja DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Naloži seznam predvajanja"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Druge datoteke (*.*)"
-#: ../plugins/gtkui/gtkui.c:926
-#: ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nov seznam predvajanja"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nov seznam predvajanja (%d)"
-#: ../plugins/gtkui/interface.c:150
-#: ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Datoteka"
-#: ../plugins/gtkui/interface.c:157
-#: ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Odpri datoteko"
-#: ../plugins/gtkui/interface.c:173
-#: ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dodaj datoteko"
-#: ../plugins/gtkui/interface.c:181
-#: ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Dodaj mapo"
-#: ../plugins/gtkui/interface.c:189
-#: ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Dodaj mesto"
-#: ../plugins/gtkui/interface.c:198
-#: ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nov seznam predvajanja"
-#: ../plugins/gtkui/interface.c:205
-#: ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Naloži seznam predvajanja"
-#: ../plugins/gtkui/interface.c:209
-#: ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Shrani seznam predvajanja"
-#: ../plugins/gtkui/interface.c:218
-#: ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Končaj"
-#: ../plugins/gtkui/interface.c:229
-#: ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Uredi"
-#: ../plugins/gtkui/interface.c:236
-#: ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Počisti"
-#: ../plugins/gtkui/interface.c:244
-#: ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Izberi vse"
-#: ../plugins/gtkui/interface.c:251
-#: ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Prekliči izbor"
-#: ../plugins/gtkui/interface.c:258
-#: ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Obrni izbor"
-#: ../plugins/gtkui/interface.c:262
-#: ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Izbor"
-#: ../plugins/gtkui/interface.c:269
-#: ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323
-#: ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Odstrani"
-#: ../plugins/gtkui/interface.c:277
-#: ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Obreži"
-#: ../plugins/gtkui/interface.c:281
-#: ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Najdi"
-#: ../plugins/gtkui/interface.c:288
-#: ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Razvrsti po"
-#: ../plugins/gtkui/interface.c:295
-#: ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318
-#: ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790
-#: ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Naslov"
-#: ../plugins/gtkui/interface.c:299
-#: ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Številka skladbe"
-#: ../plugins/gtkui/interface.c:303
-#: ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875
-#: ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307
-#: ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Izvajalec"
-#: ../plugins/gtkui/interface.c:311
-#: ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315
-#: ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017
-#: ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Naključno"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Po meri"
-#: ../plugins/gtkui/interface.c:324
-#: ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Možnosti"
-#: ../plugins/gtkui/interface.c:328
-#: ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Pogled"
-#: ../plugins/gtkui/interface.c:335
-#: ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Vrstica stanja"
-#: ../plugins/gtkui/interface.c:339
-#: ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Glave stolpcev"
-#: ../plugins/gtkui/interface.c:343
-#: ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Zavihki"
-#: ../plugins/gtkui/interface.c:347
-#: ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Uravnalnik"
-#: ../plugins/gtkui/interface.c:351
-#: ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Pre_dvajanje"
-#: ../plugins/gtkui/interface.c:358
-#: ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Vrstni red"
-#: ../plugins/gtkui/interface.c:365
-#: ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Zaporedno"
-#: ../plugins/gtkui/interface.c:370
-#: ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Premešaj skladbe"
-#: ../plugins/gtkui/interface.c:375
-#: ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Premešaj albume"
-#: ../plugins/gtkui/interface.c:380
-#: ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Naključno"
-
-#: ../plugins/gtkui/interface.c:386
-#: ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Ponavljanje"
-#: ../plugins/gtkui/interface.c:393
-#: ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Ponavljaj vse skladbe"
-#: ../plugins/gtkui/interface.c:398
-#: ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Ponavljaj eno skladbo"
-#: ../plugins/gtkui/interface.c:403
-#: ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Brez ponavljanja"
-#: ../plugins/gtkui/interface.c:409
-#: ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Drsnik sledi predvajanju"
-#: ../plugins/gtkui/interface.c:414
-#: ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Kazalnik sledi predvajanju"
-#: ../plugins/gtkui/interface.c:418
-#: ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Zaustavi po trenutni skladbi"
-#: ../plugins/gtkui/interface.c:430
-#: ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Skoči na trenutno skladbo"
-#: ../plugins/gtkui/interface.c:437
-#: ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "Pomo_č"
-#: ../plugins/gtkui/interface.c:452
-#: ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Dnevnik _sprememb"
-#: ../plugins/gtkui/interface.c:461
-#: ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465
-#: ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474
-#: ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_O programu"
-#: ../plugins/gtkui/interface.c:482
-#: ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Prevajalci"
-#: ../plugins/gtkui/interface.c:898
-#: ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Iskanje"
-#: ../plugins/gtkui/interface.c:973
-#: ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Zaustavi"
-#: ../plugins/gtkui/interface.c:981
-#: ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Predvajaj"
-#: ../plugins/gtkui/interface.c:989
-#: ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Premor"
-#: ../plugins/gtkui/interface.c:997
-#: ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Predhodna"
-#: ../plugins/gtkui/interface.c:1005
-#: ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Naslednja"
-#: ../plugins/gtkui/interface.c:1013
-#: ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Predvajaj naključno"
-#: ../plugins/gtkui/interface.c:1022
-#: ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "O programu"
-#: ../plugins/gtkui/interface.c:1035
-#: ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Končaj"
-#: ../plugins/gtkui/interface.c:1225
-#: ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Lastnosti skladbe"
-#: ../plugins/gtkui/interface.c:1270
-#: ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Nastavitve"
-#: ../plugins/gtkui/interface.c:1296
-#: ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Uveljavi"
-#: ../plugins/gtkui/interface.c:1317
-#: ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Zapri"
-#: ../plugins/gtkui/interface.c:1321
-#: ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metapodatki"
-#: ../plugins/gtkui/interface.c:1367
-#: ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Lastnosti"
-#: ../plugins/gtkui/interface.c:1494
-#: ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Vnesite ime novega stolpca"
-#: ../plugins/gtkui/interface.c:1502
-#: ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Vrsta:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Številka skladbe"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511
-#: ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Predvajanje"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Naslovnica albuma"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Izvajalec - Album"
-#: ../plugins/gtkui/interface.c:1517
-#: ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Trajanje"
-#: ../plugins/gtkui/interface.c:1518
-#: ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Št. skladbe"
-#: ../plugins/gtkui/interface.c:1519
-#: ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Skupina / Izvajalec albuma"
-#: ../plugins/gtkui/interface.c:1526
-#: ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Oblika:"
-#: ../plugins/gtkui/interface.c:1551
-#: ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Poravnava:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Levo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Desno"
-#: ../plugins/gtkui/interface.c:1583
-#: ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065
-#: ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Prekliči"
-#: ../plugins/gtkui/interface.c:1604
-#: ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086
-#: ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_V redu"
-#: ../plugins/gtkui/interface.c:1825
-#: ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Izhodni vstavek:"
-#: ../plugins/gtkui/interface.c:1838
-#: ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Izhodna naprava:"
-#: ../plugins/gtkui/interface.c:1847
-#: ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Vedno pretvori 8-bitni zvok v 16-bitnega"
-#: ../plugins/gtkui/interface.c:1851
-#: ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Zvok"
-#: ../plugins/gtkui/interface.c:1864
-#: ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "ReplayGain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Onemogočeno"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Skladba"
-#: ../plugins/gtkui/interface.c:1877
-#: ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Prilagajanje vrha ReplayGain"
-#: ../plugins/gtkui/interface.c:1892
-#: ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902
-#: ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906
-#: ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Predojačanje ReplayGain:"
-#: ../plugins/gtkui/interface.c:1913
-#: ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Splošno predojačanje:"
-#: ../plugins/gtkui/interface.c:1944
-#: ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "Datoteke privzeto dodaj na ta seznam predvajanja:"
-#: ../plugins/gtkui/interface.c:1953
-#: ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Ob zagonu nadaljuj prejšnjo sejo"
-#: ../plugins/gtkui/interface.c:1957
-#: ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Med dodajanjem map ne dodaj datotek iz arhivov"
-#: ../plugins/gtkui/interface.c:1961
-#: ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Zaustavi po trenutni skladbi"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Predvajanje"
-#: ../plugins/gtkui/interface.c:1982
-#: ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22
-#: ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Nastavitve"
-#: ../plugins/gtkui/interface.c:2017
-#: ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Predloga nastavitev verige DSP"
-#: ../plugins/gtkui/interface.c:2029
-#: ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Naloži"
-#: ../plugins/gtkui/interface.c:2033
-#: ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042
-#: ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Ob zaprtju skrči v sistemsko vrstico"
-#: ../plugins/gtkui/interface.c:2046
-#: ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Srednji miškin gumb zapre seznam predvajanja"
-#: ../plugins/gtkui/interface.c:2050
-#: ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Skrij ikono sistemske vrstice"
-#: ../plugins/gtkui/interface.c:2054
-#: ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Uporabi krepko pisavo za trenutno predvajano skladbo"
-#: ../plugins/gtkui/interface.c:2058
-#: ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Skrij možnost »Izbriši z diska«"
-#: ../plugins/gtkui/interface.c:2062
-#: ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Samodejno poimenuj seznam prevajanja, ko je dodana le ena mapa"
-#: ../plugins/gtkui/interface.c:2070
-#: ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Hitrost osveževanja vmesnika:"
-#: ../plugins/gtkui/interface.c:2084
-#: ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Besedilo nazivne vrstice med predvajanjem:"
-#: ../plugins/gtkui/interface.c:2098
-#: ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Besedilo nazivne vrstice, ko je predvajanje zaustavljeno:"
-#: ../plugins/gtkui/interface.c:2112
-#: ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Vstavek vmesnika (zahteva ponovni zagon):"
-#: ../plugins/gtkui/interface.c:2120
-#: ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Vmesnik"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135
-#: ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Omogoči"
-#: ../plugins/gtkui/interface.c:2144
-#: ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Barva"
-#: ../plugins/gtkui/interface.c:2151
-#: ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Ozadje"
-#: ../plugins/gtkui/interface.c:2170
-#: ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Barva vrstice iskanja/glasnosti"
-#: ../plugins/gtkui/interface.c:2188
-#: ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Ozadje"
-#: ../plugins/gtkui/interface.c:2195
-#: ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "1. obroba"
-#: ../plugins/gtkui/interface.c:2202
-#: ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "2. obroba"
-#: ../plugins/gtkui/interface.c:2233
-#: ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Osnova"
-#: ../plugins/gtkui/interface.c:2240
-#: ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Besedilo"
-#: ../plugins/gtkui/interface.c:2253
-#: ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Barva zavihkov"
-#: ../plugins/gtkui/interface.c:2262
-#: ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Omogoči (prepiše temo GTK+, vendar pospeši izrisovanje)"
-#: ../plugins/gtkui/interface.c:2271
-#: ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Soda vrstica"
-#: ../plugins/gtkui/interface.c:2278
-#: ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Liha vrstica"
-#: ../plugins/gtkui/interface.c:2304
-#: ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Izbrana vrstica"
-#: ../plugins/gtkui/interface.c:2323
-#: ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Izbrano besedilo"
-#: ../plugins/gtkui/interface.c:2336
-#: ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Kazalnik"
-#: ../plugins/gtkui/interface.c:2349
-#: ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Barva seznama predvajanja"
-#: ../plugins/gtkui/interface.c:2353
-#: ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Barve"
-#: ../plugins/gtkui/interface.c:2362
-#: ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Omogoči posredniški strežnik"
-#: ../plugins/gtkui/interface.c:2370
-#: ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Naslov:"
-#: ../plugins/gtkui/interface.c:2384
-#: ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Vrata:"
-#: ../plugins/gtkui/interface.c:2398
-#: ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Vrsta:"
-#: ../plugins/gtkui/interface.c:2417
-#: ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Uporabniško ime:"
-#: ../plugins/gtkui/interface.c:2430
-#: ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Geslo:"
-#: ../plugins/gtkui/interface.c:2440
-#: ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Omrežje"
-#: ../plugins/gtkui/interface.c:2471
-#: ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Različica: "
-#: ../plugins/gtkui/interface.c:2535
-#: ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Avtorske pravice"
-#: ../plugins/gtkui/interface.c:2545
-#: ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Vstavki"
-#: ../plugins/gtkui/interface.c:3033
-#: ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135
-#: ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Združi po"
-#: ../plugins/gtkui/interface.c:3259
-#: ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Razvrsti po ..."
-#: ../plugins/gtkui/interface.c:3275
-#: ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Oblika"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "Naraščajoče"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "Padajoče"
-#: ../plugins/gtkui/interface.c:3359
-#: ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Izberite vstavek DSP"
-#: ../plugins/gtkui/interface.c:3375
-#: ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016
-#: ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Vstavek"
-#: ../plugins/gtkui/interface.c:3461
-#: ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Nastavitve zapisovalnika oznak"
-#: ../plugins/gtkui/interface.c:3492
-#: ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Zapiši ID3v2"
-#: ../plugins/gtkui/interface.c:3496
-#: ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Zapiši ID3v1"
-#: ../plugins/gtkui/interface.c:3500
-#: ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619
-#: ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Zapiši APEv2"
-#: ../plugins/gtkui/interface.c:3508
-#: ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Odstrani ID3v2"
-#: ../plugins/gtkui/interface.c:3512
-#: ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Odstrani ID3v1"
-#: ../plugins/gtkui/interface.c:3516
-#: ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631
-#: ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Odstrani APEv2"
-#: ../plugins/gtkui/interface.c:3524
-#: ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Različica ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (priporočeno)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538
-#: ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Kodiranje znakov ID3v1 (privzeto je iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575
-#: ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Zapiši ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316
-#: ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Izvajalec / Album"
-#: ../plugins/gtkui/mainplaylist.c:317
-#: ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Št. skladbe"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Izbriši datoteke z diska"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr "Ali ste prepričani, da želite izbrisati datoteke iz diska?"
-#: ../plugins/gtkui/plcommon.c:340
-#: ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693
-#: ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Opozorilo"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Dodaj na seznam predvajanja"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Odstrani s seznama predvajanja"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Ponovno naloži metapodatke"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Odstrani z diska"
-#: ../plugins/gtkui/plcommon.c:855
-#: ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Dodaj stolpec"
-#: ../plugins/gtkui/plcommon.c:885
-#: ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Uredi stolpec"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Odstrani stolpec"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Združi po"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ne združi"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Izvajalec/Datum/Album"
@@ -1139,7 +1005,7 @@ msgstr "Izvajalec/Datum/Album"
msgid "Open file..."
msgstr "Odpri datoteko ..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "%s"
@@ -1148,20 +1014,23 @@ msgstr "%s"
msgid "Default Audio Device"
msgstr "Privzeta zvočna naprava"
-#: ../plugins/gtkui/prefwin.c:318
-#: ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Dodaj"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Bližnjice"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Dejanje"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Mesto"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Bližnjica"
@@ -1173,198 +1042,187 @@ msgstr "Dodajanje datotek ..."
msgid "Initializing..."
msgstr "Začenjanje ..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Spremenili ste podatke te skladbe."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Ali res želite zapreti to okno?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Več vrednosti] "
-#: ../plugins/gtkui/trkproperties.c:407
-#: ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ključ"
-#: ../plugins/gtkui/trkproperties.c:408
-#: ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Vrednost"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Zapisovanje oznak ..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Ime:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Imena polj se ne smejo začeti z »:« ali »_«"
-#: ../plugins/gtkui/trkproperties.c:634
-#: ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Polja ni mogoče dodati"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Polje s tem imenom že obstaja."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Ali res želite odstraniti izbrano polje?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Dodaj polje"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Odstrani polje"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Uporaba: deadbeef [možnosti] [datoteka]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Možnosti:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ali -h Izpiše pomoč (to sporočilo).\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Konča predvajalnik.\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Izpiše podatke o različici.\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Začne predvajanje.\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zaustavi predvajanje.\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Prekine predvajanje.\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause Začne/prekine predvajanje\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
-msgid " --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Začne predvajanje, če je zaustavljeno, v nasprotnem primeru ga prekine.\n"
+msgid ""
+" --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr ""
+" --play-pause Začne predvajanje, če je zaustavljeno, v nasprotnem "
+"primeru ga prekine.\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Naslednja skladba s seznama predvajanja.\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Predhodna skladba s seznama predvajanja.\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Naključna skladba s seznama predvajanja.\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Pripne datoteko na seznam predvajanja.\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
-msgstr " --nowplaying OBLIKA Izpiše oblikovano ime trenutno predvajane skladbe.\n"
+msgstr ""
+" --nowplaying OBLIKA Izpiše oblikovano ime trenutno predvajane skladbe.\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
-" OBLIKA (začnite z %%): izv[a]jalec, [t] - naslov, al[b]um,\n"
+" OBLIKA (začnite z %%): izv[a]jalec, [t] - naslov, al[b]"
+"um,\n"
" [l] - trajanje, [n] - številka skladbe, [y] - leto,\n"
" [c] - opomba, avto[r]ske pravice, pr[e]tečen čas\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
-msgid " e.g.: --nowplaying \"%%a - %%t\" should print \"artist - title\"\n"
-msgstr " npr.: --nowplaying »%%a - %%t« izpiše »izvajalec - naslov«\n"
+msgid ""
+" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
+"- title\"\n"
+msgstr ""
+" npr.: --nowplaying »%%a - %%t« izpiše »izvajalec - "
+"naslov«\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
-msgid " for more info, see http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " Za več podatkov si oglejte http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgid ""
+" for more info, see http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" Za več podatkov si oglejte http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454
-#: ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Privzeto"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Da"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ne"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (priporočeno)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"Naraščajoče\n"
-"Padajoče"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Onemogočeno\n"
-"Skladba\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1390,7 +1248,7 @@ msgstr ""
"Skupina / Izvajalec albuma\n"
"Po meri"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1398,23 +1256,54 @@ msgstr ""
"Levo\n"
"Desno"
-#: ../plugins/gtkui/support.c:90
-#: ../plugins/gtkui/support.c:114
-#: ../plugins/converter/support.c:90
-#: ../plugins/converter/support.c:114
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Onemogočeno\n"
+"Skladba\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Naraščajoče\n"
+"Padajoče"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (priporočeno)\n"
+"2.4"
+
+#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Večbitne sličice ni mogoče najti: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
-msgid "wildmidi: freepats config file not found. Please install timidity-freepats package, or specify path to freepats.cfg in the plugin settings."
-msgstr "wildmidi: Nastavitvene datoteke freepats ni mogoče najti. Prosimo, namestite paket timidity-freepats ali navedite pot to datoteke »freepats.cfg« v nastavitvah vstavkov."
+msgid ""
+"wildmidi: freepats config file not found. Please install timidity-freepats "
+"package, or specify path to freepats.cfg in the plugin settings."
+msgstr ""
+"wildmidi: Nastavitvene datoteke freepats ni mogoče najti. Prosimo, namestite "
+"paket timidity-freepats ali navedite pot to datoteke »freepats.cfg« v "
+"nastavitvah vstavkov."
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Dodaj zvočni CD"
#: ../translation/extra.c:4
@@ -1430,8 +1319,7 @@ msgstr "Uporabi prevzorčenje ALSA"
msgid "Release device while stopped"
msgstr "Sprosti napravo, če je predvajanje zaustavljeno"
-#: ../translation/extra.c:8
-#: ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Prednostna velikost medpomnilnika"
@@ -1460,334 +1348,382 @@ msgstr "Geslo"
msgid "Scrobble URL"
msgstr "Naslov URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Datoteka naprave"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Začasna rešitev napake v hitrosti vzorčenja za OSS4"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Hitrost osveževanja predpomnilnika (v urah)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Pridobi iz oznak"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Pridobi iz krajevne mape"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Maska datotek z naslovnicami"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Pridobi z Last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Pridobi z Albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Prilagodi velikost naslovnice daljši stranici"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Uporabi CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Uporabi CD-Text namesto CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "Naslov CDDB (npr. »freedb.org«)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Številka vrat CDDB (npr. »888«)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Uporabi protokol CDDB namesto HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Omogoči podporo za odtise NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Kakovost prevzorčenja (0 ... 2, večje je boljše)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Največja dolžina skladbe (v minutah)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Privzeta dolžina skladbe (v sekundah)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Vprašaj pred brisanjem datotek z diska"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Občutljivost ikone za nadzor glasnosti"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Ikona stanja po meri"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Zaženi gtk_init z možnostjo --sync (način razhroščevanja)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Dodaj ločilnike med predmete vstavkov v vsebinskem meniju"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Oblika naziva obvestila"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Oblika vsebine obvestila"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Pokaži naslovnico albuma"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Velikost naslovnice albuma (v slik. točkah)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Strežnik PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Hitrost vzorčenja"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relativna pot do razpredelnice iskalnih vrednosti"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Absolutna pot do razpredelnice iskalnih vrednosti"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Zamenjaj zvočne bajte (izberite, če slišite statiko)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Omogoči podatkovno zbirko dolžin pesmi HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Bitov na vzorec (8 ali 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Privzeta dolžina skladbe (v sekundah)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Nastavitvena datoteka za Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Naslov skladbe"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Izvajalec"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Število skladb"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Zvrst"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Skladatelj"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Številka diska"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Opomba"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Kodirnik"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Mesto"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Številka podskladbe"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Vrsta oznake"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Vgrajena predloga podatkov"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Pripone datotek (ločene s »;«)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Pretvori"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Ciljna hitrost vzorčenja"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Kakovost / Algoritem"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "Samodejna hitrost vzorčenja (prepiše ciljno hitrost vzorčenja)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Omogoči pošiljanje zgodovine predvajanja"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Datoteka že obstaja. Ali jo želite prepisati?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Opozorilo pretvornika"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Prosimo, izberite kodirnik"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Napaka pretvornika"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Pretvarjanje ..."
-#: ../plugins/converter/convgui.c:394
-#: ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Izberite mapo ..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Predloge nastavitev kodirnika ni mogoče shraniti"
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
-msgid "Check preset folder permissions, try to pick different title, or free up some disk space"
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
+msgid ""
+"Check preset folder permissions, try to pick different title, or free up "
+"some disk space"
msgstr ""
"Preverite dovoljenja mape predloge nastavitev, izberite drugo ime ali "
"sprostite nekaj prostora na disku."
-#: ../plugins/converter/convgui.c:637
-#: ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "Predloga nastavitev s tem imenom že obstaja."
-#: ../plugins/converter/convgui.c:638
-#: ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Napaka"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Dodaj nov kodirnik"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Uredi kodirnik"
-#: ../plugins/converter/convgui.c:756
-#: ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Odstrani predlogo nastavitev"
-#: ../plugins/converter/convgui.c:758
-#: ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Ali ste prepričani, da želite izbrisati izbrano predlogo nastavitev?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Kodirniki"
-#: ../plugins/converter/convgui.c:838
-#: ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Dodaj vstavek v verigo DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Predloge nastavitev DSP ni mogoče shraniti."
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Nova predloga nastavitev DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Uredi predlogo nastavitev DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Predloge nastavitev DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Izhodna mapa:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Ohrani zgradbo map, začni z:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Ime izhodne datoteke:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1795,84 +1731,91 @@ msgstr ""
"Pripona (npr. mp3) bo pripeta samodejno.\n"
"Za privzeto vrednost (%a - %t) pustite polje prazno."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Kodirnik:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Predloga nastavitev DSP:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Število niti:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Oblika izhodnega vzorca:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Ohrani izvirno obliko"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8-bitno predznačeno celo število"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16-bitno predznačeno celo število"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24-bitno predznačeno celo število"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32-bitno predznačeno celo število"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32-bitna plavajoča vejica"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Če datoteka že obstaja:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Vprašaj"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Prepiši"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Ohrani zgradbo map, začni z:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Uredi predlogo nastavitev kodirnika"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Neimenovan kodirnik"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Pripona izhodne datoteke:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Na primer: mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Ukazna vrstica:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1880,8 +1823,9 @@ msgstr ""
"Zgled: lame - %o\n"
"%i = vhodna datoteka, %o = izhodna datoteka, - = standardni vhod"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1889,46 +1833,313 @@ msgstr ""
"<small>%o - ime izhodne datoteke\n"
"%i - začasno ime vhodne datoteke</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Način:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Cevovod"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Začasna datoteka"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "Ogg Vorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Zapisovalnik oznak</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Urejevalnik predlog nastavitev DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Neimenovana predloga nastavitev DSP"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Prepiši"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Začasna datoteka"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Uredi"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Zapri"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Uredi stolpec"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Ukazna vrstica:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Premešaj skladbe"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Več vrednosti] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Mesto"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Odstrani"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nov seznam predvajanja"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Opomba"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Dodaj stolpec"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Ali ste prepričani, da želite izbrisati izbrano predlogo nastavitev?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Nastavitve"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Nastavitve"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Vmesnik"
+
+#~ msgid "Slot"
+#~ msgstr "Dejanje"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Ali res želite odstraniti izbrano polje?"
diff --git a/po/sr.po b/po/sr.po
index eda4bcfa..52fa91ac 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -5,11 +5,11 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: DeaDBeeF 0.4\n"
+"Project-Id-Version: DeaDBeeF 0.5\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2010-11-18 14:52+0100\n"
-"Last-Translator: Jay A. Fleming <tito.nehru.naser@gmail.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-08-30 14:27+0100\n"
+"Last-Translator: Jay A.Fleming <tito.nehru.naser@gmail.com>\n"
"Language-Team: \n"
"Language: Serbian\n"
"MIME-Version: 1.0\n"
@@ -23,9 +23,8 @@ msgid "Supported sound formats"
msgstr "Подржане звучне датотеке"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Остале датотеке (*)"
+msgstr "Све датотеке (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -56,9 +55,9 @@ msgstr "Неуспело отварање датотеке помоћи"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Помоћ"
@@ -72,123 +71,126 @@ msgstr "O DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s — Дневник измена"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF преводиоци"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Уреди листу"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Наслов:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Преименуј листу"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Уклони листу"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Додај нову листу"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Сачувај подешавања еквилајзера"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Датотеке са подешавањима еквилајзера (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Учитавање подешавања еквилајзера..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Подешавања еквилајзера (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Увоз Foobar2000 подешавања еквилајзера..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Подешавања еквилајзера - Foobar2000(*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Сачувај подешавања"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Учитај подешавања"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Увоз Foobar2000 подешавања"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Омогући"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "На нулу све"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Претпојачало на нулу"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Подручја на нулу"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "Сачувај подешавања"
+msgstr "Поставке"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 дан %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d дана %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Заустављено | %d песама | %s укупно време свирања"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Моно"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стерео"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d кбпс "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Паузирано | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -196,737 +198,763 @@ msgstr ""
"%s%s %s| %d херца | %d бита | %s | %d:%02d / %s | %d песама | %s укупно "
"време свирања"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Сачувај листу као..."
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Датотека са листом (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Учитај листу"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Остале датотеке (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Нова листа"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Нова листа (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Датотека"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Отвори датотеку(е)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Додај датотеку(е)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Додај директоријум(е)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Додај место"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Нова листа"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Учитај листу"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Сачувај листу"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Излаз"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Уређивање"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "О_чисти"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Изабери све"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Поништи избор"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Обрни избор"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Избор"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Уклони"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Одсеци"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Тражи"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Сложи по"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Наслов"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Број песме"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Албум"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Извођач"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Датум"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Случајно"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Прилагођено"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Подешавања"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "П_реглед"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Статусна трака"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Колона заглавља"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Листови"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Еквилајзер"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Ре_продукција"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Редослед"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Линијски"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Насумично"
+msgstr "Насумично песме"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Насумично"
+msgstr "Насумично албуми"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Случајно"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Понављање"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Понови све"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Понављај песму"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Не понављај"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Клизач прати репродукцију песама"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Показивач прати репродукцију песама"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Заустави после тренутне песме"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Иди на песму која се репродукује"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Помоћ"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Дневник и_змена"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "О прогр_аму"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Преводиоци"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Тражи"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Заустави"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Пусти"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Паузирај"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Претходна"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Наредна"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Пусти насумично"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "О програму"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Излаз"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Особине песме"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Подешавања"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "С_ачувај промене"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Затвори"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Подаци о песми"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Особине"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Унесите име за нову колону овде"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Врста:"
-#: ../plugins/gtkui/interface.c:1510
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr "Индекс нумера"
+msgstr "Редни број"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Репродукује се"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Омотнице албума"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Извођач — Албум"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Трајање"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Број песме"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Група / Извођач"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Формат:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Поравнање:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Лево"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Десно"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Поништи"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_У реду"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Излазни додаци:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Излазни уређај"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "Увек претварај 8-битни у 16-битни аудио"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Звук"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygain мод:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Онемогући"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Песма"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replaygain скала вршних вредности"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr "Replaygain мод:"
+msgstr "Replaygain претпојачавач:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Претпојачавач:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Додај датотеке из линије за наредбе или управника датотека у ову листу:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Врати претходну сесију при покретању"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Не учитавај дадотеке из архива приликом додавања директоријума"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Заустави после тренутне песме"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Репродукција"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Подеси"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Сачувај подешавања"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "У_читај"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "Дигитална обрада звука (DSP)"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Код клика на затвори смести у обавештајну зону"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Средње дугме миша затвара листу"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Не приказуј икону у обавештајној зони"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Користи задебљан фонт за песму која се репродукује"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Сакриј ставке \"Обриши са диска\" у менију"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
+msgstr "Самоименовање листа песама при додавању само једног директоријума"
+
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "Освежавање приказа (колико пута у секунди)"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "При репродукцији, испиши на насловној линији: "
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "По заустављеној репродукцији, испиши на насловној линији: "
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr ""
+msgstr "Додатак графичког корисничког интерфејса (неопходно поновно покретање)"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Графичке контроле"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Замени подразумевано"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Боја текста"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Позадина"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Траке за премотавање/гласноћу"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Средње"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Светло"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Тамно"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Основа"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Текст"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Боје одвајања листова"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Замени подразумевано (губе се ГТК теме погледа стабла, али се добија бржи "
"приказ)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Паран ред"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr " Непаран ред"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Одабран ред"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Одабран текст"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Показивач"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Боје листе"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Боје"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Омогући прокси сервер"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Адреса прокси сервера:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Порт прокси сервера:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Тип проксија:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Прокси корисничко име:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Прокси лозинка:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Мрежа"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "Издање:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Ауторска права"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Додаци"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Групиши по"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
+msgid "Sort by ..."
+msgstr "Сложи..."
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
-msgstr "Формат:"
+msgstr "Облик:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "Растуће"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "Опадајуће"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Избор"
+msgstr "Избор додатка за дигиталну обраду"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr "Додаци"
+msgstr "Додатак"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr "Писач ознака"
+msgstr "Подешавања писача ознака"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Уписуј ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Уписуј ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Уписуј APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Уклони ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Уклони ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Уклони APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 верзија"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Препоручено)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 кодирање знакова (подразумевано је iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Уписуј ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Извођач / Албум"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Број песме"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Обриши датотеке са диска"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -934,49 +962,48 @@ msgstr ""
"Дадотеке ће бити обрисане. Да ли сте сигурни?\n"
"(Овај дијалог може да се искључи у подешавањима додатка GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Упозорење"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Додај у заказано"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Уклони из заказаног"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Поново учитај податке о песми"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Уклони са диска"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Додај колону"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Уреди колону"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Уклони колону"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Групиши по"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Поништи груписање"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Извођач/Датум/Албум"
@@ -984,28 +1011,32 @@ msgstr "Извођач/Датум/Албум"
msgid "Open file..."
msgstr "Отвори датотеку..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, fuzzy, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
-msgstr "Подеси"
+msgstr "Подеси %s"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "Подразумевани звучни уређај"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Додај"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Опште пречице"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Наредба"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Додај место"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Комбинација тастера"
@@ -1017,139 +1048,143 @@ msgstr "Додавање датотека..."
msgid "Initializing..."
msgstr "Иницијализација..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Изменили сте податке за ову песму."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Желите ли заиста да затворите овај прозор?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr ""
+msgstr "[Вишеструке вредности] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Кључ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Вредност"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "Уписујем ознаке..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "Име:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "Имена поља не могу почињати знацима : или _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "Не могу да додам поље"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Желите ли заиста да затворите овај прозор?"
+msgstr "Поље са истим именом већ постоји. Дајте пољу друго име."
-#: ../plugins/gtkui/trkproperties.c:734
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr "Додај датотеку(е)"
+msgstr "Додај поље"
-#: ../plugins/gtkui/trkproperties.c:737
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr "Уклони"
+msgstr "Уклони поље"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Употреба: deadbeef [опције] [датотека(е)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опције:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help или -h Прикажи ову помоћ и изађи\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Напусти плејер\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Прикажи инфо о верзији и изађи\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Репродукуј\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Заустави репродукцију\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Паузирај репродукцију\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause Паузирај\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
+" --play-pause Започни репродукцију ако је заустављена, и обратно\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Наредна песма из листе\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Претходна песма из листе\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Насумично песма из листе\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Додај датотеку(е) у постојећу листу\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Испиши уређено име песме на стд. излаз\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1160,7 +1195,7 @@ msgstr ""
" [l]-трајање, [n]-бр.песме, [y]-година, [c]-примедба,\n"
" [r]-ауторска права, [e]преостало време\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1169,51 +1204,28 @@ msgstr ""
" Н.пр.: --nowplaying \"%%a - %%t\" ће исписати "
"\"Извођач - Наслов\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+" додатне информације на http://sourceforge.net/apps/"
+"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Подразумевано"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Да"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Не"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Препоручено)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Онемогући\n"
-"Песма\n"
-"Албум"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
-#, fuzzy
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1227,7 +1239,7 @@ msgid ""
"Band / Album Artist\n"
"Custom"
msgstr ""
-"Број датотеке\n"
+"Редни број\n"
"Репродукује се\n"
"Омотница албума\n"
"Извођач - Албум\n"
@@ -1239,7 +1251,7 @@ msgstr ""
"Група / Извођач\n"
"Прилагођено"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1247,13 +1259,40 @@ msgstr ""
"Лево\n"
"Десно"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Онемогући\n"
+"Песма\n"
+"Албум"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Растући\n"
+"Опадајући"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Препоручено)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Не могу пронаћи датотеку са битмапираном сликом: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1266,7 +1305,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Додај звучни диск (ЦД)"
#: ../translation/extra.c:4
@@ -1282,7 +1322,7 @@ msgstr "Користи ALSA претварања фреквенције узор
msgid "Release device while stopped"
msgstr "Ослободи уређај након завршене репродукције"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Најрадије користи бафер величине"
@@ -1311,488 +1351,806 @@ msgstr "Лозинка"
msgid "Scrobble URL"
msgstr "Адреса за скроблер"
-#. OSS output plugin
-#: ../translation/extra.c:17
-msgid "Device file"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
msgstr ""
+#. OSS output plugin
#: ../translation/extra.c:18
+msgid "Device file"
+msgstr "Датотека уређаја"
+
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "Заобиђи грешку код фреквенције узорковања у „OSS4“"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Период освежавања привремене меморије (часова)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Преузми из уграђених ознака"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Преузми из локалних директоријума"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Име датотека садржи речи"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Преузми са Last.fm страница"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Преузми са albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Промени величину омотнице према дужој страници"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Користи CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Користи ЦД-текст, ако је доступан"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB адреса (нпр. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Ослушкуј CDDB на порту (нпр. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Најрадије користи CDDB протокол"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Укључи подршку за NRG слике"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Квалитет промене фреквенције узорковања (0..2, више је боље)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Најдуже трајање песме (минута)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Подразумевано трајање песме (секунди)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Захтевај дозволу за брисање датотека са диска"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Осетљивост контроле гласноће преко иконе стања"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Прилагођена икона стања"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Покрени \"gtk_init\" са \"--sync\" (режим отклањања грешака)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "Додај раздвајаче између ставки додатака у контекстном менију"
#. OSD Notify plugin
-#: ../translation/extra.c:45
-#, fuzzy
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr "Облик обавештавања"
+msgstr "Облик наслова обавештења"
-#: ../translation/extra.c:46
-#, fuzzy
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr "Облик обавештавања"
+msgstr "Облик садржаја обавештења"
-#: ../translation/extra.c:47
-#, fuzzy
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr "Омотнице албума"
+msgstr "Прикажи омотницу албума"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Величина омотнице албума (у пикселима)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio звучни сервер"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Фреквенција узорковања (Samplerate)"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Релативна путања за претраживање"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Потпуна путања за претраживање"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Замени аудио-бајт редослед (искључити ако не чујете нормалан звук)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
#, fuzzy
msgid "Enable HVSC Songlength DB"
msgstr "Омогући HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
+#, fuzzy
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlengths.txt (from HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "бита по узорку (8 или 16)"
-#: ../translation/extra.c:61
-#, fuzzy
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr "Најдуже трајање песме (минута)"
+msgstr "Подразумевано трајање песме (секунди)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Подешавања за Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Наслов песме"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Извођач"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Укупно песмама"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Композитор"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Број диска"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Напомена"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Енкодер / Испоручилац"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Додај место"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тип(ови) ознаке"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Угњеждени Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодек"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Наставци имена датотека (раздвоји са ;)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Прекодирај"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
-#, fuzzy
+#: ../translation/extra.c:93
msgid "Target Samplerate"
-msgstr "Фреквенција узорковања (Samplerate)"
+msgstr "Циљна фреквенција узорковања"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
-msgstr ""
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "Квалитет / Алгоритам"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
+"Аутоматска фреквенција узорковања (преклапа циљну фреквенцију узорковања)"
-#: ../plugins/converter/convgui.c:108
-msgid "The file already exists. Overwrite?"
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../plugins/converter/convgui.c:110
-msgid "Converter warning"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../plugins/converter/convgui.c:222
-msgid "Please select encoder"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Омогући скроблер"
+
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr "Датотека са истим именом већ постоји. Да ли да препишем преко ње?"
+
+#: ../plugins/converter/convgui.c:119
+msgid "Converter warning"
+msgstr "Упозорење прекодера"
+
+#: ../plugins/converter/convgui.c:271
+msgid "Please select encoder"
+msgstr "Одаберите кодер"
+
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Грешка прекодера"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Прекодирам..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "Изабери све"
+msgstr "Одаберите директоријум..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "Није успело чување поставки кодера"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
+"Проверите дозволе директоријума за чување поставки или дајте поставки друго "
+"име или проверите да ли имате довољно слободног простора на диску"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
-msgstr ""
+msgstr "Поставка са истим именом већ постоји. Дајте поставци друго име."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Грешка"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Додај нови кодер"
-#: ../plugins/converter/convgui.c:724
-#, fuzzy
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr "Уреди колону"
+msgstr "Уреди кодер"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "Сачувај подешавања"
+msgstr "Уклони поставку"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
-msgstr ""
+msgstr "Овом радњом ћете обрисати одабрану поставку. Да ли то заиста желите?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "Кодери"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "Није успело чување поставки за дигиталну обраду"
-#: ../plugins/converter/convgui.c:1098
-#, fuzzy
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr "Сачувај подешавања"
+msgstr "Нова поставка за дигиталну обраду"
-#: ../plugins/converter/convgui.c:1183
-#, fuzzy
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr "Сачувај подешавања"
+msgstr "Уреди поставку за дигиталну обраду"
-#: ../plugins/converter/convgui.c:1203
-#, fuzzy
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr "Сачувај подешавања"
+msgstr "Поставке за дигиталну обраду"
-#: ../plugins/converter/interface.c:94
-#, fuzzy
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
-msgstr "Излазни уређај"
+msgstr "Излазни директоријум:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Сачувај структуру директоријума, почевши од:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr "Излазни додаци:"
+msgstr "Име датотеке на излазу:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"Сам ћу додати наставак имена датотеке (нпр. .mp3).\n"
+"За подразумевано именовање датотеке (%a - %t) \n"
+"оставите ово поље празним."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "Кодер:"
-#: ../plugins/converter/interface.c:163
-#, fuzzy
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr "Сачувај подешавања"
+msgstr "Поставка за дигиталну обраду:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "Број нити:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "Излазна дубина бита узорка:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "Као у изворној датотеци"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "Означена 8-битно целобројна"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "Означена 16-битно целобројна"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "Означена 24-битно целобројна"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "Означена 32-битно целобројна"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "32-битно једнострука"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "Уколико датотека већ постоји:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "Питај ме"
-#: ../plugins/converter/interface.c:225
-#, fuzzy
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr "Замени подразумевано"
-
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
+msgstr "Препиши"
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "Учитај подешавања"
+msgstr "Уреди поставке кодера"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "Неименован кодер"
-#: ../plugins/converter/interface.c:410
-#, fuzzy
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr "Излазни додаци:"
+msgstr "Наставак имена датотеке на излазу:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "Нпр. mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "Линија наредбе:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"На пример: lame - %o\n"
+"%i за улазну датотеку, %o за излазну датотеку, - за стандардни улаз (stdin)"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>%o - име излазне датотеке\n"
+"%i - привренено име улазне датотеке</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "Метод:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "Цев"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "Привремена датотека"
-#: ../plugins/converter/interface.c:480
-#, fuzzy
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "Уписуј APEv2"
-#: ../plugins/converter/interface.c:486
-#, fuzzy
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "Уписуј ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
-#, fuzzy
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "Уписуј ID3v2"
-#: ../plugins/converter/interface.c:520
-#, fuzzy
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr "Писач ознака"
+msgstr "<b>Писач ознака</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "Уређивач поставки за дигиталну обраду"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "Неименована поставка за дигиталну обраду"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Препиши"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Привремена датотека"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Уређивање"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Затвори"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Уреди колону"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Линија наредбе:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Насумично песме"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Вишеструке вредности] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Додај место"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Уклони"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Нова листа"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Напомена"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Додај колону"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Овом радњом ћете обрисати одабрану поставку. Да ли то заиста желите?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Подеси"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Подешавања"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
msgstr ""
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Графичке контроле"
+
+#~ msgid "Slot"
+#~ msgstr "Наредба"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Желите ли заиста да обришете ово поље?"
+
#~ msgid "Save playlist as"
#~ msgstr "Сачувај листу као..."
diff --git a/po/sr@latin.po b/po/sr@latin.po
index 58450a4f..9b3cba20 100644
--- a/po/sr@latin.po
+++ b/po/sr@latin.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: DeaDBeeF 0.4\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2010-11-18 14:52+0100\n"
"Last-Translator: Jay A. Fleming <tito.nehru.naser@gmail.com>\n"
"Language-Team: \n"
@@ -56,9 +56,9 @@ msgstr "Neuspelo otvaranje datoteke pomoći"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Pomoć"
@@ -72,123 +72,127 @@ msgstr "O DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s — Dnevnik izmena"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF prevodioci"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Uredi listu"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Naslov:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Preimenuj listu"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Ukloni listu"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Dodaj novu listu"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Sačuvaj podešavanja ekvilajzera"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Datoteke sa podešavanjima ekvilajzera (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Učitavanje podešavanja ekvilajzera..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Podešavanja ekvilajzera (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Uvoz Foobar2000 podešavanja ekvilajzera..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Podešavanja ekvilajzera - Foobar2000(*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Učitaj podešavanja"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Uvoz Foobar2000 podešavanja"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Omogući"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Na nulu sve"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Pretpojačalo na nulu"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Područja na nulu"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
#, fuzzy
msgid "Presets"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dan %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dana %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Zaustavljeno | %d pesama | %s ukupno vreme sviranja"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pauzirano | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -196,737 +200,770 @@ msgstr ""
"%s%s %s| %d herca | %d bita | %s | %d:%02d / %s | %d pesama | %s ukupno "
"vreme sviranja"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Sačuvaj listu kao..."
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Datoteka sa listom (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Učitaj listu"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Ostale datoteke (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Nova lista"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Nova lista (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Datoteka"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Otvori datoteku(e)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dodaj datoteku(e)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Dodaj direktorijum(e)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Dodaj mesto"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Nova lista"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Učitaj listu"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Sačuvaj listu"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Izlaz"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Uređivanje"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "O_čisti"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Izaberi sve"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Poništi izbor"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Obrni izbor"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Izbor"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Ukloni"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Odseci"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Traži"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Naslov"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
#, fuzzy
msgid "Track number"
msgstr "Broj pesme"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Izvođač"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Datum"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Slučajno"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Prilagođeno"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Podešavanja"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "P_regled"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusna traka"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Kolona zaglavlja"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Listovi"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekvilajzer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "Re_produkcija"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Redosled"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linijski"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
#, fuzzy
msgid "Shuffle tracks"
msgstr "Nasumično"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
#, fuzzy
msgid "Shuffle albums"
msgstr "Nasumično"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Slučajno"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Ponavljanje"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Ponovi sve"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Ponavljaj pesmu"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Ne ponavljaj"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Klizač prati reprodukciju pesama"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Pokazivač prati reprodukciju pesama"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Zaustavi posle trenutne pesme"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Idi na pesmu koja se reprodukuje"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Pomoć"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "Dnevnik i_zmena"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "O progr_amu"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Prevodioci"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Traži"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Zaustavi"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Pusti"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Pauziraj"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Prethodna"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Naredna"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Pusti nasumično"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "O programu"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Izlaz"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Osobine pesme"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "S_ačuvaj promene"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Zatvori"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Podaci o pesmi"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Osobine"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Unesite ime za novu kolonu ovde"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Vrsta:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
#, fuzzy
msgid "Item Index"
msgstr "Indeks numera"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Reprodukuje se"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Omotnice albuma"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Izvođač — Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Trajanje"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Broj pesme"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Grupa / Izvođač"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Poravnanje:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Levo"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Desno"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Poništi"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_U redu"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Izlazni dodaci:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Izlazni uređaj"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Zvuk"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygain mod:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Onemogući"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Pesma"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Replaygain skala vršnih vrednosti"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
#, fuzzy
msgid "Replaygain preamp:"
msgstr "Replaygain mod:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Dodaj datoteke iz linije za naredbe ili upravnika datoteka u ovu listu:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Vrati prethodnu sesiju pri pokretanju"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Zaustavi posle trenutne pesme"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Reprodukcija"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Podesi"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
#, fuzzy
msgid "DSP Chain Preset"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Kod klika na zatvori smesti u obaveštajnu zonu"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Srednje dugme miša zatvara listu"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Ne prikazuj ikonu u obaveštajnoj zoni"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Koristi zadebljan font za pesmu koja se reprodukuje"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Sakrij stavke \"Obriši sa diska\" u meniju"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Pri reprodukciji, ispiši na naslovnoj liniji: "
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Po zaustavljenoj reprodukciji, ispiši na naslovnoj liniji: "
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "Grafičke kontrole"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Zameni podrazumevano"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Boja teksta"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Pozadina"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Trake za premotavanje/glasnoću"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Srednje"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Svetlo"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tamno"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Osnova"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Tekst"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Boje odvajanja listova"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Zameni podrazumevano (gube se GTK teme pogleda stabla, ali se dobija brži "
"prikaz)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Paran red"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr " Neparan red"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Odabran red"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Odabran tekst"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Pokazivač"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Boje liste"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Boje"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Omogući proksi server"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adresa proksi servera:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port proksi servera:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Tip proksija:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Proksi korisničko ime:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Proksi lozinka:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Mreža"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Autorska prava"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Dodaci"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Grupiši po"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Izbor"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Dodaci"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Pisač oznaka"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Upisuj ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Upisuj ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Upisuj APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Ukloni ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Ukloni ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Ukloni APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 verzija"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Preporučeno)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 kodiranje znakova (podrazumevano je iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Upisuj ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Izvođač / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Broj pesme"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Obriši datoteke sa diska"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -934,49 +971,48 @@ msgstr ""
"Dadoteke će biti obrisane. Da li ste sigurni?\n"
"(Ovaj dijalog može da se isključi u podešavanjima dodatka GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Upozorenje"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Dodaj u zakazano"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Ukloni iz zakazanog"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Ponovo učitaj podatke o pesmi"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Ukloni sa diska"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Dodaj kolonu"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Uredi kolonu"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Ukloni kolonu"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Grupiši po"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Poništi grupisanje"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Izvođač/Datum/Album"
@@ -984,7 +1020,7 @@ msgstr "Izvođač/Datum/Album"
msgid "Open file..."
msgstr "Otvori datoteku..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Podesi"
@@ -993,19 +1029,23 @@ msgstr "Podesi"
msgid "Default Audio Device"
msgstr "Podrazumevani zvučni uređaj"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Dodaj"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Opšte prečice"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Naredba"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Dodaj mesto"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kombinacija tastera"
@@ -1017,139 +1057,144 @@ msgstr "Dodavanje datoteka..."
msgid "Initializing..."
msgstr "Inicijalizacija..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Izmenili ste podatke za ovu pesmu."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Želite li zaista da zatvorite ovaj prozor?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Ključ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Vrednost"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Želite li zaista da zatvorite ovaj prozor?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Dodaj datoteku(e)"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Ukloni"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Upotreba: deadbeef [opcije] [datoteka(e)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Opcije:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ili -h Prikaži ovu pomoć i izađi\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Napusti plejer\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Prikaži info o verziji i izađi\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Reprodukuj\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Zaustavi reprodukciju\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pauziraj reprodukciju\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Naredna pesma iz liste\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Prethodna pesma iz liste\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Nasumično pesma iz liste\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Dodaj datoteku(e) u postojeću listu\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Ispiši uređeno ime pesme na std. izlaz\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1160,7 +1205,7 @@ msgstr ""
" [l]-trajanje, [n]-br.pesme, [y]-godina, [c]-primedba,\n"
" [r]-autorska prava, [e]preostalo vreme\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1169,50 +1214,26 @@ msgstr ""
" N.pr.: --nowplaying \"%%a - %%t\" će ispisati "
"\"Izvođač - Naslov\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Podrazumevano"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Da"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ne"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Preporučeno)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Onemogući\n"
-"Pesma\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1239,7 +1260,7 @@ msgstr ""
"Grupa / Izvođač\n"
"Prilagođeno"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1247,13 +1268,38 @@ msgstr ""
"Levo\n"
"Desno"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Onemogući\n"
+"Pesma\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Preporučeno)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Ne mogu pronaći datoteku sa bitmapiranom slikom: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1266,7 +1312,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Dodaj zvučni disk (CD)"
#: ../translation/extra.c:4
@@ -1282,7 +1329,7 @@ msgstr "Koristi ALSA pretvaranja frekvencije uzorkovanja"
msgid "Release device while stopped"
msgstr "Oslobodi uređaj nakon završene reprodukcije"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Najradije koristi bafer veličine"
@@ -1311,488 +1358,813 @@ msgstr "Lozinka"
msgid "Scrobble URL"
msgstr "Adresa za skrobler"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Period osvežavanja privremene memorije (časova)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Preuzmi iz ugrađenih oznaka"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Preuzmi iz lokalnih direktorijuma"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Ime datoteka sadrži reči"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Preuzmi sa Last.fm stranica"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Preuzmi sa albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Koristi CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Koristi CD-tekst, ako je dostupan"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB adresa (npr. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Osluškuj CDDB na portu (npr. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Najradije koristi CDDB protokol"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Uključi podršku za NRG slike"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Kvalitet promene frekvencije uzorkovanja (0..2, više je bolje)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Najduže trajanje pesme (minuta)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Najduže trajanje pesme (minuta)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Zahtevaj dozvolu za brisanje datoteka sa diska"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Osetljivost kontrole glasnoće preko ikone stanja"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Prilagođena ikona stanja"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Pokreni \"gtk_init\" sa \"--sync\" (režim otklanjanja grešaka)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
#, fuzzy
msgid "Notification title format"
msgstr "Oblik obaveštavanja"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
#, fuzzy
msgid "Notification content format"
msgstr "Oblik obaveštavanja"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Omotnice albuma"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio zvučni server"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Frekvencija uzorkovanja (Samplerate)"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Relativna putanja za pretraživanje"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Potpuna putanja za pretraživanje"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Zameni audio-bajt redosled (isključiti ako ne čujete normalan zvuk)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
#, fuzzy
msgid "Enable HVSC Songlength DB"
msgstr "Omogući HVSC"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
#, fuzzy
msgid "Default song length (sec)"
msgstr "Najduže trajanje pesme (minuta)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Podešavanja za Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Naslov pesme"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Izvođač"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Ukupno pesmama"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Žanr"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Kompozitor"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Broj diska"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Napomena"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Enkoder / Isporučilac"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Dodaj mesto"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tip(ovi) oznake"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Ugnježdeni Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Kodek"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
#, fuzzy
msgid "Target Samplerate"
msgstr "Frekvencija uzorkovanja (Samplerate)"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Omogući skrobler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Izaberi sve"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Uredi kolonu"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Izlazni uređaj"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Izlazni dodaci:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Sačuvaj podešavanja"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Zameni podrazumevano"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Učitaj podešavanja"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Izlazni dodaci:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Upisuj APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Upisuj ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Upisuj ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Pisač oznaka"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Zameni podrazumevano"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Uređivanje"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Zatvori"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Uredi kolonu"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Napomena"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Nasumično"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Ukupno pesmama"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Dodaj mesto"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Ukloni"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Nova lista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Napomena"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Dodaj kolonu"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Podesi"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "Grafičke kontrole"
+
+#~ msgid "Slot"
+#~ msgstr "Naredba"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Želite li zaista da zatvorite ovaj prozor?"
+
#~ msgid "Save playlist as"
#~ msgstr "Sačuvaj listu kao..."
diff --git a/po/sv.po b/po/sv.po
index ddf1df91..88f082f3 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2012-03-07 14:11+0200\n"
"Last-Translator: Martin <brother@bsnet.se>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -54,9 +54,9 @@ msgstr "Kunde inte läsa hjälpfil"
msgid "help.txt"
msgstr ""
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Hjälp"
@@ -70,852 +70,889 @@ msgstr "Om DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeadBeeF %s Ändrligslogg"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF översättare"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Redigera spellista"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Titel:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Byt namn på spellista"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Ta bort spellista"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Lägg till ny spellista"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Spara DeaDBeeF:s Equalizer-inställningar"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Filer för DeaDBeeFs equalizer-inställningar (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Läs in equalizer-inställningar för DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeFs equalizer-inställningar (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Importera equalizer-inställningar för Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 equalizer-inställningar (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Spara inställningar"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Läs in inställningar"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Importera inställningar från Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Aktivera"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Nollställ alla"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Ingen förstärkning"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Nollställ band"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Inställningar"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 dag %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d dagar %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Stoppad | %d spår | %s total speltid"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Pausad | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d spår | %s total speltid"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Spara spellista som"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF spellistfil (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Läs in spellista"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Andra filer (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Ny spellista"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Ny spellista (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Arkiv"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Öppna fil(er)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Lägg till fil(er)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Lägg till katalog(er)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Lägg till plats"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Ny spellista"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Läs in spellista"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Spara spellista"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "A_vsluta"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Redigera"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "R_ensa"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Markera allt"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Avmarkera allt"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Invertera markering"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Markering"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Ta bort"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Beskär"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Sök"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Sort by"
msgstr ""
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Titel"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Spårnummer"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Artist"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr ""
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Slumpa"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Anpassad"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Egenskaper"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Visa"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Statusrad"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Kolumnhuvuden"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Flikar"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Uppspelning"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Ordning"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Linjär"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Blanda spår"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Blanda albm"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Slumpa"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Upprepning"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Upprepa alla"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Upprepa ett spår"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Upprepa inte"
# oerhört osäker på vad som egentligen menas här.
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Markering följer uppspelning"
# sjukt svårt att översätta utan kotext.
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Markering följer uppspelning"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Stanna efter nuvarande"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr ""
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Hjälp"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Ändringslogg"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr ""
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Om"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr ""
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Sök"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Stopp"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Spela"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Paus"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Föregående"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Nästa"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Spela slumpad"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Om"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Avsluta"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Spåregenskaper"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr ""
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Verkställ"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Stäng"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Egenskaper"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Ange ny kolumntitel här"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Typ:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr ""
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Spelar"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albumillustration"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Artist - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Längd"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Spårnummer"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Artist"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Format:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Justering:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Vänster"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Höger"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Avbryt"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_OK"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Instick för uppspelning:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Enhet för uppspelning:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr ""
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Ljud"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Läge för justering av uppspelningsvolym:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Avaktivera"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Spår"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Övre gräns för justering av uppspelningsvolym"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr ""
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Läge för justering av förstärkning:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr ""
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Lägg till filer från kommandoraden (eller filhanteraren) till den här "
"spellistan:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Återuppta föregående session vid uppstart"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr ""
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Stanna efter nuvarande"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Uppspelning"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Inställningar"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Inställningar för DSP-kedja"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr ""
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr ""
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Stäng minimerar till systembricka"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Klicka med musknappen i mitten för att stänga spellista"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Dölj ikon i systembrickan"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Använd fet stil för spåret som spelas"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Göm menyvalet \"radera från disk\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Text i titelraden vid uppspelning:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Text u titelraden utan uppspelning:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Överbrygga"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Förgrund"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Bakgrund"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Färg på sök-/volym-fält"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Mitten"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Ljus"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Mörk"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Bas"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Text"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Färg för flikrad"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Överbrygga (GTK-baserat tema för trädvy försvinner men renderingen går "
"fortare)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Jämn rad"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Ojämn rad"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Markerad rad"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Markerad text"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Markör"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Spellistans färger"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Färger"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Aktivera proxyserver"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Adress för proxyserver:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Port för proxyserver:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Proxytyp:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Användarnamn för proxy:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Lösenord för proxy:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Nätverk"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Instick"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Gruppera efter"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+msgid "Sort by ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Format"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Välj DSP-instick"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Instick"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Inställningar för tagg-skrivare"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Skriv ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Skriv ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Skriv APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Rensa ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Rensa ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Rensa APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 version"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Rekomenderad)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 teckenkodning (iso8859-1 är standard)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Skriv ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Artist / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Spårnummer"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Radera filer från disk"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -923,49 +960,48 @@ msgstr ""
"Filer kommer att förloras. Fortsätta?\n"
"(Denna dialogruta kan stängas av i inställningarna för GTKUI-instick)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Varning"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Lägg till i uppspelningskön"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Ta bort från uppspelningskön"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Ladda om metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Ta bort från disk"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Lägg till kolumn"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Redigera kolumn"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Ta bort kolumn"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Gruppera efter"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Ingen"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Artist/Datum/Album"
@@ -973,7 +1009,7 @@ msgstr "Artist/Datum/Album"
msgid "Open file..."
msgstr "Öppna fil..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Inställningar för %s"
@@ -982,19 +1018,23 @@ msgstr "Inställningar för %s"
msgid "Default Audio Device"
msgstr "Standardljudenhet"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Lägg till"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Globala snabbtangenter"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Utrymme"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Plats"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Tangentkombination"
@@ -1006,138 +1046,144 @@ msgstr "Lägger till filer..."
msgid "Initializing..."
msgstr "Förbereder..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Du har ändrat data för detta spår."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Ska fönstret verkligen stängas?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Nyckel"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Värde"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Ska fältet verkligen tas bort?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Lägg till fält"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Ta bort fält"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Användning: deadbeef [flaggor] [fil(er)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Flaggor:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help eller -h Visa hjälp (detta meddelande) och avsluta\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Stäng spelare\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Skriv ut versionsinformation och avsluta\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Påbörja uppspelning\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Stoppa uppspelning\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pausa uppspelning\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Nästa spår i spellista\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Föregående spår i spellista\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Slumpa spår i spellista\n"
# existing => nuvarande? jag utgår ifrån att man avser listan som är aktiv i spelaren för tillfället.
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Lägg till fil(er) i nuvarande spellista\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Skriv formaterat spårnamn till standard ut\n"
# jag hatar dessa!
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1148,7 +1194,7 @@ msgstr ""
" längd (l), spårnummer (n), år (y), kommentar (c),\n"
" utgiven av (r), förfluten tid (e)\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1157,50 +1203,26 @@ msgstr ""
" e.x.: --nowplaying \"%%a - %%t\" bör visa \"artist - "
"titel\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Standard"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Ja"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Nej"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (rekomenderad)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Avaktivera\n"
-"Spår\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1227,7 +1249,7 @@ msgstr ""
"Band / Artist på album\n"
"Anpassad"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1235,13 +1257,38 @@ msgstr ""
"Vänster\n"
"Höger"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Avaktivera\n"
+"Spår\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (rekomenderad)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Kunde inte hitta pixmap-fil: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1254,7 +1301,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Lägg till ljud-CD"
#: ../translation/extra.c:4
@@ -1270,7 +1318,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr "Frigör enhet vid stopp"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1301,482 +1349,805 @@ msgstr "Lösenord"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Fråga innan radering av filer från disk"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Albumillustration"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Spårtitel"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Artist"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Titel / Artist för spåret"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Genre"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Kompositör"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Skivnummer"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Kommentar"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Plats"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Tagg-kategori(er)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Inbäddat körschema"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Codec"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Aktivera proxyserver"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Välj katalog..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Redigera kolumn"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Spara inställningar"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Spara inställningar"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Spara inställningar"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Spara inställningar"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Enhet för uppspelning:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Instick för uppspelning:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Spara inställningar"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Överbrygga"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Läs in inställningar"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Instick för uppspelning:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Skriv APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Skriv ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Skriv ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Tagg-skrivare"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Överbrygga"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Redigera"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Stäng"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Redigera kolumn"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Kommentar"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Blanda spår"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Titel / Artist för spåret"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Plats"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Ta bort"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Ny spellista"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Kommentar"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Lägg till kolumn"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Inställningar"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, c-format
+msgid "Starting %s"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "Utrymme"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Ska fältet verkligen tas bort?"
+
#~ msgid "Save playlist as"
#~ msgstr "Spara spellista som"
diff --git a/po/te.po b/po/te.po
index 0f09689d..b7c77923 100644
--- a/po/te.po
+++ b/po/te.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-04-25 17:20+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-04-11 04:21+0200\n"
"Last-Translator: PraveenIlla <mail2ipn@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: te\n"
@@ -23,9 +23,8 @@ msgid "Supported sound formats"
msgstr "సహకారంవున్న శబ్ధపు ఫార్మేట్లు"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "ఇతర ఫైళ్ళు (*)"
+msgstr "అన్ని ఫైళ్ళు (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -37,7 +36,7 @@ msgstr "పాటలజాబితాకు ఫైళ్ళ(ను) జతచ
#: ../plugins/gtkui/callbacks.c:220
msgid "Add folder(s) to playlist..."
-msgstr "సంచయా(ల)ను పాటలజాబితాకు జతచేయి..."
+msgstr "సంచయము(ల)ను పాటలజాబితాకు జతచేయి..."
#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
@@ -53,11 +52,11 @@ msgstr "సహాయక ఫైల్ లోడుచేయుటలో విఫ
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "సహాయం.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "సహాయం"
@@ -69,857 +68,889 @@ msgstr "డెడ్‌బీఫ్ %s గురించి"
#: ../plugins/gtkui/callbacks.c:760
#, c-format
msgid "DeaDBeeF %s ChangeLog"
-msgstr "డెడ్‌బీఫ్ %s మార్పుచిట్టా"
+msgstr "డెడ్‌బీఫ్ %s మార్పులచిట్టా"
-#: ../plugins/gtkui/callbacks.c:1116
-#, fuzzy, c-format
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
msgid "DeaDBeeF Translators"
-msgstr "డెడ్‌బీఫ్ ఇప్పుడు ఆడిస్తున్నది"
+msgstr "డెడ్‌బీఫ్ అనువాదకులు"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "పాటలజాబితాను సవరించు"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "శీర్షిక:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "పాటలజాబితా పేరుమార్చు"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "పాటలజాబితాను తొలగించు"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "కొత్త పాటలజాబితాను జతచేయి"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "డెడ్‌బీఫ్ EQ ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "డెడ్‌బీఫ్ EQ ప్రిసెట్ ఫైళ్ళు (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "డెడ్‌బీఫ్ EQ ప్రిసెట్ లోడుచేయి..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "డెడ్‌బీఫ్ EQ ప్రిసెట్ (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ ప్రిసెట్ దిగుమతిచేయి..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ ప్రిసెట్ (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "ప్రిసెట్ లోడుచేయి"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 EQ ప్రిసెట్ దిగుమతిచేయి"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "చేతనపరుచు"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "అన్నీ సున్నాచేయి"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "ప్రిఆంప్ సున్నాచేయి"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "బ్రాండ్లను సున్నాచేయి"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "ప్రిసెట్ భద్రపరుచు"
+msgstr "ప్రిసెట్లు"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 రోజు %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d రోజులు %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "ఆపివేయబడింది | %d ట్రాక్‌లు | %s మొత్తం ప్లేటైమ్"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "మోనో"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "స్టీరియో"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "నిలిపివేయబడింది | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dHz | %d బిట్ | %s | %d:%02d / %s | %d ట్రాక్‌లు | %s మొత్తం ప్లేటైమ్"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "పాటలజాబితాను ఇలా దాచు"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "డెడ్‍బీఫ్ పాటలజాబితా ఫైళ్ళు (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "పాటలజాబితాను నింపు"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "ఇతర ఫైళ్ళు (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "కొత్త పాటలజాబితా"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "కొత్త పాటలజాబితా (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "ఫైల్ (_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "ఫైళ్ళ(ను) తెరువు (_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "ఫైళ్ళ(ను) జతచేయి"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "సంచయా(ల)ను జతచేయి"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "స్థానమును జతచేయి"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "కొత్త పాటలజాబితా"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "పాటలజాబితాను నింపు"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "పాటలజాబితాను దాచు"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "నిష్క్రమించు (_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "సవరించు(_E)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "శుభ్రంచేయి (_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "అన్నీ ఎంచుకో"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "ఎంపికను రద్దుచేయి"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "ఎంపికను తారుమారుచేయి"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "ఎంపిక"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "తొలగించు"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "కత్తిరించు"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "కనుగొను (_F)"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "ఇలా క్రమబద్దీకరించు"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "శీర్షిక"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr "ఫైల్ సంఖ్య"
+msgstr "పాట సంఖ్య"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "ఆల్బమ్"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "కళాకారుడు"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "తేదీ"
+
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "యాదృచ్ఛికం"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
-msgstr ""
+msgstr "అనురూపితం"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "ప్రాధాన్యతలు"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "వీక్షణం (_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "స్థితి పట్టీ"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "నిలువువరుస పీఠికలు"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "ట్యాబ్‌లు"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "ఈక్విలైజర్"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "ప్లేబాక్(_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "క్రమం"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "ఒకే వరుసలో ఉన్నవి"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "యాదృచ్ఛికం"
+msgstr "పాటలను యాదృచ్ఛికపరుచు"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "యాదృచ్ఛికం"
+msgstr "ఆల్బములను యాదృచ్ఛికపరుచు"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "యాదృచ్ఛికం"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
-msgstr ""
+msgstr "ఆవృతీకరణ"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
-msgstr ""
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
+msgstr "అన్నీ ఆవృతం"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
-msgstr ""
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
+msgstr "ఒక పాట ఆవృతం"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
-msgstr ""
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
+msgstr "ఆవృతీకరించవద్దు"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr ""
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "దీని తరువాత ఆపివేయి"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "తరువాత పాటకి వెళ్ళు"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "సహాయం (_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "మార్పుచిట్టా (_C)"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
-msgstr ""
+msgstr "GPLv2 (_G)"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
-msgstr ""
+msgstr "LGPLv2.1 (_L)"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "గురించి (_A)"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
-msgstr ""
+msgstr "అనువాదకులు (_T)"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "వెతుకు"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "ఆపు"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "ప్లే"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "నిలిపివేయి"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "మునుపటి"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "తరువాతి"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "యాదృచ్ఛికంగా ప్లేచేయి"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "గురించి"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "నిష్క్రమించు"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "ట్రాక్ లక్షణాలు"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "అమరికలు"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "అనువర్తించు (_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "మూసివేయి (_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "మెటాడేటా"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "గుణములు"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "కొత్త నిలువువరుస శీర్షికను ఇక్కడ ప్రవేశపెట్టండి"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "రకం:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "అంశపు సూచీ"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "ప్లేచేస్తున్నది"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "ఆల్బమ్ చిత్రం"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "కళాకారుడు - ఆల్బమ్"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "నిడివి"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
-msgstr "ట్రాక్ సంఖ్య"
+msgstr "పాట సంఖ్య"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "బ్యాండ్ / ఆల్బమ్ కళాకారుడు"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "ఫార్మేట్:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "అనుగుణం:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "ఎడమ"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "కుడి"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "రద్దుచేయి (_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "సరే (_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "అవుట్‌పుట్ ప్లగిన్:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "అవుట్‌పుట్ పరికరం:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "ఎల్పప్పుడూ 8 బిట్ ఆడియోని 16 బిట్‌కి పరివర్తించు"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "ధ్వని"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
-msgstr ""
+msgstr "రిప్లైగెయిన్ రీతి:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "అచేతనంచేయి"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "ట్రాక్"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
-msgstr ""
+msgstr "రిప్లైగెయిన్ పీక్ స్కేల్"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr ""
+msgstr "రిప్లైగెయిన్ ప్రీఆంప్:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "గ్లోబల్ ప్రీఆంప్:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "ఆదేశ వరుస (లేదా ఫైల్ నిర్వాహకము) నుండి ఫైళ్ళను ఈ పాటలజాబితాకు జతచేయి"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "ప్రారంభములో మునుపటి కొనసాగిన కాలాన్ని పునఃప్రారంభించు"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "సంచయాలను జతచేస్తున్నపుడు సంగ్రహాలను జతచేయవద్దు"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "దీని తరువాత ఆపివేయి"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "ప్లేబాక్"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "స్వరూపించు"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "ప్రిసెట్ భద్రపరుచు"
+msgstr "DSP చైన్ ప్రిసెట్"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "నింపు (_L)"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr ""
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr ""
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr ""
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr ""
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "తిరస్కరించు"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "ముందుభాగము"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "నేపథ్యం"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr ""
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr ""
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr ""
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr ""
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "పాఠ్యం"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr ""
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "ఎంచుకున్న అడ్డవరుస"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "ఎంచుకున్న పాఠ్యం"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "కర్సరు"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "పాటలజాబితా రంగులు"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "రంగులు"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "ప్రోక్సీ సేవికను చేతనపరుచు"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "ప్రోక్సీ సేవిక చిరునామా:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "ప్రోక్సీ సేవిక పోర్టు:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "ప్రోక్సీ రకం:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "ప్రోక్సీ వాడుకరిపేరు:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "ప్రోక్సీ సంకేతపదం:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "నెట్‌వర్క్"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "ప్లగిన్‌లు"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+msgid "Group By ..."
msgstr ""
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "ఇలా క్రమబద్దీకరించు"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "ఫార్మేట్:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "ఎంపిక"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "ప్లగిన్‌లు"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "ట్యాగ్ వ్రైటర్"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 వ్రాయి"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 వ్రాయి"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 వ్రాయి"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr ""
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr ""
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 వర్షన్"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (సిఫారసుచేయబడింది)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 అక్షరపు ఎన్‌కోడింగ్ (iso8859-1 అనేది అప్రమేయము)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 వ్రాయి"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "కళాకారుడు / ఆల్బమ్"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "ట్రాక్ సంఖ్య"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "డిస్కు నుండి ఫైళ్ళను తీసివేయి"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -927,49 +958,48 @@ msgstr ""
"ఫైళ్ళను కోల్పోతారు. కొనసాగుతారా?\n"
"(ఈ డైలాగును GTKUI ప్లగిన్ అమరికలలోకి వెళ్ళి ఆపివేయవచ్చు)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "హెచ్చరిక"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "ప్లేబాక్ వరుసకు జతచేయి"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "ప్లేబాక్ వరుస నుండి తొలగించు"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "మెటాడేటాను మళ్ళీ నింపు"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "డిస్కు నుండి తొలగించు"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "నిలువువరుసను జతచేయి"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "నిలువువరుసను సవరించు"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "నిలువువరుసను తొలగించు"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr ""
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "ఏదీకాదు"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "కళాకారుడు/తేదీ/ఆల్బమ్"
@@ -977,7 +1007,7 @@ msgstr "కళాకారుడు/తేదీ/ఆల్బమ్"
msgid "Open file..."
msgstr "ఫైల్ తెరువు..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "స్వరూపించు"
@@ -986,19 +1016,23 @@ msgstr "స్వరూపించు"
msgid "Default Audio Device"
msgstr "అప్రమేయ ఆడియా పరికరం"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "జతచేయి"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "సార్వత్రిక హాట్ కీలు"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "స్థానమును జతచేయి"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "కీ కాంబినేషన్"
@@ -1010,139 +1044,144 @@ msgstr "ఫైళ్ళను జతచేస్తున్నది..."
msgid "Initializing..."
msgstr "ఆరంభిస్తున్నది..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "ఈ ట్రాక్ డేటాను మీరు సవరించారు."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "నిజంగానే విండో మూసివేయాలా?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "కీ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "విలువ"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "నిజంగానే విండో మూసివేయాలా?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "ఫైళ్ళ(ను) జతచేయి"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "తొలగించు"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "వాడుక: deadbeef [options] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "ఐచ్ఛికాలు:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h సహాయాన్ని ముద్రించు (ఈ సందేశమును) మరియు నిష్క్రమించు\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit ప్లేయర్ నుండి నిష్క్రమిస్తుంది\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version వర్షన్ సమాచారాన్ని ముద్రించి, నిష్క్రమించు\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play ప్లేబాక్ ప్రారంభించు\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop ప్లేబాక్ ఆపుము\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause ప్లేబాక్ నిలిపివేయి\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next పాటలజాబితాలో తదుపరి పాట\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev పాటలజాబితాలో మునుపటి పాట\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random పాటల జాబితాలో యాదృచ్ఛిక పాట\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue ఉన్నటువంటి పాటలజాబితాకు ఫైళ్ళను జతచేయి\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1150,57 +1189,33 @@ msgid ""
" copy[r]ight, [e]lapsed\n"
msgstr ""
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "అప్రమేయం"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "అవును"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "కాదు"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (సిఫారసుచేయబడింది)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"అచేతనపరుచు\n"
-"ట్రాక్\n"
-"ఆల్బమ్"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1227,7 +1242,7 @@ msgstr ""
"బ్యాండ్ / ఆల్బమ్ కళాకారుడు\n"
"అనురూపితం"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1235,13 +1250,38 @@ msgstr ""
"ఎడమ\n"
"కుడి"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"అచేతనపరుచు\n"
+"ట్రాక్\n"
+"ఆల్బమ్"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (సిఫారసుచేయబడింది)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr ""
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1251,7 +1291,7 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+msgid "Add audio CD"
msgstr ""
#: ../translation/extra.c:4
@@ -1267,7 +1307,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1300,488 +1340,807 @@ msgstr "ప్రోక్సీ సంకేతపదం:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "డిస్కు నుండి ఫైళ్ళను తీసివేయి"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "ఆల్బమ్ చిత్రం"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "ట్రాక్ సంఖ్య"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "శీర్షిక / ట్రాక్ కళాకారుడు"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "ఫైల్ సంఖ్య"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "స్థానమును జతచేయి"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "ట్యాగ్ రకము(లు)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr ""
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "కొడెక్"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "ప్రోక్సీ సేవికను చేతనపరుచు"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "అన్నీ ఎంచుకో"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "నిలువువరుసను సవరించు"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "అవుట్‌పుట్ పరికరం:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "అవుట్‌పుట్ ప్లగిన్:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "ప్రిసెట్ భద్రపరుచు"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "తిరస్కరించు"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "ప్రిసెట్ లోడుచేయి"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "అవుట్‌పుట్ ప్లగిన్:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "APEv2 వ్రాయి"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "ID3v1 వ్రాయి"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "ID3v2 వ్రాయి"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "ట్యాగ్ వ్రైటర్"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "తిరస్కరించు"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "సవరించు(_E)"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "మూసివేయి (_C)"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "నిలువువరుసను సవరించు"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "పాటలను యాదృచ్ఛికపరుచు"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "శీర్షిక / ట్రాక్ కళాకారుడు"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "స్థానమును జతచేయి"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "తొలగించు"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "కొత్త పాటలజాబితా"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "నిలువువరుసను జతచేయి"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "స్వరూపించు"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "అమరికలు"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "నిజంగానే విండో మూసివేయాలా?"
+
#~ msgid "Save playlist as"
#~ msgstr "పాటలజాబితాను ఇలా దాచు"
diff --git a/po/tr.po b/po/tr.po
index 506efe36..6ce14154 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,24 +7,24 @@ msgid ""
msgstr ""
"Project-Id-Version: LXDE\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-01-20 10:41+0000\n"
-"Last-Translator: decent <bahadiroglu33@gmail.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-05-06 15:22+0200\n"
+"Last-Translator: Necdet <necdetyucel@gmail.com>\n"
"Language-Team: Turkish <http://forum.ubuntu-tr.net>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=1; plural=0\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.5\n"
#: ../plugins/gtkui/callbacks.c:123
msgid "Supported sound formats"
msgstr "Desteklenen ses biçimleri"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "Diğer dosyalar (*)"
+msgstr "Tüm dosyalar (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -54,9 +54,9 @@ msgstr "Yardım dosyası yüklenirken hata oluştu"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Yardım"
@@ -70,123 +70,126 @@ msgstr "DeaDBeef %s Hakkında"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s Sürüm Notları"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF'i Çevirenler"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Çalma listesini düzenle"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Başlık:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Çalma Listesini Yeniden Adlandır"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Çalma Listesini Sil"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Yeni Çalma Listesi Ekle"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF EQ Ayarlarını Kaydet"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF kaydedilmiş EQ dosyaları (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF Hazır EQ ayarları yükle..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ hazır ayarlar (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ ayarlarını içe aktar..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ hazır ayarları (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Ayarları Kaydet"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Ayarları Yükle"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 EQ Ayarlarını İçe Aktar"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Etkin"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Tümünü Sıfırla"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Ön Amfiyi Sıfırla"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Bantları Sıfırla"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "Ayarları Kaydet"
+msgstr "Önayarlar:"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 gün %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d gün %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Durduruldu | %d parça |toplam çalma zamanı: %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Duraklatıldı"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -194,735 +197,761 @@ msgstr ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d parça | %s toplam çalma "
"zamanı"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Çalma Listesini Farklı Kaydet"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF çalma listesi dosyaları (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Çalma Listesi Yükle"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Diğer dosyalar (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Yeni Çalma Listesi"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Yeni Çalma Listesi (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Dosya"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "Dosy_a(lar) aç"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Dosya(lar) ekle"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Dizin(ler) ekle"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Konum ekle"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Yeni çalma listesi"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Çalma listesi yükle"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Çalma listesini kaydet"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Çıkış"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "Düz_enle"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Temizle"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Tümünü seç"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Tüm seçimleri kaldır"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Seçimi ters çevir"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Seçim"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Kaldır"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Kes"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Bul"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Sıralama Kriteri"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Başlık"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Parça Numarası"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Albüm"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Sanatçı"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Tarih"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Rastgele"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Özel"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Tercihler"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Görünüm"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Durum çubuğu"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Sütun başlıkları"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Sekmeler"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Ekolayzır"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Oynatım"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Sıralama"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Sıralı"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Karışık"
+msgstr "Parçaları karıştır"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Karışık"
+msgstr "Albümleri karıştır"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Rastgele"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Tekrar"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Tümünü Tekrarla"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Bir Şarkıyı Tekrarla"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Tekrar Yok"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Liste takibi oynatım"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "İmleç takibi oynatım"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Çalan parçadan sonra dur"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Çalan parçaya git"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Yardım"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Sürüm notları"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Hakkında"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "Çe_virenler"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Arama"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Dur"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Çal"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Duraklat"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Önceki"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Sonraki"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Rastgele Oynatım"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Hakkında"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Çıkış"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Parça Özellikleri"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Ayarlar"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Uygula"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "_Kapat"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Üstveri"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Özellikler"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Yeni sütun başlığını giriniz"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Yaz:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Öğe İndeksi"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Çalıyor"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Albüm Kapağı"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Sanatçı - Albüm"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Süre"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Parça Numarası"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Bant / Albüm Sanatçısı"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Biçim:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Hizalama:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Sol"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Sağ"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Vazgeç"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_Tamam"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Çıktı eklentisi"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Çıktı aygıtı"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "8 bit sesi her zaman 16 bite çevir"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Ses"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Ses gücü sabitleme kipi:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Devre dışı"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Parça"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Ses gücü sabitleme en yüksek limit"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr "Ses gücü sabitleme kipi:"
+msgstr "ReplayGain preamp:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Genel önamfi:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Bu çalma listesine komut satırından (veya dosya yöneticisinden) dosyalar "
"ekle:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Açılışta önceki oturum ile devam et"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Dizin eklerken arşivden ekleme"
+
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Çalan parçadan sonra dur"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Oynatım"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Yapılandırma"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "Ayarları Kaydet"
+msgstr "DSP Zinciri Önayarları"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "_Yükle"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Çıkışta bildirim alanına küçült"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Orta fare düğmesi çalma listesini kapatır"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Bildirim alanı simgesini gizle"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Çalan parça için kalın yazı biçimi kullan"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Diskten sil girdisini\" sağ tık menüsünde\" gösterme"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
+msgstr "Bir dizin eklendiğinde şarkı listesini otomatik isimlendir"
+
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "Arayüz tazeleme oranı (saniyede defa)"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Oynatım sırasındaki başlık çubuğu metni:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Durdurulduğunda başlık çubuğu metni:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr ""
+msgstr "GUI Eklentisi (yeniden başlatınca geçerli olur)"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GTK Kullanıcı Arayüzü"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Üstüne bindir"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Önplan"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Arkaplan"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Gezinti-çubuğu/Ses çubuğu renkleri"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Orta"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Açık"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Koyu"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Temel"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Metin"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Sekme şerit renkleri"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Üstüne bindir (GTK tema görünümü kaybolur, fakat çalma hızlanır)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Tüm satırlar"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Tek satır"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Seçili satır"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Seçili metin"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "İmleç"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Çalma listesi rengi"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Renkler"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Vekil Sunucu Etkin"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Vekil Sunucu Adresleri:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Vekil Sunucu Portu:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Vekil Türü:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Vekil Kullanıcı Adı:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Vekil Şifresi:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Ağ"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "Sürüm:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Telif hakkı"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Eklentiler"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Gruplandırma Ölçütü"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
+msgid "Sort by ..."
+msgstr "Sıralama kriteri..."
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
-msgstr "Biçim:"
+msgstr "Biçim"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "Artan"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "Azalan"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "Seçim"
+msgstr "DSP Eklentisini Seçin"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr "Eklentiler"
+msgstr "Eklenti"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr "Etiketleyici"
+msgstr "Etiket Yazma Tercihleri"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 Yaz"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 Yaz"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 Yaz"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 şeridi"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 şeridi"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 şeridi"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 sürümü"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Önerilen)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 karakter kodlaması (varsayılan iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 Yaz"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Sanatçı / Albüm"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Parça No"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Dosyaları diskten sil"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -930,49 +959,48 @@ msgstr ""
"Dosyayı kaybedeceksiniz. Onaylıyor musunuz?\n"
"(Bu diyalog GTKUI eklenti ayarlarından kapatılabilir)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Uyarı"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Çalma kuyruğuna ekle"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Çalma kuyruğundan kaldır"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Üstveriyi tekrar yükle"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Diskten sil"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Sütun ekle"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Sütunu düzenle"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Sütunu kaldır"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Gruplandırma ölçütü"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Hiçbiri"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Sanatçı/Tarih/Albüm"
@@ -980,28 +1008,32 @@ msgstr "Sanatçı/Tarih/Albüm"
msgid "Open file..."
msgstr "Dosya aç..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, fuzzy, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
-msgstr "Yapılandırma"
+msgstr "%s'i yapılandır"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
msgstr "Varsayılan Ses Aygıtı"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Ekle"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Evrensel Kısayollar"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Yuva"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Konum"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Tuş bileşimi"
@@ -1013,139 +1045,144 @@ msgstr "Dosyalar ekleniyor..."
msgid "Initializing..."
msgstr "Başlatılıyor..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Bu parça için değiştirilmiş veri mevcut."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Pencere gerçekten kapatılsın mı?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr ""
+msgstr "[çoklu değerler]"
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Tuş"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Değer"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "Etiketler yazılıyor..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "İsim:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "Alan isimleri : veya _ ile başlayamaz"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "Alan eklenemez"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
-msgstr ""
+msgstr "Bu isimde bir alan mevcut, lütfen başka bir isimle tekrar deneyin."
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Pencere gerçekten kapatılsın mı?"
-
-#: ../plugins/gtkui/trkproperties.c:734
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr "Dosya(lar) ekle"
+msgstr "Alan ekle"
-#: ../plugins/gtkui/trkproperties.c:737
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr "Kaldır"
+msgstr "Alan sil"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Kullanım: deadbeef [seçenekler] [dosya(lar)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Seçenekler:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help veya -h Yardımı yazdır (bu mesajı) ve çık\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Oynatıcıyı kapat\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Sürüm bilgilerini yazdır ve çık\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Oynatımı başlat\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Oynatımı durdur\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Oynatımı duraklat\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause Duraklamayı geç\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr ""
+msgstr "--play-pause Durdurulmuşsa çal, değilse duraklamayı geç\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Çalma listesinde sonraki parça\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Çalma listesinde önceki parça\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Çalma listesinde rastgele parça\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Çalma listesine parça(lar) ekle\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
-msgstr " --nowplaying FMT Değiştirilmiş dosya adını std çıktısına yazdır\n"
+msgstr ""
+" --nowplaying FMT Değiştirilmiş dosya adını standard çıktıya (stdout) "
+"yazdır\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1156,7 +1193,7 @@ msgstr ""
" [u]zunluk, parça[n]umarası, [y]ıl, y[o]rum,\n"
" teli[f]hakkı, [g]eçmiş\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1165,51 +1202,28 @@ msgstr ""
" e.g.: --şimdi çalıyor \"%%a - %%t\" yazdırır \"sanatçı "
"- başlık\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+"daha fazla bilgi için http://sourceforge.net/apps/mediawiki/deadbeef/index."
+"php?title=Title_Formatting adresine bakabilirsiniz\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Varsayılan"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Evet"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Hayır"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Tavsiye edilen)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Devre dışı\n"
-"Parça\n"
-"Albüm"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
-#, fuzzy
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1230,12 +1244,12 @@ msgstr ""
"Sanatçı\n"
"Albüm\n"
"Başlık\n"
-"Uzunluk\n"
-"Parça\n"
-"Bant / Albüm Sanatçısı\n"
+"Süre\n"
+"Parça Numarası\n"
+"Grup / Albüm Sanatçısı\n"
"Özel"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1243,13 +1257,40 @@ msgstr ""
"Sol\n"
"Sağ"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Devre dışı\n"
+"Parça\n"
+"Albüm"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Artan\n"
+"Azalan"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Tavsiye edilen)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Resim dosyası bulunamıyor: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1262,7 +1303,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Ses CD'si Ekle"
#: ../translation/extra.c:4
@@ -1278,7 +1320,7 @@ msgstr "ALSA örneklemesini kullan"
msgid "Release device while stopped"
msgstr "Aygıt durdurulduğunda"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Tercih edilen tampon boyutu"
@@ -1301,494 +1343,809 @@ msgstr "Kullanıcıadı"
#: ../translation/extra.c:14
msgid "Password"
-msgstr "Şifre"
+msgstr "Parola"
#: ../translation/extra.c:15
msgid "Scrobble URL"
msgstr "Scrobble URL"
-#. OSS output plugin
-#: ../translation/extra.c:17
-msgid "Device file"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
msgstr ""
+#. OSS output plugin
#: ../translation/extra.c:18
+msgid "Device file"
+msgstr "Aygıt dosyası"
+
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "OSS4 örnekleme hızı hatası için geçici çözüm"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Önbellek güncelleştirme döngüsü (saat)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Gömülü etiketlerden getir"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Yerel dizinlerden getir"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Yerel kapak dosya maskesi"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Last.fm'den getir"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "albumart.org'dan getir"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "Kapağı uzun kenara göre ölçekle"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB kullan"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "CDDB'den CD-Metni tercih et"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (örn. 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB port numarası (örn. '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "HTTP için CDDB protokolünü tercih et"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "NRG kalıp desteği etkin"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Örnekleme kalitesi (0..2, yüksek olan kalitelidir)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "En büyük parça uzunluğu (dakika cinsinden)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Öntanımlı parça uzunluğu (saniye)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Diskten dosya silmek için onay iste"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Ses kontrol simgesi hassasiyet durumu"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Özel durum simgesi"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "--sync ile gtk_init çalıştır (hata ayıklama kipinde)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "Eklenti içeriği menü öğeleri arasına ayırıcı ekle"
#. OSD Notify plugin
-#: ../translation/extra.c:45
-#, fuzzy
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr "Bildirim biçimi"
+msgstr "Bilgilendirme başlık biçimi"
-#: ../translation/extra.c:46
-#, fuzzy
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr "Bildirim biçimi"
+msgstr "Bilgineldirme içerik biçimi"
-#: ../translation/extra.c:47
-#, fuzzy
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr "Albüm Kapağı"
+msgstr "Albüm kapağını göster"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "Albüm kapağı büyüklüğü (px)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio sunucusu"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Örnekleme oranı"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "İlgili tablo arama yolu"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Tam tablo arama yolu"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Ses takas baytları(duyduğunuz bütün geçiş statik ise)"
#. SID decoder plugin
-#: ../translation/extra.c:58
-#, fuzzy
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr "HVSC etkin"
+msgstr "HVSC Songlength DB'yi etkinleştir"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlengths.txt (HVSC'den)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "Örnekleme başına bit (8 veya 16)"
-#: ../translation/extra.c:61
-#, fuzzy
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr "En büyük parça uzunluğu (dakika cinsinden)"
+msgstr "Öntanımlı parça uzunluğu (saniye)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity + + bank yapılandırma dosyası"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Parça Başlığı"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Sanatçı"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Toplam Parça"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Tür"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Besteci"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Disk Numarası"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Yorum"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Kodlayıcı / Sağlayıcı"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Konum"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Altparça İndeksi"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Etiket Tür(leri)"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Gömülü Çağrı Sayfası"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Çözücü"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "Dosya Uzantıları (';' ile ayırın)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "Dönüştür"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
-#, fuzzy
+#: ../translation/extra.c:93
msgid "Target Samplerate"
-msgstr "Örnekleme oranı"
+msgstr "Hedef örnekleme oranı"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
-msgstr ""
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "Kalite / Algoritma"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "Otomatik örnekleme oranı (hedef örnekleme oranının üzerine yazılır)"
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../plugins/converter/convgui.c:108
-msgid "The file already exists. Overwrite?"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../plugins/converter/convgui.c:110
-msgid "Converter warning"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Scrobbler etkin"
+
+#: ../plugins/converter/convgui.c:117
+msgid "The file already exists. Overwrite?"
+msgstr "Dosya mevcut. Üzerine yazılsın mı?"
+
+#: ../plugins/converter/convgui.c:119
+msgid "Converter warning"
+msgstr "Dönüştürücü uyarısı"
+
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "Lütfen bir kodlayıcı seçin"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "Dönüştürücü hatası"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "Dönüştürülüyor..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "Tümünü seç"
+msgstr "Dizin seçin..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "Kodlayıcı önayarları kaydedilemedi"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
+"Dizinin erişim izinlerini kontrol edin, başka bir isim deneyin veya yeterli "
+"disk alanını boşaltın"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
-msgstr ""
+msgstr "Bu isimle bir önayar mevcut. Başka bir isim seçin."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "Hata"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "Yeni kodlayıcı ekle"
-#: ../plugins/converter/convgui.c:724
-#, fuzzy
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr "Sütunu düzenle"
+msgstr "Kodlayıcıyı düzenle"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "Ayarları Kaydet"
+msgstr "Önayarı kaldır"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
-msgstr ""
+msgstr "Seçtiğiniz önayar silinecek. Bunu yapmak istediğinizden emin misiniz?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "Kodlayıcılar"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr ""
+msgstr "DSP zincirine eklenti ekle"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "DSP önayarı kaydedilemedi"
-#: ../plugins/converter/convgui.c:1098
-#, fuzzy
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr "Ayarları Kaydet"
+msgstr "Yeni DSP Önayarı"
-#: ../plugins/converter/convgui.c:1183
-#, fuzzy
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr "Ayarları Kaydet"
+msgstr "DSP Önayarını Düzenle"
-#: ../plugins/converter/convgui.c:1203
-#, fuzzy
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr "Ayarları Kaydet"
+msgstr "DSP Önayarları"
-#: ../plugins/converter/interface.c:94
-#, fuzzy
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
-msgstr "Çıktı aygıtı"
+msgstr "Çıktı dizini:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Dizin yapısını buradan başlayarak koru:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr "Çıktı eklentisi"
+msgstr "Çıktı dosya adı:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"Dosya uzantısı (.mp3 gibi) otomatik olarak eklenecektir.\n"
+"Öntanımlı olanı kullanmak için bu alanı boş bırakın (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "Kodlayıcı:"
-#: ../plugins/converter/interface.c:163
-#, fuzzy
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr "Ayarları Kaydet"
+msgstr "DSP önayarı:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "Thread sayısı:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "Çıktı örneği biçimi:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "Kaynak biçimini koru"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "8 bit signed int"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "16 bit signed int"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "24 bit signed int"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "32 bit signed int"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "32 bit float"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "Dosya mevcut olduğunda:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "İstem"
-#: ../plugins/converter/interface.c:225
-#, fuzzy
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr "Üstüne bindir"
-
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
+msgstr "Üstüne yaz"
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "Ayarları Yükle"
+msgstr "Kodlayıcının Önayarlarını Düzenle"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "İsimsiz Kodlayıcı"
-#: ../plugins/converter/interface.c:410
-#, fuzzy
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr "Çıktı eklentisi"
+msgstr "Oluşacak dosyanın uzantısı:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "mp3 gibi"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "Komut satırı:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"Örnek: lame - %o\n"
+"girdi dosyası için %i, çıktı dosyası için %o, stdin (standard girdi) için - "
+"for"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>%o - oluşacak dosyanın adı\n"
+"%i - geçici girdi dosyasının adı</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "Yöntem:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "Boru"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "Geçici dosya"
-#: ../plugins/converter/interface.c:480
-#, fuzzy
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
-msgstr "APEv2 Yaz"
+msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
-#, fuzzy
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
-msgstr "ID3v1 Yaz"
+msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
-#, fuzzy
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
-msgstr "ID3v2 Yaz"
+msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
-#, fuzzy
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr "Etiketleyici"
+msgstr "<b>Etiket yazıcı</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "DSP Önayar Düzenleyicisi"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "İsimsiz DSP Önayarı"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Üstüne yaz"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Geçici dosya"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "Düz_enle"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "_Kapat"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Sütunu düzenle"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Komut satırı:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Parçaları karıştır"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[çoklu değerler]"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Konum"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Kaldır"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Yeni Çalma Listesi"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
msgstr ""
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Yorum"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Sütun ekle"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Seçtiğiniz önayar silinecek. Bunu yapmak istediğinizden emin misiniz?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Yapılandırma"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Ayarlar"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GTK Kullanıcı Arayüzü"
+
+#~ msgid "Slot"
+#~ msgstr "Yuva"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Seçilen alan gerçekten kaldırılsın mı?"
+
#~ msgid "Save playlist as"
#~ msgstr "Çalma listesini farklı kaydet"
diff --git a/po/ug.po b/po/ug.po
index beb34642..dc165edd 100644
--- a/po/ug.po
+++ b/po/ug.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2012-02-07 10:15+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-04-18 01:46+0200\n"
"Last-Translator: Gheyret <gheyret@gmail.com>\n"
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
"Language: ug\n"
@@ -54,9 +54,9 @@ msgstr "ياردەم ھۆججىتىنى ئوقۇش مەغلۇپ بولدى."
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "ياردەم"
@@ -70,122 +70,126 @@ msgstr "DeaDBeeF %s ھەققىدە"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s نى ئۆزگەرتىش خاتىرىسى"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF تەرجىمانلىرى"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "قويۇش تىزىمىنى تەھرىرلەش"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "ماۋزۇ:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "قويۇش تىزىمىنىڭ ئاتىنى ئۆزگەرتىش"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "قويۇش تىزىمىنى چىقىرىۋېتىش"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "يېڭى قويۇش تىزىمى قوشۇش"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "DeaDBeeF EQ نىڭ ئالدىن تەڭشىشىنى ساقلاش"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ نىڭ ئالدىن تەڭشەش ھۆججەتلىرى (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "DeaDBeeF EQ نىڭ ئالدىن تەڭشىشىنى ئوقۇش…"
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ نىڭ ئالدىن تەڭشەشلىرى (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Foobar2000 EQ نىڭ ئالدىن تەڭشىشىنى ئىمپورت قىلىش…"
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ نىڭ ئالدىن تەڭشەشلىرى (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "ئالدىن تەڭشەشنى ساقلاش"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "ئالدىن تەڭشەشنى ئوقۇش"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Foobar2000 نىڭ ئالدىن تەڭشىشىنى ئىمپورت قىلىش"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "ئىناۋەتلىك"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "ھەممىنى نۆل قىلىش"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "ئالدىن كۈچەيتىشنى نۆل قىلىش"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "بەلۋاغلارنى نۆل قىلىش"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "ئالدىن تەڭشەشلەر"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 كۈن %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d كۈن %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "توختىغان | %d نەغمە | %s جەمئىي قويۇش ۋاقتى"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "يەككە يوللۇق ئاۋاز"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "ستېرېئو"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "ۋاقىتلىق توختىدى | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -193,728 +197,763 @@ msgstr ""
"%s%s %s| %d گېرتس | %d بىت | %s | %d:%02d / %s | %d نەغمە | %s جەمئىي قويۇش "
"ۋاقتى"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "قويۇش تىزىمىنى باشقا ئاتتا ساقلاش"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF قويۇش تىزىمى ھۆججەتلىرى (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "قويۇش تىزىمىنى ئوقۇش"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "باشقا ھۆججەتلەر(*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "يېڭى قويۇش تىزىمى"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "يېڭى قويۇش تىزىمى(%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "ھۆججەت(_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "ھۆججەت(لەر)نى ئاچ(_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "ھۆججەت(لەر)نى قوشۇش"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "قىسقۇچ(لار)نى قوشۇش"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "ئورۇن قوشۇش"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "يېڭى قويۇش تىزىمى"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "قويۇش تىزىمىنى ئوقۇش"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "قويۇش تىزىمىنى ساقلاش"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "چېكىن(_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "تەھرىر(_E)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "تازىلا(_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "ھەممىنى تاللا"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "ھەممىنى تاللىما"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "تاللاشنى ئۆرۈ"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "تاللانما"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "چىقىرىۋەت"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "قىرقىش"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "ئىزدە(_F)"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "تەرتىپى"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "ماۋزۇ"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "ناخشا نومۇرى"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "ئالبوم"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "ئورۇنلىغۇچى"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "چېسلا"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "قالايمىقان"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "ئىختىيارى"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "مايىللىق"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "كۆرۈنۈش(_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "ھالەت بالدىقى"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "ئىستون باشلىرى"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "بەتكۈچلەر"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "تەڭشىگۈچ"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "قوي(_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "تەرتىپلە"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "سىزىقلىق"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "نەغمىنى تەرتىپسىز قويۇش"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "ئالبومنى تەرتىپسىز قويۇش"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "قالايمىقان"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "قايتىلاۋاتىدۇ"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "ھەممىسىنى قايتىلاش"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "بىرلا ناخشىنى قايتىلاش"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "قايتىلىما"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "سىيرىغۇچ قويۇۋاتقىنىغا ئەگەشسۇن"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "نۇربەلگە قويۇۋاتقىنىغا ئەگەشسۇن"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "ھازىرقىسى تاماملانغاندا توختىتىش"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "نۆۋەتتىكى نەغمىگە سەكرەش"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "ياردەم(_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "ئۆزگىرىش خاتىرىسى(_C)"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "ھەققىدە(_A)"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "تەرجىمانلار(_T)"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "ئىزدە"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "توختا"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "قوي"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "ۋاقىتلىق توختا"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "ئالدىنقى"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "كېيىنكى"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "تەرتىپسىز قويۇش"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "ھەققىدە"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "ئاخىرلاشتۇرۇش"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "نەغمە خاسلىقى"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "تەڭشەكلەر"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "قوللان(_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "ياپ(_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "مېتا سانلىق-مەلۇماتى"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "خاسلىق"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "يېڭى ئىستون ماۋزۇسىنى بۇ يەرگە كىرگۈزۈڭ"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "تىپى:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "تۈر ئىندېكسى"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "قويۇۋاتىدۇ"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "ئالبوم مۇقاۋىسى"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "ئورۇنلىغۇچى - ئالبوم"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "ۋاقتى"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "نەغمە نومۇرى"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "مۇزىكا ئەترىتى / ئالبوم ئورۇنلىغۇچى"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "پىچىم:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "توغرىلاش:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "سول"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "ئوڭ"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "ئەمەلدىن قالدۇر(_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "جەزملە(_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "چىقىرىش قىستۇرمىسى:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "چىقىرىش ئۈسكۈنىسى:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "8 بىتلىق ئۈننى ھەمىشە 16 بىتلىق ئۈنگە ئايلاندۇرۇش"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "ئاۋاز"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Replaygain ھالىتى:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "ئىناۋەتسىز"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "نەغمە"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "قويۇشنى كۈچەيتىش مىقدارىنىڭ ئەڭ چوڭ قىممىتىنى تەڭشەش"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "قويۇش مىقدارىنى ئالدىن كۈچەيتىش:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "ئومۇمىي ئالدىن كۈچەيتىش:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"بۇيرۇق قۇرىدىن(ياكى ھۆججەت باشقۇرغۇدىن) ھۆججەت(لەر)نى بۇ قويۇش تىزىمىغا "
"قوشۇش:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "باشلانغاندا ئالدىنقى ئەڭگىمەنى داۋام قىلسۇن"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "قىسقۇچتىن قوشۇۋاتقاندا ئارخىپتىن قوشما"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "ھازىرقىسى تاماملانغاندا توختىتىش"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "قويۇش"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "سەپلە"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP زەنجىرىنىڭ ئالدىن تەڭشىشى"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "يۈكلە(_L)"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "كۆزنەك يېپىلغاندا سىستېما قوندىقىغا كىرسۇن"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "چاشقىنەك ئوتتۇرا توپچىسى قويۇش تىزىمىنى ياپسۇن "
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "سىستېما قونداق سىنبەلگىسىنى يوشۇر"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "نۆۋەتتە قويۇلۇۋاتقان نەغمە ئۈچۈن توم خەت نۇسخىسى ئىشلەت"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "«دىسكىدىن ئۇچۇر» دېگەن مەزمۇن تىزىملىك تۇرىنى يوشۇر"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "يەككە مۇندەرىجە قوشۇلغاندا قويۇش تىزىمىنىڭ ئاتىنى ئاپتوماتىك بەلگىلە"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "كۆرۈنمەيۈزنى يېڭىلاش تېزلىكى(ھەر سېكۇنتتىكى قېتىم سانى)"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "قويۇۋاتقان چاغدىكى ماۋزۇ بالدىقى تېكىستى:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "توختىغان چاغدىكى ماۋزۇ بالدىقى تېكىستى:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "GUI قىستۇرمىسى (ئۆزگەرتىلگەندىن كېيىن قايتا باشلاش زۆرۈر):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "قاپلاش"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "ئالدى كۆرۈنۈش"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "تەگلىك"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "ئىزدەش بالدىقى/ئاۋاز چوڭلۇقى بالدىقى"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "ئوتتۇرا"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "ئاق"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "قارا"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "ئاساسى"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "تېكىست"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "بەتكۈچنىڭ رەڭگى"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"قاپلاش(GTK نىڭ دەرەخسىمان كۆرۈنۈشىنىڭ ئۆرنىكى يوقىلىدۇ، بىراق سىزىش تېزلىكى "
"تېزلىشىدۇ)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "جۈپ قۇر"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "تاق قۇر"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "تاللانغان قۇر"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "تاللانغان تېكىست"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "نۇربەلگە"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "قويۇش تىزىمىنىڭ رەڭلىرى"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "رەڭلەر"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "ۋاكالەتچى مۇلازىمېتىرنى ئىناۋەتلىك قىلىش"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "ۋاكالەتچى مۇلازىمېتىرنىڭ ئادرېسى:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "ۋاكالەتچى مۇلازىمېتىرنىڭ ئېغىزى:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "ۋاكالەتچىنىڭ تىپى:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "ۋاكالەتچىنىڭ ئىشلەتكۈچى ئاتى:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "ۋاكالەتچى ئىمى:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "تور"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "نەشرى: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "نەشر ھوقۇقى"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "قىستۇرما"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "گۇرۇپپىلاش"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "تەرتىپلەش…"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "پىچىمى"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "ئۆسكۈچى"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "كېمەيگۈچى"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "DSP قىستۇرمىسىنى تاللاش"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "قىستۇرما"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "خەتكۈش يازغۇچ تەڭشىكى"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "ID3v2 نى يېزىش"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "ID3v1 نى يېزىش"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "APEv2 نى يېزىش"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "ID3v2 نى ئۆچۈرۈۋېتىش"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "ID3v1 نى ئۆچۈرۈۋېتىش"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "APEv2 نى ئۆچۈرۈۋېتىش"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 نەشرى"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (تەۋسىيە قىلىنىدۇ)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 ھەرپ كودلىشى (كۆڭۈلدىكى قىممىتى iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "ID3v2.4 نى يېزىش"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "ئورۇنلىغۇچى / ئالبوم"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "نەغمە نومۇرى"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "دىسكىدىن ھۆججەت ئۆچۈرۈش"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -922,49 +961,48 @@ msgstr ""
"ھۆججەتلەر يوقىلىپ كېتىدۇ. داۋاملاشتۇرسۇنمۇ؟\n"
"(بۇ سۆزلەشكۈ GTKUI قىستۇرما تەڭشىكىدە ئۆچمەيدۇ)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "ئاگاھلاندۇرۇش"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "قويۇش قاتارىغا قوشۇش"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "قويۇش قاتارىدىن چىقىرىۋېتىش"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "مېتا سانلىق-مەلۇماتنى قايتا ئوقۇش"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "دىسكىدىن چىقىرىۋېتىش"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "ئىستون قوشۇش"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "ئىستون تەھرىرلەش"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "ئىستوننى ئۆچۈر"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "گۇرۇپپىلاش"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "يوق"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "ئورۇنلىغۇچى/چېسلا/ئالبوم"
@@ -972,7 +1010,7 @@ msgstr "ئورۇنلىغۇچى/چېسلا/ئالبوم"
msgid "Open file..."
msgstr "ھۆججەت ئېچىش…"
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "%s نى سەپلەش"
@@ -981,19 +1019,23 @@ msgstr "%s نى سەپلەش"
msgid "Default Audio Device"
msgstr "كۆڭۈلدىكى ئۇن ئۈسكۈنىسى"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "قوش"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "پۈتۈن دائىرىلىك ئىسسىق كۇنۇپكا"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "ئوقۇر"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "ئورنى"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "كۇنۇپكا بىرىكمىسى"
@@ -1005,105 +1047,105 @@ msgstr "ھۆججەتلەرنى قوشۇۋاتىدۇ…"
msgid "Initializing..."
msgstr "دەسلەپلەشتۈرۈۋاتىدۇ…"
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "بۇ نەغمىنىڭ سانلىق-مەلۇماتلىرىنى ئۆزگەرتتىڭىز."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "كۆزنەكنى راستلا ياپامسىز؟"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[بىر قانچە قىممەت] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "ئاچقۇچ"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "قىممەت"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "خەتكۈچلەرنى يېزىۋاتىدۇ…"
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "ئاتى:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "سوز بۆلىكى ئاتى : ياكى _ بىلەن باشلانماسلىقى كېرەك"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "سوز بۆلىكى قوشقىلى بولمىدى"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "بۇنداق ئاتى بار سوز بۆلىكى مەۋجۇت، باشقا ئاتنى سىناپ كۆرۈڭ."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "تاللانغان سوز بۆلىكىنى راستلا چىقىرىۋېتەمسىز؟"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "سوز بۆلىكى قوشۇش"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "سوز بۆلىكىنى چىقىرىۋېتىش"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "ئىشلىتىش ئۇسۇلى: deadbeef [options] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "تاللانمىلار:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help ياكى -h مۇشۇ ياردەمنى كۆرسىتىپ ئاخىرلىشىدۇ\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit قويغۇنى ئاخىرلاشتۇرىدۇ\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version نەشر ئۇچۇرىنى بېسىپ چىقىرىپ ئاخىرلىشىدۇ\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play قويۇشنى باشلايدۇ\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop قويۇشنى توختىتىدۇ\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause قويۇشنى ۋاقىتلىق توختىتىدۇ\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause ۋاقىتلىق توختىتىشنى ئالماشتۇرىدۇ\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
@@ -1111,34 +1153,40 @@ msgstr ""
" --play-pause قويۇۋاتقان بولسا ۋاقىتلىق توختىتىدۇ، باشقا ھالەتنىمۇ "
"ۋاقىتلىق توختىتىدۇ\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next قويۇش تىزىمىدىكى كېيىنكى ناخشا\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev قويۇش تىزىمىدىكى ئالدىنقى ناخشا\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random قويۇش تىزىمىدىكى ناخشىنى تەرتىپسىز قويىدۇ\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue ھۆججەت(لەر) نى قويۇش تىزىمىغا قوشىدۇ\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr ""
" --nowplaying FMT پىچىلغان نەغمە ئاتىنى ئۆلچەملىك چىقىرىش ئۈسكۈنىسى"
"(stdout) غا چىقىرىدۇ\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1149,7 +1197,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1158,7 +1206,7 @@ msgstr ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
@@ -1167,43 +1215,19 @@ msgstr ""
" تېخىمۇ كوپ ئۇچۇرلار ئۈچۈن http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting گە قاراڭ\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "كۆڭۈلدىكى"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "ھەئە"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "ياق"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (تەۋسىيە قىلىنىدۇ)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr "چوڭىيىش/كىچىكلەش"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"ئىناۋەتسىز\n"
-"نەغمە\n"
-"ئالبوم"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1229,7 +1253,7 @@ msgstr ""
"مۇزىكا ئەترىتى / ئورۇنلىغۇچى\n"
"ئىختىيارىي"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1237,13 +1261,38 @@ msgstr ""
"سول\n"
"ئوڭ"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"ئىناۋەتسىز\n"
+"نەغمە\n"
+"ئالبوم"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr "چوڭىيىش/كىچىكلەش"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (تەۋسىيە قىلىنىدۇ)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "pixmap ھۆججىتىنى تاپقىلى بولمىدى: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1256,7 +1305,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "ئۈن CD نى قوشۇش"
#: ../translation/extra.c:4
@@ -1272,7 +1322,7 @@ msgstr "ئەۋرىشكىلەشكە ALSA ئىشلىتىش"
msgid "Release device while stopped"
msgstr "توختىغاندا ئۈسكىنىنى قويۇۋېتىش"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "ئامراق يىغلەك چوڭلۇقى"
@@ -1301,265 +1351,304 @@ msgstr "ئىم"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "ئۈسكۈنە ھۆججىتى"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "OSS4 ئەۋرىشكىلەش نىسبىتىدىكى كەمتۈكلەرنى تۈزىتىش"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "غەملەك يېڭىلاش ئىنتېرۋالى(سائەت)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "سىڭدۈرۈلگەن خەتكۈچلەردىن ئېلىش"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "يەرلىك قىسقۇچتىن ئېلىش"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "يەرلىك مۇقاۋا ھۆججەت ماسكىسى"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "last.fm دىن ئېلىش"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "albumart.org دىن ئېلىش"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "سۈرەتنى ئۇزۇن تەرىپى بويىچە چوڭايتىش"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "CDDB/FreeDB نى ئىشلىتىش"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "CDDB نى ئەمەس CD-Text نى ئالدىن ئويلىشىش"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB تور ئادرېسى(URL)( ‹freedb.org› دېگەندەك)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB ئېغىز نومۇرى( ‹888› دېگەندەك)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "HTTP نى ئەمەس CDDB كېلىشىمىنى ئالدىن ئويلىشىش"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "ئىناۋەتلىك قىلىش (NRG سۈرىتىنى قوللاشنى)"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "ئەۋرىشكىلەش سۈپىتى (0..2, چوڭ بولسا ياخشى)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "ئەڭ چوڭ ناخشا ئۇزۇنلۇقى( مىنۇت)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "كۆڭۈلدىكى ناخشا ئۇزۇنلۇقى (سېكۇنت)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "ھۆججەتلەرنى دىسكىدىن ئۆچۈرىدىغان چاغدا سورىسۇن"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "ئاۋاز كونترول ھالەت سىنبەلگىسىنىڭ سەزگۈرلۈكى"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "ئىختىيارىي ھالەت سىنبەلگىسى"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "gtk_init نى --sync نىڭ بىلەن ئىجرا قىلىش(سازلاش ھالىتى)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "قىستۇرما مەزمۇن تۈرلىرىنىڭ ئارىسىغا ئايرىغۇچ قوشۇش"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "ئۇقتۇرۇش ماۋزۇسىنىڭ پىچىمى"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "ئۇقتۇرۇش مەزمۇنىنىڭ پىچىمى"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "ئالبوم مۇقاۋىسىنى كۆرسىتىش"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "ئالبوم مۇقاۋىسىنىڭ چوڭلۇقى"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio مۇلازىمېتىرى"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "ئەۋرىشكە تېزلىكى"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "نىسپىي ئىزدەش جەدۋىلىنىڭ يولى"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "مۇتلەق ئىزدەش جەدۋىلىنىڭ يولى"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
+"ئۈن بايتلىرىنى ئالماشتۇرۇش (ئەگەر ئۆزگىرىش بولمىسا ئەسلىگە كەلتۈرسە بولىدۇ)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "ئىناۋەتلىك قىلىش(HVSC Songlength DB نى)"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt ( HVSC نىڭدىن )"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "ھەر بىر ئەۋرىشكىدىكى بىت سانى(8 ياكى 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "كۆڭۈلدىكى ناخشا ئۇزۇنلۇقى (سېكۇنت)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ بانكا سەپلىمە ھۆججىتى"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "نەغمە ئاتى"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "ئورۇنلىغۇچى"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "جەمئىي نەغمە"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "ئېقىم"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "مۇزىكىسىنى ئىشلىگۈچى"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "دىسكا نومۇرى"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "ئىزاھات"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "كودلىغۇچ / تارقاتقۇچى"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "ئورنى"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "تارماق نەغمە ئىندېكسى"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "خەتكۈش تىپ(لىرى)ى"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "سىڭدۈرمە Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "كودلىغۇچ-كودسىزلۇغۇچ"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "ھۆججەت كېڭەيتىلگەن ئاتى(‹;› بىلەن ئايرىلىدۇ)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "ئايلاندۇرۇش"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "نىشان ئەۋرىشكە تېزلىكى"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "سۈپەت / ئالگورىزىم"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "ئاپتوماتىك ئەۋرىشكە تېزلىكى (‹نىشان ئەۋرىشكە تېزلىكى›نى قاپلىنىدۇ)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "scrobbler نى ئىناۋەتلىك قىلىش"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "مەزكۇر ھۆججەت مەۋجۇت. قاپلامسىز؟"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "ئايلاندۇرغۇچ ئاگاھلاندۇرۇشى"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "كودلىغۇچ تاللاڭ"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "ئايلاندۇرغۇچ خاتالىقى"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "ئايلاندۇرۇۋاتىدۇ…"
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "قىسقۇچ تاللاش…"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "كودلىغۇچ ئالدىن تەڭشىشىنى ساقلاش مەغلۇپ بولدى"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1567,63 +1656,78 @@ msgstr ""
"ئالدىن تەڭشەش قىسقۇچىنىڭ ئىمتىيازلىرىنى تەكشۈرۈڭ، باشقا ماۋزۇ تاللاڭ ياكى "
"دىسكىنى ئازراق بىكارلاڭ"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "ئوخشاش ئاتلىق ئالدىن تەڭشەش مەۋجۇت. باشقا بىرنى تاللاڭ."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "خاتالىق"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "يېڭى كودلىغۇچ قوشۇش"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "كودلىغۇچ تەھرىرلەش"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "ئالدىن تەڭشەشنى چىقىرىۋېتىش"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "بۇ مەشغۇلاتتا تاللانغان ئالدىن تەڭشەش ئۆچۈرۈلىدۇ. راستلا ئۆچۈرەمسىز؟"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "كودلىغۇچ"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "يېڭى قىستۇرمىنى DSP زەنجىرىگە قوشۇش"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "DSP ئالدىن تەڭشىشىنى ساقلاش مەغلۇپ بولدى"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "يېڭى DSP ئالدىن تەڭشىشى"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "DSP ئالدىن تەڭشىشىنى تەھرىرلەش"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP ئالدىن تەڭشەشلىرى"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "چىقىرىش قىسقۇچى:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "بۇ يەردىن باشلانغان قىسقۇچ قۇرۇلمىسىنى ساقلاپ قېلىش:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "چىقىرىش ھۆججىتىنىڭ ئاتى:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1631,84 +1735,91 @@ msgstr ""
"كېڭەيتىلمە ئاتى (.mp3 دېگەندەك) ئاپتوماتىك قوشۇلىدۇ.\n"
"قۇرۇق بولسا كۆڭۈلدىكىسى ئىشلىتىلىدۇ (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "كودلىغۇچ:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP ئالدىن تەڭشىشى"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "جەريان(threads) سانى:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "چىقىرىش ئەۋرىشكىسىنىڭ پىچىمى:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "مەنبەنىڭ پىچىمىدەك بولسۇن"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 بىتلىق ئالامىتى بار پۈتۈن سان"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 بىتلىق ئالامىتى بار پۈتۈن سان"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 بىتلىق ئالامىتى بار پۈتۈن سان"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 بىتلىق ئالامىتى بار پۈتۈن سان"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 بىتلىق لەيلىمە كەسىر سان"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "ھۆججەت مەۋجۇت بولسا:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "ئەسكەرتىش"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "قاپلاش"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "كودلىغۇچ ئالدىن تەڭشىشىنى تەھرىرلەش"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "ماۋزۇسىز كودلىغۇچ"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "چىقىرىش ھۆججىتىنىڭ كېڭەيتىلمە ئاتى:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "يەنى mp3 دېگەندەك"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "بۇيرۇق قۇرى:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1716,8 +1827,9 @@ msgstr ""
"مىسال: lame - %o\n"
"%i كىرىش ھۆججىتى، %o چىقىرىش ھۆججىتى, - for stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1725,75 +1837,321 @@ msgstr ""
"<small>%o - چىقىرىش ھۆججىتىنىڭ ئاتى\n"
"%i - ۋاقىتلىق كىرگۈزۈش ھۆججىتىنىڭ ئاتى</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "ئۇسۇل:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "تۇرۇبا"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "ۋاقىتلىق ھۆججەت"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>خەتكۈش يازغۇچ</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP ئالدىن تەڭشىكىنى تەھرىرلىگۈچ"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "نامسىز DSP ئالدىن تەڭشىشى"
-#~ msgid ""
-#~ "Keep source format\n"
-#~ "8 bit signed int\n"
-#~ "16 bit signed int\n"
-#~ "24 bit signed int\n"
-#~ "32 bit signed int\n"
-#~ "32 bit float"
-#~ msgstr ""
-#~ "مەنبە پىچىمى ئۆزگەرمىسۇن\n"
-#~ "8 بىتلىق ئالامەتلىك پۈتۈن سان\n"
-#~ "16 بىتلىق ئالامەتلىك پۈتۈن سان\n"
-#~ "24 بىتلىق ئالامەتلىك پۈتۈن سان\n"
-#~ "32 بىتلىق ئالامەتلىك پۈتۈن سان\n"
-#~ "32 بىتلىق لەيلىمە كەسىر سان"
-
-#~ msgid ""
-#~ "Pipe\n"
-#~ "Temporary file"
-#~ msgstr ""
-#~ "نەيچە\n"
-#~ "ۋاقىتلىق ھۆججەت"
-
-#~ msgid ""
-#~ "Prompt\n"
-#~ "Overwrite"
-#~ msgstr ""
-#~ "ئەسكەرتىش\n"
-#~ "قاپلاش"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+"مەنبە پىچىمى ئۆزگەرمىسۇن\n"
+"8 بىتلىق ئالامەتلىك پۈتۈن سان\n"
+"16 بىتلىق ئالامەتلىك پۈتۈن سان\n"
+"24 بىتلىق ئالامەتلىك پۈتۈن سان\n"
+"32 بىتلىق ئالامەتلىك پۈتۈن سان\n"
+"32 بىتلىق لەيلىمە كەسىر سان"
+
+#: ../plugins/converter/converter.glade.h:19
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr ""
+"ئەسكەرتىش\n"
+"قاپلاش"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+"نەيچە\n"
+"ۋاقىتلىق ھۆججەت"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "تەھرىر(_E)"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "ياپ(_C)"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "ئىستون تەھرىرلەش"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "بۇيرۇق قۇرى:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "نەغمىنى تەرتىپسىز قويۇش"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[بىر قانچە قىممەت] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "ئورنى"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "چىقىرىۋەت"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "يېڭى قويۇش تىزىمى"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "ئىزاھات"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "ئىستون قوشۇش"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "بۇ مەشغۇلاتتا تاللانغان ئالدىن تەڭشەش ئۆچۈرۈلىدۇ. راستلا ئۆچۈرەمسىز؟"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "سەپلە"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "تەڭشەكلەر"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#~ msgid "Slot"
+#~ msgstr "ئوقۇر"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "تاللانغان سوز بۆلىكىنى راستلا چىقىرىۋېتەمسىز؟"
diff --git a/po/uk.po b/po/uk.po
index 5944610d..b53f4425 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: deadbeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-11-23 18:50+0200\n"
"Last-Translator: Y P <yupadmin@gmail.com>\n"
"Language-Team: UKRAINIAN <translate@linux.org.ua>\n"
@@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Language: Ukrainian\n"
"X-Poedit-SourceCharset: utf-8\n"
@@ -58,9 +58,9 @@ msgstr "Не можу прочитати файл допомоги"
msgid "help.txt"
msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Допомога"
@@ -74,122 +74,126 @@ msgstr "Про DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s Список Змін"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
msgstr "Перекладачі DeaDBeeF"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Редагувати список програвання"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Назва:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Перейменувати список програвання"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Вилучити список програвання"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Додати новий список програвання"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "Зберегти типові значення еквалайзера DeaDBeeF"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "Файли типових значень еквалайзера DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "Завантаження типові значення еквалайзера DeaDBeeF..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "Типові значення еквалайзера DeaDBeeF (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "Імпорт типових значень еквалайзера Foobar2000..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Типові значення еквалайзера Foobar2000 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "Зберегти типові значення"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "Завантажити типові значення"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "Імортувати типові значення Foobar2000"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Включити"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "Скинути все на нуль"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "Скинути підсилення на нуль"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "Скинути частоти на нуль"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "Типові значення"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 день %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d дні %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Зупинено | %d треків | %s повна тривалість програвання"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Моно"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Стерео"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps"
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "На паузі |"
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
@@ -197,727 +201,762 @@ msgstr ""
"%s%s %s| %dГц | %d біт | %s | %d:%02d / %s | %d треків | %s повна тривалість "
"програвання"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "Зберегти список програвання як"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "Файли списків програвання DeaDBeeF (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Завантажити список програвання"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Інші файли (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Новий список програвання"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Новий список програвання (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Файл"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Відкрити файл(и)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Додати файл(и)"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Додати теку(и)"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Додати URL-посилання"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Новий список програвання"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Завантажити список програвання"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Зберегти список програвання"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "_Закінчити"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Редагувати"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Очистити"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Вибрати все"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Забрати вибирання всього"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Інвертувати виділення"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Вибір"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Вилучити"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Вилучити невиділене"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "_Знайти"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "Сортувати за"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Назва"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "Номер треку"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Альбом"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Виконавець"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "Дата"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Випадково"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Користувацьке"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Параметри"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Вигляд"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Рядок стану"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Заголовки колонок"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Вкладки"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Еквалайзер"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "_Програвання"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "Порядок"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Одне за одним"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "Перемішати треки"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "Перемішати треки"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Випадково"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Повторювати"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "Повторювати все"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "Повторювати тільки одну пісню"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "Не повторювати"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "Прокручувати поточну пісню"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "Виділяти поточну пісню"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "Зупинити піcля поточного"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "Перескочити на поточний трек"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "_Допомога"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_Впроваджені зміни"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "_Про"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "_Перекладачі"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Пошук"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Стоп"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Програвати"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Пауза"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Попереднє"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Наступне"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "Програвати випадково"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Про"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Вийти"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "Властивості треків"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "Налаштування"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "_Застосувати"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "З_акрити"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Метадані"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Властивості"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Введіть назву нової колонки тут"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Тип:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "Індекс"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Програвання"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Обкладинка альбому"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Виконавець - Альбом"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Тривалість"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "Номер треку"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "Гурт / Альбом Виконавець"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Формат:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Вирівнювання:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "По лівому краю"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "По правому краю"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Скасувати"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "_ОК"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "Плагін виводу:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "Пристрій виводу:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "Завжди конвертувати 8 біт аудіо до 16 біт"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Звук"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "Режим автовирівнювання гучності:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Виключити"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Трек"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "Використовувати пікове значення"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 дБ"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 дБ"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "Режим автовирівнювання гучності:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "Глобальне вирівнювання"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr ""
"Додати файли з командної стрічки (або менеджера файлів) до цього списку "
"програвання:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "Відновити попередню сесію на старті"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "Не додавати з архіву при додаванні тек"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Зупинити піcля поточного"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "Програвання"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Налаштувати"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "Типові значення ланцюга DSP"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "_Завантаження"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Закрити мінімізує до сист. лотка"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Середня кнопка миші закриває список програвання"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "Ховати іконку системного лотка"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "Використовувати жирні шрифти для треку, що програється"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "Ховати пункт контекстного меню \"Вилучити з диску\""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "Автоматично назвати список програвання при додаванні одної теки"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "Частота оновлення інтерфейсу (разів за секунду)"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "Текст заголовку панелі під час програвання:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "Текст заголовку панелі під час призупинення:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "Додаток GUI (для змін потрібно перезавантажити):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "GUI (Графічний інтерфейс)"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Перезаписати"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Передній план"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Тло"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Кольори Рядка Пошуку/Регулятора Гучності"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Середньо"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Легко"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Темно"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "Основний"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Текст"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "Кольори смужки вкладок"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr ""
"Перезаписати (втрачаються налаштування GTK, але пришвидшується візуалізація)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Парний рядок"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Непарний рядок"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Вибраний рядок"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Вибраний текст"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Курсор"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Кольори списку програвання"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "Кольори"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "Включити сервер проксі"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "Адреса сервера проксі:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "Порт сервера проксі:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "Тип проксі:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "Назва користувача проксі:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "Пароль користувача проксі:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "Мережа"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "Версія: "
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "Авторські права"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "Додатки"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Групувати по"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "Сортувати за..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "Формат"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "В порядку зростання"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "В порядку спадання"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "Вибрати додаток DSP"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "Додаток"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "Налаштування записувача мітки"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "Вписати ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "Вписати ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "Вписати APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "Вирізати ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "Вирізати ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "Вирізати APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "Версія ID3v2"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (Рекомендовано)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "Кодування символів у ID3v1 (типово є iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "Вписати ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Виконавець / Альбом"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Номер треку"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Вилучити файли з диску"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -925,49 +964,48 @@ msgstr ""
"Файли буде втрачено. Продовжити?\n"
"(Цей діалог можна виключити в налаштуваннях плагіна GTKUI)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Попередження"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "Додати до черги програвання"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "Вилучити з черги програвання"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "Перезавантажити метадані"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Вилучити з диску"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Додати колонку"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Редагувати колонку"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Вилучити колонку"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Групувати по"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Нічого"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Виконавець/Дата/Альбом"
@@ -975,7 +1013,7 @@ msgstr "Виконавець/Дата/Альбом"
msgid "Open file..."
msgstr "Відкрити файл..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
msgstr "Налаштувати %s"
@@ -984,19 +1022,23 @@ msgstr "Налаштувати %s"
msgid "Default Audio Device"
msgstr "Типовий пристрій Аудіо"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Додати"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Глоб. скор. клавіш"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "Слот"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "Розташування"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Комбінації клавіш"
@@ -1008,138 +1050,145 @@ msgstr "Додавання файлів"
msgid "Initializing..."
msgstr "Ініціалізація..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Ви змінили дані для цього треку."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Дійсно закрити вікно?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[Різні значення] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Клавіша"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Значення"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "Записую мітки..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "Назва:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "Назви полів не повинні починатися з : або _"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "Неможливо додати поле"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "Поле з такою назвою вже існує, введіть іншу назву."
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "Дійсно вилучити вибране поле?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "Додати поле"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "Вилучити поле"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Використання: deadbeef [опції] [файл(и)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "Опції:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr ""
" --help або -h Показати цю допомогу (це повідомлення) і вийти\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit Вийти з програвача\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Показати інформацію про версію і вийти\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play Почати програвання\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Зупинити програвання\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Призупинити програвання\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause перемикання паузи\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr " --play-pause Почати програвання якщо зупинено, включити паузу в "
+msgstr ""
+" --play-pause Почати програвання якщо зупинено, включити паузу в "
"протилежному випадку\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Наступна пісня в списку програвання\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Попередня пісня в списку програвання\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Випадкова пісня в списку програвання\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Додати файл(и) до існуючого списку програвання\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Показати форматовану назву треку до виводу\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1150,7 +1199,7 @@ msgstr ""
" [l]тривалість, [n]номер треку, [y]рік, [c]коментар,\n"
" [r]копірайт, [e]час що пройшов\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1159,53 +1208,28 @@ msgstr ""
" наприклад: --nowplaying \"%%a - %%t\" повинно показати "
"\"виконавець - назва\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " для більшої інформації дивитися http://sourceforge.net"
-"/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr ""
+" для більшої інформації дивитися http://sourceforge.net/"
+"apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Типово"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Так"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Ні"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Рекомендовано)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"В порядку зростання\n"
-"В порядку спадання"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Виключити\n"
-"Трек\n"
-"Альбом"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1231,7 +1255,7 @@ msgstr ""
"Гурт / Альбом Виконавець\n"
"Користувацьке"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1239,13 +1263,40 @@ msgstr ""
"Зліва\n"
"Справа"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Виключити\n"
+"Трек\n"
+"Альбом"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"В порядку зростання\n"
+"В порядку спадання"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Рекомендовано)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Не можу знайти файл pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1258,7 +1309,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Додати Аудіо CD"
#: ../translation/extra.c:4
@@ -1274,7 +1326,7 @@ msgstr "Використовувати зміну якості ALSA"
msgid "Release device while stopped"
msgstr "Вивільняти пристрій під час зупинки"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "Бажаний розмір буфера"
@@ -1303,266 +1355,304 @@ msgstr "Пароль"
msgid "Scrobble URL"
msgstr "Адреса для скроблера"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "Файл пристрою"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "Помилка OSS4 samplerate"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "Період оновлення кешу (год.)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "Отримувати з вставлених тегів"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "Отримати з локальної теки"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "Маска файлу для локальних обкладинок"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "Отримати з last.fm"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "Отримати з albumart.org"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "Скалювати обкладинку стосовно довшої сторони"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "Використовувати CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "Використовувати CD-Text замість CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB лінк (наприклад 'freedb.org')"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "Порт для CDDB (наприклад '888')"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "Використовувати CDDB замість HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "Включити підтримку образу NRG"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "Якість передискретизації (0..2, більше-краще)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "Максимальна довжина пісні (хв.)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "Типова довжина пісні (сек)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "Запистувати підтвердження перед вилученням файлів з диску"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "Чутливість регулятора гучності в значку статусу"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "Користувацький значок статусу"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "Запустити gtk_init з --sync (режим наладки)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "Додати розділювачі між додатками контекстного меню"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "Формат назви повідомлення"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "Формат вмісту повідомлення"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "Показати обкладинку альбому"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "Розмір обкладинки (пікселі)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "Сервер PulseAudio"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "Частота дискретизації"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "Відносний шлях таблиці пошуку"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "Абсолютний шлях таблиці пошуку"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "Переставити місцями аудіо байти"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "Включити HVSC Songlength DB"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (з HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "Біт на зразок (8 або 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "Типова довжина пісні (сек)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Файл налаштувань для банку Timidity++"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "Назва треку"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "Виконавець"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "Всіх треків"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "Жанр"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "Композитор"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "Номер диску"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "Коментар"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "Кодер / Продавець"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "Розташування"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "Індекс субтреку"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "Тип(и) мітки"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "Вбудований список"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "Кодек"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "Розширення файлу (розділити за допомогою ';')"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "Конвертувати"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "Частота дискретизація цілі"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "Якість / Алгоритм"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
"Автоматична частота дискретизації (перезапише Частоту дискретизації цілі)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Включити скроблер"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "Файл вже існує. Перезаписати?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "Попередження конвертора"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "Будь ласка, виберіть інший енкодер"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "Помилка конвертора"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "Конвертування..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "Вибрати теку..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "Не можна зберегти типові параметри енкодера"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
@@ -1570,65 +1660,80 @@ msgstr ""
"Перевірте типові права доступу теки, спробуйте вибрати іншу назву, або "
"звільніть трохи дискового простору"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
"Типові параметри з тою самою назвою вже існують. Спробуйте вибрати іншу "
"назву."
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "Помилка"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "Додати новий енкодер"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "Редагувати енкодер"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "Вилучити типові значення"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "Ця дія вилучить вибрані типові значення. Ви впевнені?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "Енкодери"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "Додати додаток до ланцюжка DSP"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "Не можу зберегти типові значення DSP"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "Нові типові значення DSP"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "Редагувати типові значення DSP"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "Типові значення DSP"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "Тека виводу:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "Зберігати структуру тек, починаючи з:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "Назва файла виводу:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1636,84 +1741,91 @@ msgstr ""
"Розширення (наприклад .mp3) буде додано автоматично.\n"
"Залишіть поле пустим для типових значень (%a - %t)."
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "Енкодер:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "Типові значення DSP"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "Кількість потоків:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "Формат зразка виводу:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "Зберегти формат джерела"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 біт ціле"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 біт ціле"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 біт ціле"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 біт ціле"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 біт плаваюче"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "Коли файл існує:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "Питати"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "Перезаписати"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "Зберігати структуру тек, починаючи з:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "Редагувати типові значення енкодера"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "Енкодер без назви"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "Розширення файла виводу:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "Наприклад mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "Командна стрічка:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1721,8 +1833,9 @@ msgstr ""
"Приклад: lame - %o\n"
"%i для вхідного файлу, %o для вихідного файлу, - для потокових даних"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1730,50 +1843,317 @@ msgstr ""
"<small>%o - назва вихідного файлу\n"
"%i - назва тимчасового вхідного файлу</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "Метод:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "Трубка"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "Тимчасовий файл"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>Записувач мітки</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "Редактор типових значень DSP"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "Типові значення DSP без назви"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Перезаписати"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "Тимчасовий файл"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Редагувати"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "З_акрити"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Редагувати колонку"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "Командна стрічка:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Перемішати треки"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[Різні значення] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Розташування"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Вилучити"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Новий список програвання"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "Коментар"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Додати колонку"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "Ця дія вилучить вибрані типові значення. Ви впевнені?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Налаштувати"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Налаштування"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "GUI (Графічний інтерфейс)"
+
+#~ msgid "Slot"
+#~ msgstr "Слот"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "Дійсно вилучити вибране поле?"
+
#~ msgid "about.txt"
#~ msgstr "about.txt"
diff --git a/po/vi.po b/po/vi.po
index 607e7cfa..895af919 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 0xDeadBeef\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2011-02-18 05:14+0200\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-07-18 16:14+0200\n"
"Last-Translator: Duy Hung <nguyentieuhau@gmail.com>\n"
"Language-Team: English (United Kingdom) <yorvik.ubunto@gmail.com>\n"
"Language: vi\n"
@@ -44,7 +44,7 @@ msgstr "Thêm thư mục vào playlist..."
#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
-msgstr ""
+msgstr "Đi theo liên kết tượng trưng"
#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
@@ -56,11 +56,11 @@ msgstr "Không thể đọc tập tin trợ giúp"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "Trợ giúp"
@@ -70,912 +70,913 @@ msgid "About DeaDBeeF %s"
msgstr "Về DeaDBeeF %s"
#: ../plugins/gtkui/callbacks.c:760
-#, fuzzy, c-format
+#, c-format
msgid "DeaDBeeF %s ChangeLog"
-msgstr "DeaDBeeF %s ChangeLog"
+msgstr "DeaDBeeF %s Nhật ký thay đổi"
-#: ../plugins/gtkui/callbacks.c:1116
-#, fuzzy, c-format
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
msgid "DeaDBeeF Translators"
-msgstr "DeaDBeeF đang phát"
+msgstr "DeaDBeeF Dịch giả"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "Sửa playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "Tiêu đề:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "Đổi tên Playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "Xóa Playlist"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "Thêm Playlist Mới"
-#: ../plugins/gtkui/eq.c:136
-#, fuzzy
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
-msgstr "Save DeaDBeeF EQ Preset"
+msgstr "Lưu DeaDBeeF EQ Preset"
-#: ../plugins/gtkui/eq.c:143
-#, fuzzy
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
-msgstr "DeaDBeeF EQ preset files (*.ddbeq)"
+msgstr "Tập tin DeaDBeeF EQ preset (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
-#, fuzzy
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
-msgstr "Load DeaDBeeF EQ Preset..."
+msgstr "Nạp DeaDBeeF EQ Preset..."
-#: ../plugins/gtkui/eq.c:186
-#, fuzzy
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ presets (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
-#, fuzzy
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
-msgstr "Import Foobar2000 EQ Preset..."
+msgstr "Nhập Foobar2000 EQ Preset..."
-#: ../plugins/gtkui/eq.c:251
-#, fuzzy
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ presets (*.feq)"
-#: ../plugins/gtkui/eq.c:316
-#, fuzzy
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
-msgstr "Save Preset"
+msgstr "Lưu Preset"
-#: ../plugins/gtkui/eq.c:324
-#, fuzzy
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
-msgstr "Load Preset"
+msgstr "Nạp Preset"
-#: ../plugins/gtkui/eq.c:332
-#, fuzzy
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
-msgstr "Import Foobar2000 Preset"
+msgstr "Nhập Foobar2000 Preset"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "Bật"
-#: ../plugins/gtkui/eq.c:366
-#, fuzzy
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
-msgstr "Zero All"
+msgstr "Tất Cả Về 0"
-#: ../plugins/gtkui/eq.c:373
-#, fuzzy
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
-msgstr "Zero Preamp"
+msgstr "Preamp Về 0"
-#: ../plugins/gtkui/eq.c:380
-#, fuzzy
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
-msgstr "Zero Bands"
+msgstr "Bands Về 0"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "Save Preset"
+msgstr "Presets"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 ngày %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d ngày %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "Dừng phát | %d bài | Tất cả %s"
-#: ../plugins/gtkui/gtkui.c:162
-#, fuzzy
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "Mono"
-#: ../plugins/gtkui/gtkui.c:162
-#, fuzzy
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "Stereo"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "Tạm dừng | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d bài | Tất cả %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
-msgstr "Sao chép Playlist"
+msgstr "Sao Chép Playlist"
-#: ../plugins/gtkui/gtkui.c:655
-#, fuzzy
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
-msgstr "DeaDBeeF playlist files (*.dbpl)"
+msgstr "Tập tin DeaDBeeF playlist (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "Nạp Playlist"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "Những tập tin khác (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "Playlist Mới"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "Playlist Mới (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "_Tập tin"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "_Mở tập tin"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "Thêm tập tin"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "Thêm thư mục"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "Thêm vị trí"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "Tạo playlist mới"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "Nạp playlist"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "Lưu playlist"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
-msgstr "_Thoát"
+msgstr "T_hoát"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "_Sửa"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "_Xóa"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "Chọn tất cả"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "Bỏ chọn tất cả"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "Đảo lựa chọn"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "Lựa chọn"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "Xóa"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "Cắt"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
-msgstr "_Tìm"
+msgstr "Tì_m"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "Sắp Xếp Theo"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "Tiêu đề"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
-#, fuzzy
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr "Thứ tự"
+msgstr "Thứ tự bài"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "Album"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "Nghệ sĩ"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "Ngày"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "Ngẫu nhiên"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "Tùy chọn"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "Tùy chỉnh"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "_Hiển thị"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "Thanh trạng thái"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "Tiêu đề cột"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
-#, fuzzy
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "Thẻ"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
-#, fuzzy
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "Equalizer"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
-#, fuzzy
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
-msgstr "_Playback"
+msgstr "Phát _lại"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
-msgstr "Thứ tự phát"
+msgstr "Thứ tự"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
-#, fuzzy
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "Theo thứ tự"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "Theo vòng tròn"
+msgstr "Bài hát ngẫu nhiên"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "Theo vòng tròn"
-
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "Ngẫu nhiên"
+msgstr "Album ngẫu nhiên"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "Lặp lại"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
-msgstr "Lặp lại Tất cả"
-
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
-msgstr "Lặp lại Một Bài"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
+msgstr "Lặp Lại Tất Cả"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
-msgstr "Không Lặp lại"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
+msgstr "Lặp Lại Một Bài"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
#, fuzzy
+msgid "Don't loop"
+msgstr "Không Lặp Lại"
+
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
-msgstr "Trượt theo quá trình playback"
+msgstr "Trượt theo quá trình phát lại"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
-#, fuzzy
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
-msgstr "Trỏ chuột theo quá trình playback"
+msgstr "Con trỏ đi theo quá trình phát lại"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
-#, fuzzy
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
-msgstr "Dừng sau khi kết thúc bài nhạc"
+msgstr "Dừng sau khi kết thúc bài hiện tại"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "Nhảy đến bài hiện tại"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
-msgstr "_Trợ giúp"
+msgstr "T_rợ giúp"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
-#, fuzzy
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
-msgstr "_ChangeLog"
+msgstr "_Nhật ký thay đổi"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
-msgstr ""
+msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
-msgstr ""
+msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
-msgstr "_Thông tin"
+msgstr "Thôn_g tin"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
-msgstr ""
+msgstr "_Dịch giả"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "Tìm kiếm"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "Dừng"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "Phát"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "Tạm dừng"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "Trước"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "Sau"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
-msgstr "Phát Ngẫu nhiên"
+msgstr "Phát Ngẫu Nhiên"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "Thông tin"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "Thoát"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
-msgstr "Thông tin Bài nhạc"
+msgstr "Thông Tin Bài Nhạc"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "Thiết lập"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
-msgstr "_Áp dụng"
+msgstr "Á_p dụng"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
-msgstr "_Đóng"
+msgstr "Đó_ng"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "Metadata"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "Thuộc tính"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "Nhập tiêu đề cột mới tại đây"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "Loại:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "Item Index"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "Đang phát"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "Bìa Album"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "Nghệ sĩ - Album"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "Thời lượng"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
-msgstr "Bài Số"
+msgstr "Thứ Tự Bài Hát"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr "Nhóm / Nghệ sĩ Chính"
+msgstr "Nhóm / Nghệ sĩ"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "Định dạng:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "Canh chỉnh:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "Trái"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "Phải"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "_Hủy"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
-msgstr "_Đồng ý"
+msgstr "Đồng _ý"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
-msgstr "Output plugin:"
+msgstr "Plugin đầu ra:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
-msgstr "Output device:"
+msgstr "Thiết bị đầu ra:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "Luôn luôn chuyển đổi âm thanh 8 bit sang 16 bit"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "Âm thanh"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
-msgstr "Replay-gain mode:"
+msgstr "Chế độ Replaygain:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "Tắt"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "Bài"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
-msgstr "Replay-gain peak scale"
+msgstr "Tỉ lệ cao điểm Replaygain"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
-#, fuzzy
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr "Replay-gain mode:"
+msgstr "Khuếch đại trước của Replaygain:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "Khuếch đại trước toàn cục:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
-msgstr ""
+msgstr "Thêm tập tin từ dòng lệnh (hay bộ quản lý tập tin) vào playlist này:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
-msgstr ""
+msgstr "Phục hội lại phiên làm việc cuối khi vừa khởi động"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "Không thêm từ các tập tin lưu trữ khi thêm thư mục"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "Dừng sau khi kết thúc bài hiện tại"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
-msgstr "_Playback"
+msgstr "Phát lạ_i"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "Cấu hình"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "Save Preset"
+msgstr "DSP Chain Preset"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "_Nạp"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "Thu nhỏ xuống khay hệ thống"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "Nút giữa của chuột đóng playlist"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
-msgstr ""
+msgstr "Ẩn biểu tượng khay hệ thống"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
-msgstr ""
+msgstr "Sử dụng phông đậm cho bài đang được phát"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr ""
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr ""
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-#, fuzzy
-msgid "GUI"
-msgstr "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "Ghi đè"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "Mặt trước"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "Mặt sau"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "Màu thanh trượt/thanh âm lượng"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "Giữa"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "Sáng"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "Tối"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
#, fuzzy
msgid "Base"
msgstr "Base"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "Văn bản"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
#, fuzzy
msgid "Tab strip colors"
msgstr "Tab strip colours"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
#, fuzzy
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "Override (loses GTK tree-view theming, but speeds up rendering)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "Dòng chẵn"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "Dòng lẻ"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "Dòng đã chọn"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "Văn bản đã chọn"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "Trỏ chuột"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "Màu playlist"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr ""
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
#, fuzzy
msgid "Enable Proxy Server"
msgstr "Enable Proxy Server"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
#, fuzzy
msgid "Proxy Server Address:"
msgstr "Proxy Server Address:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
#, fuzzy
msgid "Proxy Server Port:"
msgstr "Proxy Server Port:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
#, fuzzy
msgid "Proxy Type:"
msgstr "Proxy Type:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
#, fuzzy
msgid "Proxy Username:"
msgstr "Proxy Username:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
#, fuzzy
msgid "Proxy Password:"
msgstr "Proxy Password:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
#, fuzzy
msgid "Network"
msgstr "Network"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr ""
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr ""
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
#, fuzzy
msgid "Plugins"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "Nhóm bởi"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
+msgstr "Sắp Xếp Theo"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
#, fuzzy
msgid "Format"
msgstr "Định dạng:"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr ""
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
#, fuzzy
msgid "Select DSP Plugin"
msgstr "Lựa chọn"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
#, fuzzy
msgid "Plugin"
msgstr "Plugins"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
#, fuzzy
msgid "Tag Writer Settings"
msgstr "Ghi thẻ"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
#, fuzzy
msgid "Write ID3v2"
msgstr "Write ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
#, fuzzy
msgid "Write ID3v1"
msgstr "Write ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
#, fuzzy
msgid "Write APEv2"
msgstr "Write APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
#, fuzzy
msgid "Strip ID3v2"
msgstr "Strip ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
#, fuzzy
msgid "Strip ID3v1"
msgstr "Strip ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
#, fuzzy
msgid "Strip APEv2"
msgstr "Strip APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
#, fuzzy
msgid "ID3v2 version"
msgstr "ID3v2 version"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
#, fuzzy
msgid "2.3 (Recommended)"
msgstr "2.3 (Recommended)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
#, fuzzy
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 character encoding (default is iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
#, fuzzy
msgid "Write ID3v2.4"
msgstr "Write ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "Nghệ sĩ / Album"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "Bài Số"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "Xóa những tập tin trong đĩa"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
#, fuzzy
msgid ""
"Files will be lost. Proceed?\n"
@@ -984,52 +985,51 @@ msgstr ""
"Những tập tin sẽ bị xóa. Tiếp tục?\n"
"(Hộp thoại này có thể được tắt trong những thiết lập GTKUI plugin)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "Cảnh báo"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
#, fuzzy
msgid "Add to playback queue"
msgstr "Thêm vào hàng đợi playback"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
#, fuzzy
msgid "Remove from playback queue"
msgstr "Xóa khỏi hàng đợi playback"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
#, fuzzy
msgid "Reload metadata"
msgstr "Reload metadata"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "Xóa khỏi đĩa"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "Thêm cột"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "Sửa cột"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "Xóa cột"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "Nhóm bởi"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "Không"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "Nghệ sĩ/Ngày/Album"
@@ -1037,7 +1037,7 @@ msgstr "Nghệ sĩ/Ngày/Album"
msgid "Open file..."
msgstr "Mở tập tin..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, fuzzy, c-format
msgid "Configure %s"
msgstr "Cấu hình"
@@ -1046,20 +1046,23 @@ msgstr "Cấu hình"
msgid "Default Audio Device"
msgstr "Thiết bị Âm thanh Mặc định"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "Thêm"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "Những Phím nóng Toàn cục"
-#: ../plugins/gtkui/prefwin.c:390
+#: ../plugins/gtkui/prefwin.c:416
#, fuzzy
-msgid "Slot"
-msgstr "Slot"
+msgid "Action"
+msgstr "Thêm vị trí"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "Kết hợp phím"
@@ -1071,139 +1074,144 @@ msgstr "Thêm tập tin..."
msgid "Initializing..."
msgstr "Đang khởi tạo..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "Bạn đã thay đổi dữ liệu của bài nhạc này."
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "Bạn thật sự muốn đóng cửa sổ này?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "Phím tắt"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "Giá trị"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:692
-#, fuzzy
-msgid "Really remove selected field?"
-msgstr "Bạn thật sự muốn đóng cửa sổ này?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
#, fuzzy
msgid "Add field"
msgstr "Thêm tập tin"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
#, fuzzy
msgid "Remove field"
msgstr "Xóa"
-#: ../main.c:91
+#: ../main.c:84
#, fuzzy, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "Usage: deadbeef [options] [file(s)]\n"
-#: ../main.c:92
+#: ../main.c:85
#, fuzzy, c-format
msgid "Options:\n"
msgstr "Options:\n"
-#: ../main.c:93
+#: ../main.c:86
#, fuzzy, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help or -h Print help (this message) and exit\n"
-#: ../main.c:94
+#: ../main.c:87
#, fuzzy, c-format
msgid " --quit Quit player\n"
msgstr " --quit Quit player\n"
-#: ../main.c:95
+#: ../main.c:88
#, fuzzy, c-format
msgid " --version Print version info and exit\n"
msgstr " --version Print version info and exit\n"
-#: ../main.c:96
+#: ../main.c:89
#, fuzzy, c-format
msgid " --play Start playback\n"
msgstr " --play Start playback\n"
-#: ../main.c:97
+#: ../main.c:90
#, fuzzy, c-format
msgid " --stop Stop playback\n"
msgstr " --stop Stop playback\n"
-#: ../main.c:98
+#: ../main.c:91
#, fuzzy, c-format
msgid " --pause Pause playback\n"
msgstr " --pause Pause playback\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr ""
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr ""
-#: ../main.c:101
+#: ../main.c:94
#, fuzzy, c-format
msgid " --next Next song in playlist\n"
msgstr " --next Next song in playlist\n"
-#: ../main.c:102
+#: ../main.c:95
#, fuzzy, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev Previous song in playlist\n"
-#: ../main.c:103
+#: ../main.c:96
#, fuzzy, c-format
msgid " --random Random song in playlist\n"
msgstr " --random Random song in playlist\n"
-#: ../main.c:104
+#: ../main.c:97
#, fuzzy, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue Append file(s) to existing playlist\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, fuzzy, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT Print formatted track name to stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, fuzzy, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1214,7 +1222,7 @@ msgstr ""
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
-#: ../main.c:109
+#: ../main.c:103
#, fuzzy, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1223,51 +1231,26 @@ msgstr ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "Mặc định"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "Có"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "Không"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-#, fuzzy
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (Recommended)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"Tắt\n"
-"Bài\n"
-"Album"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
#, fuzzy
msgid ""
"Item Index\n"
@@ -1294,7 +1277,7 @@ msgstr ""
"Band / Nghệ sĩ Chính\n"
"Tùy chọn"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1302,13 +1285,39 @@ msgstr ""
"Trái\n"
"Phải"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Tắt\n"
+"Bài\n"
+"Album"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+#, fuzzy
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Recommended)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, fuzzy, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "Không thể tìm tập tin pixmap: %s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1318,7 +1327,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "Thêm Audio CD"
#: ../translation/extra.c:4
@@ -1334,7 +1344,7 @@ msgstr ""
msgid "Release device while stopped"
msgstr ""
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr ""
@@ -1367,490 +1377,814 @@ msgstr "Proxy Password:"
msgid "Scrobble URL"
msgstr ""
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr ""
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr ""
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr ""
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr ""
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr ""
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr ""
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr ""
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr ""
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr ""
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr ""
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr ""
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr ""
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr ""
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr ""
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr ""
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr ""
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr ""
+#: ../translation/extra.c:40
+msgid "Fadeout length (seconds)"
+msgstr ""
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
#, fuzzy
msgid "Ask confirmation to delete files from disk"
msgstr "Xóa những tập tin trong đĩa"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr ""
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr ""
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr ""
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr ""
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr ""
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr ""
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
#, fuzzy
msgid "Show album art"
msgstr "Bìa Album"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr ""
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr ""
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr ""
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr ""
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr ""
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr ""
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr ""
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr ""
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr ""
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr ""
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr ""
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
#, fuzzy
msgid "Track Title"
msgstr "Bài Số"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr ""
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
#, fuzzy
msgid "Total Tracks"
msgstr "Tiêu đề / Nghệ sĩ"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr ""
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr ""
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
#, fuzzy
msgid "Disc Number"
msgstr "Thứ tự"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr ""
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr ""
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
#, fuzzy
msgid "Location"
msgstr "Thêm vị trí"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr ""
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
#, fuzzy
msgid "Tag Type(s)"
msgstr "Loại Thẻ"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
#, fuzzy
msgid "Embedded Cuesheet"
msgstr "Embedded Cue-sheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr ""
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr ""
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr ""
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+msgid "Quality / Algorithm"
msgstr ""
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "Enable Proxy Server"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr ""
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr ""
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr ""
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr ""
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
#, fuzzy
msgid "Select folder..."
msgstr "Chọn tất cả"
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr ""
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr ""
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr ""
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr ""
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
#, fuzzy
msgid "Edit encoder"
msgstr "Sửa cột"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
#, fuzzy
msgid "Remove preset"
msgstr "Save Preset"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr ""
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr ""
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr ""
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr ""
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
#, fuzzy
msgid "New DSP Preset"
msgstr "Save Preset"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
#, fuzzy
msgid "Edit DSP Preset"
msgstr "Save Preset"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
#, fuzzy
msgid "DSP Presets"
msgstr "Save Preset"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
#, fuzzy
msgid "Output folder:"
msgstr "Output device:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+msgid "Preserve folder structure"
+msgstr ""
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
#, fuzzy
msgid "Output file name:"
msgstr "Output plugin:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr ""
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
#, fuzzy
msgid "DSP preset:"
msgstr "Save Preset"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr ""
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr ""
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr ""
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr ""
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr ""
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr ""
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr ""
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
#, fuzzy
msgid "Overwrite"
msgstr "Ghi đè"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
#, fuzzy
msgid "Edit Encoder Preset"
msgstr "Load Preset"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr ""
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
#, fuzzy
msgid "Output file extension:"
msgstr "Output plugin:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr ""
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr ""
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr ""
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr ""
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr ""
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
#, fuzzy
msgid "APEv2"
msgstr "Write APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
#, fuzzy
msgid "ID3v1"
msgstr "Write ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr ""
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr ""
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
#, fuzzy
msgid "ID3v2"
msgstr "Write ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
#, fuzzy
msgid "<b>Tag writer</b>"
msgstr "Ghi thẻ"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr ""
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr ""
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "Ghi đè"
+
+#: ../plugins/converter/converter.glade.h:34
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "_Sửa"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "Đó_ng"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "Sửa cột"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+msgid "Command:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "Bài hát ngẫu nhiên"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "Tiêu đề / Nghệ sĩ"
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "Thêm vị trí"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "Xóa"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "Playlist Mới"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+msgid "Common"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "Thêm cột"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Cấu hình"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "Thiết lập"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#, fuzzy
+#~ msgid "GUI"
+#~ msgstr "GUI"
+
+#, fuzzy
+#~ msgid "Slot"
+#~ msgstr "Slot"
+
+#, fuzzy
+#~ msgid "Really remove selected field?"
+#~ msgstr "Bạn thật sự muốn đóng cửa sổ này?"
+
#~ msgid "Save playlist as"
#~ msgstr "Sao chép playlist"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index a402052a..6f44b194 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
"PO-Revision-Date: 2011-11-24 05:01+0200\n"
"Last-Translator: Yinghua_Wang <wantinghard@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -54,9 +54,9 @@ msgstr "加入帮助文件失败"
msgid "help.txt"
msgstr "帮助.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "帮助"
@@ -70,845 +70,884 @@ msgstr "关于 DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s 更新记录"
-#: ../plugins/gtkui/callbacks.c:1116
-#, c-format, c-format
+#: ../plugins/gtkui/callbacks.c:1134
+#, c-format
msgid "DeaDBeeF Translators"
msgstr "DeaDBeeF 翻译者"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "编辑播放列表"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
msgstr "标题:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "重命名播放列表"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "移除播放列表"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "添加新播放列表"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
msgstr "保存 DeaDBeeF EQ 预设置"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
msgstr "DeaDBeeF EQ 预设置文件(*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
msgstr "加载 DeaDBeeF EQ 预设置..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
msgstr "DeaDBeeF EQ 预设置(*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
msgstr "导入 Foobar2000 EQ 预设置..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
msgstr "Foobar2000 EQ 预设置(*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
msgstr "保存预设置"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
msgstr "加载预设置"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
msgstr "导入 Foobar2000 预设置"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "启用"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
msgstr "清零所有"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
msgstr "清零前置放大"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
msgstr "清零频段"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
msgstr "预设置"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
msgstr "1 天 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
msgstr "%d 天 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
msgstr "已停止 | 音轨数 %d | 播放总时长 %s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
msgstr "单声道"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
msgstr "立体声"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
msgstr "已暂停 | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | 音轨数 %d | 播放总时长 %s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "将播放列表保存为"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
msgstr "DeaDBeeF 播放列表文件(*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "载入播放列表"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "其他文件(*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "新播放列表"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "新播放列表(%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "文件(_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "打开文件(_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "添加文件"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "添加文件夹"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "添加位置"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "新播放列表"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
msgstr "加载播放列表"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
msgstr "保存播放列表"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
msgstr "退出(_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "编辑(_E)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "清除(_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "选择所有"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "去选所有"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "反转选择"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "选择"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "移除"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "剪切"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "查找(_F)"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
msgstr "排序依据"
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
msgstr "标题"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
msgstr "音轨号"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
msgstr "专辑"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
msgstr "艺人"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
msgstr "日期"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "随机"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
msgstr "自定义"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "偏好设置"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "查看(_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "状态栏"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "列标题"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "标签"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "均衡器"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "播放(_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "顺序"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "线性"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
msgstr "打乱音轨"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
msgstr "打乱专辑"
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "随机"
-
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "循环"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "全部循环"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "单曲循环"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "不循环"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
msgstr "随播放滚动列表"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
msgstr "光标定位在播放的曲目"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
msgstr "当前曲目后停止"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
msgstr "跳到当前音轨"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "帮助(_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "更新记录(_C)"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "关于(_A)"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
msgstr "翻译者(_T)"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "搜索"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "停止"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "播放"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "暂停"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
msgstr "上一曲"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "下一曲"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
msgstr "随机播放"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
msgstr "关于"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
msgstr "退出"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
msgstr "音轨属性"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
msgstr "设置"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
msgstr "应用(_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
msgstr "关闭(_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
msgstr "元数据"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
msgstr "属性"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
msgstr "在此输入新的列标题"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
msgstr "类型:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
msgstr "项目索引"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
msgstr "正在播放"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
msgstr "专辑封面"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
msgstr "艺人 - 专辑"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
msgstr "时长"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
msgstr "音轨号"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
msgstr "乐队 / 专辑艺人"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
msgstr "格式:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
msgstr "对齐:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "左"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "右"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "取消(_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "确定(_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
msgstr "输出插件:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
msgstr "输出设备:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
msgstr "总是将 8 位音频转换为 16 位"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
msgstr "声音"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
msgstr "回放增益方式:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
msgstr "禁用"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
msgstr "音轨"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
msgstr "回放增益峰值均衡"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
msgstr "回放预增益:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
msgstr "全局预增益:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
msgstr "通过命令行(或文件管理器)向此播放列表添加文件:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
msgstr "启动时恢复上一次会话"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
msgstr "在添加文件夹时排除归档"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
+#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "当前曲目后停止"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
msgstr "回放"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
msgstr "配置"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
msgstr "DSP 链预设置"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
msgstr "加载(_L)"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
msgstr "DSP(数字信号处理)"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
msgstr "点击关闭时最小化到托盘"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
msgstr "鼠标中键关闭播放列表"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
msgstr "隐藏系统托盘图标"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
msgstr "用粗体显示当前正在播放的音轨"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
msgstr "隐藏“从磁盘删除”右键菜单项"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
msgstr "在添加单个文件夹时自动命名播放列表"
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
msgid "Interface refresh rate (times per second):"
msgstr "界面刷新频率(每秒的次数):"
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
msgstr "播放时的标题栏文本:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
msgstr "停止时的标题栏文本:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
msgstr "图形用户界面插件(更改后需重启程序):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
-msgstr "用户界面"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
+msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
msgstr "覆盖"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
msgstr "前景色"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
msgstr "背景色"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
msgstr "搜索条/音量条颜色"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
msgstr "中"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
msgstr "右"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
msgstr "暗"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
msgstr "基础"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
msgstr "文本"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
msgstr "标签条颜色"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
msgstr "覆盖(不同于 GTK 树状视图风格,但渲染更快)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
msgstr "偶数行"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
msgstr "奇数行"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
msgstr "选择的行"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
msgstr "选择的文本"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
msgstr "光标"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
msgstr "播放列表颜色"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
msgstr "颜色"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
msgstr "启用代理服务器"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
msgstr "代理服务器地址:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
msgstr "代理服务器端口:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
msgstr "代理类型:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
msgstr "代理用户名:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
msgstr "代理密码:"
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
msgstr "网络"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
msgstr "版本:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
msgstr "版权"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
msgstr "插件"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
msgstr "URL:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
msgstr "分组依据"
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
+#, fuzzy
+msgid "Sort by ..."
msgstr "排序依据..."
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
msgstr "格式"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
msgstr "升序"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
msgstr "降序"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
msgstr "选择 DSP 插件"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
msgstr "插件"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
msgstr "标签编辑器设置"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
msgstr "写 ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
msgstr "写 ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
msgstr "写 APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
msgstr "清除 ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
msgstr "清除 ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
msgstr "清除 APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
msgstr "ID3v2 版本"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
msgstr "2.3 (推荐)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
msgstr "ID3v1 字符编码(默认为 iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
msgstr "写 ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
msgstr "艺人 / 专辑"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
msgstr "音轨号"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
msgstr "从磁盘中删除文件"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
@@ -916,49 +955,48 @@ msgstr ""
"文件将消失。继续吗?\n"
"(可以在 GTKUI 插件设置中禁用此对话框)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
msgstr "警告"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
msgstr "添加到播放列表"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
msgstr "从播放队列中移除"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
msgstr "重新载入元数据"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
msgstr "从磁盘中删除"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
msgstr "添加列"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
msgstr "编辑列"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
msgstr "移除列"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
msgstr "分组依据"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
msgstr "无"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
msgstr "艺人/日期/专辑"
@@ -966,8 +1004,8 @@ msgstr "艺人/日期/专辑"
msgid "Open file..."
msgstr "打开文件..."
-#: ../plugins/gtkui/pluginconf.c:217
-#, c-format, c-format
+#: ../plugins/gtkui/pluginconf.c:220
+#, c-format
msgid "Configure %s"
msgstr "配置 %s"
@@ -975,19 +1013,23 @@ msgstr "配置 %s"
msgid "Default Audio Device"
msgstr "默认音频设备"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
msgstr "添加"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
msgstr "全局热键"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr "槽"
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "位置"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
msgstr "按键组合"
@@ -999,136 +1041,142 @@ msgstr "正在添加文件..."
msgid "Initializing..."
msgstr "正在初始化..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
msgstr "您修改了此音轨的数据。"
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
msgstr "真的关闭该窗口吗?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
msgstr "[多个值] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
msgstr "键"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
msgstr "值"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
msgstr "正在写入标签..."
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
+msgstr ""
+
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
msgstr "名称:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
msgstr "字段名称不能以 : 或 _ 开头"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
msgstr "无法添加字段"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
msgstr "同名的字段已经存在,请尝试其他名称。"
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr "真的移除所选字段吗?"
-
-#: ../plugins/gtkui/trkproperties.c:734
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
msgstr "添加字段"
-#: ../plugins/gtkui/trkproperties.c:737
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
msgstr "移除字段"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
msgstr "用法:deadbeef [选项] [文件]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
msgstr "选项:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
msgstr " --help 或 -h 打印帮助(这条消息)并退出\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
msgstr " --quit 退出播放器\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
msgstr " --version 打印版本信息并退出\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
msgstr " --play 开始播放\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
msgstr " --stop 停止播放\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
msgstr " --pause 暂停播放\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
msgstr " --toggle-pause 切换暂停状态\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
msgstr " --play-pause 若停止则开始播放,否则切换暂停状态\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
msgstr " --next 播放列表中的下一首歌曲\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
msgstr " --prev 播放列表中的上一首歌曲\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
msgstr " --random 播放列表中的任一首歌曲\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
msgstr " --queue 向现有的播放列表中追加文件\n"
-#: ../main.c:105
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
+msgstr ""
+
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
msgstr " --nowplaying FMT 向标准输出打印格式化的音轨名称\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
@@ -1139,7 +1187,7 @@ msgstr ""
" [l]时长, [n]音轨号, [y]年代, [c]注释,\n"
" [r]版权, [e]已播放时间\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
@@ -1147,53 +1195,28 @@ msgid ""
msgstr ""
" 例:--nowplaying \"%%a - %%t\" 将打印“艺人 - 标题”\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
-msgstr " 更多信息请参阅 http://sourceforge.net/apps/mediawiki/deadbeef"
-"/index.php?title=Title_Formatting\n"
+msgstr ""
+" 更多信息请参阅 http://sourceforge.net/apps/mediawiki/"
+"deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
msgstr "默认"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
msgstr "是"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
msgstr "否"
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-"2.3 (推荐)\n"
-"2.4"
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-"升序\n"
-"降序"
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
-"禁用\n"
-"音轨\n"
-"专辑"
-
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1219,7 +1242,7 @@ msgstr ""
"乐队 / 专辑艺人\n"
"自定义"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
@@ -1227,13 +1250,40 @@ msgstr ""
"左\n"
"右"
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"禁用\n"
+"音轨\n"
+"专辑"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"升序\n"
+"降序"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (推荐)\n"
+"2.4"
+
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
msgstr "找不到位图文件:%s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
@@ -1245,7 +1295,8 @@ msgstr ""
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "添加音频 CD"
#: ../translation/extra.c:4
@@ -1261,7 +1312,7 @@ msgstr "使用 ALSA 重采样"
msgid "Release device while stopped"
msgstr "停止时释放设备"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
msgstr "首选的缓存大小"
@@ -1290,327 +1341,380 @@ msgstr "密码"
msgid "Scrobble URL"
msgstr "Scrobble URL"
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
+msgstr ""
+
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
msgstr "设备文件"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
msgstr "修正 OSS4 采样率问题"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
msgstr "缓存更新周期(小时)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
msgstr "从内嵌标签中提取"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
msgstr "从本地文件夹提取"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
msgstr "本地封面文件掩码"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
msgstr "从 last.fm 获取"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
msgstr "从 albumart.org 获取"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
msgstr "按较长的边拉伸图片"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
msgstr "使用 CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
msgstr "首选 CD-Text 而非 CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
msgstr "CDDB url (如“freedb.org”)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
msgstr "CDDB 端口号 (如“888”)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
msgstr "首选 CDDB 协议而非 HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
msgstr "启用 NRG 图像支持"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
msgstr "重采样品质(0~2,越大品质越好)"
-#. Game_Music_Emu decoder plugin
#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
+msgstr ""
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
msgstr "最大歌曲长度(分钟)"
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "默认歌曲长度(秒)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
+msgstr ""
+
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
msgstr "从磁盘中删除文件时让我确认"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
msgstr "状态图标音量控制灵敏度"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
msgstr "自定义状态图标"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
msgstr "以 --sync 参数运行 gtk_init (调试模式)"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
msgstr "在插件环境菜单项间添加分隔线"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
msgstr "通知标题格式"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
msgstr "通知内容格式"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
msgstr "显示专辑封面"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
msgstr "专辑封面尺寸(像素)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
msgstr "PulseAudio 服务器"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
msgstr "采样率"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
msgstr "相对搜寻表路径"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
msgstr "绝对搜寻表路径"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
msgstr "交换音频字节(如果所听到的没有变化可切回)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
msgstr "启用 HVSC 歌曲长度数据库"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
msgstr "Songlengths.txt (来自 HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
msgstr "采样位数(8 或 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
msgstr "默认歌曲长度(秒)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
msgstr "Timidity++ 音色库配置文件"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
msgstr "音轨标题"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
msgstr "演奏/演唱"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
msgstr "总音轨数"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
msgstr "流派"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
msgstr "作曲"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
msgstr "盘片号"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
msgstr "注释"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
msgstr "编码器 / 厂商"
-#: ../translation/extra.c:79
+#: ../translation/extra.c:83
msgid "Location"
msgstr "位置"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
msgstr "次音轨索引"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
msgstr "标签类型"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
msgstr "嵌入的 Cuesheet"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
msgstr "编解码器"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
msgstr "文件扩展名(用;分隔)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
msgstr "转换"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
msgstr "目标采样率"
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
msgstr "品质 / 算法"
-#: ../translation/extra.c:91
+#: ../translation/extra.c:95
msgid "Automatic Samplerate (overrides Target Samplerate)"
msgstr "自动采样率(替代目标采样率)"
-#: ../plugins/converter/convgui.c:108
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
+msgstr ""
+
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
+msgstr ""
+
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
+msgstr ""
+
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "启用 scrobbler"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
msgstr "文件已存在。覆盖吗?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
msgstr "转换器警告"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
msgstr "请选择编码器"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
msgstr "转换器错误"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
msgstr "正在转换..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
msgstr "选择文件夹..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
msgstr "保存编码器预设置失败"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
msgstr "请检查预设置文件夹权限,选择其他标题或清理出一些磁盘空间"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
msgstr "同名的预设置已经存在。请另选一个标题。"
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
msgstr "错误"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
msgstr "添加新编码器"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
msgstr "编辑编码器"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
msgstr "移除预设置"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
msgstr "此操作将删除所选的预设置。您确定吗?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
msgstr "编码器"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
msgstr "向 DSP 链上添加插件"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
msgstr "保存 DSP 预设置失败"
-#: ../plugins/converter/convgui.c:1098
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
msgstr "新建 DSP 预设置"
-#: ../plugins/converter/convgui.c:1183
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
msgstr "编辑 DSP 预设置"
-#: ../plugins/converter/convgui.c:1203
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
msgstr "DSP 预设置"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
msgstr "输出文件夹:"
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
+msgstr ""
+
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "保持文件夹结构,开始于:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
msgstr "输出文件名:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
@@ -1618,84 +1722,91 @@ msgstr ""
"扩展名(如 .mp3)会自动追加。\n"
"不填则使用默认(%a - %t)。"
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
msgstr "编码器:"
-#: ../plugins/converter/interface.c:163
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
msgstr "DSP 预设置:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
msgstr "线程数:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
msgstr "输出采样格式:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
msgstr "保持源格式"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
msgstr "8 位有符号整型"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
msgstr "16 位有符号整型"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
msgstr "24 位有符号整型"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
msgstr "32 位有符号整型"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
msgstr "32 位浮点型"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
msgstr "若文件存在:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
msgstr "提示"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
msgstr "覆盖"
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr "保持文件夹结构,开始于:"
-
-#: ../plugins/converter/interface.c:379
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
msgstr "编辑编码器预设置"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
msgstr "无标题编码器"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
msgstr "输出文件扩展名:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
msgstr "如 mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
msgstr "命令行:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
@@ -1703,8 +1814,9 @@ msgstr ""
"例如:lame - %o\n"
"%i 为输入文件,%o 为输出文件,- 为标准输入"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
@@ -1712,50 +1824,317 @@ msgstr ""
"<small>%o - 输出文件名\n"
"%i - 临时输入文件名</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
msgstr "方法:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
msgstr "管道"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
msgstr "临时文件"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
msgstr "<b>标签编辑器</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
msgstr "DSP 预设置编辑器"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
msgstr "无标题的 DSP 预设置"
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "覆盖"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "临时文件"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "编辑(_E)"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "关闭(_C)"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "编辑列"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "命令行:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "打乱音轨"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[多个值] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "位置"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "移除"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "新播放列表"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "注释"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "添加列"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "此操作将删除所选的预设置。您确定吗?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "配置"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "设置"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "用户界面"
+
+#~ msgid "Slot"
+#~ msgstr "槽"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "真的移除所选字段吗?"
+
#~ msgid "Save playlist as"
#~ msgstr "将播放列表保存为"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 0e914100..1eabdc4f 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -7,14 +7,16 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-11-23 14:16+0100\n"
-"PO-Revision-Date: 2010-05-30 16:19+0800\n"
-"Last-Translator: Hong Jen Yee <pcman.tw@gmail.com>\n"
+"POT-Creation-Date: 2012-09-10 20:26+0200\n"
+"PO-Revision-Date: 2012-04-16 06:39+0200\n"
+"Last-Translator: Walter <wwycheuk@gmail.com>\n"
"Language-Team: zh_TW <zh@li.org>\n"
-"Language: \n"
+"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"X-Generator: Pootle 2.0.5\n"
"X-Poedit-Language: Chinese\n"
"X-Poedit-Country: TAIWAN\n"
@@ -23,9 +25,8 @@ msgid "Supported sound formats"
msgstr "支援的聲音格式"
#: ../plugins/gtkui/callbacks.c:134
-#, fuzzy
msgid "All files (*)"
-msgstr "其他檔案 (*)"
+msgstr "全部檔案 (*)"
#: ../plugins/gtkui/callbacks.c:144
msgid "Open file(s)..."
@@ -41,23 +42,23 @@ msgstr "加入資料夾到播放清單..."
#: ../plugins/gtkui/callbacks.c:225
msgid "Follow symlinks"
-msgstr ""
+msgstr "跟隨符號連結"
#: ../plugins/gtkui/callbacks.c:711
msgid "Failed while reading help file"
-msgstr ""
+msgstr "未能讀取說明檔案"
#: ../plugins/gtkui/callbacks.c:721
msgid "Failed to load help file"
-msgstr ""
+msgstr "未能載入說明檔案"
#: ../plugins/gtkui/callbacks.c:736
msgid "help.txt"
-msgstr ""
+msgstr "help.txt"
-#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1155
-#: ../plugins/gtkui/deadbeef.glade.h:49 ../plugins/converter/convgui.c:1240
-#: ../plugins/converter/convgui.c:1248
+#: ../plugins/gtkui/callbacks.c:737 ../plugins/gtkui/interface.c:1158
+#: ../plugins/gtkui/deadbeef.glade.h:61 ../plugins/converter/convgui.c:1362
+#: ../plugins/converter/convgui.c:1370
msgid "Help"
msgstr "說明"
@@ -71,1125 +72,1155 @@ msgstr "關於 DeaDBeeF %s"
msgid "DeaDBeeF %s ChangeLog"
msgstr "DeaDBeeF %s ChangeLog"
-#: ../plugins/gtkui/callbacks.c:1116
+#: ../plugins/gtkui/callbacks.c:1134
#, c-format
msgid "DeaDBeeF Translators"
-msgstr ""
+msgstr "DeaDBeeF 翻譯者"
-#: ../plugins/gtkui/ddbtabstrip.c:755 ../plugins/gtkui/trkproperties.c:618
+#: ../plugins/gtkui/ddbtabstrip.c:842
msgid "Edit playlist"
msgstr "編輯播放清單"
-#: ../plugins/gtkui/ddbtabstrip.c:758 ../plugins/gtkui/interface.c:1486
-#: ../plugins/gtkui/interface.c:2922 ../plugins/gtkui/deadbeef.glade.h:136
-#: ../plugins/converter/interface.c:395
+#: ../plugins/gtkui/ddbtabstrip.c:845 ../plugins/gtkui/interface.c:1489
+#: ../plugins/gtkui/interface.c:2983 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/converter/interface.c:378
+#: ../plugins/converter/converter.glade.h:22
+#: ../plugins/shellexecui/interface.c:159
+#: ../plugins/shellexecui/shellexec.glade.h:7
msgid "Title:"
-msgstr ""
+msgstr "歌名:"
-#: ../plugins/gtkui/ddbtabstrip.c:814
+#: ../plugins/gtkui/ddbtabstrip.c:1034
msgid "Rename Playlist"
msgstr "重新命名播放清單"
-#: ../plugins/gtkui/ddbtabstrip.c:821
+#: ../plugins/gtkui/ddbtabstrip.c:1041
msgid "Remove Playlist"
msgstr "移除播放清單"
-#: ../plugins/gtkui/ddbtabstrip.c:828
+#: ../plugins/gtkui/ddbtabstrip.c:1048
msgid "Add New Playlist"
msgstr "新增播放清單"
-#: ../plugins/gtkui/eq.c:136
+#: ../plugins/gtkui/eq.c:141
msgid "Save DeaDBeeF EQ Preset"
-msgstr "儲存 DeaDBeeF EQ Preset"
+msgstr "儲存 DeaDBeeF 等化器預設值"
-#: ../plugins/gtkui/eq.c:143
+#: ../plugins/gtkui/eq.c:148
msgid "DeaDBeeF EQ preset files (*.ddbeq)"
-msgstr "DeaDBeeF EQ preset 檔案 (*.ddbeq)"
+msgstr "DeaDBeeF 等化器預設值檔案 (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:182
+#: ../plugins/gtkui/eq.c:187
msgid "Load DeaDBeeF EQ Preset..."
-msgstr "載入 DeaDBeeF EQ Preset..."
+msgstr "載入 DeaDBeeF 等化器預設值..."
-#: ../plugins/gtkui/eq.c:186
+#: ../plugins/gtkui/eq.c:191
msgid "DeaDBeeF EQ presets (*.ddbeq)"
-msgstr "DeaDBeeF EQ presets (*.ddbeq)"
+msgstr "DeaDBeeF 等化器預設值 (*.ddbeq)"
-#: ../plugins/gtkui/eq.c:247
+#: ../plugins/gtkui/eq.c:252
msgid "Import Foobar2000 EQ Preset..."
-msgstr "匯入 Foobar2000 EQ Preset..."
+msgstr "匯入 Foobar2000 等化器預設值..."
-#: ../plugins/gtkui/eq.c:251
+#: ../plugins/gtkui/eq.c:256
msgid "Foobar2000 EQ presets (*.feq)"
-msgstr "Foobar2000 EQ presets (*.feq)"
+msgstr "Foobar2000 等化器預設值 (*.feq)"
-#: ../plugins/gtkui/eq.c:316
+#: ../plugins/gtkui/eq.c:321
msgid "Save Preset"
-msgstr "儲存 Preset"
+msgstr "儲存預設值"
-#: ../plugins/gtkui/eq.c:324
+#: ../plugins/gtkui/eq.c:329
msgid "Load Preset"
-msgstr "載入 Preset"
+msgstr "載入預設值"
-#: ../plugins/gtkui/eq.c:332
+#: ../plugins/gtkui/eq.c:337
msgid "Import Foobar2000 Preset"
-msgstr "載入 Foobar2000 Preset"
+msgstr "匯入 Foobar2000 預設值"
-#: ../plugins/gtkui/eq.c:357
+#: ../plugins/gtkui/eq.c:362
msgid "Enable"
msgstr "啟用"
-#: ../plugins/gtkui/eq.c:366
+#: ../plugins/gtkui/eq.c:371
msgid "Zero All"
-msgstr ""
+msgstr "全部歸零"
-#: ../plugins/gtkui/eq.c:373
+#: ../plugins/gtkui/eq.c:378
msgid "Zero Preamp"
-msgstr ""
+msgstr "前級放大器歸零"
-#: ../plugins/gtkui/eq.c:380
+#: ../plugins/gtkui/eq.c:385
msgid "Zero Bands"
-msgstr ""
+msgstr "頻帶歸零"
-#: ../plugins/gtkui/eq.c:387 ../plugins/converter/interface.c:820
-#, fuzzy
+#: ../plugins/gtkui/eq.c:392 ../plugins/converter/interface.c:803
+#: ../plugins/converter/converter.glade.h:50
msgid "Presets"
-msgstr "儲存 Preset"
+msgstr "預設值"
-#: ../plugins/gtkui/gtkui.c:137
+#: ../plugins/gtkui/gtkui.c:140
#, c-format
msgid "1 day %d:%02d:%02d"
-msgstr ""
+msgstr "1 天 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:140
+#: ../plugins/gtkui/gtkui.c:143
#, c-format
msgid "%d days %d:%02d:%02d"
-msgstr ""
+msgstr "%d 天 %d:%02d:%02d"
-#: ../plugins/gtkui/gtkui.c:149
+#: ../plugins/gtkui/gtkui.c:152
#, c-format
msgid "Stopped | %d tracks | %s total playtime"
-msgstr ""
+msgstr "停止 | 第 %d 軌 | 總播放時間:%s"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Mono"
-msgstr ""
+msgstr "單聲道"
-#: ../plugins/gtkui/gtkui.c:162
+#: ../plugins/gtkui/gtkui.c:165 ../playlist.c:3036
msgid "Stereo"
-msgstr ""
+msgstr "立體聲"
-#: ../plugins/gtkui/gtkui.c:187
+#: ../plugins/gtkui/gtkui.c:190
#, c-format
msgid "| %4d kbps "
-msgstr ""
+msgstr "| %4d kbps "
-#: ../plugins/gtkui/gtkui.c:193
+#: ../plugins/gtkui/gtkui.c:196
msgid "Paused | "
-msgstr ""
+msgstr "暫停 | "
-#: ../plugins/gtkui/gtkui.c:198
+#: ../plugins/gtkui/gtkui.c:201
#, c-format
msgid ""
"%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
msgstr ""
+"%s%s %s| %dHz | %d 位元 | %s | %d:%02d / %s | 第 %d 首 | 總播放時間:%s"
-#: ../plugins/gtkui/gtkui.c:644
+#: ../plugins/gtkui/gtkui.c:647
msgid "Save Playlist As"
msgstr "另存播放清單"
-#: ../plugins/gtkui/gtkui.c:655
+#: ../plugins/gtkui/gtkui.c:658
msgid "DeaDBeeF playlist files (*.dbpl)"
-msgstr ""
+msgstr "DeaDBeeF 播放清單檔案 (*.dbpl)"
-#: ../plugins/gtkui/gtkui.c:773
+#: ../plugins/gtkui/gtkui.c:776
msgid "Load Playlist"
msgstr "載入播放清單"
-#: ../plugins/gtkui/gtkui.c:788
+#: ../plugins/gtkui/gtkui.c:791
msgid "Other files (*)"
msgstr "其他檔案 (*)"
-#: ../plugins/gtkui/gtkui.c:926 ../plugins/gtkui/fileman.c:40
+#: ../plugins/gtkui/gtkui.c:929 ../plugins/gtkui/fileman.c:41
msgid "New Playlist"
msgstr "新增播放清單"
-#: ../plugins/gtkui/gtkui.c:929
+#: ../plugins/gtkui/gtkui.c:932
#, c-format
msgid "New Playlist (%d)"
msgstr "新增播放清單 (%d)"
-#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:156
+#: ../plugins/gtkui/gtkui.c:1085
+msgid "- Test logout functionality"
+msgstr ""
+
+#: ../plugins/gtkui/interface.c:150 ../plugins/gtkui/deadbeef.glade.h:1
msgid "_File"
msgstr "檔案(_F)"
-#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:163
+#: ../plugins/gtkui/interface.c:157 ../plugins/gtkui/deadbeef.glade.h:2
msgid "_Open file(s)"
msgstr "開啟檔案(_O)"
-#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:6
+#: ../plugins/gtkui/interface.c:173 ../plugins/gtkui/deadbeef.glade.h:3
msgid "Add file(s)"
msgstr "加入檔案"
-#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:8
+#: ../plugins/gtkui/interface.c:181 ../plugins/gtkui/deadbeef.glade.h:4
msgid "Add folder(s)"
msgstr "加入資料夾"
-#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3022
-#: ../plugins/gtkui/deadbeef.glade.h:9
+#: ../plugins/gtkui/interface.c:189 ../plugins/gtkui/interface.c:3083
+#: ../plugins/gtkui/deadbeef.glade.h:5
msgid "Add location"
msgstr "加入位址"
-#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:80
+#: ../plugins/gtkui/interface.c:198 ../plugins/gtkui/deadbeef.glade.h:6
msgid "New playlist"
msgstr "新播放清單"
-#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:72
+#: ../plugins/gtkui/interface.c:205 ../plugins/gtkui/deadbeef.glade.h:7
msgid "Load playlist"
-msgstr ""
+msgstr "載入播放清單"
-#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:110
+#: ../plugins/gtkui/interface.c:209 ../plugins/gtkui/deadbeef.glade.h:8
msgid "Save playlist"
-msgstr ""
+msgstr "儲存播放清單"
-#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:165
+#: ../plugins/gtkui/interface.c:218 ../plugins/gtkui/deadbeef.glade.h:9
msgid "_Quit"
-msgstr "離開(_Q)"
+msgstr "結束(_Q)"
-#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:155
+#: ../plugins/gtkui/interface.c:229 ../plugins/gtkui/deadbeef.glade.h:10
msgid "_Edit"
msgstr "編輯(_E)"
-#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:153
+#: ../plugins/gtkui/interface.c:236 ../plugins/gtkui/deadbeef.glade.h:11
msgid "_Clear"
msgstr "清除(_C)"
-#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:115
+#: ../plugins/gtkui/interface.c:244 ../plugins/gtkui/deadbeef.glade.h:12
msgid "Select all"
msgstr "全選"
-#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:32
+#: ../plugins/gtkui/interface.c:251 ../plugins/gtkui/deadbeef.glade.h:13
msgid "Deselect all"
msgstr "全部取消選取"
-#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:55
+#: ../plugins/gtkui/interface.c:258 ../plugins/gtkui/deadbeef.glade.h:14
msgid "Invert selection"
msgstr "反向選取"
-#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:118
+#: ../plugins/gtkui/interface.c:262 ../plugins/gtkui/deadbeef.glade.h:15
msgid "Selection"
msgstr "選取"
-#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:468
-#: ../plugins/gtkui/prefwin.c:323 ../plugins/gtkui/deadbeef.glade.h:105
-#: ../plugins/converter/interface.c:645
+#: ../plugins/gtkui/interface.c:269 ../plugins/gtkui/plcommon.c:480
+#: ../plugins/gtkui/prefwin.c:353 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/converter/interface.c:628
+#: ../plugins/converter/converter.glade.h:46
+#: ../plugins/shellexecui/interface.c:65
+#: ../plugins/shellexecui/shellexec.glade.h:4
msgid "Remove"
msgstr "移除"
-#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../plugins/gtkui/interface.c:277 ../plugins/gtkui/deadbeef.glade.h:17
msgid "Crop"
msgstr "剪裁"
-#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:157
+#: ../plugins/gtkui/interface.c:281 ../plugins/gtkui/deadbeef.glade.h:18
msgid "_Find"
msgstr "尋找(_F)"
-#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:122
-msgid "Sort By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1516
-#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/prefwin.c:626
-#: ../plugins/gtkui/search.c:393 ../plugins/gtkui/deadbeef.glade.h:135
-#: ../plugins/converter/convgui.c:790 ../plugins/converter/convgui.c:1211
-#: ../plugins/converter/interface.c:622
+#: ../plugins/gtkui/interface.c:288 ../plugins/gtkui/deadbeef.glade.h:19
+#, fuzzy
+msgid "Sort by"
+msgstr "排序根據:"
+
+#: ../plugins/gtkui/interface.c:295 ../plugins/gtkui/interface.c:1519
+#: ../plugins/gtkui/mainplaylist.c:320 ../plugins/gtkui/prefwin.c:667
+#: ../plugins/gtkui/search.c:415 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/converter/convgui.c:834 ../plugins/converter/convgui.c:1333
+#: ../plugins/converter/interface.c:605
+#: ../plugins/converter/converter.glade.h:43
+#: ../plugins/shellexecui/shellexecui.c:327
msgid "Title"
-msgstr ""
+msgstr "歌名"
-#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:140
+#: ../plugins/gtkui/interface.c:299 ../plugins/gtkui/deadbeef.glade.h:21
msgid "Track number"
-msgstr ""
+msgstr "曲號"
-#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1515
-#: ../plugins/gtkui/interface.c:1875 ../plugins/gtkui/deadbeef.glade.h:10
-#: ../translation/extra.c:69
+#: ../plugins/gtkui/interface.c:303 ../plugins/gtkui/interface.c:1518
+#: ../plugins/gtkui/interface.c:1888 ../plugins/gtkui/deadbeef.glade.h:22
+#: ../translation/extra.c:73
msgid "Album"
-msgstr ""
+msgstr "專輯"
#. Track properties dialog
-#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1514
-#: ../plugins/gtkui/plcommon.c:1013 ../plugins/gtkui/deadbeef.glade.h:13
-#: ../translation/extra.c:65
+#: ../plugins/gtkui/interface.c:307 ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/plcommon.c:1028 ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:69
msgid "Artist"
-msgstr ""
+msgstr "藝人"
-#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:31
-#: ../translation/extra.c:70
+#: ../plugins/gtkui/interface.c:311 ../plugins/gtkui/deadbeef.glade.h:24
+#: ../translation/extra.c:74
msgid "Date"
-msgstr ""
+msgstr "日期"
-#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:1520
-#: ../plugins/gtkui/plcommon.c:1017 ../plugins/gtkui/deadbeef.glade.h:27
+#: ../plugins/gtkui/interface.c:315 ../plugins/gtkui/interface.c:387
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Random"
+msgstr "隨機"
+
+#: ../plugins/gtkui/interface.c:319 ../plugins/gtkui/interface.c:1523
+#: ../plugins/gtkui/plcommon.c:1032 ../plugins/gtkui/deadbeef.glade.h:26
msgid "Custom"
-msgstr ""
+msgstr "自訂"
-#: ../plugins/gtkui/interface.c:324 ../plugins/gtkui/interface.c:1804
-#: ../plugins/gtkui/deadbeef.glade.h:95
+#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/interface.c:1817
+#: ../plugins/gtkui/deadbeef.glade.h:27
msgid "Preferences"
msgstr "偏好設定"
-#: ../plugins/gtkui/interface.c:328 ../plugins/gtkui/deadbeef.glade.h:167
+#: ../plugins/gtkui/interface.c:332 ../plugins/gtkui/deadbeef.glade.h:28
msgid "_View"
msgstr "檢視(_V)"
-#: ../plugins/gtkui/interface.c:335 ../plugins/gtkui/deadbeef.glade.h:125
+#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:29
msgid "Status bar"
msgstr "狀態列"
-#: ../plugins/gtkui/interface.c:339 ../plugins/gtkui/deadbeef.glade.h:21
+#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:30
msgid "Column headers"
msgstr "標題欄"
-#: ../plugins/gtkui/interface.c:343 ../plugins/gtkui/deadbeef.glade.h:132
+#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:31
msgid "Tabs"
msgstr "分頁"
-#: ../plugins/gtkui/interface.c:347 ../plugins/gtkui/deadbeef.glade.h:40
+#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:32
msgid "Equalizer"
msgstr "等化器"
-#: ../plugins/gtkui/interface.c:351 ../plugins/gtkui/deadbeef.glade.h:164
+#: ../plugins/gtkui/interface.c:355 ../plugins/gtkui/deadbeef.glade.h:33
msgid "_Playback"
msgstr "播放(_P)"
-#: ../plugins/gtkui/interface.c:358 ../plugins/gtkui/interface.c:3298
-#: ../plugins/gtkui/deadbeef.glade.h:83
+#: ../plugins/gtkui/interface.c:362 ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:34
msgid "Order"
msgstr "順序"
-#: ../plugins/gtkui/interface.c:365 ../plugins/gtkui/deadbeef.glade.h:71
+#: ../plugins/gtkui/interface.c:369 ../plugins/gtkui/deadbeef.glade.h:35
msgid "Linear"
msgstr "線性"
-#: ../plugins/gtkui/interface.c:370 ../plugins/gtkui/deadbeef.glade.h:121
-#, fuzzy
+#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:36
msgid "Shuffle tracks"
-msgstr "洗牌"
+msgstr "調亂歌曲"
-#: ../plugins/gtkui/interface.c:375 ../plugins/gtkui/deadbeef.glade.h:120
-#, fuzzy
+#: ../plugins/gtkui/interface.c:381 ../plugins/gtkui/deadbeef.glade.h:37
msgid "Shuffle albums"
-msgstr "洗牌"
-
-#: ../plugins/gtkui/interface.c:380 ../plugins/gtkui/deadbeef.glade.h:104
-msgid "Random"
-msgstr "隨機"
+msgstr "調亂專輯"
-#: ../plugins/gtkui/interface.c:386 ../plugins/gtkui/deadbeef.glade.h:75
+#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:38
msgid "Looping"
msgstr "重複"
-#: ../plugins/gtkui/interface.c:393 ../plugins/gtkui/deadbeef.glade.h:73
-msgid "Loop All"
+#: ../plugins/gtkui/interface.c:400 ../plugins/gtkui/deadbeef.glade.h:39
+#, fuzzy
+msgid "Loop all"
msgstr "重複全部"
-#: ../plugins/gtkui/interface.c:398 ../plugins/gtkui/deadbeef.glade.h:74
-msgid "Loop Single Song"
+#: ../plugins/gtkui/interface.c:406 ../plugins/gtkui/deadbeef.glade.h:40
+#, fuzzy
+msgid "Loop single song"
msgstr "重複單一曲目"
-#: ../plugins/gtkui/interface.c:403 ../plugins/gtkui/deadbeef.glade.h:36
-msgid "Don't Loop"
+#: ../plugins/gtkui/interface.c:412 ../plugins/gtkui/deadbeef.glade.h:41
+#, fuzzy
+msgid "Don't loop"
msgstr "不要重複播放"
-#: ../plugins/gtkui/interface.c:409 ../plugins/gtkui/deadbeef.glade.h:111
+#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:42
msgid "Scroll follows playback"
-msgstr ""
+msgstr "隨播放捲動"
-#: ../plugins/gtkui/interface.c:414 ../plugins/gtkui/deadbeef.glade.h:26
+#: ../plugins/gtkui/interface.c:423 ../plugins/gtkui/deadbeef.glade.h:43
msgid "Cursor follows playback"
-msgstr ""
+msgstr "隨播放移動游標"
-#: ../plugins/gtkui/interface.c:418 ../plugins/gtkui/deadbeef.glade.h:127
+#: ../plugins/gtkui/interface.c:427 ../plugins/gtkui/deadbeef.glade.h:44
msgid "Stop after current"
-msgstr ""
+msgstr "播放當前歌曲後停止"
-#: ../plugins/gtkui/interface.c:430 ../plugins/gtkui/deadbeef.glade.h:67
+#: ../plugins/gtkui/interface.c:439 ../plugins/gtkui/deadbeef.glade.h:45
msgid "Jump to current track"
-msgstr ""
+msgstr "跳至當前歌曲"
-#: ../plugins/gtkui/interface.c:437 ../plugins/gtkui/interface.c:444
-#: ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/gtkui/interface.c:446 ../plugins/gtkui/interface.c:453
+#: ../plugins/gtkui/deadbeef.glade.h:46
msgid "_Help"
msgstr "說明(_H)"
-#: ../plugins/gtkui/interface.c:452 ../plugins/gtkui/deadbeef.glade.h:152
+#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:47
msgid "_ChangeLog"
msgstr "_ChangeLog"
-#: ../plugins/gtkui/interface.c:461 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/gtkui/interface.c:470 ../plugins/gtkui/deadbeef.glade.h:48
msgid "_GPLv2"
-msgstr ""
+msgstr "_GPLv2"
-#: ../plugins/gtkui/interface.c:465 ../plugins/gtkui/deadbeef.glade.h:160
+#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:49
msgid "_LGPLv2.1"
-msgstr ""
+msgstr "_LGPLv2.1"
-#: ../plugins/gtkui/interface.c:474 ../plugins/gtkui/deadbeef.glade.h:149
+#: ../plugins/gtkui/interface.c:483 ../plugins/gtkui/deadbeef.glade.h:50
msgid "_About"
msgstr "關於(_A)"
-#: ../plugins/gtkui/interface.c:482 ../plugins/gtkui/deadbeef.glade.h:166
+#: ../plugins/gtkui/interface.c:491 ../plugins/gtkui/deadbeef.glade.h:51
msgid "_Translators"
-msgstr ""
+msgstr "翻譯者(_T)"
-#: ../plugins/gtkui/interface.c:898 ../plugins/gtkui/deadbeef.glade.h:112
+#: ../plugins/gtkui/interface.c:907 ../plugins/gtkui/deadbeef.glade.h:52
msgid "Search"
msgstr "搜尋"
-#: ../plugins/gtkui/interface.c:973 ../plugins/gtkui/deadbeef.glade.h:126
+#: ../plugins/gtkui/interface.c:976 ../plugins/gtkui/deadbeef.glade.h:53
msgid "Stop"
msgstr "停止"
-#: ../plugins/gtkui/interface.c:981 ../plugins/gtkui/deadbeef.glade.h:89
+#: ../plugins/gtkui/interface.c:984 ../plugins/gtkui/deadbeef.glade.h:54
msgid "Play"
msgstr "播放"
-#: ../plugins/gtkui/interface.c:989 ../plugins/gtkui/deadbeef.glade.h:88
+#: ../plugins/gtkui/interface.c:992 ../plugins/gtkui/deadbeef.glade.h:55
msgid "Pause"
msgstr "暫停"
-#: ../plugins/gtkui/interface.c:997 ../plugins/gtkui/deadbeef.glade.h:96
+#: ../plugins/gtkui/interface.c:1000 ../plugins/gtkui/deadbeef.glade.h:56
msgid "Previous"
-msgstr "上一個"
+msgstr "上一首"
-#: ../plugins/gtkui/interface.c:1005 ../plugins/gtkui/deadbeef.glade.h:81
+#: ../plugins/gtkui/interface.c:1008 ../plugins/gtkui/deadbeef.glade.h:57
msgid "Next"
msgstr "下一首"
-#: ../plugins/gtkui/interface.c:1013 ../plugins/gtkui/deadbeef.glade.h:90
+#: ../plugins/gtkui/interface.c:1016 ../plugins/gtkui/deadbeef.glade.h:58
msgid "Play Random"
-msgstr ""
+msgstr "隨機播放"
-#: ../plugins/gtkui/interface.c:1022 ../plugins/gtkui/deadbeef.glade.h:5
+#: ../plugins/gtkui/interface.c:1025 ../plugins/gtkui/deadbeef.glade.h:59
msgid "About"
-msgstr ""
+msgstr "關於"
-#: ../plugins/gtkui/interface.c:1035 ../plugins/gtkui/deadbeef.glade.h:103
+#: ../plugins/gtkui/interface.c:1038 ../plugins/gtkui/deadbeef.glade.h:60
msgid "Quit"
-msgstr ""
+msgstr "結束"
-#: ../plugins/gtkui/interface.c:1225 ../plugins/gtkui/deadbeef.glade.h:139
+#: ../plugins/gtkui/interface.c:1228 ../plugins/gtkui/deadbeef.glade.h:62
msgid "Track Properties"
-msgstr ""
+msgstr "歌曲屬性"
-#: ../plugins/gtkui/interface.c:1270 ../plugins/gtkui/deadbeef.glade.h:119
+#: ../plugins/gtkui/interface.c:1273 ../plugins/gtkui/deadbeef.glade.h:63
msgid "Settings"
-msgstr ""
+msgstr "設定"
-#: ../plugins/gtkui/interface.c:1296 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../plugins/gtkui/interface.c:1299 ../plugins/gtkui/deadbeef.glade.h:64
msgid "_Apply"
-msgstr ""
+msgstr "套用(_A)"
-#: ../plugins/gtkui/interface.c:1317 ../plugins/gtkui/interface.c:1363
-#: ../plugins/gtkui/deadbeef.glade.h:154
+#: ../plugins/gtkui/interface.c:1320 ../plugins/gtkui/interface.c:1366
+#: ../plugins/gtkui/deadbeef.glade.h:65
msgid "_Close"
-msgstr ""
+msgstr "關閉(_C)"
-#: ../plugins/gtkui/interface.c:1321 ../plugins/gtkui/deadbeef.glade.h:76
+#: ../plugins/gtkui/interface.c:1324 ../plugins/gtkui/deadbeef.glade.h:66
msgid "Metadata"
-msgstr ""
+msgstr "元數據"
-#: ../plugins/gtkui/interface.c:1367 ../plugins/gtkui/plcommon.c:618
-#: ../plugins/gtkui/deadbeef.glade.h:97
+#: ../plugins/gtkui/interface.c:1370 ../plugins/gtkui/plcommon.c:630
+#: ../plugins/gtkui/deadbeef.glade.h:67
msgid "Properties"
-msgstr ""
+msgstr "屬性"
-#: ../plugins/gtkui/interface.c:1494 ../plugins/gtkui/deadbeef.glade.h:39
+#: ../plugins/gtkui/interface.c:1497 ../plugins/gtkui/deadbeef.glade.h:71
msgid "Enter new column title here"
-msgstr ""
+msgstr "在此輸入欄位名稱"
-#: ../plugins/gtkui/interface.c:1502 ../plugins/gtkui/deadbeef.glade.h:141
+#: ../plugins/gtkui/interface.c:1505 ../plugins/gtkui/deadbeef.glade.h:72
msgid "Type:"
-msgstr ""
+msgstr "類型:"
-#: ../plugins/gtkui/interface.c:1510
+#: ../plugins/gtkui/interface.c:1513
msgid "Item Index"
-msgstr ""
+msgstr "項目索引"
#. create default set of columns
-#: ../plugins/gtkui/interface.c:1511 ../plugins/gtkui/mainplaylist.c:315
+#: ../plugins/gtkui/interface.c:1514 ../plugins/gtkui/mainplaylist.c:317
msgid "Playing"
-msgstr ""
+msgstr "正在播放"
-#: ../plugins/gtkui/interface.c:1512
+#: ../plugins/gtkui/interface.c:1515
msgid "Album Art"
-msgstr ""
+msgstr "專輯封面"
-#: ../plugins/gtkui/interface.c:1513
+#: ../plugins/gtkui/interface.c:1516
msgid "Artist - Album"
-msgstr ""
+msgstr "藝人 - 專輯"
-#: ../plugins/gtkui/interface.c:1517 ../plugins/gtkui/mainplaylist.c:319
-#: ../plugins/gtkui/search.c:394
+#: ../plugins/gtkui/interface.c:1520 ../plugins/gtkui/mainplaylist.c:321
+#: ../plugins/gtkui/search.c:416
msgid "Duration"
-msgstr ""
+msgstr "長度"
-#: ../plugins/gtkui/interface.c:1518 ../translation/extra.c:71
+#: ../plugins/gtkui/interface.c:1521 ../translation/extra.c:75
msgid "Track Number"
-msgstr ""
+msgstr "歌曲編號"
-#: ../plugins/gtkui/interface.c:1519 ../translation/extra.c:68
+#: ../plugins/gtkui/interface.c:1522 ../translation/extra.c:72
msgid "Band / Album Artist"
-msgstr ""
+msgstr "樂隊 / 專輯藝人"
-#: ../plugins/gtkui/interface.c:1526 ../plugins/gtkui/interface.c:3150
-#: ../plugins/gtkui/deadbeef.glade.h:44
+#: ../plugins/gtkui/interface.c:1529 ../plugins/gtkui/interface.c:3211
+#: ../plugins/gtkui/deadbeef.glade.h:84
msgid "Format:"
-msgstr "格式:"
+msgstr "格式:"
-#: ../plugins/gtkui/interface.c:1551 ../plugins/gtkui/deadbeef.glade.h:11
+#: ../plugins/gtkui/interface.c:1554 ../plugins/gtkui/deadbeef.glade.h:85
msgid "Alignment:"
-msgstr "對齊:"
+msgstr "對齊:"
-#: ../plugins/gtkui/interface.c:1559
+#: ../plugins/gtkui/interface.c:1562
msgid "Left"
msgstr "左"
-#: ../plugins/gtkui/interface.c:1560
+#: ../plugins/gtkui/interface.c:1563
msgid "Right"
msgstr "右"
-#: ../plugins/gtkui/interface.c:1583 ../plugins/gtkui/interface.c:2953
-#: ../plugins/gtkui/interface.c:3065 ../plugins/gtkui/interface.c:3191
-#: ../plugins/gtkui/deadbeef.glade.h:151
+#: ../plugins/gtkui/interface.c:1586 ../plugins/gtkui/interface.c:3014
+#: ../plugins/gtkui/interface.c:3126 ../plugins/gtkui/interface.c:3252
+#: ../plugins/gtkui/deadbeef.glade.h:68
msgid "_Cancel"
msgstr "取消(_C)"
-#: ../plugins/gtkui/interface.c:1604 ../plugins/gtkui/interface.c:2974
-#: ../plugins/gtkui/interface.c:3086 ../plugins/gtkui/interface.c:3212
-#: ../plugins/gtkui/deadbeef.glade.h:162
+#: ../plugins/gtkui/interface.c:1607 ../plugins/gtkui/interface.c:3035
+#: ../plugins/gtkui/interface.c:3147 ../plugins/gtkui/interface.c:3273
+#: ../plugins/gtkui/deadbeef.glade.h:69
msgid "_OK"
msgstr "確定(_O)"
-#: ../plugins/gtkui/interface.c:1825 ../plugins/gtkui/deadbeef.glade.h:85
+#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:88
msgid "Output plugin:"
-msgstr ""
+msgstr "輸出外掛程式:"
-#: ../plugins/gtkui/interface.c:1838 ../plugins/gtkui/deadbeef.glade.h:84
+#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:89
msgid "Output device:"
-msgstr ""
+msgstr "輸出裝置:"
-#: ../plugins/gtkui/interface.c:1847 ../plugins/gtkui/deadbeef.glade.h:12
+#: ../plugins/gtkui/interface.c:1860 ../plugins/gtkui/deadbeef.glade.h:90
msgid "Always convert 8 bit audio to 16 bit"
-msgstr ""
+msgstr "將 8 位元音訊轉為 16 位元"
-#: ../plugins/gtkui/interface.c:1851 ../plugins/gtkui/deadbeef.glade.h:124
+#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:91
msgid "Sound"
-msgstr ""
+msgstr "聲音"
-#: ../plugins/gtkui/interface.c:1864 ../plugins/gtkui/deadbeef.glade.h:106
+#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:92
msgid "Replaygain mode:"
-msgstr ""
+msgstr "播放增益模式:"
-#: ../plugins/gtkui/interface.c:1873
+#: ../plugins/gtkui/interface.c:1886
msgid "Disable"
-msgstr ""
+msgstr "停用"
-#: ../plugins/gtkui/interface.c:1874
+#: ../plugins/gtkui/interface.c:1887
msgid "Track"
-msgstr ""
+msgstr "歌曲"
-#: ../plugins/gtkui/interface.c:1877 ../plugins/gtkui/deadbeef.glade.h:107
+#: ../plugins/gtkui/interface.c:1890 ../plugins/gtkui/deadbeef.glade.h:96
msgid "Replaygain peak scale"
-msgstr ""
+msgstr "播放增益峰值比例"
-#: ../plugins/gtkui/interface.c:1892 ../plugins/gtkui/interface.c:1926
-#: ../plugins/gtkui/deadbeef.glade.h:2
+#: ../plugins/gtkui/interface.c:1905 ../plugins/gtkui/interface.c:1939
+#: ../plugins/gtkui/deadbeef.glade.h:97
msgid "-12 dB"
-msgstr ""
+msgstr "-12 dB"
-#: ../plugins/gtkui/interface.c:1902 ../plugins/gtkui/interface.c:1936
-#: ../plugins/gtkui/deadbeef.glade.h:1
+#: ../plugins/gtkui/interface.c:1915 ../plugins/gtkui/interface.c:1949
+#: ../plugins/gtkui/deadbeef.glade.h:98
msgid "+12 dB"
-msgstr ""
+msgstr "+12 dB"
-#: ../plugins/gtkui/interface.c:1906 ../plugins/gtkui/deadbeef.glade.h:108
+#: ../plugins/gtkui/interface.c:1919 ../plugins/gtkui/deadbeef.glade.h:99
msgid "Replaygain preamp:"
-msgstr ""
+msgstr "播放增益前置放大器:"
-#: ../plugins/gtkui/interface.c:1913 ../plugins/gtkui/deadbeef.glade.h:47
+#: ../plugins/gtkui/interface.c:1926 ../plugins/gtkui/deadbeef.glade.h:100
msgid "Global preamp:"
-msgstr ""
+msgstr "全域前置放大器:"
-#: ../plugins/gtkui/interface.c:1944 ../plugins/gtkui/deadbeef.glade.h:7
+#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:101
msgid "Add files from command line (or file manager) to this playlist:"
-msgstr ""
+msgstr "由指令列 (或檔案管理員) 將檔案加入至此播放清單:"
-#: ../plugins/gtkui/interface.c:1953 ../plugins/gtkui/deadbeef.glade.h:109
+#: ../plugins/gtkui/interface.c:1966 ../plugins/gtkui/deadbeef.glade.h:102
msgid "Resume previous session on startup"
-msgstr ""
+msgstr "啟動時繼續前一作業"
-#: ../plugins/gtkui/interface.c:1957 ../plugins/gtkui/deadbeef.glade.h:37
+#: ../plugins/gtkui/interface.c:1970 ../plugins/gtkui/deadbeef.glade.h:103
msgid "Don't add from archives when adding folders"
-msgstr ""
+msgstr "加入資料夾時不要加入壓縮檔"
-#: ../plugins/gtkui/interface.c:1961 ../plugins/gtkui/deadbeef.glade.h:91
+#: ../plugins/gtkui/interface.c:1974 ../plugins/gtkui/deadbeef.glade.h:104
#, fuzzy
+msgid "Auto-reset \"Stop after current\""
+msgstr "播放當前歌曲後停止"
+
+#: ../plugins/gtkui/interface.c:1978 ../plugins/gtkui/deadbeef.glade.h:105
msgid "Playback"
-msgstr "播放(_P)"
+msgstr "播放"
-#: ../plugins/gtkui/interface.c:1982 ../plugins/gtkui/interface.c:2514
-#: ../plugins/gtkui/deadbeef.glade.h:22 ../plugins/converter/interface.c:649
+#: ../plugins/gtkui/interface.c:1999 ../plugins/gtkui/interface.c:2556
+#: ../plugins/gtkui/deadbeef.glade.h:106 ../plugins/converter/interface.c:632
+#: ../plugins/converter/converter.glade.h:47
msgid "Configure"
-msgstr ""
+msgstr "設定"
-#: ../plugins/gtkui/interface.c:2017 ../plugins/gtkui/deadbeef.glade.h:29
-#, fuzzy
+#: ../plugins/gtkui/interface.c:2034 ../plugins/gtkui/deadbeef.glade.h:107
msgid "DSP Chain Preset"
-msgstr "儲存 Preset"
+msgstr "DSP 連鎖預設值"
-#: ../plugins/gtkui/interface.c:2029 ../plugins/gtkui/deadbeef.glade.h:161
+#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:108
msgid "_Load"
-msgstr ""
+msgstr "載入(_L)"
-#: ../plugins/gtkui/interface.c:2033 ../plugins/gtkui/deadbeef.glade.h:28
+#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:109
msgid "DSP"
-msgstr ""
+msgstr "DSP"
-#: ../plugins/gtkui/interface.c:2042 ../plugins/gtkui/deadbeef.glade.h:19
+#: ../plugins/gtkui/interface.c:2059 ../plugins/gtkui/deadbeef.glade.h:110
msgid "Close minimizes to tray"
-msgstr ""
+msgstr "關閉時縮小至系統匣"
-#: ../plugins/gtkui/interface.c:2046 ../plugins/gtkui/deadbeef.glade.h:78
+#: ../plugins/gtkui/interface.c:2063 ../plugins/gtkui/deadbeef.glade.h:111
msgid "Middle mouse button closes playlist"
-msgstr ""
+msgstr "滑鼠中鍵關閉播放清單"
-#: ../plugins/gtkui/interface.c:2050 ../plugins/gtkui/deadbeef.glade.h:51
+#: ../plugins/gtkui/interface.c:2067 ../plugins/gtkui/deadbeef.glade.h:112
msgid "Hide system tray icon"
-msgstr ""
+msgstr "隱藏系統匣圖示"
-#: ../plugins/gtkui/interface.c:2054 ../plugins/gtkui/deadbeef.glade.h:143
+#: ../plugins/gtkui/interface.c:2071 ../plugins/gtkui/deadbeef.glade.h:113
msgid "Use bold font for currently playing track"
-msgstr ""
+msgstr "以粗體字顯示當前播放歌曲"
-#: ../plugins/gtkui/interface.c:2058 ../plugins/gtkui/deadbeef.glade.h:50
+#: ../plugins/gtkui/interface.c:2075 ../plugins/gtkui/deadbeef.glade.h:114
msgid "Hide \"Delete from disk\" context menu item"
-msgstr ""
+msgstr "隱藏「自磁碟刪除」境況選單項目"
-#: ../plugins/gtkui/interface.c:2062 ../plugins/gtkui/deadbeef.glade.h:16
+#: ../plugins/gtkui/interface.c:2079 ../plugins/gtkui/deadbeef.glade.h:115
msgid "Auto-name playlists when adding a single folder"
+msgstr "加入單一資料夾時自動為播放清單命名"
+
+#: ../plugins/gtkui/interface.c:2083 ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Enable Russian CP1251 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2070 ../plugins/gtkui/deadbeef.glade.h:54
-msgid "Interface refresh rate (times per second):"
+#: ../plugins/gtkui/interface.c:2087 ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Enable Chinese CP936 detection and recoding"
msgstr ""
-#: ../plugins/gtkui/interface.c:2084 ../plugins/gtkui/deadbeef.glade.h:137
+#: ../plugins/gtkui/interface.c:2095 ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Interface refresh rate (times per second):"
+msgstr "介面重刷率 (每秒次數):"
+
+#: ../plugins/gtkui/interface.c:2109 ../plugins/gtkui/deadbeef.glade.h:119
msgid "Titlebar text while playing:"
-msgstr ""
+msgstr "播放時標題列文字:"
-#: ../plugins/gtkui/interface.c:2098 ../plugins/gtkui/deadbeef.glade.h:138
+#: ../plugins/gtkui/interface.c:2123 ../plugins/gtkui/deadbeef.glade.h:120
msgid "Titlebar text while stopped:"
-msgstr ""
+msgstr "停止時標題列文字:"
-#: ../plugins/gtkui/interface.c:2112 ../plugins/gtkui/deadbeef.glade.h:46
+#: ../plugins/gtkui/interface.c:2137 ../plugins/gtkui/deadbeef.glade.h:121
msgid "GUI Plugin (changing requires restart):"
-msgstr ""
+msgstr "圖像用戶介面外掛程式 (重新啟動始生效):"
-#: ../plugins/gtkui/interface.c:2120 ../plugins/gtkui/deadbeef.glade.h:45
-msgid "GUI"
+#: ../plugins/gtkui/interface.c:2145 ../plugins/gtkui/deadbeef.glade.h:122
+msgid "GUI/Misc"
msgstr ""
-#: ../plugins/gtkui/interface.c:2135 ../plugins/gtkui/interface.c:2179
-#: ../plugins/gtkui/deadbeef.glade.h:86
+#: ../plugins/gtkui/interface.c:2160 ../plugins/gtkui/interface.c:2204
+#: ../plugins/gtkui/deadbeef.glade.h:123
msgid "Override"
-msgstr ""
+msgstr "優先於"
-#: ../plugins/gtkui/interface.c:2144 ../plugins/gtkui/deadbeef.glade.h:42
+#: ../plugins/gtkui/interface.c:2169 ../plugins/gtkui/deadbeef.glade.h:124
msgid "Foreground"
-msgstr ""
+msgstr "前景"
-#: ../plugins/gtkui/interface.c:2151 ../plugins/gtkui/deadbeef.glade.h:17
+#: ../plugins/gtkui/interface.c:2176 ../plugins/gtkui/deadbeef.glade.h:125
msgid "Background"
-msgstr ""
+msgstr "背景"
-#: ../plugins/gtkui/interface.c:2170 ../plugins/gtkui/deadbeef.glade.h:113
+#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:126
msgid "Seekbar/Volumebar colors"
-msgstr ""
+msgstr "搜索列/音量列 色彩"
-#: ../plugins/gtkui/interface.c:2188 ../plugins/gtkui/deadbeef.glade.h:77
+#: ../plugins/gtkui/interface.c:2213 ../plugins/gtkui/deadbeef.glade.h:127
msgid "Middle"
-msgstr ""
+msgstr "中等"
-#: ../plugins/gtkui/interface.c:2195 ../plugins/gtkui/deadbeef.glade.h:70
+#: ../plugins/gtkui/interface.c:2220 ../plugins/gtkui/deadbeef.glade.h:128
msgid "Light"
-msgstr ""
+msgstr "光亮"
-#: ../plugins/gtkui/interface.c:2202 ../plugins/gtkui/deadbeef.glade.h:30
+#: ../plugins/gtkui/interface.c:2227 ../plugins/gtkui/deadbeef.glade.h:129
msgid "Dark"
-msgstr ""
+msgstr "暗淡"
-#: ../plugins/gtkui/interface.c:2233 ../plugins/gtkui/deadbeef.glade.h:18
+#: ../plugins/gtkui/interface.c:2258 ../plugins/gtkui/deadbeef.glade.h:130
msgid "Base"
-msgstr ""
+msgstr "基礎"
-#: ../plugins/gtkui/interface.c:2240 ../plugins/gtkui/interface.c:2297
-#: ../plugins/gtkui/deadbeef.glade.h:134
+#: ../plugins/gtkui/interface.c:2265 ../plugins/gtkui/interface.c:2322
+#: ../plugins/gtkui/deadbeef.glade.h:131
msgid "Text"
-msgstr ""
+msgstr "文字"
-#: ../plugins/gtkui/interface.c:2253 ../plugins/gtkui/deadbeef.glade.h:131
+#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:132
msgid "Tab strip colors"
-msgstr ""
+msgstr "分頁條色彩"
-#: ../plugins/gtkui/interface.c:2262 ../plugins/gtkui/deadbeef.glade.h:87
+#: ../plugins/gtkui/interface.c:2287 ../plugins/gtkui/deadbeef.glade.h:133
msgid "Override (looses GTK treeview theming, but speeds up rendering)"
-msgstr ""
+msgstr "優先於 (放鬆 GTK 樹狀目錄佈景主題,但會加速成像)"
-#: ../plugins/gtkui/interface.c:2271 ../plugins/gtkui/deadbeef.glade.h:41
+#: ../plugins/gtkui/interface.c:2296 ../plugins/gtkui/deadbeef.glade.h:134
msgid "Even row"
-msgstr ""
+msgstr "偶數列"
-#: ../plugins/gtkui/interface.c:2278 ../plugins/gtkui/deadbeef.glade.h:82
+#: ../plugins/gtkui/interface.c:2303 ../plugins/gtkui/deadbeef.glade.h:135
msgid "Odd row"
-msgstr ""
+msgstr "單數列"
-#: ../plugins/gtkui/interface.c:2304 ../plugins/gtkui/deadbeef.glade.h:116
+#: ../plugins/gtkui/interface.c:2329 ../plugins/gtkui/deadbeef.glade.h:136
msgid "Selected row"
-msgstr ""
+msgstr "所選列"
-#: ../plugins/gtkui/interface.c:2323 ../plugins/gtkui/deadbeef.glade.h:117
+#: ../plugins/gtkui/interface.c:2348 ../plugins/gtkui/deadbeef.glade.h:137
msgid "Selected text"
-msgstr ""
+msgstr "所選文字"
-#: ../plugins/gtkui/interface.c:2336 ../plugins/gtkui/deadbeef.glade.h:25
+#: ../plugins/gtkui/interface.c:2361 ../plugins/gtkui/deadbeef.glade.h:138
msgid "Cursor"
-msgstr ""
+msgstr "游標"
-#: ../plugins/gtkui/interface.c:2349 ../plugins/gtkui/deadbeef.glade.h:92
+#: ../plugins/gtkui/interface.c:2374 ../plugins/gtkui/deadbeef.glade.h:139
msgid "Playlist colors"
-msgstr ""
+msgstr "播放清單色彩"
-#: ../plugins/gtkui/interface.c:2353 ../plugins/gtkui/deadbeef.glade.h:20
+#: ../plugins/gtkui/interface.c:2378 ../plugins/gtkui/deadbeef.glade.h:140
msgid "Colors"
-msgstr ""
+msgstr "色彩"
-#: ../plugins/gtkui/interface.c:2362 ../plugins/gtkui/deadbeef.glade.h:38
+#: ../plugins/gtkui/interface.c:2387 ../plugins/gtkui/deadbeef.glade.h:141
msgid "Enable Proxy Server"
-msgstr ""
+msgstr "啟用代理伺服器"
-#: ../plugins/gtkui/interface.c:2370 ../plugins/gtkui/deadbeef.glade.h:99
+#: ../plugins/gtkui/interface.c:2395 ../plugins/gtkui/deadbeef.glade.h:142
msgid "Proxy Server Address:"
-msgstr ""
+msgstr "代理伺服器位址:"
-#: ../plugins/gtkui/interface.c:2384 ../plugins/gtkui/deadbeef.glade.h:100
+#: ../plugins/gtkui/interface.c:2409 ../plugins/gtkui/deadbeef.glade.h:143
msgid "Proxy Server Port:"
-msgstr ""
+msgstr "代理伺服器連接埠:"
-#: ../plugins/gtkui/interface.c:2398 ../plugins/gtkui/deadbeef.glade.h:101
+#: ../plugins/gtkui/interface.c:2423 ../plugins/gtkui/deadbeef.glade.h:144
msgid "Proxy Type:"
-msgstr ""
+msgstr "代理類型:"
-#: ../plugins/gtkui/interface.c:2417 ../plugins/gtkui/deadbeef.glade.h:102
+#: ../plugins/gtkui/interface.c:2442 ../plugins/gtkui/deadbeef.glade.h:145
msgid "Proxy Username:"
-msgstr ""
+msgstr "代理使用者名稱:"
-#: ../plugins/gtkui/interface.c:2430 ../plugins/gtkui/deadbeef.glade.h:98
+#: ../plugins/gtkui/interface.c:2455 ../plugins/gtkui/deadbeef.glade.h:146
msgid "Proxy Password:"
+msgstr "代理密碼:"
+
+#: ../plugins/gtkui/interface.c:2473 ../plugins/gtkui/deadbeef.glade.h:147
+msgid "HTTP User Agent:"
msgstr ""
-#: ../plugins/gtkui/interface.c:2440 ../plugins/gtkui/deadbeef.glade.h:79
+#: ../plugins/gtkui/interface.c:2482 ../plugins/gtkui/deadbeef.glade.h:148
msgid "Network"
-msgstr ""
+msgstr "網路"
-#: ../plugins/gtkui/interface.c:2471 ../plugins/gtkui/deadbeef.glade.h:144
+#: ../plugins/gtkui/interface.c:2513 ../plugins/gtkui/deadbeef.glade.h:149
msgid "Version: "
-msgstr ""
+msgstr "版本:"
-#: ../plugins/gtkui/interface.c:2535 ../plugins/gtkui/deadbeef.glade.h:23
-#: ../translation/extra.c:78
+#: ../plugins/gtkui/interface.c:2577 ../plugins/gtkui/deadbeef.glade.h:150
+#: ../translation/extra.c:82
msgid "Copyright"
-msgstr ""
+msgstr "版權"
-#: ../plugins/gtkui/interface.c:2545 ../plugins/gtkui/deadbeef.glade.h:94
+#: ../plugins/gtkui/interface.c:2587 ../plugins/gtkui/deadbeef.glade.h:151
msgid "Plugins"
-msgstr ""
+msgstr "外掛程式"
-#: ../plugins/gtkui/interface.c:3033 ../plugins/gtkui/deadbeef.glade.h:142
+#: ../plugins/gtkui/interface.c:3094 ../plugins/gtkui/deadbeef.glade.h:152
msgid "URL:"
-msgstr ""
+msgstr "網址:"
-#: ../plugins/gtkui/interface.c:3135 ../plugins/gtkui/deadbeef.glade.h:48
-msgid "Group By"
-msgstr ""
-
-#: ../plugins/gtkui/interface.c:3259 ../plugins/gtkui/deadbeef.glade.h:123
-msgid "Sort by..."
-msgstr ""
+#: ../plugins/gtkui/interface.c:3196 ../plugins/gtkui/deadbeef.glade.h:153
+#, fuzzy
+msgid "Group By ..."
+msgstr "分組根據:"
-#: ../plugins/gtkui/interface.c:3275 ../plugins/gtkui/deadbeef.glade.h:43
+#: ../plugins/gtkui/interface.c:3320 ../plugins/gtkui/deadbeef.glade.h:154
#, fuzzy
+msgid "Sort by ..."
+msgstr "排序根據..."
+
+#: ../plugins/gtkui/interface.c:3336 ../plugins/gtkui/deadbeef.glade.h:155
msgid "Format"
-msgstr "格式:"
+msgstr "格式"
-#: ../plugins/gtkui/interface.c:3305
+#: ../plugins/gtkui/interface.c:3366
msgid "Ascending"
-msgstr ""
+msgstr "順序"
-#: ../plugins/gtkui/interface.c:3306
+#: ../plugins/gtkui/interface.c:3367
msgid "Descending"
-msgstr ""
+msgstr "逆序"
-#: ../plugins/gtkui/interface.c:3359 ../plugins/gtkui/deadbeef.glade.h:114
-#: ../plugins/converter/interface.c:750
-#, fuzzy
+#: ../plugins/gtkui/interface.c:3420 ../plugins/gtkui/deadbeef.glade.h:158
+#: ../plugins/converter/interface.c:733
+#: ../plugins/converter/converter.glade.h:48
msgid "Select DSP Plugin"
-msgstr "選取"
+msgstr "選取 DSP 外掛程式"
-#: ../plugins/gtkui/interface.c:3375 ../plugins/gtkui/deadbeef.glade.h:93
-#: ../plugins/converter/convgui.c:1016 ../plugins/converter/interface.c:766
-#: ../plugins/gtkui/dspconfig.c:139
+#: ../plugins/gtkui/interface.c:3436 ../plugins/gtkui/deadbeef.glade.h:159
+#: ../plugins/converter/convgui.c:1135 ../plugins/converter/interface.c:749
+#: ../plugins/gtkui/dspconfig.c:139 ../plugins/converter/converter.glade.h:49
msgid "Plugin"
-msgstr ""
+msgstr "外掛程式"
-#: ../plugins/gtkui/interface.c:3461 ../plugins/gtkui/deadbeef.glade.h:133
+#: ../plugins/gtkui/interface.c:3522 ../plugins/gtkui/deadbeef.glade.h:160
msgid "Tag Writer Settings"
-msgstr ""
+msgstr "標記寫入器設定"
-#: ../plugins/gtkui/interface.c:3492 ../plugins/gtkui/deadbeef.glade.h:147
+#: ../plugins/gtkui/interface.c:3553 ../plugins/gtkui/deadbeef.glade.h:161
msgid "Write ID3v2"
-msgstr ""
+msgstr "寫入 ID3v2"
-#: ../plugins/gtkui/interface.c:3496 ../plugins/gtkui/interface.c:3623
-#: ../plugins/gtkui/deadbeef.glade.h:146
+#: ../plugins/gtkui/interface.c:3557 ../plugins/gtkui/interface.c:3684
+#: ../plugins/gtkui/deadbeef.glade.h:162
msgid "Write ID3v1"
-msgstr ""
+msgstr "寫入 ID3v1"
-#: ../plugins/gtkui/interface.c:3500 ../plugins/gtkui/interface.c:3579
-#: ../plugins/gtkui/interface.c:3619 ../plugins/gtkui/deadbeef.glade.h:145
+#: ../plugins/gtkui/interface.c:3561 ../plugins/gtkui/interface.c:3640
+#: ../plugins/gtkui/interface.c:3680 ../plugins/gtkui/deadbeef.glade.h:163
msgid "Write APEv2"
-msgstr ""
+msgstr "寫入 APEv2"
-#: ../plugins/gtkui/interface.c:3508 ../plugins/gtkui/interface.c:3587
-#: ../plugins/gtkui/deadbeef.glade.h:130
+#: ../plugins/gtkui/interface.c:3569 ../plugins/gtkui/interface.c:3648
+#: ../plugins/gtkui/deadbeef.glade.h:164
msgid "Strip ID3v2"
-msgstr ""
+msgstr "砍掉 ID3v2"
-#: ../plugins/gtkui/interface.c:3512 ../plugins/gtkui/interface.c:3635
-#: ../plugins/gtkui/deadbeef.glade.h:129
+#: ../plugins/gtkui/interface.c:3573 ../plugins/gtkui/interface.c:3696
+#: ../plugins/gtkui/deadbeef.glade.h:165
msgid "Strip ID3v1"
-msgstr ""
+msgstr "砍掉 ID3v1"
-#: ../plugins/gtkui/interface.c:3516 ../plugins/gtkui/interface.c:3591
-#: ../plugins/gtkui/interface.c:3631 ../plugins/gtkui/deadbeef.glade.h:128
+#: ../plugins/gtkui/interface.c:3577 ../plugins/gtkui/interface.c:3652
+#: ../plugins/gtkui/interface.c:3692 ../plugins/gtkui/deadbeef.glade.h:166
msgid "Strip APEv2"
-msgstr ""
+msgstr "砍掉 APEv2"
-#: ../plugins/gtkui/interface.c:3524 ../plugins/gtkui/deadbeef.glade.h:53
+#: ../plugins/gtkui/interface.c:3585 ../plugins/gtkui/deadbeef.glade.h:167
msgid "ID3v2 version"
-msgstr ""
+msgstr "ID3v2 版本"
-#: ../plugins/gtkui/interface.c:3531
+#: ../plugins/gtkui/interface.c:3592
msgid "2.3 (Recommended)"
-msgstr ""
+msgstr "2.3 (建議版本)"
-#: ../plugins/gtkui/interface.c:3532
+#: ../plugins/gtkui/interface.c:3593
msgid "2.4"
-msgstr ""
+msgstr "2.4"
-#: ../plugins/gtkui/interface.c:3538 ../plugins/gtkui/deadbeef.glade.h:52
+#: ../plugins/gtkui/interface.c:3599 ../plugins/gtkui/deadbeef.glade.h:170
msgid "ID3v1 character encoding (default is iso8859-1)"
-msgstr ""
+msgstr "ID3v1 字元編碼 (預設為 iso8859-1)"
-#: ../plugins/gtkui/interface.c:3575 ../plugins/gtkui/deadbeef.glade.h:148
+#: ../plugins/gtkui/interface.c:3636 ../plugins/gtkui/deadbeef.glade.h:171
msgid "Write ID3v2.4"
-msgstr ""
+msgstr "寫入 ID3v2.4"
-#: ../plugins/gtkui/mainplaylist.c:316 ../plugins/gtkui/search.c:391
+#: ../plugins/gtkui/mainplaylist.c:318 ../plugins/gtkui/search.c:413
msgid "Artist / Album"
-msgstr ""
+msgstr "藝人 / 專輯"
-#: ../plugins/gtkui/mainplaylist.c:317 ../plugins/gtkui/search.c:392
+#: ../plugins/gtkui/mainplaylist.c:319 ../plugins/gtkui/search.c:414
msgid "Track No"
-msgstr ""
+msgstr "歌曲編號"
-#: ../plugins/gtkui/plcommon.c:338
+#: ../plugins/gtkui/plcommon.c:349
msgid "Delete files from disk"
-msgstr ""
+msgstr "自磁碟刪除檔案"
-#: ../plugins/gtkui/plcommon.c:339
+#: ../plugins/gtkui/plcommon.c:350
msgid ""
"Files will be lost. Proceed?\n"
"(This dialog can be turned off in GTKUI plugin settings)"
msgstr ""
+"檔案會丟失。是否繼續?\n"
+"(本對話框可以 GTKUI 外掛程式設定關閉)"
-#: ../plugins/gtkui/plcommon.c:340 ../plugins/gtkui/trkproperties.c:162
-#: ../plugins/gtkui/trkproperties.c:693 ../plugins/converter/convgui.c:759
-#: ../plugins/converter/convgui.c:1136
+#: ../plugins/gtkui/plcommon.c:351 ../plugins/gtkui/trkproperties.c:164
+#: ../plugins/converter/convgui.c:803 ../plugins/converter/convgui.c:1258
msgid "Warning"
-msgstr ""
+msgstr "警告"
-#: ../plugins/gtkui/plcommon.c:444
+#: ../plugins/gtkui/plcommon.c:456
msgid "Add to playback queue"
-msgstr ""
+msgstr "加入至播放佇列"
-#: ../plugins/gtkui/plcommon.c:449
+#: ../plugins/gtkui/plcommon.c:461
msgid "Remove from playback queue"
-msgstr ""
+msgstr "自播放佇列移除"
-#: ../plugins/gtkui/plcommon.c:457
+#: ../plugins/gtkui/plcommon.c:469
msgid "Reload metadata"
-msgstr ""
+msgstr "重讀元數據"
-#: ../plugins/gtkui/plcommon.c:476
+#: ../plugins/gtkui/plcommon.c:488
msgid "Remove from disk"
-msgstr ""
+msgstr "自磁碟移除"
-#: ../plugins/gtkui/plcommon.c:855 ../plugins/gtkui/plcommon.c:980
+#: ../plugins/gtkui/plcommon.c:869 ../plugins/gtkui/plcommon.c:995
msgid "Add column"
-msgstr ""
+msgstr "加入欄位"
-#: ../plugins/gtkui/plcommon.c:885 ../plugins/gtkui/plcommon.c:984
+#: ../plugins/gtkui/plcommon.c:899 ../plugins/gtkui/plcommon.c:999
msgid "Edit column"
-msgstr ""
+msgstr "編輯欄位"
-#: ../plugins/gtkui/plcommon.c:988
+#: ../plugins/gtkui/plcommon.c:1003
msgid "Remove column"
-msgstr ""
+msgstr "移除欄位"
-#: ../plugins/gtkui/plcommon.c:998
+#: ../plugins/gtkui/plcommon.c:1013
msgid "Group by"
-msgstr ""
+msgstr "分組根據:"
-#: ../plugins/gtkui/plcommon.c:1005
+#: ../plugins/gtkui/plcommon.c:1020
msgid "None"
-msgstr ""
+msgstr "無"
-#: ../plugins/gtkui/plcommon.c:1009
+#: ../plugins/gtkui/plcommon.c:1024
msgid "Artist/Date/Album"
-msgstr ""
+msgstr "藝人/日期/專輯"
#: ../plugins/gtkui/pluginconf.c:42
msgid "Open file..."
-msgstr ""
+msgstr "開啟檔案..."
-#: ../plugins/gtkui/pluginconf.c:217
+#: ../plugins/gtkui/pluginconf.c:220
#, c-format
msgid "Configure %s"
-msgstr ""
+msgstr "設定 %s"
#: ../plugins/gtkui/prefwin.c:82
msgid "Default Audio Device"
-msgstr ""
+msgstr "預設音訊裝置"
-#: ../plugins/gtkui/prefwin.c:318 ../plugins/converter/interface.c:641
+#: ../plugins/gtkui/prefwin.c:348 ../plugins/converter/interface.c:624
+#: ../plugins/converter/converter.glade.h:45
+#: ../plugins/shellexecui/interface.c:61
+#: ../plugins/shellexecui/shellexec.glade.h:3
msgid "Add"
-msgstr ""
+msgstr "加入"
-#: ../plugins/gtkui/prefwin.c:328
+#: ../plugins/gtkui/prefwin.c:358
msgid "Global Hotkeys"
-msgstr ""
+msgstr "全域熱鍵"
-#: ../plugins/gtkui/prefwin.c:390
-msgid "Slot"
-msgstr ""
+#: ../plugins/gtkui/prefwin.c:416
+#, fuzzy
+msgid "Action"
+msgstr "位址"
-#: ../plugins/gtkui/prefwin.c:391
+#: ../plugins/gtkui/prefwin.c:417
msgid "Key combination"
-msgstr ""
+msgstr "按鍵組合"
#: ../plugins/gtkui/progress.c:56
msgid "Adding files..."
-msgstr ""
+msgstr "正在加入檔案..."
#: ../plugins/gtkui/progress.c:90
msgid "Initializing..."
-msgstr ""
+msgstr "正在初始化..."
-#: ../plugins/gtkui/trkproperties.c:159
+#: ../plugins/gtkui/trkproperties.c:161
msgid "You've modified data for this track."
-msgstr ""
+msgstr "已修改此歌曲資料。"
-#: ../plugins/gtkui/trkproperties.c:161
+#: ../plugins/gtkui/trkproperties.c:163
msgid "Really close the window?"
-msgstr ""
+msgstr "真要關閉視窗?"
#. get value to edit
-#: ../plugins/gtkui/trkproperties.c:254
+#: ../plugins/gtkui/trkproperties.c:272
msgid "[Multiple values] "
-msgstr ""
+msgstr "[多重值] "
-#: ../plugins/gtkui/trkproperties.c:407 ../plugins/gtkui/trkproperties.c:419
+#: ../plugins/gtkui/trkproperties.c:425 ../plugins/gtkui/trkproperties.c:437
msgid "Key"
-msgstr ""
+msgstr "按鍵"
-#: ../plugins/gtkui/trkproperties.c:408 ../plugins/gtkui/trkproperties.c:420
+#: ../plugins/gtkui/trkproperties.c:426 ../plugins/gtkui/trkproperties.c:438
msgid "Value"
-msgstr ""
+msgstr "值"
-#: ../plugins/gtkui/trkproperties.c:594
+#: ../plugins/gtkui/trkproperties.c:623
msgid "Writing tags..."
+msgstr "正在寫入標記..."
+
+#: ../plugins/gtkui/trkproperties.c:651
+msgid "Field name"
msgstr ""
-#: ../plugins/gtkui/trkproperties.c:621
+#: ../plugins/gtkui/trkproperties.c:654
msgid "Name:"
-msgstr ""
+msgstr "名稱:"
-#: ../plugins/gtkui/trkproperties.c:633
+#: ../plugins/gtkui/trkproperties.c:666
msgid "Field names must not start with : or _"
-msgstr ""
+msgstr "欄位名稱不能以 : 或 _ 開首"
-#: ../plugins/gtkui/trkproperties.c:634 ../plugins/gtkui/trkproperties.c:668
+#: ../plugins/gtkui/trkproperties.c:667 ../plugins/gtkui/trkproperties.c:706
msgid "Cannot add field"
-msgstr ""
+msgstr "無法加入欄位"
-#: ../plugins/gtkui/trkproperties.c:667
+#: ../plugins/gtkui/trkproperties.c:705
msgid "Field with such name already exists, please try different name."
-msgstr ""
+msgstr "已有此名稱欄位,請選別個。"
-#: ../plugins/gtkui/trkproperties.c:692
-msgid "Really remove selected field?"
-msgstr ""
-
-#: ../plugins/gtkui/trkproperties.c:734
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:767
msgid "Add field"
-msgstr "加入檔案"
+msgstr "加入欄位"
-#: ../plugins/gtkui/trkproperties.c:737
-#, fuzzy
+#: ../plugins/gtkui/trkproperties.c:770
msgid "Remove field"
-msgstr "移除"
+msgstr "移除欄位"
-#: ../main.c:91
-#, c-format
-msgid "Usage: deadbeef [options] [file(s)]\n"
-msgstr ""
+#: ../main.c:84
+#, fuzzy, c-format
+msgid "Usage: deadbeef [options] [--] [file(s)]\n"
+msgstr "用法: deadbeef [選項] [檔案]\n"
-#: ../main.c:92
+#: ../main.c:85
#, c-format
msgid "Options:\n"
-msgstr ""
+msgstr "選項:\n"
-#: ../main.c:93
+#: ../main.c:86
#, c-format
msgid " --help or -h Print help (this message) and exit\n"
-msgstr ""
+msgstr " --help 或 -h 顯示說明 (本訊息) 並結束\n"
-#: ../main.c:94
+#: ../main.c:87
#, c-format
msgid " --quit Quit player\n"
-msgstr ""
+msgstr " --quit 結束播放器\n"
-#: ../main.c:95
+#: ../main.c:88
#, c-format
msgid " --version Print version info and exit\n"
-msgstr ""
+msgstr " --version 顯示版本資料並結束\n"
-#: ../main.c:96
+#: ../main.c:89
#, c-format
msgid " --play Start playback\n"
-msgstr ""
+msgstr " --play 開始播放\n"
-#: ../main.c:97
+#: ../main.c:90
#, c-format
msgid " --stop Stop playback\n"
-msgstr ""
+msgstr " --stop 停止播放\n"
-#: ../main.c:98
+#: ../main.c:91
#, c-format
msgid " --pause Pause playback\n"
-msgstr ""
+msgstr " --pause 暫停播放\n"
-#: ../main.c:99
+#: ../main.c:92
#, c-format
msgid " --toggle-pause Toggle pause\n"
-msgstr ""
+msgstr " --toggle-pause 切換暫停狀態\n"
-#: ../main.c:100
+#: ../main.c:93
#, c-format
msgid ""
" --play-pause Start playback if stopped, toggle pause otherwise\n"
-msgstr ""
+msgstr " --play-pause 如停止則開始播放,否則切換暫停狀態\n"
-#: ../main.c:101
+#: ../main.c:94
#, c-format
msgid " --next Next song in playlist\n"
-msgstr ""
+msgstr " --next 播放清單下一首歌\n"
-#: ../main.c:102
+#: ../main.c:95
#, c-format
msgid " --prev Previous song in playlist\n"
-msgstr ""
+msgstr " --prev 播放清單上一首歌\n"
-#: ../main.c:103
+#: ../main.c:96
#, c-format
msgid " --random Random song in playlist\n"
-msgstr ""
+msgstr " --random 播放清單隨機歌曲\n"
-#: ../main.c:104
+#: ../main.c:97
#, c-format
msgid " --queue Append file(s) to existing playlist\n"
+msgstr " --queue 將檔案附加至播放清單\n"
+
+#: ../main.c:98
+#, c-format
+msgid ""
+" --gui PLUGIN Tells which GUI plugin to use, default is \"GTK2\"\n"
msgstr ""
-#: ../main.c:105
+#: ../main.c:99
#, c-format
msgid " --nowplaying FMT Print formatted track name to stdout\n"
-msgstr ""
+msgstr " --nowplaying FMT 將格式化的歌曲名輸出至 stdout\n"
-#: ../main.c:106
+#: ../main.c:100
#, c-format
msgid ""
" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
" copy[r]ight, [e]lapsed\n"
msgstr ""
+" FMT %%-句法: [a]藝人, [t]歌名, [b]專輯,\n"
+" [l]長度, [n]歌曲編號, [y]年份, [c]評語,\n"
+" [r]版權, [e]已過時間\n"
-#: ../main.c:109
+#: ../main.c:103
#, c-format
msgid ""
" e.g.: --nowplaying \"%%a - %%t\" should print \"artist "
"- title\"\n"
msgstr ""
+" 例如: --nowplaying \"%%a - %%t\" 會顯示 \"藝人 - 歌名"
+"\"\n"
-#: ../main.c:110
+#: ../main.c:104
#, c-format
msgid ""
" for more info, see http://sourceforge.net/apps/"
"mediawiki/deadbeef/index.php?title=Title_Formatting\n"
msgstr ""
+" 更多資料請見 http://sourceforge.net/apps/mediawiki/"
+"deadbeef/index.php?title=Title_Formatting\n"
-#: ../playlist.c:454 ../playlist.c:2398
+#: ../playlist.c:454 ../playlist.c:2418
msgid "Default"
-msgstr ""
+msgstr "預設"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "Yes"
-msgstr ""
+msgstr "是"
-#: ../playlist.c:3664
+#: ../playlist.c:3793
msgid "No"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:3
-msgid ""
-"2.3 (Recommended)\n"
-"2.4"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:14
-msgid ""
-"Ascending\n"
-"Descending"
-msgstr ""
-
-#: ../plugins/gtkui/deadbeef.glade.h:33
-msgid ""
-"Disable\n"
-"Track\n"
-"Album"
-msgstr ""
+msgstr "否"
-#: ../plugins/gtkui/deadbeef.glade.h:56
+#: ../plugins/gtkui/deadbeef.glade.h:73
msgid ""
"Item Index\n"
"Playing\n"
@@ -1203,538 +1234,897 @@ msgid ""
"Band / Album Artist\n"
"Custom"
msgstr ""
+"項目索引\n"
+"正在播放專輯封面藝人 - 專輯藝人專輯歌名長度歌曲編號樂隊 / 專輯藝人自訂"
-#: ../plugins/gtkui/deadbeef.glade.h:68
+#: ../plugins/gtkui/deadbeef.glade.h:86
msgid ""
"Left\n"
"Right"
msgstr ""
+"左\n"
+"右"
+
+#: ../plugins/gtkui/deadbeef.glade.h:93
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"停用\n"
+"歌曲專輯"
+
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"順序\n"
+"逆序"
+
+#: ../plugins/gtkui/deadbeef.glade.h:168
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (建議版本)\n"
+"2.4"
#: ../plugins/gtkui/support.c:90 ../plugins/gtkui/support.c:114
#: ../plugins/converter/support.c:90 ../plugins/converter/support.c:114
+#: ../plugins/shellexecui/support.c:90 ../plugins/shellexecui/support.c:114
#, c-format
msgid "Couldn't find pixmap file: %s"
-msgstr ""
+msgstr "找不 pixmap 檔案:%s"
-#: ../plugins/wildmidi/wildmidiplug.c:162
+#: ../plugins/wildmidi/wildmidiplug.c:164
#, c-format
msgid ""
"wildmidi: freepats config file not found. Please install timidity-freepats "
"package, or specify path to freepats.cfg in the plugin settings."
msgstr ""
+"wildmidi:找不到 freepats 設定檔案。請安裝 timidity-freepats 套件,或在外掛程"
+"式設定指定 freepats.cfg 的路徑。"
#. this file should list extra translatable strings that are not referenced
#. directly in source code, e.g. scripted plugin configuration strings
#: ../translation/extra.c:3
-msgid "Add Audio CD"
+#, fuzzy
+msgid "Add audio CD"
msgstr "加入音樂 CD"
#: ../translation/extra.c:4
msgid "Lookup on Last.fm"
-msgstr ""
+msgstr "在 Last.fm 查看"
#. ALSA output plugin
#: ../translation/extra.c:6
msgid "Use ALSA resampling"
-msgstr ""
+msgstr "使用 ALSA 再取樣"
#: ../translation/extra.c:7
msgid "Release device while stopped"
-msgstr ""
+msgstr "停止時釋出裝置"
-#: ../translation/extra.c:8 ../translation/extra.c:51
+#: ../translation/extra.c:8 ../translation/extra.c:55
msgid "Preferred buffer size"
-msgstr ""
+msgstr "偏好的緩衝區大小"
#: ../translation/extra.c:9
msgid "Preferred period size"
-msgstr ""
+msgstr "偏好的間隔大小"
#. Last.fm plugin
#: ../translation/extra.c:11
msgid "Enable scrobbler"
-msgstr ""
+msgstr "偏用歌曲記錄"
#: ../translation/extra.c:12
msgid "Disable nowplaying"
-msgstr ""
+msgstr "停用 nowplaying"
#: ../translation/extra.c:13
msgid "Username"
-msgstr ""
+msgstr "使用者名稱"
#: ../translation/extra.c:14
msgid "Password"
-msgstr ""
+msgstr "密碼"
#: ../translation/extra.c:15
msgid "Scrobble URL"
+msgstr "Scrobble 網址"
+
+#: ../translation/extra.c:16
+msgid "Prefer Album Artist over Artist field"
msgstr ""
#. OSS output plugin
-#: ../translation/extra.c:17
+#: ../translation/extra.c:18
msgid "Device file"
-msgstr ""
+msgstr "裝置檔案"
-#: ../translation/extra.c:18
+#: ../translation/extra.c:19
msgid "OSS4 samplerate bug workaround"
-msgstr ""
+msgstr "OSS4 取樣率問題臨時解決辦法"
#. Album Artwork plugin
-#: ../translation/extra.c:20
+#: ../translation/extra.c:21
msgid "Cache update period (hr)"
-msgstr ""
+msgstr "快取更新間隔 (小時)"
-#: ../translation/extra.c:21
+#: ../translation/extra.c:22
msgid "Fetch from embedded tags"
-msgstr ""
+msgstr "由內置標記取得"
-#: ../translation/extra.c:22
+#: ../translation/extra.c:23
msgid "Fetch from local folder"
-msgstr ""
+msgstr "由本機資料夾取得"
-#: ../translation/extra.c:23
+#: ../translation/extra.c:24
msgid "Local cover file mask"
-msgstr ""
+msgstr "本機封面檔案遮罩"
-#: ../translation/extra.c:24
+#: ../translation/extra.c:25
msgid "Fetch from last.fm"
-msgstr ""
+msgstr "由 last.fm 取得"
-#: ../translation/extra.c:25
+#: ../translation/extra.c:26
msgid "Fetch from albumart.org"
-msgstr ""
+msgstr "由 albumart.org 取得"
-#: ../translation/extra.c:26
+#: ../translation/extra.c:27
msgid "Scale artwork towards longer side"
-msgstr ""
+msgstr "依較長一邊縮放封面"
#. Audio CD player
-#: ../translation/extra.c:28
+#: ../translation/extra.c:29
msgid "Use CDDB/FreeDB"
-msgstr ""
+msgstr "使用 CDDB/FreeDB"
-#: ../translation/extra.c:29
+#: ../translation/extra.c:30
msgid "Prefer CD-Text over CDDB"
-msgstr ""
+msgstr "優先使用 CD-Text 而非 CDDB"
-#: ../translation/extra.c:30
+#: ../translation/extra.c:31
msgid "CDDB url (e.g. 'freedb.org')"
-msgstr ""
+msgstr "CDDB url (例如 freedb.org)"
-#: ../translation/extra.c:31
+#: ../translation/extra.c:32
msgid "CDDB port number (e.g. '888')"
-msgstr ""
+msgstr "CDDB 連接埠號碼 (例如 888)"
-#: ../translation/extra.c:32
+#: ../translation/extra.c:33
msgid "Prefer CDDB protocol over HTTP"
-msgstr ""
+msgstr "優先使用 CDDB 協定而非 HTTP"
-#: ../translation/extra.c:33
+#: ../translation/extra.c:34
msgid "Enable NRG image support"
-msgstr ""
+msgstr "啟用支援 NRG 影像"
#. DUMB module player plugin
-#: ../translation/extra.c:35
+#: ../translation/extra.c:36
msgid "Resampling quality (0..2, higher is better)"
+msgstr "重取樣品質 (0..2,越高越好)"
+
+#: ../translation/extra.c:37
+msgid "8-bit output (default is 16)"
msgstr ""
#. Game_Music_Emu decoder plugin
-#: ../translation/extra.c:37
+#: ../translation/extra.c:39
msgid "Max song length (in minutes)"
+msgstr "歌曲最大長度 (分鐘)"
+
+#: ../translation/extra.c:40
+#, fuzzy
+msgid "Fadeout length (seconds)"
+msgstr "預設歌曲長度 (秒)"
+
+#: ../translation/extra.c:41
+msgid "Play loops nr. of times (if available)"
msgstr ""
#. Standard GTK2 user interface plugin
-#: ../translation/extra.c:39
+#: ../translation/extra.c:43
msgid "Ask confirmation to delete files from disk"
-msgstr ""
+msgstr "自磁碟刪除檔案要先確認"
-#: ../translation/extra.c:40
+#: ../translation/extra.c:44
msgid "Status icon volume control sensitivity"
-msgstr ""
+msgstr "狀態圖示音量控制敏感度"
-#: ../translation/extra.c:41
+#: ../translation/extra.c:45
msgid "Custom status icon"
-msgstr ""
+msgstr "自訂狀態圖示"
-#: ../translation/extra.c:42
+#: ../translation/extra.c:46
msgid "Run gtk_init with --sync (debug mode)"
-msgstr ""
+msgstr "以 --sync (除錯模式) 執行 gtk_init"
-#: ../translation/extra.c:43
+#: ../translation/extra.c:47
msgid "Add separators between plugin context menu items"
-msgstr ""
+msgstr "在外掛程式境況選單項目之間加入分隔符號"
#. OSD Notify plugin
-#: ../translation/extra.c:45
+#: ../translation/extra.c:49
msgid "Notification title format"
-msgstr ""
+msgstr "通告標題格式"
-#: ../translation/extra.c:46
+#: ../translation/extra.c:50
msgid "Notification content format"
-msgstr ""
+msgstr "通告內容格式"
-#: ../translation/extra.c:47
+#: ../translation/extra.c:51
msgid "Show album art"
-msgstr ""
+msgstr "顯示專輯封面"
-#: ../translation/extra.c:48
+#: ../translation/extra.c:52
msgid "Album art size (px)"
-msgstr ""
+msgstr "專輯封面尺寸 (像素)"
#. PulseAudio output plugin
-#: ../translation/extra.c:50
+#: ../translation/extra.c:54
msgid "PulseAudio server"
-msgstr ""
+msgstr "PulseAudio 伺服器"
-#: ../translation/extra.c:52
+#: ../translation/extra.c:56
msgid "Samplerate"
-msgstr ""
+msgstr "取樣率"
#. SHN player plugin
-#: ../translation/extra.c:54
+#: ../translation/extra.c:58
msgid "Relative seek table path"
-msgstr ""
+msgstr "相對搜索表格路徑"
-#: ../translation/extra.c:55
+#: ../translation/extra.c:59
msgid "Absolute seek table path"
-msgstr ""
+msgstr "絕對搜索表格路徑"
-#: ../translation/extra.c:56
+#: ../translation/extra.c:60
msgid "Swap audio bytes (toggle if all you hear is static)"
-msgstr ""
+msgstr "置換音訊位元組 (如聽到的只是雜訊則切換)"
#. SID decoder plugin
-#: ../translation/extra.c:58
+#: ../translation/extra.c:62
msgid "Enable HVSC Songlength DB"
-msgstr ""
+msgstr "啟用 HVSC 歌曲長度資料庫"
-#: ../translation/extra.c:59
+#: ../translation/extra.c:63
msgid "Songlengths.txt (from HVSC)"
-msgstr ""
+msgstr "Songlengths.txt (來自 HVSC)"
-#: ../translation/extra.c:60
+#: ../translation/extra.c:64
msgid "Bits per sample (8 or 16)"
-msgstr ""
+msgstr "取樣位元 (8 或 16)"
-#: ../translation/extra.c:61
+#: ../translation/extra.c:65
msgid "Default song length (sec)"
-msgstr ""
+msgstr "預設歌曲長度 (秒)"
#. WildMidi player plugin
-#: ../translation/extra.c:63
+#: ../translation/extra.c:67
msgid "Timidity++ bank configuration file"
-msgstr ""
+msgstr "Timidity++ 樂器庫設定檔案"
-#: ../translation/extra.c:66
+#: ../translation/extra.c:70
msgid "Track Title"
-msgstr ""
+msgstr "歌曲名稱"
-#: ../translation/extra.c:67
+#: ../translation/extra.c:71
msgid "Performer"
-msgstr ""
+msgstr "演唱"
-#: ../translation/extra.c:72
+#: ../translation/extra.c:76
msgid "Total Tracks"
-msgstr ""
+msgstr "總歌曲數"
-#: ../translation/extra.c:73
+#: ../translation/extra.c:77
msgid "Genre"
-msgstr ""
+msgstr "種類"
-#: ../translation/extra.c:74
+#: ../translation/extra.c:78
msgid "Composer"
-msgstr ""
+msgstr "作曲"
-#: ../translation/extra.c:75
+#: ../translation/extra.c:79
msgid "Disc Number"
-msgstr ""
+msgstr "碟號"
-#: ../translation/extra.c:76
+#: ../translation/extra.c:80
msgid "Comment"
-msgstr ""
+msgstr "評語"
-#: ../translation/extra.c:77
+#: ../translation/extra.c:81
msgid "Encoder / Vendor"
-msgstr ""
+msgstr "編碼器 / 生產者"
-#: ../translation/extra.c:79
-#, fuzzy
+#: ../translation/extra.c:83
msgid "Location"
-msgstr "加入位址"
+msgstr "位址"
-#: ../translation/extra.c:80
+#: ../translation/extra.c:84
msgid "Subtrack Index"
-msgstr ""
+msgstr "子曲目索引"
-#: ../translation/extra.c:81
+#: ../translation/extra.c:85
msgid "Tag Type(s)"
-msgstr ""
+msgstr "標記類型"
-#: ../translation/extra.c:82
+#: ../translation/extra.c:86
msgid "Embedded Cuesheet"
-msgstr ""
+msgstr "內置提場紙(Cuesheet)"
-#: ../translation/extra.c:83
+#: ../translation/extra.c:87
msgid "Codec"
-msgstr ""
+msgstr "編碼解碼器"
#. FFmpeg deocder plugin
-#: ../translation/extra.c:85
+#: ../translation/extra.c:89
msgid "File Extensions (separate with ';')"
-msgstr ""
+msgstr "檔案副檔名 (以 ; 分隔)"
#. Converter GUI
-#: ../translation/extra.c:87
+#: ../translation/extra.c:91
msgid "Convert"
-msgstr ""
+msgstr "轉換"
#. Resampler (Secret Rabbit Code)
-#: ../translation/extra.c:89
+#: ../translation/extra.c:93
msgid "Target Samplerate"
+msgstr "目標取樣率"
+
+#: ../translation/extra.c:94
+#, fuzzy
+msgid "Quality / Algorithm"
+msgstr "品質 / 演算法"
+
+#: ../translation/extra.c:95
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "自動取樣率 (優先於「目標取樣率」)"
+
+#. shellexecui
+#: ../translation/extra.c:97
+msgid "Configure custom shell commands"
msgstr ""
-#: ../translation/extra.c:90
-msgid "Quality / Algorythm"
+#. mpgmad
+#: ../translation/extra.c:99
+msgid "Disable gapless playback (faster scanning)"
msgstr ""
-#: ../translation/extra.c:91
-msgid "Automatic Samplerate (overrides Target Samplerate)"
+#. adplug
+#: ../translation/extra.c:101
+msgid "Prefer Ken emu over Satoh (surround won't work)"
msgstr ""
-#: ../plugins/converter/convgui.c:108
+#: ../translation/extra.c:102
+#, fuzzy
+msgid "Enable surround"
+msgstr "偏用歌曲記錄"
+
+#: ../plugins/converter/convgui.c:117
msgid "The file already exists. Overwrite?"
-msgstr ""
+msgstr "已有該檔案。是否覆寫?"
-#: ../plugins/converter/convgui.c:110
+#: ../plugins/converter/convgui.c:119
msgid "Converter warning"
-msgstr ""
+msgstr "轉換器警告"
-#: ../plugins/converter/convgui.c:222
+#: ../plugins/converter/convgui.c:271
msgid "Please select encoder"
-msgstr ""
+msgstr "請選取編碼器"
-#: ../plugins/converter/convgui.c:224
+#: ../plugins/converter/convgui.c:273
msgid "Converter error"
-msgstr ""
+msgstr "轉換器出錯"
-#: ../plugins/converter/convgui.c:248
+#: ../plugins/converter/convgui.c:297
msgid "Converting..."
-msgstr ""
+msgstr "正在轉換..."
-#: ../plugins/converter/convgui.c:394 ../plugins/converter/convgui.c:496
-#, fuzzy
+#: ../plugins/converter/convgui.c:459
msgid "Select folder..."
-msgstr "全選"
+msgstr "選取資料夾..."
-#: ../plugins/converter/convgui.c:635
+#: ../plugins/converter/convgui.c:681
msgid "Failed to save encoder preset"
-msgstr ""
+msgstr "未能儲存編碼器預設值"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid ""
"Check preset folder permissions, try to pick different title, or free up "
"some disk space"
-msgstr ""
+msgstr "檢查預設值資料夾權限、嘗試揀選另一個歌名,又或空出一些磁碟空間"
-#: ../plugins/converter/convgui.c:637 ../plugins/converter/convgui.c:1035
+#: ../plugins/converter/convgui.c:683 ../plugins/converter/convgui.c:1157
msgid "Preset with the same name already exists. Try to pick another title."
-msgstr ""
+msgstr "已有同名預設值。請揀選另一個。"
-#: ../plugins/converter/convgui.c:638 ../plugins/converter/convgui.c:1036
+#: ../plugins/converter/convgui.c:684 ../plugins/converter/convgui.c:1158
msgid "Error"
-msgstr ""
+msgstr "錯誤"
-#: ../plugins/converter/convgui.c:692
+#: ../plugins/converter/convgui.c:738
msgid "Add new encoder"
-msgstr ""
+msgstr "加入新編碼器"
-#: ../plugins/converter/convgui.c:724
+#: ../plugins/converter/convgui.c:768
msgid "Edit encoder"
-msgstr ""
+msgstr "編輯編碼器"
-#: ../plugins/converter/convgui.c:756 ../plugins/converter/convgui.c:1133
-#, fuzzy
+#: ../plugins/converter/convgui.c:800 ../plugins/converter/convgui.c:1255
msgid "Remove preset"
-msgstr "儲存 Preset"
+msgstr "移除預設值"
-#: ../plugins/converter/convgui.c:758 ../plugins/converter/convgui.c:1135
+#: ../plugins/converter/convgui.c:802 ../plugins/converter/convgui.c:1257
msgid "This action will delete the selected preset. Are you sure?"
-msgstr ""
+msgstr "此舉會刪除所選預設值。確定嗎?"
-#: ../plugins/converter/convgui.c:782
+#: ../plugins/converter/convgui.c:826
msgid "Encoders"
-msgstr ""
+msgstr "編碼器"
-#: ../plugins/converter/convgui.c:838 ../plugins/gtkui/dspconfig.c:183
+#: ../plugins/converter/convgui.c:897 ../plugins/gtkui/dspconfig.c:186
msgid "Add plugin to DSP chain"
-msgstr ""
+msgstr "將外掛程式加入至 DSP 連鎖"
-#: ../plugins/converter/convgui.c:1034
+#: ../plugins/converter/convgui.c:1156
msgid "Failed to save DSP preset"
-msgstr ""
+msgstr "未能儲存 DSP 預設值"
-#: ../plugins/converter/convgui.c:1098
-#, fuzzy
+#: ../plugins/converter/convgui.c:1220
msgid "New DSP Preset"
-msgstr "儲存 Preset"
+msgstr "新增 DSP 預設值"
-#: ../plugins/converter/convgui.c:1183
-#, fuzzy
+#: ../plugins/converter/convgui.c:1305
msgid "Edit DSP Preset"
-msgstr "儲存 Preset"
+msgstr "編輯 DSP 預設值"
-#: ../plugins/converter/convgui.c:1203
-#, fuzzy
+#: ../plugins/converter/convgui.c:1325
msgid "DSP Presets"
-msgstr "儲存 Preset"
+msgstr "DSP 預設值"
-#: ../plugins/converter/interface.c:94
+#: ../plugins/converter/interface.c:92
+#: ../plugins/converter/converter.glade.h:1
msgid "Output folder:"
+msgstr "輸出資料夾:"
+
+#: ../plugins/converter/interface.c:109
+#: ../plugins/converter/converter.glade.h:2
+msgid "Write to source track folder"
msgstr ""
-#: ../plugins/converter/interface.c:115
+#: ../plugins/converter/interface.c:113
+#: ../plugins/converter/converter.glade.h:3
+#, fuzzy
+msgid "Preserve folder structure"
+msgstr "保持資料夾結構,由此處開始:"
+
+#: ../plugins/converter/interface.c:121
+#: ../plugins/converter/converter.glade.h:4
msgid "Output file name:"
-msgstr ""
+msgstr "輸出檔案名稱:"
-#: ../plugins/converter/interface.c:126
+#: ../plugins/converter/interface.c:132
+#: ../plugins/converter/converter.glade.h:6
+#, no-c-format
msgid ""
"Extension (e.g. .mp3) will be appended automatically.\n"
"Leave the field empty for default (%a - %t)."
msgstr ""
+"會自動加上副檔名 (例如 .mp3)。\n"
+"留空使用預設值 (%a - %t)。"
-#: ../plugins/converter/interface.c:139
+#: ../plugins/converter/interface.c:145
+#: ../plugins/converter/converter.glade.h:8
msgid "Encoder:"
-msgstr ""
+msgstr "編碼器:"
-#: ../plugins/converter/interface.c:163
-#, fuzzy
+#: ../plugins/converter/interface.c:169
+#: ../plugins/converter/converter.glade.h:9
msgid "DSP preset:"
-msgstr "儲存 Preset"
+msgstr "DSP 預設值:"
-#: ../plugins/converter/interface.c:186
+#: ../plugins/converter/interface.c:192
+#: ../plugins/converter/converter.glade.h:10
msgid "Number of threads:"
-msgstr ""
+msgstr "線程數目:"
-#: ../plugins/converter/interface.c:199
+#: ../plugins/converter/interface.c:205
+#: ../plugins/converter/converter.glade.h:11
msgid "Output sample format:"
-msgstr ""
+msgstr "輸出取樣格式:"
-#: ../plugins/converter/interface.c:206
+#: ../plugins/converter/interface.c:212
msgid "Keep source format"
-msgstr ""
+msgstr "保持來源格式"
-#: ../plugins/converter/interface.c:207
+#: ../plugins/converter/interface.c:213
msgid "8 bit signed int"
-msgstr ""
+msgstr "8 位元帶正負整數"
-#: ../plugins/converter/interface.c:208
+#: ../plugins/converter/interface.c:214
msgid "16 bit signed int"
-msgstr ""
+msgstr "16 位元帶正負整數"
-#: ../plugins/converter/interface.c:209
+#: ../plugins/converter/interface.c:215
msgid "24 bit signed int"
-msgstr ""
+msgstr "24 位元帶正負整數"
-#: ../plugins/converter/interface.c:210
+#: ../plugins/converter/interface.c:216
msgid "32 bit signed int"
-msgstr ""
+msgstr "32 位元帶正負整數"
-#: ../plugins/converter/interface.c:211
+#: ../plugins/converter/interface.c:217
msgid "32 bit float"
-msgstr ""
+msgstr "32 位元浮點數"
-#: ../plugins/converter/interface.c:217
+#: ../plugins/converter/interface.c:223
+#: ../plugins/converter/converter.glade.h:18
msgid "When file exists:"
-msgstr ""
+msgstr "當有此檔案:"
-#: ../plugins/converter/interface.c:224
+#: ../plugins/converter/interface.c:230
msgid "Prompt"
-msgstr ""
+msgstr "提示"
-#: ../plugins/converter/interface.c:225
+#: ../plugins/converter/interface.c:231
msgid "Overwrite"
-msgstr ""
-
-#: ../plugins/converter/interface.c:227
-msgid "Preserve folder structure, starting from:"
-msgstr ""
+msgstr "覆寫"
-#: ../plugins/converter/interface.c:379
-#, fuzzy
+#: ../plugins/converter/interface.c:362
+#: ../plugins/converter/converter.glade.h:21
msgid "Edit Encoder Preset"
-msgstr "載入 Preset"
+msgstr "編輯編碼器預設值"
-#: ../plugins/converter/interface.c:402
+#: ../plugins/converter/interface.c:385
+#: ../plugins/converter/converter.glade.h:23
msgid "Untitled Encoder"
-msgstr ""
+msgstr "未命名編碼器"
-#: ../plugins/converter/interface.c:410
+#: ../plugins/converter/interface.c:393
+#: ../plugins/converter/converter.glade.h:24
msgid "Output file extension:"
-msgstr ""
+msgstr "輸出檔案副檔名:"
-#: ../plugins/converter/interface.c:417
+#: ../plugins/converter/interface.c:400
+#: ../plugins/converter/converter.glade.h:25
msgid "E.g. mp3"
-msgstr ""
+msgstr "例如 mp3"
-#: ../plugins/converter/interface.c:425
+#: ../plugins/converter/interface.c:408
+#: ../plugins/converter/converter.glade.h:26
msgid "Command line:"
-msgstr ""
+msgstr "指令列:"
-#: ../plugins/converter/interface.c:436
-#, c-format
+#: ../plugins/converter/interface.c:419
+#: ../plugins/converter/converter.glade.h:28
+#, no-c-format
msgid ""
"Example: lame - %o\n"
"%i for input file, %o for output file, - for stdin"
msgstr ""
+"例如: lame - %o\n"
+"%i 為輸入檔案、%o 為輸出檔案、- 為 stdin"
-#: ../plugins/converter/interface.c:446
-#, c-format
+#: ../plugins/converter/interface.c:429
+#: ../plugins/converter/converter.glade.h:31
+#, no-c-format
msgid ""
"<small>%o - output file name\n"
"%i - temporary input file name</small>"
msgstr ""
+"<small>%o - 輸出檔案名稱\n"
+"%i - 臨時輸入檔案名稱</small>"
-#: ../plugins/converter/interface.c:455
+#: ../plugins/converter/interface.c:438
+#: ../plugins/converter/converter.glade.h:33
msgid "Method:"
-msgstr ""
+msgstr "方法:"
-#: ../plugins/converter/interface.c:462
+#: ../plugins/converter/interface.c:445
msgid "Pipe"
-msgstr ""
+msgstr "管線"
-#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/interface.c:446
msgid "Temporary file"
-msgstr ""
+msgstr "臨時檔案"
-#: ../plugins/converter/interface.c:480
+#: ../plugins/converter/interface.c:463
+#: ../plugins/converter/converter.glade.h:36
msgid "APEv2"
-msgstr ""
+msgstr "APEv2"
-#: ../plugins/converter/interface.c:486
+#: ../plugins/converter/interface.c:469
+#: ../plugins/converter/converter.glade.h:37
msgid "ID3v1"
-msgstr ""
+msgstr "ID3v1"
-#: ../plugins/converter/interface.c:492
+#: ../plugins/converter/interface.c:475
+#: ../plugins/converter/converter.glade.h:38
msgid "OggVorbis"
-msgstr ""
+msgstr "OggVorbis"
-#: ../plugins/converter/interface.c:498
+#: ../plugins/converter/interface.c:481
+#: ../plugins/converter/converter.glade.h:39
msgid "FLAC"
-msgstr ""
+msgstr "FLAC"
-#: ../plugins/converter/interface.c:510
+#: ../plugins/converter/interface.c:493
+#: ../plugins/converter/converter.glade.h:40
msgid "ID3v2"
-msgstr ""
+msgstr "ID3v2"
-#: ../plugins/converter/interface.c:520
+#: ../plugins/converter/interface.c:503
+#: ../plugins/converter/converter.glade.h:41
msgid "<b>Tag writer</b>"
-msgstr ""
+msgstr "<b>標記寫入器</b>"
-#: ../plugins/converter/interface.c:606
+#: ../plugins/converter/interface.c:589
+#: ../plugins/converter/converter.glade.h:42
msgid "DSP Preset Editor"
-msgstr ""
+msgstr "DSP 預設值編輯"
-#: ../plugins/converter/interface.c:629
+#: ../plugins/converter/interface.c:612
+#: ../plugins/converter/converter.glade.h:44
msgid "Untitled DSP Preset"
+msgstr "未命名 DSP 預設值"
+
+#: ../plugins/converter/converter.glade.h:12
+msgid ""
+"Keep source format\n"
+"8 bit signed int\n"
+"16 bit signed int\n"
+"24 bit signed int\n"
+"32 bit signed int\n"
+"32 bit float"
+msgstr ""
+
+#: ../plugins/converter/converter.glade.h:19
+#, fuzzy
+msgid ""
+"Prompt\n"
+"Overwrite"
+msgstr "覆寫"
+
+#: ../plugins/converter/converter.glade.h:34
+#, fuzzy
+msgid ""
+"Pipe\n"
+"Temporary file"
+msgstr "臨時檔案"
+
+#: ../plugins/shellexecui/interface.c:46
+#: ../plugins/shellexecui/shellexec.glade.h:1
+msgid "Custom Shell Commands"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:69
+#: ../plugins/shellexecui/shellexec.glade.h:5
+#, fuzzy
+msgid "Edit"
+msgstr "編輯(_E)"
+
+#: ../plugins/shellexecui/interface.c:87
+#: ../plugins/shellexecui/shellexec.glade.h:2
+#, fuzzy
+msgid "Close"
+msgstr "關閉(_C)"
+
+#: ../plugins/shellexecui/interface.c:145
+#: ../plugins/shellexecui/shellexec.glade.h:6
+#, fuzzy
+msgid "Edit Command"
+msgstr "編輯欄位"
+
+#: ../plugins/shellexecui/interface.c:166
+#: ../plugins/shellexecui/shellexec.glade.h:8
+#, fuzzy
+msgid "Command:"
+msgstr "指令列:"
+
+#: ../plugins/shellexecui/interface.c:178
+#: ../plugins/shellexecui/shellexec.glade.h:10
+#, no-c-format
+msgid ""
+"Arbitrary shell command. Will be executed in the shell context which the "
+"main application was started from. Title formatting can be used. Example: "
+"xdg-open %D"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:181
+#: ../plugins/shellexecui/shellexec.glade.h:11
+msgid "ID:"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:193
+#: ../plugins/shellexecui/shellexec.glade.h:12
+msgid "Free-form name, for example \"My Shell Command\""
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:201
+#: ../plugins/shellexecui/shellexec.glade.h:13
+msgid ""
+"Command ID, normally it should be something short, for example \"youtube_open"
+"\". It must be unique."
msgstr ""
+
+#: ../plugins/shellexecui/interface.c:204
+#: ../plugins/shellexecui/shellexec.glade.h:15
+#, fuzzy
+msgid "Single Tracks"
+msgstr "調亂歌曲"
+
+#: ../plugins/shellexecui/interface.c:207
+#: ../plugins/shellexecui/shellexec.glade.h:14
+msgid "Works on single track."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:209
+#: ../plugins/shellexecui/shellexec.glade.h:17
+#, fuzzy
+msgid "Multiple Tracks"
+msgstr "[多重值] "
+
+#: ../plugins/shellexecui/interface.c:212
+#: ../plugins/shellexecui/shellexec.glade.h:16
+msgid "Works on multiple tracks."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:214
+#: ../plugins/shellexecui/shellexec.glade.h:19
+#, fuzzy
+msgid "Local"
+msgstr "位址"
+
+#: ../plugins/shellexecui/interface.c:217
+#: ../plugins/shellexecui/shellexec.glade.h:18
+msgid "Works on local files."
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:219
+#: ../plugins/shellexecui/shellexec.glade.h:21
+#, fuzzy
+msgid "Remote"
+msgstr "移除"
+
+#: ../plugins/shellexecui/interface.c:222
+#: ../plugins/shellexecui/shellexec.glade.h:20
+msgid "Works on remote files (e.g. http:// streams)"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:224
+#: ../plugins/shellexecui/shellexec.glade.h:23
+#, fuzzy
+msgid "Playlist"
+msgstr "新增播放清單"
+
+#: ../plugins/shellexecui/interface.c:227
+#: ../plugins/shellexecui/shellexec.glade.h:22
+msgid "Item should appear on the playlist tab context menu"
+msgstr ""
+
+#: ../plugins/shellexecui/interface.c:229
+#: ../plugins/shellexecui/shellexec.glade.h:25
+#, fuzzy
+msgid "Common"
+msgstr "評語"
+
+#: ../plugins/shellexecui/interface.c:232
+#: ../plugins/shellexecui/shellexec.glade.h:24
+msgid "Item should appear in the main menu"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:94
+#, fuzzy
+msgid "Add Command"
+msgstr "加入欄位"
+
+#: ../plugins/shellexecui/shellexecui.c:137
+msgid "Delete"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:139
+#, fuzzy
+msgid "This action will delete the selected shell command. Are you sure?"
+msgstr "此舉會刪除所選預設值。確定嗎?"
+
+#: ../plugins/shellexecui/shellexecui.c:141
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "設定"
+
+#: ../plugins/shellexecui/shellexecui.c:230
+msgid "ID must be non-empty and unique.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:236
+msgid "Title must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:242
+msgid "Shell Command must be non-empty.\n"
+msgstr ""
+
+#: ../plugins/shellexecui/shellexecui.c:249
+#: ../plugins/shellexecui/shellexecui.c:253
+msgid "Invalid Values"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:165
+#, c-format
+msgid "File is not a valid .desktop file"
+msgstr ""
+
+#. translators: 'Version' is from a desktop file, and
+#. * should not be translated. '%s' would probably be a
+#. * version number.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:191
+#, c-format
+msgid "Unrecognized desktop file Version '%s'"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:974
+#, fuzzy, c-format
+msgid "Starting %s"
+msgstr "設定"
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1116
+#, c-format
+msgid "Application does not accept documents on command line"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1184
+#, c-format
+msgid "Unrecognized launch option: %d"
+msgstr ""
+
+#. translators: The 'Type=Link' string is found in a
+#. * desktop file, and should not be translated.
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1391
+#, c-format
+msgid "Can't pass document URIs to a 'Type=Link' desktop entry"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggdesktopfile.c:1412
+#, c-format
+msgid "Not a launchable item"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:226
+msgid "Disable connection to session manager"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "Specify file containing saved configuration"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:229
+msgid "FILE"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "Specify session management ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:232
+msgid "ID"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:253
+msgid "Session management options:"
+msgstr ""
+
+#: ../plugins/gtkui/smclient/eggsmclient.c:254
+msgid "Show session management options"
+msgstr ""
+
+#~ msgid "GUI"
+#~ msgstr "圖像用戶介面"
+
+#~ msgid "Slot"
+#~ msgstr "空位"
+
+#~ msgid "Really remove selected field?"
+#~ msgstr "真要移除所選欄位?"
diff --git a/premix.c b/premix.c
index 67b3b18a..e012df3f 100644
--- a/premix.c
+++ b/premix.c
@@ -369,7 +369,14 @@ static inline void
pcm_write_samples_float_to_32 (const ddb_waveformat_t * restrict inputfmt, const char * restrict input, const ddb_waveformat_t * restrict outputfmt, char * restrict output, int nsamples, int * restrict channelmap, int outputsamplesize) {
for (int s = 0; s < nsamples; s++) {
for (int c = 0; c < outputfmt->channels; c++) {
- int sample = (*((float*)(input + channelmap[c] * 4))) * (float)0x7fffffff;
+ float fsample = (*((float*)(input + channelmap[c] * 4)));
+ if (fsample > 0.999f) {
+ fsample = 0.999f;
+ }
+ else if (fsample < -0.999f) {
+ fsample = -0.999f;
+ }
+ int sample = fsample * (float)0x7fffffff;
*((int32_t *)(output + 4 * c)) = sample;
}
input += 4 * inputfmt->channels;
diff --git a/scripts/portable_build.sh b/scripts/portable_build.sh
index 6a047023..3a11ea99 100755
--- a/scripts/portable_build.sh
+++ b/scripts/portable_build.sh
@@ -1,9 +1,10 @@
#!/bin/sh
VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
ORIGIN=`pwd | perl -ne 'chomp and print'`
-AP=$HOME/bin/autopackage
-export CC=$AP/apbuild/apgcc
-export CXX=$AP/apbuild/apgcc
+AP=$ORIGIN/tools/apbuild
+export CC=$AP/apgcc
+export CXX=$AP/apgcc
+
export APBUILD_STATIC_LIBGCC=1
./autogen.sh
@@ -22,5 +23,3 @@ cd tools/pluginfo
make
cd ../../
-./scripts/portable_postbuild.sh
-
diff --git a/scripts/portable_package_static.sh b/scripts/portable_package_static.sh
index 2b8e5465..1ad0c076 100755
--- a/scripts/portable_package_static.sh
+++ b/scripts/portable_package_static.sh
@@ -1,21 +1,28 @@
#!/bin/sh
+./scripts/portable_postbuild.sh
+
# package for distribution
VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
BUILD=`cat PORTABLE_BUILD | perl -ne 'chomp and print'`
+ARCH=`uname -m | perl -ne 'chomp and print'`
# main distro
SRCDIR=deadbeef-$VERSION
PLUGDIR=$SRCDIR/plugins
DOCDIR=$SRCDIR/doc
PIXMAPDIR=$SRCDIR/pixmaps
+OUTNAME=deadbeef-static_${VERSION}-${BUILD}_${ARCH}.tar.bz2
+
+ARCH=`uname -m | perl -ne 'chomp and print'`
-rm portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2
+rm portable_out/build/$OUTNAME
-cd portable
-tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\
+cd portable/$ARCH
+tar jcvf ../../portable_out/build/$OUTNAME\
$SRCDIR/deadbeef\
$SRCDIR/deadbeef.png\
+ $SRCDIR/.ddb_portable\
$DOCDIR\
$PLUGDIR/aac.so\
$PLUGDIR/adplug.so\
@@ -39,6 +46,7 @@ tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\
$PLUGDIR/nullout.so\
$PLUGDIR/oss.so\
$PLUGDIR/shellexec.so\
+ $PLUGDIR/shellexecui_gtk2.so\
$PLUGDIR/sid.so\
$PLUGDIR/sndfile.so\
$PLUGDIR/supereq.so\
@@ -57,7 +65,7 @@ tar jcvf ../portable_out/build/deadbeef-$VERSION-static-i686.tar.bz2\
$PLUGDIR/convpresets\
$PLUGDIR/pulse.so\
$PLUGDIR/dsp_libsrc.so\
- $PLUGDIR/mono2stereo.so\
+ $PLUGDIR/ddb_mono2stereo.so\
$PIXMAPDIR\
$SRCDIR/locale
-cd ..
+cd ../..
diff --git a/scripts/portable_postbuild.sh b/scripts/portable_postbuild.sh
index f572240f..45db6740 100755
--- a/scripts/portable_postbuild.sh
+++ b/scripts/portable_postbuild.sh
@@ -1,10 +1,12 @@
#!/bin/sh
VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
OSTYPE=`uname -s`
-OUTDIR=portable/deadbeef-$VERSION
+ARCH=`uname -m | perl -ne 'chomp and print'`
+OUTDIR=portable/$ARCH/deadbeef-$VERSION
PLUGDIR=$OUTDIR/plugins
DOCDIR=$OUTDIR/doc
PIXMAPDIR=$OUTDIR/pixmaps
+echo OUTDIR=$OUTDIR
rm -rf $OUTDIR
@@ -18,7 +20,7 @@ for i in nullout cdda flac alsa mpgmad hotkeys vtx \
ffap ffmpeg wavpack vorbis oss vfs_curl \
lastfm sid adplug sndfile artwork \
supereq gme dumb notify musepack wildmidi \
- tta dca aac mms shn ao shellexec vfs_zip \
+ tta dca aac mms shn ao shellexec shellexecui vfs_zip \
m3u converter pulse dsp_libsrc mono2stereo ; do
if [ -f ./plugins/$i/.libs/$i.so ]; then
cp ./plugins/$i/.libs/$i.so $PLUGDIR/
@@ -53,7 +55,7 @@ fi
#pixmaps
-for i in pause_16.png play_16.png noartwork.jpg buffering_16.png; do
+for i in pause_16.png play_16.png noartwork.png buffering_16.png; do
cp ./pixmaps/$i $PIXMAPDIR/
done
@@ -77,6 +79,7 @@ for i in po/*.gmo ; do
done
cp translation/help.pt_BR.txt $OUTDIR/doc/
cp translation/help.ru.txt $OUTDIR/doc/
+touch $OUTDIR/.ddb_portable
# strip
if [ $OSTYPE != 'Darwin' ];then
diff --git a/scripts/quickinstall.sh b/scripts/quickinstall.sh
index 38f1ac7e..41cc412e 100755
--- a/scripts/quickinstall.sh
+++ b/scripts/quickinstall.sh
@@ -33,8 +33,10 @@ cp ./plugins/dca/.libs/dca.so /usr/local/lib/deadbeef/
cp ./plugins/aac/.libs/aac.so /usr/local/lib/deadbeef/
cp ./plugins/mms/.libs/mms.so /usr/local/lib/deadbeef/
cp ./plugins/shn/.libs/ddb_shn.so /usr/local/lib/deadbeef/
-cp ./plugins/ao/.libs/ddb_aopsf.so /usr/local/lib/deadbeef/
+cp ./plugins/ao/.libs/ddb_ao.so /usr/local/lib/deadbeef/
cp ./plugins/shellexec/.libs/shellexec.so /usr/local/lib/deadbeef/
+cp ./plugins/shellexecui/.libs/shellexecui_gtk2.so /usr/local/lib/deadbeef/
+cp ./plugins/shellexecui/.libs/shellexecui_gtk3.so /usr/local/lib/deadbeef/
cp ./plugins/dsp_libsrc/.libs/dsp_libsrc.so /usr/local/lib/deadbeef/
cp ./plugins/m3u/.libs/m3u.so /usr/local/lib/deadbeef/
cp ./plugins/ddb_input_uade2/ddb_input_uade2.so /usr/local/lib/deadbeef/
@@ -45,3 +47,4 @@ cp ./plugins/soundtouch/ddb_soundtouch.so /usr/local/lib/deadbeef/
cp ./plugins/vfs_zip/.libs/vfs_zip.so /usr/local/lib/deadbeef/
cp ./plugins/medialib/.libs/medialib.so /usr/local/lib/deadbeef/
cp ./plugins/mono2stereo/.libs/ddb_mono2stereo.so /usr/local/lib/deadbeef/
+cp ./plugins/alac/.libs/alac.so /usr/local/lib/deadbeef/
diff --git a/scripts/static_build.sh b/scripts/static_build.sh
new file mode 100755
index 00000000..250b29e8
--- /dev/null
+++ b/scripts/static_build.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
+ORIGIN=`pwd | perl -ne 'chomp and print'`
+AP=$ORIGIN/tools/apbuild
+ARCH=`uname -m | perl -ne 'chomp and print'`
+
+cd tools/apbuild
+./apinit
+cd ../../
+
+./autogen.sh
+
+export APBUILD_STATIC_LIBGCC=1
+CC=$AP/apgcc CXX=$AP/apgcc ./configure --enable-staticlink --disable-artwork-imlib2 --prefix=/opt/deadbeef
+sed -i 's/-lstdc++ -lm -lgcc_s -lc -lgcc_s/-lm -lc/g' libtool
+make clean
+make DESTDIR=`pwd`/static/$ARCH/deadbeef-$VERSION -j8 install
+
+echo "building pluginfo tool..."
+cd tools/pluginfo
+make
+cd ../../
diff --git a/scripts/static_install.sh b/scripts/static_install.sh
new file mode 100755
index 00000000..d2295961
--- /dev/null
+++ b/scripts/static_install.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
+ARCH=`uname -m | perl -ne 'chomp and print'`
+DESTDIR=`pwd`/static/$ARCH/deadbeef-$VERSION make install
diff --git a/shortlicense b/shortlicense.gpl2
index 8d9c6d9f..8d9c6d9f 100644
--- a/shortlicense
+++ b/shortlicense.gpl2
diff --git a/shortlicense.zlib b/shortlicense.zlib
new file mode 100644
index 00000000..2a5cb512
--- /dev/null
+++ b/shortlicense.zlib
@@ -0,0 +1,23 @@
+/*
+ DeaDBeeF -- the music player
+ Copyright (C) 2009-2012 Alexey Yakovenko and other contributors
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
diff --git a/sr.po b/sr.po
new file mode 100644
index 00000000..db075695
--- /dev/null
+++ b/sr.po
@@ -0,0 +1,2074 @@
+# Serbian translation for DeaDBeeF package
+# Copyright (C) 2009-2010 Alexey Yakovenko
+# This file is distributed under the same license as the DeaDBeeF package.
+# Jay A. Fleming <tito.nehru.naser@gmail.com>, 2010.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: DeaDBeeF 0.4\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2011-11-23 14:16+0100\n"
+"PO-Revision-Date: 2012-08-30 14:27+0100\n"
+"Last-Translator: Jay A.Fleming <tito.nehru.naser@gmail.com>\n"
+"Language-Team: \n"
+"Language: Serbian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: ../plugins/gtkui/callbacks.c:123
+msgid "Supported sound formats"
+msgstr "Подржане звучне датотеке"
+
+#: ../plugins/gtkui/callbacks.c:134
+msgid "All files (*)"
+msgstr "Све датотеке (*)"
+
+#: ../plugins/gtkui/callbacks.c:144
+msgid "Open file(s)..."
+msgstr "Отвори датотеку(е)..."
+
+#: ../plugins/gtkui/callbacks.c:179
+msgid "Add file(s) to playlist..."
+msgstr "Додај датотеке у листу..."
+
+#: ../plugins/gtkui/callbacks.c:220
+msgid "Add folder(s) to playlist..."
+msgstr "Додај директоријуме у листу..."
+
+#: ../plugins/gtkui/callbacks.c:225
+msgid "Follow symlinks"
+msgstr "Прати меке везе (symlinks)"
+
+#: ../plugins/gtkui/callbacks.c:711
+msgid "Failed while reading help file"
+msgstr "Неуспело читање датотеке помоћи"
+
+#: ../plugins/gtkui/callbacks.c:721
+msgid "Failed to load help file"
+msgstr "Неуспело отварање датотеке помоћи"
+
+#: ../plugins/gtkui/callbacks.c:736
+#, fuzzy
+msgid "help.txt"
+msgstr "help.txt"
+
+#: ../plugins/gtkui/callbacks.c:737
+#: ../plugins/gtkui/interface.c:1155
+#: ../plugins/gtkui/deadbeef.glade.h:49
+#: ../plugins/converter/convgui.c:1240
+#: ../plugins/converter/convgui.c:1248
+msgid "Help"
+msgstr "Помоћ"
+
+#: ../plugins/gtkui/callbacks.c:747
+#, c-format
+msgid "About DeaDBeeF %s"
+msgstr "O DeaDBeeF %s"
+
+#: ../plugins/gtkui/callbacks.c:760
+#, c-format
+msgid "DeaDBeeF %s ChangeLog"
+msgstr "DeaDBeeF %s — Дневник измена"
+
+#: ../plugins/gtkui/callbacks.c:1116
+#, c-format
+msgid "DeaDBeeF Translators"
+msgstr "DeaDBeeF преводиоци"
+
+#: ../plugins/gtkui/ddbtabstrip.c:755
+#: ../plugins/gtkui/trkproperties.c:618
+msgid "Edit playlist"
+msgstr "Уреди листу"
+
+#: ../plugins/gtkui/ddbtabstrip.c:758
+#: ../plugins/gtkui/interface.c:1486
+#: ../plugins/gtkui/interface.c:2922
+#: ../plugins/gtkui/deadbeef.glade.h:136
+#: ../plugins/converter/interface.c:395
+msgid "Title:"
+msgstr "Наслов:"
+
+#: ../plugins/gtkui/ddbtabstrip.c:814
+msgid "Rename Playlist"
+msgstr "Преименуј листу"
+
+#: ../plugins/gtkui/ddbtabstrip.c:821
+msgid "Remove Playlist"
+msgstr "Уклони листу"
+
+#: ../plugins/gtkui/ddbtabstrip.c:828
+msgid "Add New Playlist"
+msgstr "Додај нову листу"
+
+#: ../plugins/gtkui/eq.c:136
+msgid "Save DeaDBeeF EQ Preset"
+msgstr "Сачувај подешавања еквилајзера"
+
+#: ../plugins/gtkui/eq.c:143
+msgid "DeaDBeeF EQ preset files (*.ddbeq)"
+msgstr "Датотеке са подешавањима еквилајзера (*.ddbeq)"
+
+#: ../plugins/gtkui/eq.c:182
+msgid "Load DeaDBeeF EQ Preset..."
+msgstr "Учитавање подешавања еквилајзера..."
+
+#: ../plugins/gtkui/eq.c:186
+msgid "DeaDBeeF EQ presets (*.ddbeq)"
+msgstr "Подешавања еквилајзера (*.ddbeq)"
+
+#: ../plugins/gtkui/eq.c:247
+msgid "Import Foobar2000 EQ Preset..."
+msgstr "Увоз Foobar2000 подешавања еквилајзера..."
+
+#: ../plugins/gtkui/eq.c:251
+msgid "Foobar2000 EQ presets (*.feq)"
+msgstr "Подешавања еквилајзера - Foobar2000(*.feq)"
+
+#: ../plugins/gtkui/eq.c:316
+msgid "Save Preset"
+msgstr "Сачувај подешавања"
+
+#: ../plugins/gtkui/eq.c:324
+msgid "Load Preset"
+msgstr "Учитај подешавања"
+
+#: ../plugins/gtkui/eq.c:332
+msgid "Import Foobar2000 Preset"
+msgstr "Увоз Foobar2000 подешавања"
+
+#: ../plugins/gtkui/eq.c:357
+msgid "Enable"
+msgstr "Омогући"
+
+#: ../plugins/gtkui/eq.c:366
+msgid "Zero All"
+msgstr "На нулу све"
+
+#: ../plugins/gtkui/eq.c:373
+msgid "Zero Preamp"
+msgstr "Претпојачало на нулу"
+
+#: ../plugins/gtkui/eq.c:380
+msgid "Zero Bands"
+msgstr "Подручја на нулу"
+
+#: ../plugins/gtkui/eq.c:387
+#: ../plugins/converter/interface.c:820
+msgid "Presets"
+msgstr "Поставке"
+
+#: ../plugins/gtkui/gtkui.c:137
+#, c-format
+msgid "1 day %d:%02d:%02d"
+msgstr "1 дан %d:%02d:%02d"
+
+#: ../plugins/gtkui/gtkui.c:140
+#, c-format
+msgid "%d days %d:%02d:%02d"
+msgstr "%d дана %d:%02d:%02d"
+
+#: ../plugins/gtkui/gtkui.c:149
+#, c-format
+msgid "Stopped | %d tracks | %s total playtime"
+msgstr "Заустављено | %d песама | %s укупно време свирања"
+
+#: ../plugins/gtkui/gtkui.c:162
+msgid "Mono"
+msgstr "Моно"
+
+#: ../plugins/gtkui/gtkui.c:162
+msgid "Stereo"
+msgstr "Стерео"
+
+#: ../plugins/gtkui/gtkui.c:187
+#, c-format
+msgid "| %4d kbps "
+msgstr "| %4d кбпс "
+
+#: ../plugins/gtkui/gtkui.c:193
+msgid "Paused | "
+msgstr "Паузирано | "
+
+#: ../plugins/gtkui/gtkui.c:198
+#, c-format
+msgid "%s%s %s| %dHz | %d bit | %s | %d:%02d / %s | %d tracks | %s total playtime"
+msgstr "%s%s %s| %d херца | %d бита | %s | %d:%02d / %s | %d песама | %s укупно време свирања"
+
+#: ../plugins/gtkui/gtkui.c:644
+msgid "Save Playlist As"
+msgstr "Сачувај листу као..."
+
+#: ../plugins/gtkui/gtkui.c:655
+msgid "DeaDBeeF playlist files (*.dbpl)"
+msgstr "Датотека са листом (*.dbpl)"
+
+#: ../plugins/gtkui/gtkui.c:773
+msgid "Load Playlist"
+msgstr "Учитај листу"
+
+#: ../plugins/gtkui/gtkui.c:788
+msgid "Other files (*)"
+msgstr "Остале датотеке (*)"
+
+#: ../plugins/gtkui/gtkui.c:926
+#: ../plugins/gtkui/fileman.c:40
+msgid "New Playlist"
+msgstr "Нова листа"
+
+#: ../plugins/gtkui/gtkui.c:929
+#, c-format
+msgid "New Playlist (%d)"
+msgstr "Нова листа (%d)"
+
+#: ../plugins/gtkui/interface.c:150
+#: ../plugins/gtkui/deadbeef.glade.h:156
+msgid "_File"
+msgstr "_Датотека"
+
+#: ../plugins/gtkui/interface.c:157
+#: ../plugins/gtkui/deadbeef.glade.h:163
+msgid "_Open file(s)"
+msgstr "_Отвори датотеку(е)"
+
+#: ../plugins/gtkui/interface.c:173
+#: ../plugins/gtkui/deadbeef.glade.h:6
+msgid "Add file(s)"
+msgstr "Додај датотеку(е)"
+
+#: ../plugins/gtkui/interface.c:181
+#: ../plugins/gtkui/deadbeef.glade.h:8
+msgid "Add folder(s)"
+msgstr "Додај директоријум(е)"
+
+#: ../plugins/gtkui/interface.c:189
+#: ../plugins/gtkui/interface.c:3022
+#: ../plugins/gtkui/deadbeef.glade.h:9
+msgid "Add location"
+msgstr "Додај место"
+
+#: ../plugins/gtkui/interface.c:198
+#: ../plugins/gtkui/deadbeef.glade.h:80
+msgid "New playlist"
+msgstr "Нова листа"
+
+#: ../plugins/gtkui/interface.c:205
+#: ../plugins/gtkui/deadbeef.glade.h:72
+msgid "Load playlist"
+msgstr "Учитај листу"
+
+#: ../plugins/gtkui/interface.c:209
+#: ../plugins/gtkui/deadbeef.glade.h:110
+msgid "Save playlist"
+msgstr "Сачувај листу"
+
+#: ../plugins/gtkui/interface.c:218
+#: ../plugins/gtkui/deadbeef.glade.h:165
+msgid "_Quit"
+msgstr "_Излаз"
+
+#: ../plugins/gtkui/interface.c:229
+#: ../plugins/gtkui/deadbeef.glade.h:155
+msgid "_Edit"
+msgstr "_Уређивање"
+
+#: ../plugins/gtkui/interface.c:236
+#: ../plugins/gtkui/deadbeef.glade.h:153
+msgid "_Clear"
+msgstr "О_чисти"
+
+#: ../plugins/gtkui/interface.c:244
+#: ../plugins/gtkui/deadbeef.glade.h:115
+msgid "Select all"
+msgstr "Изабери све"
+
+#: ../plugins/gtkui/interface.c:251
+#: ../plugins/gtkui/deadbeef.glade.h:32
+msgid "Deselect all"
+msgstr "Поништи избор"
+
+#: ../plugins/gtkui/interface.c:258
+#: ../plugins/gtkui/deadbeef.glade.h:55
+msgid "Invert selection"
+msgstr "Обрни избор"
+
+#: ../plugins/gtkui/interface.c:262
+#: ../plugins/gtkui/deadbeef.glade.h:118
+msgid "Selection"
+msgstr "Избор"
+
+#: ../plugins/gtkui/interface.c:269
+#: ../plugins/gtkui/plcommon.c:468
+#: ../plugins/gtkui/prefwin.c:323
+#: ../plugins/gtkui/deadbeef.glade.h:105
+#: ../plugins/converter/interface.c:645
+msgid "Remove"
+msgstr "Уклони"
+
+#: ../plugins/gtkui/interface.c:277
+#: ../plugins/gtkui/deadbeef.glade.h:24
+msgid "Crop"
+msgstr "Одсеци"
+
+#: ../plugins/gtkui/interface.c:281
+#: ../plugins/gtkui/deadbeef.glade.h:157
+msgid "_Find"
+msgstr "_Тражи"
+
+#: ../plugins/gtkui/interface.c:288
+#: ../plugins/gtkui/deadbeef.glade.h:122
+msgid "Sort By"
+msgstr "Сложи по"
+
+#: ../plugins/gtkui/interface.c:295
+#: ../plugins/gtkui/interface.c:1516
+#: ../plugins/gtkui/mainplaylist.c:318
+#: ../plugins/gtkui/prefwin.c:626
+#: ../plugins/gtkui/search.c:393
+#: ../plugins/gtkui/deadbeef.glade.h:135
+#: ../plugins/converter/convgui.c:790
+#: ../plugins/converter/convgui.c:1211
+#: ../plugins/converter/interface.c:622
+msgid "Title"
+msgstr "Наслов"
+
+#: ../plugins/gtkui/interface.c:299
+#: ../plugins/gtkui/deadbeef.glade.h:140
+msgid "Track number"
+msgstr "Број песме"
+
+#: ../plugins/gtkui/interface.c:303
+#: ../plugins/gtkui/interface.c:1515
+#: ../plugins/gtkui/interface.c:1875
+#: ../plugins/gtkui/deadbeef.glade.h:10
+#: ../translation/extra.c:69
+msgid "Album"
+msgstr "Албум"
+
+#. Track properties dialog
+#: ../plugins/gtkui/interface.c:307
+#: ../plugins/gtkui/interface.c:1514
+#: ../plugins/gtkui/plcommon.c:1013
+#: ../plugins/gtkui/deadbeef.glade.h:13
+#: ../translation/extra.c:65
+msgid "Artist"
+msgstr "Извођач"
+
+#: ../plugins/gtkui/interface.c:311
+#: ../plugins/gtkui/deadbeef.glade.h:31
+#: ../translation/extra.c:70
+msgid "Date"
+msgstr "Датум"
+
+#: ../plugins/gtkui/interface.c:315
+#: ../plugins/gtkui/interface.c:1520
+#: ../plugins/gtkui/plcommon.c:1017
+#: ../plugins/gtkui/deadbeef.glade.h:27
+msgid "Custom"
+msgstr "Прилагођено"
+
+#: ../plugins/gtkui/interface.c:324
+#: ../plugins/gtkui/interface.c:1804
+#: ../plugins/gtkui/deadbeef.glade.h:95
+msgid "Preferences"
+msgstr "Подешавања"
+
+#: ../plugins/gtkui/interface.c:328
+#: ../plugins/gtkui/deadbeef.glade.h:167
+msgid "_View"
+msgstr "П_реглед"
+
+#: ../plugins/gtkui/interface.c:335
+#: ../plugins/gtkui/deadbeef.glade.h:125
+msgid "Status bar"
+msgstr "Статусна трака"
+
+#: ../plugins/gtkui/interface.c:339
+#: ../plugins/gtkui/deadbeef.glade.h:21
+msgid "Column headers"
+msgstr "Колона заглавља"
+
+#: ../plugins/gtkui/interface.c:343
+#: ../plugins/gtkui/deadbeef.glade.h:132
+msgid "Tabs"
+msgstr "Листови"
+
+#: ../plugins/gtkui/interface.c:347
+#: ../plugins/gtkui/deadbeef.glade.h:40
+msgid "Equalizer"
+msgstr "Еквилајзер"
+
+#: ../plugins/gtkui/interface.c:351
+#: ../plugins/gtkui/deadbeef.glade.h:164
+msgid "_Playback"
+msgstr "Ре_продукција"
+
+#: ../plugins/gtkui/interface.c:358
+#: ../plugins/gtkui/interface.c:3298
+#: ../plugins/gtkui/deadbeef.glade.h:83
+msgid "Order"
+msgstr "Редослед"
+
+#: ../plugins/gtkui/interface.c:365
+#: ../plugins/gtkui/deadbeef.glade.h:71
+msgid "Linear"
+msgstr "Линијски"
+
+#: ../plugins/gtkui/interface.c:370
+#: ../plugins/gtkui/deadbeef.glade.h:121
+msgid "Shuffle tracks"
+msgstr "Насумично песме"
+
+#: ../plugins/gtkui/interface.c:375
+#: ../plugins/gtkui/deadbeef.glade.h:120
+msgid "Shuffle albums"
+msgstr "Насумично албуми"
+
+#: ../plugins/gtkui/interface.c:380
+#: ../plugins/gtkui/deadbeef.glade.h:104
+msgid "Random"
+msgstr "Случајно"
+
+#: ../plugins/gtkui/interface.c:386
+#: ../plugins/gtkui/deadbeef.glade.h:75
+msgid "Looping"
+msgstr "Понављање"
+
+#: ../plugins/gtkui/interface.c:393
+#: ../plugins/gtkui/deadbeef.glade.h:73
+msgid "Loop All"
+msgstr "Понови све"
+
+#: ../plugins/gtkui/interface.c:398
+#: ../plugins/gtkui/deadbeef.glade.h:74
+msgid "Loop Single Song"
+msgstr "Понављај песму"
+
+#: ../plugins/gtkui/interface.c:403
+#: ../plugins/gtkui/deadbeef.glade.h:36
+msgid "Don't Loop"
+msgstr "Не понављај"
+
+#: ../plugins/gtkui/interface.c:409
+#: ../plugins/gtkui/deadbeef.glade.h:111
+msgid "Scroll follows playback"
+msgstr "Клизач прати репродукцију песама"
+
+#: ../plugins/gtkui/interface.c:414
+#: ../plugins/gtkui/deadbeef.glade.h:26
+msgid "Cursor follows playback"
+msgstr "Показивач прати репродукцију песама"
+
+#: ../plugins/gtkui/interface.c:418
+#: ../plugins/gtkui/deadbeef.glade.h:127
+msgid "Stop after current"
+msgstr "Заустави после тренутне песме"
+
+#: ../plugins/gtkui/interface.c:430
+#: ../plugins/gtkui/deadbeef.glade.h:67
+msgid "Jump to current track"
+msgstr "Иди на песму која се репродукује"
+
+#: ../plugins/gtkui/interface.c:437
+#: ../plugins/gtkui/interface.c:444
+#: ../plugins/gtkui/deadbeef.glade.h:159
+msgid "_Help"
+msgstr "_Помоћ"
+
+#: ../plugins/gtkui/interface.c:452
+#: ../plugins/gtkui/deadbeef.glade.h:152
+msgid "_ChangeLog"
+msgstr "Дневник и_змена"
+
+#: ../plugins/gtkui/interface.c:461
+#: ../plugins/gtkui/deadbeef.glade.h:158
+msgid "_GPLv2"
+msgstr "_GPLv2"
+
+#: ../plugins/gtkui/interface.c:465
+#: ../plugins/gtkui/deadbeef.glade.h:160
+msgid "_LGPLv2.1"
+msgstr "_LGPLv2.1"
+
+#: ../plugins/gtkui/interface.c:474
+#: ../plugins/gtkui/deadbeef.glade.h:149
+msgid "_About"
+msgstr "О прогр_аму"
+
+#: ../plugins/gtkui/interface.c:482
+#: ../plugins/gtkui/deadbeef.glade.h:166
+msgid "_Translators"
+msgstr "_Преводиоци"
+
+#: ../plugins/gtkui/interface.c:898
+#: ../plugins/gtkui/deadbeef.glade.h:112
+msgid "Search"
+msgstr "Тражи"
+
+#: ../plugins/gtkui/interface.c:973
+#: ../plugins/gtkui/deadbeef.glade.h:126
+msgid "Stop"
+msgstr "Заустави"
+
+#: ../plugins/gtkui/interface.c:981
+#: ../plugins/gtkui/deadbeef.glade.h:89
+msgid "Play"
+msgstr "Пусти"
+
+#: ../plugins/gtkui/interface.c:989
+#: ../plugins/gtkui/deadbeef.glade.h:88
+msgid "Pause"
+msgstr "Паузирај"
+
+#: ../plugins/gtkui/interface.c:997
+#: ../plugins/gtkui/deadbeef.glade.h:96
+msgid "Previous"
+msgstr "Претходна"
+
+#: ../plugins/gtkui/interface.c:1005
+#: ../plugins/gtkui/deadbeef.glade.h:81
+msgid "Next"
+msgstr "Наредна"
+
+#: ../plugins/gtkui/interface.c:1013
+#: ../plugins/gtkui/deadbeef.glade.h:90
+msgid "Play Random"
+msgstr "Пусти насумично"
+
+#: ../plugins/gtkui/interface.c:1022
+#: ../plugins/gtkui/deadbeef.glade.h:5
+msgid "About"
+msgstr "О програму"
+
+#: ../plugins/gtkui/interface.c:1035
+#: ../plugins/gtkui/deadbeef.glade.h:103
+msgid "Quit"
+msgstr "Излаз"
+
+#: ../plugins/gtkui/interface.c:1225
+#: ../plugins/gtkui/deadbeef.glade.h:139
+msgid "Track Properties"
+msgstr "Особине песме"
+
+#: ../plugins/gtkui/interface.c:1270
+#: ../plugins/gtkui/deadbeef.glade.h:119
+msgid "Settings"
+msgstr "Подешавања"
+
+#: ../plugins/gtkui/interface.c:1296
+#: ../plugins/gtkui/deadbeef.glade.h:150
+msgid "_Apply"
+msgstr "С_ачувај промене"
+
+#: ../plugins/gtkui/interface.c:1317
+#: ../plugins/gtkui/interface.c:1363
+#: ../plugins/gtkui/deadbeef.glade.h:154
+msgid "_Close"
+msgstr "_Затвори"
+
+#: ../plugins/gtkui/interface.c:1321
+#: ../plugins/gtkui/deadbeef.glade.h:76
+msgid "Metadata"
+msgstr "Подаци о песми"
+
+#: ../plugins/gtkui/interface.c:1367
+#: ../plugins/gtkui/plcommon.c:618
+#: ../plugins/gtkui/deadbeef.glade.h:97
+msgid "Properties"
+msgstr "Особине"
+
+#: ../plugins/gtkui/interface.c:1494
+#: ../plugins/gtkui/deadbeef.glade.h:39
+msgid "Enter new column title here"
+msgstr "Унесите име за нову колону овде"
+
+#: ../plugins/gtkui/interface.c:1502
+#: ../plugins/gtkui/deadbeef.glade.h:141
+msgid "Type:"
+msgstr "Врста:"
+
+#: ../plugins/gtkui/interface.c:1510
+msgid "Item Index"
+msgstr "Редни број"
+
+#. create default set of columns
+#: ../plugins/gtkui/interface.c:1511
+#: ../plugins/gtkui/mainplaylist.c:315
+msgid "Playing"
+msgstr "Репродукује се"
+
+#: ../plugins/gtkui/interface.c:1512
+msgid "Album Art"
+msgstr "Омотнице албума"
+
+#: ../plugins/gtkui/interface.c:1513
+msgid "Artist - Album"
+msgstr "Извођач — Албум"
+
+#: ../plugins/gtkui/interface.c:1517
+#: ../plugins/gtkui/mainplaylist.c:319
+#: ../plugins/gtkui/search.c:394
+msgid "Duration"
+msgstr "Трајање"
+
+#: ../plugins/gtkui/interface.c:1518
+#: ../translation/extra.c:71
+msgid "Track Number"
+msgstr "Број песме"
+
+#: ../plugins/gtkui/interface.c:1519
+#: ../translation/extra.c:68
+msgid "Band / Album Artist"
+msgstr "Група / Извођач"
+
+#: ../plugins/gtkui/interface.c:1526
+#: ../plugins/gtkui/interface.c:3150
+#: ../plugins/gtkui/deadbeef.glade.h:44
+msgid "Format:"
+msgstr "Формат:"
+
+#: ../plugins/gtkui/interface.c:1551
+#: ../plugins/gtkui/deadbeef.glade.h:11
+msgid "Alignment:"
+msgstr "Поравнање:"
+
+#: ../plugins/gtkui/interface.c:1559
+msgid "Left"
+msgstr "Лево"
+
+#: ../plugins/gtkui/interface.c:1560
+msgid "Right"
+msgstr "Десно"
+
+#: ../plugins/gtkui/interface.c:1583
+#: ../plugins/gtkui/interface.c:2953
+#: ../plugins/gtkui/interface.c:3065
+#: ../plugins/gtkui/interface.c:3191
+#: ../plugins/gtkui/deadbeef.glade.h:151
+msgid "_Cancel"
+msgstr "_Поништи"
+
+#: ../plugins/gtkui/interface.c:1604
+#: ../plugins/gtkui/interface.c:2974
+#: ../plugins/gtkui/interface.c:3086
+#: ../plugins/gtkui/interface.c:3212
+#: ../plugins/gtkui/deadbeef.glade.h:162
+msgid "_OK"
+msgstr "_У реду"
+
+#: ../plugins/gtkui/interface.c:1825
+#: ../plugins/gtkui/deadbeef.glade.h:85
+msgid "Output plugin:"
+msgstr "Излазни додаци:"
+
+#: ../plugins/gtkui/interface.c:1838
+#: ../plugins/gtkui/deadbeef.glade.h:84
+msgid "Output device:"
+msgstr "Излазни уређај"
+
+#: ../plugins/gtkui/interface.c:1847
+#: ../plugins/gtkui/deadbeef.glade.h:12
+msgid "Always convert 8 bit audio to 16 bit"
+msgstr "Увек претварај 8-битни у 16-битни аудио"
+
+#: ../plugins/gtkui/interface.c:1851
+#: ../plugins/gtkui/deadbeef.glade.h:124
+msgid "Sound"
+msgstr "Звук"
+
+#: ../plugins/gtkui/interface.c:1864
+#: ../plugins/gtkui/deadbeef.glade.h:106
+msgid "Replaygain mode:"
+msgstr "Replaygain мод:"
+
+#: ../plugins/gtkui/interface.c:1873
+msgid "Disable"
+msgstr "Онемогући"
+
+#: ../plugins/gtkui/interface.c:1874
+msgid "Track"
+msgstr "Песма"
+
+#: ../plugins/gtkui/interface.c:1877
+#: ../plugins/gtkui/deadbeef.glade.h:107
+msgid "Replaygain peak scale"
+msgstr "Replaygain скала вршних вредности"
+
+#: ../plugins/gtkui/interface.c:1892
+#: ../plugins/gtkui/interface.c:1926
+#: ../plugins/gtkui/deadbeef.glade.h:2
+msgid "-12 dB"
+msgstr "-12 dB"
+
+#: ../plugins/gtkui/interface.c:1902
+#: ../plugins/gtkui/interface.c:1936
+#: ../plugins/gtkui/deadbeef.glade.h:1
+msgid "+12 dB"
+msgstr "+12 dB"
+
+#: ../plugins/gtkui/interface.c:1906
+#: ../plugins/gtkui/deadbeef.glade.h:108
+msgid "Replaygain preamp:"
+msgstr "Replaygain претпојачавач:"
+
+#: ../plugins/gtkui/interface.c:1913
+#: ../plugins/gtkui/deadbeef.glade.h:47
+msgid "Global preamp:"
+msgstr "Претпојачавач:"
+
+#: ../plugins/gtkui/interface.c:1944
+#: ../plugins/gtkui/deadbeef.glade.h:7
+msgid "Add files from command line (or file manager) to this playlist:"
+msgstr "Додај датотеке из линије за наредбе или управника датотека у ову листу:"
+
+#: ../plugins/gtkui/interface.c:1953
+#: ../plugins/gtkui/deadbeef.glade.h:109
+msgid "Resume previous session on startup"
+msgstr "Врати претходну сесију при покретању"
+
+#: ../plugins/gtkui/interface.c:1957
+#: ../plugins/gtkui/deadbeef.glade.h:37
+msgid "Don't add from archives when adding folders"
+msgstr "Не учитавај дадотеке из архива приликом додавања директоријума"
+
+#: ../plugins/gtkui/interface.c:1961
+#: ../plugins/gtkui/deadbeef.glade.h:91
+msgid "Playback"
+msgstr "Репродукција"
+
+#: ../plugins/gtkui/interface.c:1982
+#: ../plugins/gtkui/interface.c:2514
+#: ../plugins/gtkui/deadbeef.glade.h:22
+#: ../plugins/converter/interface.c:649
+msgid "Configure"
+msgstr "Подеси"
+
+#: ../plugins/gtkui/interface.c:2017
+#: ../plugins/gtkui/deadbeef.glade.h:29
+#, fuzzy
+msgid "DSP Chain Preset"
+msgstr "Сачувај подешавања"
+
+#: ../plugins/gtkui/interface.c:2029
+#: ../plugins/gtkui/deadbeef.glade.h:161
+msgid "_Load"
+msgstr "У_читај"
+
+#: ../plugins/gtkui/interface.c:2033
+#: ../plugins/gtkui/deadbeef.glade.h:28
+msgid "DSP"
+msgstr "Дигитална обрада звука (DSP)"
+
+#: ../plugins/gtkui/interface.c:2042
+#: ../plugins/gtkui/deadbeef.glade.h:19
+msgid "Close minimizes to tray"
+msgstr "Код клика на затвори смести у обавештајну зону"
+
+#: ../plugins/gtkui/interface.c:2046
+#: ../plugins/gtkui/deadbeef.glade.h:78
+msgid "Middle mouse button closes playlist"
+msgstr "Средње дугме миша затвара листу"
+
+#: ../plugins/gtkui/interface.c:2050
+#: ../plugins/gtkui/deadbeef.glade.h:51
+msgid "Hide system tray icon"
+msgstr "Не приказуј икону у обавештајној зони"
+
+#: ../plugins/gtkui/interface.c:2054
+#: ../plugins/gtkui/deadbeef.glade.h:143
+msgid "Use bold font for currently playing track"
+msgstr "Користи задебљан фонт за песму која се репродукује"
+
+#: ../plugins/gtkui/interface.c:2058
+#: ../plugins/gtkui/deadbeef.glade.h:50
+msgid "Hide \"Delete from disk\" context menu item"
+msgstr "Сакриј ставке \"Обриши са диска\" у менију"
+
+#: ../plugins/gtkui/interface.c:2062
+#: ../plugins/gtkui/deadbeef.glade.h:16
+msgid "Auto-name playlists when adding a single folder"
+msgstr "Самоименовање листа песама при додавању само једног директоријума"
+
+#: ../plugins/gtkui/interface.c:2070
+#: ../plugins/gtkui/deadbeef.glade.h:54
+msgid "Interface refresh rate (times per second):"
+msgstr "Освежавање приказа (колико пута у секунди)"
+
+#: ../plugins/gtkui/interface.c:2084
+#: ../plugins/gtkui/deadbeef.glade.h:137
+msgid "Titlebar text while playing:"
+msgstr "При репродукцији, испиши на насловној линији: "
+
+#: ../plugins/gtkui/interface.c:2098
+#: ../plugins/gtkui/deadbeef.glade.h:138
+msgid "Titlebar text while stopped:"
+msgstr "По заустављеној репродукцији, испиши на насловној линији: "
+
+#: ../plugins/gtkui/interface.c:2112
+#: ../plugins/gtkui/deadbeef.glade.h:46
+msgid "GUI Plugin (changing requires restart):"
+msgstr "Додатак графичког корисничког интерфејса (неопходно поновно покретање)"
+
+#: ../plugins/gtkui/interface.c:2120
+#: ../plugins/gtkui/deadbeef.glade.h:45
+msgid "GUI"
+msgstr "Графичке контроле"
+
+#: ../plugins/gtkui/interface.c:2135
+#: ../plugins/gtkui/interface.c:2179
+#: ../plugins/gtkui/deadbeef.glade.h:86
+msgid "Override"
+msgstr "Замени подразумевано"
+
+#: ../plugins/gtkui/interface.c:2144
+#: ../plugins/gtkui/deadbeef.glade.h:42
+msgid "Foreground"
+msgstr "Боја текста"
+
+#: ../plugins/gtkui/interface.c:2151
+#: ../plugins/gtkui/deadbeef.glade.h:17
+msgid "Background"
+msgstr "Позадина"
+
+#: ../plugins/gtkui/interface.c:2170
+#: ../plugins/gtkui/deadbeef.glade.h:113
+msgid "Seekbar/Volumebar colors"
+msgstr "Траке за премотавање/гласноћу"
+
+#: ../plugins/gtkui/interface.c:2188
+#: ../plugins/gtkui/deadbeef.glade.h:77
+msgid "Middle"
+msgstr "Средње"
+
+#: ../plugins/gtkui/interface.c:2195
+#: ../plugins/gtkui/deadbeef.glade.h:70
+msgid "Light"
+msgstr "Светло"
+
+#: ../plugins/gtkui/interface.c:2202
+#: ../plugins/gtkui/deadbeef.glade.h:30
+msgid "Dark"
+msgstr "Тамно"
+
+#: ../plugins/gtkui/interface.c:2233
+#: ../plugins/gtkui/deadbeef.glade.h:18
+msgid "Base"
+msgstr "Основа"
+
+#: ../plugins/gtkui/interface.c:2240
+#: ../plugins/gtkui/interface.c:2297
+#: ../plugins/gtkui/deadbeef.glade.h:134
+msgid "Text"
+msgstr "Текст"
+
+#: ../plugins/gtkui/interface.c:2253
+#: ../plugins/gtkui/deadbeef.glade.h:131
+msgid "Tab strip colors"
+msgstr "Боје одвајања листова"
+
+#: ../plugins/gtkui/interface.c:2262
+#: ../plugins/gtkui/deadbeef.glade.h:87
+msgid "Override (looses GTK treeview theming, but speeds up rendering)"
+msgstr "Замени подразумевано (губе се ГТК теме погледа стабла, али се добија бржи приказ)"
+
+#: ../plugins/gtkui/interface.c:2271
+#: ../plugins/gtkui/deadbeef.glade.h:41
+msgid "Even row"
+msgstr "Паран ред"
+
+#: ../plugins/gtkui/interface.c:2278
+#: ../plugins/gtkui/deadbeef.glade.h:82
+msgid "Odd row"
+msgstr " Непаран ред"
+
+#: ../plugins/gtkui/interface.c:2304
+#: ../plugins/gtkui/deadbeef.glade.h:116
+msgid "Selected row"
+msgstr "Одабран ред"
+
+#: ../plugins/gtkui/interface.c:2323
+#: ../plugins/gtkui/deadbeef.glade.h:117
+msgid "Selected text"
+msgstr "Одабран текст"
+
+#: ../plugins/gtkui/interface.c:2336
+#: ../plugins/gtkui/deadbeef.glade.h:25
+msgid "Cursor"
+msgstr "Показивач"
+
+#: ../plugins/gtkui/interface.c:2349
+#: ../plugins/gtkui/deadbeef.glade.h:92
+msgid "Playlist colors"
+msgstr "Боје листе"
+
+#: ../plugins/gtkui/interface.c:2353
+#: ../plugins/gtkui/deadbeef.glade.h:20
+msgid "Colors"
+msgstr "Боје"
+
+#: ../plugins/gtkui/interface.c:2362
+#: ../plugins/gtkui/deadbeef.glade.h:38
+msgid "Enable Proxy Server"
+msgstr "Омогући прокси сервер"
+
+#: ../plugins/gtkui/interface.c:2370
+#: ../plugins/gtkui/deadbeef.glade.h:99
+msgid "Proxy Server Address:"
+msgstr "Адреса прокси сервера:"
+
+#: ../plugins/gtkui/interface.c:2384
+#: ../plugins/gtkui/deadbeef.glade.h:100
+msgid "Proxy Server Port:"
+msgstr "Порт прокси сервера:"
+
+#: ../plugins/gtkui/interface.c:2398
+#: ../plugins/gtkui/deadbeef.glade.h:101
+msgid "Proxy Type:"
+msgstr "Тип проксија:"
+
+#: ../plugins/gtkui/interface.c:2417
+#: ../plugins/gtkui/deadbeef.glade.h:102
+msgid "Proxy Username:"
+msgstr "Прокси корисничко име:"
+
+#: ../plugins/gtkui/interface.c:2430
+#: ../plugins/gtkui/deadbeef.glade.h:98
+msgid "Proxy Password:"
+msgstr "Прокси лозинка:"
+
+#: ../plugins/gtkui/interface.c:2440
+#: ../plugins/gtkui/deadbeef.glade.h:79
+msgid "Network"
+msgstr "Мрежа"
+
+#: ../plugins/gtkui/interface.c:2471
+#: ../plugins/gtkui/deadbeef.glade.h:144
+msgid "Version: "
+msgstr "Издање:"
+
+#: ../plugins/gtkui/interface.c:2535
+#: ../plugins/gtkui/deadbeef.glade.h:23
+#: ../translation/extra.c:78
+msgid "Copyright"
+msgstr "Ауторска права"
+
+#: ../plugins/gtkui/interface.c:2545
+#: ../plugins/gtkui/deadbeef.glade.h:94
+msgid "Plugins"
+msgstr "Додаци"
+
+#: ../plugins/gtkui/interface.c:3033
+#: ../plugins/gtkui/deadbeef.glade.h:142
+msgid "URL:"
+msgstr "URL:"
+
+#: ../plugins/gtkui/interface.c:3135
+#: ../plugins/gtkui/deadbeef.glade.h:48
+msgid "Group By"
+msgstr "Групиши по"
+
+#: ../plugins/gtkui/interface.c:3259
+#: ../plugins/gtkui/deadbeef.glade.h:123
+msgid "Sort by..."
+msgstr "Сложи..."
+
+#: ../plugins/gtkui/interface.c:3275
+#: ../plugins/gtkui/deadbeef.glade.h:43
+msgid "Format"
+msgstr "Облик:"
+
+#: ../plugins/gtkui/interface.c:3305
+msgid "Ascending"
+msgstr "Растуће"
+
+#: ../plugins/gtkui/interface.c:3306
+msgid "Descending"
+msgstr "Опадајуће"
+
+#: ../plugins/gtkui/interface.c:3359
+#: ../plugins/gtkui/deadbeef.glade.h:114
+#: ../plugins/converter/interface.c:750
+msgid "Select DSP Plugin"
+msgstr "Избор додатка за дигиталну обраду"
+
+#: ../plugins/gtkui/interface.c:3375
+#: ../plugins/gtkui/deadbeef.glade.h:93
+#: ../plugins/converter/convgui.c:1016
+#: ../plugins/converter/interface.c:766
+#: ../plugins/gtkui/dspconfig.c:139
+msgid "Plugin"
+msgstr "Додатак"
+
+#: ../plugins/gtkui/interface.c:3461
+#: ../plugins/gtkui/deadbeef.glade.h:133
+msgid "Tag Writer Settings"
+msgstr "Подешавања писача ознака"
+
+#: ../plugins/gtkui/interface.c:3492
+#: ../plugins/gtkui/deadbeef.glade.h:147
+msgid "Write ID3v2"
+msgstr "Уписуј ID3v2"
+
+#: ../plugins/gtkui/interface.c:3496
+#: ../plugins/gtkui/interface.c:3623
+#: ../plugins/gtkui/deadbeef.glade.h:146
+msgid "Write ID3v1"
+msgstr "Уписуј ID3v1"
+
+#: ../plugins/gtkui/interface.c:3500
+#: ../plugins/gtkui/interface.c:3579
+#: ../plugins/gtkui/interface.c:3619
+#: ../plugins/gtkui/deadbeef.glade.h:145
+msgid "Write APEv2"
+msgstr "Уписуј APEv2"
+
+#: ../plugins/gtkui/interface.c:3508
+#: ../plugins/gtkui/interface.c:3587
+#: ../plugins/gtkui/deadbeef.glade.h:130
+msgid "Strip ID3v2"
+msgstr "Уклони ID3v2"
+
+#: ../plugins/gtkui/interface.c:3512
+#: ../plugins/gtkui/interface.c:3635
+#: ../plugins/gtkui/deadbeef.glade.h:129
+msgid "Strip ID3v1"
+msgstr "Уклони ID3v1"
+
+#: ../plugins/gtkui/interface.c:3516
+#: ../plugins/gtkui/interface.c:3591
+#: ../plugins/gtkui/interface.c:3631
+#: ../plugins/gtkui/deadbeef.glade.h:128
+msgid "Strip APEv2"
+msgstr "Уклони APEv2"
+
+#: ../plugins/gtkui/interface.c:3524
+#: ../plugins/gtkui/deadbeef.glade.h:53
+msgid "ID3v2 version"
+msgstr "ID3v2 верзија"
+
+#: ../plugins/gtkui/interface.c:3531
+msgid "2.3 (Recommended)"
+msgstr "2.3 (Препоручено)"
+
+#: ../plugins/gtkui/interface.c:3532
+msgid "2.4"
+msgstr "2.4"
+
+#: ../plugins/gtkui/interface.c:3538
+#: ../plugins/gtkui/deadbeef.glade.h:52
+msgid "ID3v1 character encoding (default is iso8859-1)"
+msgstr "ID3v1 кодирање знакова (подразумевано је iso8859-1)"
+
+#: ../plugins/gtkui/interface.c:3575
+#: ../plugins/gtkui/deadbeef.glade.h:148
+msgid "Write ID3v2.4"
+msgstr "Уписуј ID3v2.4"
+
+#: ../plugins/gtkui/mainplaylist.c:316
+#: ../plugins/gtkui/search.c:391
+msgid "Artist / Album"
+msgstr "Извођач / Албум"
+
+#: ../plugins/gtkui/mainplaylist.c:317
+#: ../plugins/gtkui/search.c:392
+msgid "Track No"
+msgstr "Број песме"
+
+#: ../plugins/gtkui/plcommon.c:338
+msgid "Delete files from disk"
+msgstr "Обриши датотеке са диска"
+
+#: ../plugins/gtkui/plcommon.c:339
+msgid ""
+"Files will be lost. Proceed?\n"
+"(This dialog can be turned off in GTKUI plugin settings)"
+msgstr ""
+"Дадотеке ће бити обрисане. Да ли сте сигурни?\n"
+"(Овај дијалог може да се искључи у подешавањима додатка GTKUI)"
+
+#: ../plugins/gtkui/plcommon.c:340
+#: ../plugins/gtkui/trkproperties.c:162
+#: ../plugins/gtkui/trkproperties.c:693
+#: ../plugins/converter/convgui.c:759
+#: ../plugins/converter/convgui.c:1136
+msgid "Warning"
+msgstr "Упозорење"
+
+#: ../plugins/gtkui/plcommon.c:444
+msgid "Add to playback queue"
+msgstr "Додај у заказано"
+
+#: ../plugins/gtkui/plcommon.c:449
+msgid "Remove from playback queue"
+msgstr "Уклони из заказаног"
+
+#: ../plugins/gtkui/plcommon.c:457
+msgid "Reload metadata"
+msgstr "Поново учитај податке о песми"
+
+#: ../plugins/gtkui/plcommon.c:476
+msgid "Remove from disk"
+msgstr "Уклони са диска"
+
+#: ../plugins/gtkui/plcommon.c:855
+#: ../plugins/gtkui/plcommon.c:980
+msgid "Add column"
+msgstr "Додај колону"
+
+#: ../plugins/gtkui/plcommon.c:885
+#: ../plugins/gtkui/plcommon.c:984
+msgid "Edit column"
+msgstr "Уреди колону"
+
+#: ../plugins/gtkui/plcommon.c:988
+msgid "Remove column"
+msgstr "Уклони колону"
+
+#: ../plugins/gtkui/plcommon.c:998
+msgid "Group by"
+msgstr "Групиши по"
+
+#: ../plugins/gtkui/plcommon.c:1005
+msgid "None"
+msgstr "Поништи груписање"
+
+#: ../plugins/gtkui/plcommon.c:1009
+msgid "Artist/Date/Album"
+msgstr "Извођач/Датум/Албум"
+
+#: ../plugins/gtkui/pluginconf.c:42
+msgid "Open file..."
+msgstr "Отвори датотеку..."
+
+#: ../plugins/gtkui/pluginconf.c:217
+#, c-format
+msgid "Configure %s"
+msgstr "Подеси %s"
+
+#: ../plugins/gtkui/prefwin.c:82
+msgid "Default Audio Device"
+msgstr "Подразумевани звучни уређај"
+
+#: ../plugins/gtkui/prefwin.c:318
+#: ../plugins/converter/interface.c:641
+msgid "Add"
+msgstr "Додај"
+
+#: ../plugins/gtkui/prefwin.c:328
+msgid "Global Hotkeys"
+msgstr "Опште пречице"
+
+#: ../plugins/gtkui/prefwin.c:390
+msgid "Slot"
+msgstr "Наредба"
+
+#: ../plugins/gtkui/prefwin.c:391
+msgid "Key combination"
+msgstr "Комбинација тастера"
+
+#: ../plugins/gtkui/progress.c:56
+msgid "Adding files..."
+msgstr "Додавање датотека..."
+
+#: ../plugins/gtkui/progress.c:90
+msgid "Initializing..."
+msgstr "Иницијализација..."
+
+#: ../plugins/gtkui/trkproperties.c:159
+msgid "You've modified data for this track."
+msgstr "Изменили сте податке за ову песму."
+
+#: ../plugins/gtkui/trkproperties.c:161
+msgid "Really close the window?"
+msgstr "Желите ли заиста да затворите овај прозор?"
+
+#. get value to edit
+#: ../plugins/gtkui/trkproperties.c:254
+msgid "[Multiple values] "
+msgstr "[Вишеструке вредности] "
+
+#: ../plugins/gtkui/trkproperties.c:407
+#: ../plugins/gtkui/trkproperties.c:419
+msgid "Key"
+msgstr "Кључ"
+
+#: ../plugins/gtkui/trkproperties.c:408
+#: ../plugins/gtkui/trkproperties.c:420
+msgid "Value"
+msgstr "Вредност"
+
+#: ../plugins/gtkui/trkproperties.c:594
+msgid "Writing tags..."
+msgstr "Уписујем ознаке..."
+
+#: ../plugins/gtkui/trkproperties.c:621
+msgid "Name:"
+msgstr "Име:"
+
+#: ../plugins/gtkui/trkproperties.c:633
+msgid "Field names must not start with : or _"
+msgstr "Имена поља не могу почињати знацима : или _"
+
+#: ../plugins/gtkui/trkproperties.c:634
+#: ../plugins/gtkui/trkproperties.c:668
+msgid "Cannot add field"
+msgstr "Не могу да додам поље"
+
+#: ../plugins/gtkui/trkproperties.c:667
+msgid "Field with such name already exists, please try different name."
+msgstr "Поље са истим именом већ постоји. Дајте пољу друго име."
+
+#: ../plugins/gtkui/trkproperties.c:692
+msgid "Really remove selected field?"
+msgstr "Желите ли заиста да обришете ово поље?"
+
+#: ../plugins/gtkui/trkproperties.c:734
+msgid "Add field"
+msgstr "Додај поље"
+
+#: ../plugins/gtkui/trkproperties.c:737
+msgid "Remove field"
+msgstr "Уклони поље"
+
+#: ../main.c:91
+#, c-format
+msgid "Usage: deadbeef [options] [file(s)]\n"
+msgstr "Употреба: deadbeef [опције] [датотека(е)]\n"
+
+#: ../main.c:92
+#, c-format
+msgid "Options:\n"
+msgstr "Опције:\n"
+
+#: ../main.c:93
+#, c-format
+msgid " --help or -h Print help (this message) and exit\n"
+msgstr " --help или -h Прикажи ову помоћ и изађи\n"
+
+#: ../main.c:94
+#, c-format
+msgid " --quit Quit player\n"
+msgstr " --quit Напусти плејер\n"
+
+#: ../main.c:95
+#, c-format
+msgid " --version Print version info and exit\n"
+msgstr " --version Прикажи инфо о верзији и изађи\n"
+
+#: ../main.c:96
+#, c-format
+msgid " --play Start playback\n"
+msgstr " --play Репродукуј\n"
+
+#: ../main.c:97
+#, c-format
+msgid " --stop Stop playback\n"
+msgstr " --stop Заустави репродукцију\n"
+
+#: ../main.c:98
+#, c-format
+msgid " --pause Pause playback\n"
+msgstr " --pause Паузирај репродукцију\n"
+
+#: ../main.c:99
+#, c-format
+msgid " --toggle-pause Toggle pause\n"
+msgstr " --toggle-pause Паузирај\n"
+
+#: ../main.c:100
+#, c-format
+msgid " --play-pause Start playback if stopped, toggle pause otherwise\n"
+msgstr " --play-pause Започни репродукцију ако је заустављена, и обратно\n"
+
+#: ../main.c:101
+#, c-format
+msgid " --next Next song in playlist\n"
+msgstr " --next Наредна песма из листе\n"
+
+#: ../main.c:102
+#, c-format
+msgid " --prev Previous song in playlist\n"
+msgstr " --prev Претходна песма из листе\n"
+
+#: ../main.c:103
+#, c-format
+msgid " --random Random song in playlist\n"
+msgstr " --random Насумично песма из листе\n"
+
+#: ../main.c:104
+#, c-format
+msgid " --queue Append file(s) to existing playlist\n"
+msgstr " --queue Додај датотеку(е) у постојећу листу\n"
+
+#: ../main.c:105
+#, c-format
+msgid " --nowplaying FMT Print formatted track name to stdout\n"
+msgstr " --nowplaying FMT Испиши уређено име песме на стд. излаз\n"
+
+#: ../main.c:106
+#, c-format
+msgid ""
+" FMT %%-syntax: [a]rtist, [t]itle, al[b]um,\n"
+" [l]ength, track[n]umber, [y]ear, [c]omment,\n"
+" copy[r]ight, [e]lapsed\n"
+msgstr ""
+" FMT %%-syntax: [a]-извођач, [t]-наслов, [b]-албум,\n"
+" [l]-трајање, [n]-бр.песме, [y]-година, [c]-примедба,\n"
+" [r]-ауторска права, [e]преостало време\n"
+
+#: ../main.c:109
+#, c-format
+msgid " e.g.: --nowplaying \"%%a - %%t\" should print \"artist - title\"\n"
+msgstr " Н.пр.: --nowplaying \"%%a - %%t\" ће исписати \"Извођач - Наслов\"\n"
+
+#: ../main.c:110
+#, c-format
+msgid " for more info, see http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+msgstr " додатне информације на http://sourceforge.net/apps/mediawiki/deadbeef/index.php?title=Title_Formatting\n"
+
+#: ../playlist.c:454
+#: ../playlist.c:2398
+msgid "Default"
+msgstr "Подразумевано"
+
+#: ../playlist.c:3664
+msgid "Yes"
+msgstr "Да"
+
+#: ../playlist.c:3664
+msgid "No"
+msgstr "Не"
+
+#: ../plugins/gtkui/deadbeef.glade.h:3
+msgid ""
+"2.3 (Recommended)\n"
+"2.4"
+msgstr ""
+"2.3 (Препоручено)\n"
+"2.4"
+
+#: ../plugins/gtkui/deadbeef.glade.h:14
+msgid ""
+"Ascending\n"
+"Descending"
+msgstr ""
+"Растући\n"
+"Опадајући"
+
+#: ../plugins/gtkui/deadbeef.glade.h:33
+msgid ""
+"Disable\n"
+"Track\n"
+"Album"
+msgstr ""
+"Онемогући\n"
+"Песма\n"
+"Албум"
+
+#: ../plugins/gtkui/deadbeef.glade.h:56
+msgid ""
+"Item Index\n"
+"Playing\n"
+"Album Art\n"
+"Artist - Album\n"
+"Artist\n"
+"Album\n"
+"Title\n"
+"Duration\n"
+"Track Number\n"
+"Band / Album Artist\n"
+"Custom"
+msgstr ""
+"Редни број\n"
+"Репродукује се\n"
+"Омотница албума\n"
+"Извођач - Албум\n"
+"Извођач\n"
+"Албум\n"
+"Наслов\n"
+"Трајање\n"
+"Песма\n"
+"Група / Извођач\n"
+"Прилагођено"
+
+#: ../plugins/gtkui/deadbeef.glade.h:68
+msgid ""
+"Left\n"
+"Right"
+msgstr ""
+"Лево\n"
+"Десно"
+
+#: ../plugins/gtkui/support.c:90
+#: ../plugins/gtkui/support.c:114
+#: ../plugins/converter/support.c:90
+#: ../plugins/converter/support.c:114
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr "Не могу пронаћи датотеку са битмапираном сликом: %s"
+
+#: ../plugins/wildmidi/wildmidiplug.c:162
+#, c-format
+msgid "wildmidi: freepats config file not found. Please install timidity-freepats package, or specify path to freepats.cfg in the plugin settings."
+msgstr "wildmidi: \"freepats\" датотека са подешавањима није пронађена. Инсталирајте \"timidity-freepats\" програм или подесите путању до датотеке \"freepats.cfg\"."
+
+#. this file should list extra translatable strings that are not referenced
+#. directly in source code, e.g. scripted plugin configuration strings
+#: ../translation/extra.c:3
+msgid "Add Audio CD"
+msgstr "Додај звучни диск (ЦД)"
+
+#: ../translation/extra.c:4
+msgid "Lookup on Last.fm"
+msgstr "Погледај на Last.fm страници"
+
+#. ALSA output plugin
+#: ../translation/extra.c:6
+msgid "Use ALSA resampling"
+msgstr "Користи ALSA претварања фреквенције узорковања"
+
+#: ../translation/extra.c:7
+msgid "Release device while stopped"
+msgstr "Ослободи уређај након завршене репродукције"
+
+#: ../translation/extra.c:8
+#: ../translation/extra.c:51
+msgid "Preferred buffer size"
+msgstr "Најрадије користи бафер величине"
+
+#: ../translation/extra.c:9
+msgid "Preferred period size"
+msgstr "Најрадије користи период величине"
+
+#. Last.fm plugin
+#: ../translation/extra.c:11
+msgid "Enable scrobbler"
+msgstr "Омогући скроблер"
+
+#: ../translation/extra.c:12
+msgid "Disable nowplaying"
+msgstr "Онемогући сада се репродукује"
+
+#: ../translation/extra.c:13
+msgid "Username"
+msgstr "Корисничко име"
+
+#: ../translation/extra.c:14
+msgid "Password"
+msgstr "Лозинка"
+
+#: ../translation/extra.c:15
+msgid "Scrobble URL"
+msgstr "Адреса за скроблер"
+
+#. OSS output plugin
+#: ../translation/extra.c:17
+msgid "Device file"
+msgstr "Датотека уређаја"
+
+#: ../translation/extra.c:18
+msgid "OSS4 samplerate bug workaround"
+msgstr "Заобиђи грешку код фреквенције узорковања у „OSS4“"
+
+#. Album Artwork plugin
+#: ../translation/extra.c:20
+msgid "Cache update period (hr)"
+msgstr "Период освежавања привремене меморије (часова)"
+
+#: ../translation/extra.c:21
+msgid "Fetch from embedded tags"
+msgstr "Преузми из уграђених ознака"
+
+#: ../translation/extra.c:22
+msgid "Fetch from local folder"
+msgstr "Преузми из локалних директоријума"
+
+#: ../translation/extra.c:23
+msgid "Local cover file mask"
+msgstr "Име датотека садржи речи"
+
+#: ../translation/extra.c:24
+msgid "Fetch from last.fm"
+msgstr "Преузми са Last.fm страница"
+
+#: ../translation/extra.c:25
+msgid "Fetch from albumart.org"
+msgstr "Преузми са albumart.org"
+
+#: ../translation/extra.c:26
+msgid "Scale artwork towards longer side"
+msgstr "Промени величину омотнице према дужој страници"
+
+#. Audio CD player
+#: ../translation/extra.c:28
+msgid "Use CDDB/FreeDB"
+msgstr "Користи CDDB/FreeDB"
+
+#: ../translation/extra.c:29
+msgid "Prefer CD-Text over CDDB"
+msgstr "Користи ЦД-текст, ако је доступан"
+
+#: ../translation/extra.c:30
+msgid "CDDB url (e.g. 'freedb.org')"
+msgstr "CDDB адреса (нпр. 'freedb.org')"
+
+#: ../translation/extra.c:31
+msgid "CDDB port number (e.g. '888')"
+msgstr "Ослушкуј CDDB на порту (нпр. '888')"
+
+#: ../translation/extra.c:32
+msgid "Prefer CDDB protocol over HTTP"
+msgstr "Најрадије користи CDDB протокол"
+
+#: ../translation/extra.c:33
+msgid "Enable NRG image support"
+msgstr "Укључи подршку за NRG слике"
+
+#. DUMB module player plugin
+#: ../translation/extra.c:35
+msgid "Resampling quality (0..2, higher is better)"
+msgstr "Квалитет промене фреквенције узорковања (0..2, више је боље)"
+
+#. Game_Music_Emu decoder plugin
+#: ../translation/extra.c:37
+msgid "Max song length (in minutes)"
+msgstr "Најдуже трајање песме (минута)"
+
+#. Standard GTK2 user interface plugin
+#: ../translation/extra.c:39
+msgid "Ask confirmation to delete files from disk"
+msgstr "Захтевај дозволу за брисање датотека са диска"
+
+#: ../translation/extra.c:40
+msgid "Status icon volume control sensitivity"
+msgstr "Осетљивост контроле гласноће преко иконе стања"
+
+#: ../translation/extra.c:41
+msgid "Custom status icon"
+msgstr "Прилагођена икона стања"
+
+#: ../translation/extra.c:42
+msgid "Run gtk_init with --sync (debug mode)"
+msgstr "Покрени \"gtk_init\" са \"--sync\" (режим отклањања грешака)"
+
+#: ../translation/extra.c:43
+msgid "Add separators between plugin context menu items"
+msgstr "Додај раздвајаче између ставки додатака у контекстном менију"
+
+#. OSD Notify plugin
+#: ../translation/extra.c:45
+msgid "Notification title format"
+msgstr "Облик наслова обавештења"
+
+#: ../translation/extra.c:46
+msgid "Notification content format"
+msgstr "Облик садржаја обавештења"
+
+#: ../translation/extra.c:47
+msgid "Show album art"
+msgstr "Прикажи омотницу албума"
+
+#: ../translation/extra.c:48
+msgid "Album art size (px)"
+msgstr "Величина омотнице албума (у пикселима)"
+
+#. PulseAudio output plugin
+#: ../translation/extra.c:50
+msgid "PulseAudio server"
+msgstr "PulseAudio звучни сервер"
+
+#: ../translation/extra.c:52
+msgid "Samplerate"
+msgstr "Фреквенција узорковања (Samplerate)"
+
+#. SHN player plugin
+#: ../translation/extra.c:54
+msgid "Relative seek table path"
+msgstr "Релативна путања за претраживање"
+
+#: ../translation/extra.c:55
+msgid "Absolute seek table path"
+msgstr "Потпуна путања за претраживање"
+
+#: ../translation/extra.c:56
+msgid "Swap audio bytes (toggle if all you hear is static)"
+msgstr "Замени аудио-бајт редослед (искључити ако не чујете нормалан звук)"
+
+#. SID decoder plugin
+#: ../translation/extra.c:58
+#, fuzzy
+msgid "Enable HVSC Songlength DB"
+msgstr "Омогући HVSC"
+
+#: ../translation/extra.c:59
+#, fuzzy
+msgid "Songlengths.txt (from HVSC)"
+msgstr "Songlengths.txt (from HVSC)"
+
+#: ../translation/extra.c:60
+msgid "Bits per sample (8 or 16)"
+msgstr "бита по узорку (8 или 16)"
+
+#: ../translation/extra.c:61
+msgid "Default song length (sec)"
+msgstr "Подразумевано трајање песме (секунди)"
+
+#. WildMidi player plugin
+#: ../translation/extra.c:63
+msgid "Timidity++ bank configuration file"
+msgstr "Подешавања за Timidity++"
+
+#: ../translation/extra.c:66
+msgid "Track Title"
+msgstr "Наслов песме"
+
+#: ../translation/extra.c:67
+msgid "Performer"
+msgstr "Извођач"
+
+#: ../translation/extra.c:72
+msgid "Total Tracks"
+msgstr "Укупно песмама"
+
+#: ../translation/extra.c:73
+msgid "Genre"
+msgstr "Жанр"
+
+#: ../translation/extra.c:74
+msgid "Composer"
+msgstr "Композитор"
+
+#: ../translation/extra.c:75
+msgid "Disc Number"
+msgstr "Број диска"
+
+#: ../translation/extra.c:76
+msgid "Comment"
+msgstr "Напомена"
+
+#: ../translation/extra.c:77
+msgid "Encoder / Vendor"
+msgstr "Енкодер / Испоручилац"
+
+#: ../translation/extra.c:79
+msgid "Location"
+msgstr "Додај место"
+
+#: ../translation/extra.c:80
+msgid "Subtrack Index"
+msgstr ""
+
+#: ../translation/extra.c:81
+msgid "Tag Type(s)"
+msgstr "Тип(ови) ознаке"
+
+#: ../translation/extra.c:82
+msgid "Embedded Cuesheet"
+msgstr "Угњеждени Cuesheet"
+
+#: ../translation/extra.c:83
+msgid "Codec"
+msgstr "Кодек"
+
+#. FFmpeg deocder plugin
+#: ../translation/extra.c:85
+msgid "File Extensions (separate with ';')"
+msgstr "Наставци имена датотека (раздвоји са ;)"
+
+#. Converter GUI
+#: ../translation/extra.c:87
+msgid "Convert"
+msgstr "Прекодирај"
+
+#. Resampler (Secret Rabbit Code)
+#: ../translation/extra.c:89
+msgid "Target Samplerate"
+msgstr "Циљна фреквенција узорковања"
+
+#: ../translation/extra.c:90
+msgid "Quality / Algorythm"
+msgstr "Квалитет / Алгоритам"
+
+#: ../translation/extra.c:91
+msgid "Automatic Samplerate (overrides Target Samplerate)"
+msgstr "Аутоматска фреквенција узорковања (преклапа циљну фреквенцију узорковања)"
+
+#: ../plugins/converter/convgui.c:108
+msgid "The file already exists. Overwrite?"
+msgstr "Датотека са истим именом већ постоји. Да ли да препишем преко ње?"
+
+#: ../plugins/converter/convgui.c:110
+msgid "Converter warning"
+msgstr "Упозорење прекодера"
+
+#: ../plugins/converter/convgui.c:222
+msgid "Please select encoder"
+msgstr "Одаберите кодер"
+
+#: ../plugins/converter/convgui.c:224
+msgid "Converter error"
+msgstr "Грешка прекодера"
+
+#: ../plugins/converter/convgui.c:248
+msgid "Converting..."
+msgstr "Прекодирам..."
+
+#: ../plugins/converter/convgui.c:394
+#: ../plugins/converter/convgui.c:496
+msgid "Select folder..."
+msgstr "Одаберите директоријум..."
+
+#: ../plugins/converter/convgui.c:635
+msgid "Failed to save encoder preset"
+msgstr "Није успело чување поставки кодера"
+
+#: ../plugins/converter/convgui.c:637
+#: ../plugins/converter/convgui.c:1035
+msgid "Check preset folder permissions, try to pick different title, or free up some disk space"
+msgstr "Проверите дозволе директоријума за чување поставки или дајте поставки друго име или проверите да ли имате довољно слободног простора на диску"
+
+#: ../plugins/converter/convgui.c:637
+#: ../plugins/converter/convgui.c:1035
+msgid "Preset with the same name already exists. Try to pick another title."
+msgstr "Поставка са истим именом већ постоји. Дајте поставци друго име."
+
+#: ../plugins/converter/convgui.c:638
+#: ../plugins/converter/convgui.c:1036
+msgid "Error"
+msgstr "Грешка"
+
+#: ../plugins/converter/convgui.c:692
+msgid "Add new encoder"
+msgstr "Додај нови кодер"
+
+#: ../plugins/converter/convgui.c:724
+msgid "Edit encoder"
+msgstr "Уреди кодер"
+
+#: ../plugins/converter/convgui.c:756
+#: ../plugins/converter/convgui.c:1133
+msgid "Remove preset"
+msgstr "Уклони поставку"
+
+#: ../plugins/converter/convgui.c:758
+#: ../plugins/converter/convgui.c:1135
+msgid "This action will delete the selected preset. Are you sure?"
+msgstr "Овом радњом ћете обрисати одабрану поставку. Да ли то заиста желите?"
+
+#: ../plugins/converter/convgui.c:782
+msgid "Encoders"
+msgstr "Кодери"
+
+#: ../plugins/converter/convgui.c:838
+#: ../plugins/gtkui/dspconfig.c:183
+msgid "Add plugin to DSP chain"
+msgstr ""
+
+#: ../plugins/converter/convgui.c:1034
+msgid "Failed to save DSP preset"
+msgstr "Није успело чување поставки за дигиталну обраду"
+
+#: ../plugins/converter/convgui.c:1098
+msgid "New DSP Preset"
+msgstr "Нова поставка за дигиталну обраду"
+
+#: ../plugins/converter/convgui.c:1183
+msgid "Edit DSP Preset"
+msgstr "Уреди поставку за дигиталну обраду"
+
+#: ../plugins/converter/convgui.c:1203
+msgid "DSP Presets"
+msgstr "Поставке за дигиталну обраду"
+
+#: ../plugins/converter/interface.c:94
+msgid "Output folder:"
+msgstr "Излазни директоријум:"
+
+#: ../plugins/converter/interface.c:115
+msgid "Output file name:"
+msgstr "Име датотеке на излазу:"
+
+#: ../plugins/converter/interface.c:126
+msgid ""
+"Extension (e.g. .mp3) will be appended automatically.\n"
+"Leave the field empty for default (%a - %t)."
+msgstr ""
+"Сам ћу додати наставак имена датотеке (нпр. .mp3).\n"
+"За подразумевано именовање датотеке (%a - %t) \n"
+"оставите ово поље празним."
+
+#: ../plugins/converter/interface.c:139
+msgid "Encoder:"
+msgstr "Кодер:"
+
+#: ../plugins/converter/interface.c:163
+msgid "DSP preset:"
+msgstr "Поставка за дигиталну обраду:"
+
+#: ../plugins/converter/interface.c:186
+msgid "Number of threads:"
+msgstr "Број нити:"
+
+#: ../plugins/converter/interface.c:199
+msgid "Output sample format:"
+msgstr "Излазна дубина бита узорка:"
+
+#: ../plugins/converter/interface.c:206
+msgid "Keep source format"
+msgstr "Као у изворној датотеци"
+
+#: ../plugins/converter/interface.c:207
+msgid "8 bit signed int"
+msgstr "Означена 8-битно целобројна"
+
+#: ../plugins/converter/interface.c:208
+msgid "16 bit signed int"
+msgstr "Означена 16-битно целобројна"
+
+#: ../plugins/converter/interface.c:209
+msgid "24 bit signed int"
+msgstr "Означена 24-битно целобројна"
+
+#: ../plugins/converter/interface.c:210
+msgid "32 bit signed int"
+msgstr "Означена 32-битно целобројна"
+
+#: ../plugins/converter/interface.c:211
+msgid "32 bit float"
+msgstr "32-битно једнострука"
+
+#: ../plugins/converter/interface.c:217
+msgid "When file exists:"
+msgstr "Уколико датотека већ постоји:"
+
+#: ../plugins/converter/interface.c:224
+msgid "Prompt"
+msgstr "Питај ме"
+
+#: ../plugins/converter/interface.c:225
+msgid "Overwrite"
+msgstr "Препиши"
+
+#: ../plugins/converter/interface.c:227
+msgid "Preserve folder structure, starting from:"
+msgstr "Сачувај структуру директоријума, почевши од:"
+
+#: ../plugins/converter/interface.c:379
+msgid "Edit Encoder Preset"
+msgstr "Уреди поставке кодера"
+
+#: ../plugins/converter/interface.c:402
+msgid "Untitled Encoder"
+msgstr "Неименован кодер"
+
+#: ../plugins/converter/interface.c:410
+msgid "Output file extension:"
+msgstr "Наставак имена датотеке на излазу:"
+
+#: ../plugins/converter/interface.c:417
+msgid "E.g. mp3"
+msgstr "Нпр. mp3"
+
+#: ../plugins/converter/interface.c:425
+msgid "Command line:"
+msgstr "Линија наредбе:"
+
+#: ../plugins/converter/interface.c:436
+#, c-format
+msgid ""
+"Example: lame - %o\n"
+"%i for input file, %o for output file, - for stdin"
+msgstr ""
+"На пример: lame - %o\n"
+"%i за улазну датотеку, %o за излазну датотеку, - за стандардни улаз (stdin)"
+
+#: ../plugins/converter/interface.c:446
+#, c-format
+msgid ""
+"<small>%o - output file name\n"
+"%i - temporary input file name</small>"
+msgstr ""
+"<small>%o - име излазне датотеке\n"
+"%i - привренено име улазне датотеке</small>"
+
+#: ../plugins/converter/interface.c:455
+msgid "Method:"
+msgstr "Метод:"
+
+#: ../plugins/converter/interface.c:462
+msgid "Pipe"
+msgstr "Цев"
+
+#: ../plugins/converter/interface.c:463
+msgid "Temporary file"
+msgstr "Привремена датотека"
+
+#: ../plugins/converter/interface.c:480
+msgid "APEv2"
+msgstr "Уписуј APEv2"
+
+#: ../plugins/converter/interface.c:486
+msgid "ID3v1"
+msgstr "Уписуј ID3v1"
+
+#: ../plugins/converter/interface.c:492
+msgid "OggVorbis"
+msgstr "OggVorbis"
+
+#: ../plugins/converter/interface.c:498
+msgid "FLAC"
+msgstr "FLAC"
+
+#: ../plugins/converter/interface.c:510
+msgid "ID3v2"
+msgstr "Уписуј ID3v2"
+
+#: ../plugins/converter/interface.c:520
+msgid "<b>Tag writer</b>"
+msgstr "<b>Писач ознака</b>"
+
+#: ../plugins/converter/interface.c:606
+msgid "DSP Preset Editor"
+msgstr "Уређивач поставки за дигиталну обраду"
+
+#: ../plugins/converter/interface.c:629
+msgid "Untitled DSP Preset"
+msgstr "Неименована поставка за дигиталну обраду"
+
+#~ msgid "Save playlist as"
+#~ msgstr "Сачувај листу као..."
+
+#, fuzzy
+#~ msgid "editcolumndlg"
+#~ msgstr "editcolumndlg"
+
+#~ msgid "Length"
+#~ msgstr "Трајање"
+
+#~ msgid ""
+#~ "Format conversions (start with %):\n"
+#~ " [a]rtist, [t]itle, al[b]um, [B]and, [C]omposer\n"
+#~ " track[n]umber, [N]totaltracks,\n"
+#~ " [l]ength, [y]ear, [g]enre, [c]omment,\n"
+#~ " copy[r]ight, [f]ilename, [F]ullPathname, [T]ags,\n"
+#~ " [d]irectory, [D]irectoryWithPath\n"
+#~ "Example: %a - %t [%l]"
+#~ msgstr ""
+#~ "Претварања формата (започните са %):\n"
+#~ " извођ[a]ч, [t]-наслов, [b]-албум, [B]-група,\n"
+#~ " [C]-композитор, [n]-број песме, [N]-укупно песама,\n"
+#~ " [l]-трајање, [y]-година, [g]-жанр, [c]-примедба,\n"
+#~ " [r]-ауторска права, [f]-датотека, [T]-ознке\n"
+#~ "На пример: %a - %t [%l]"
+
+#~ msgid "Allow dynamic samplerate switching"
+#~ msgstr "Дозволи динамичко пребацивање фреквенције узорковања"
+
+#~ msgid "Samplerate conversion quality:"
+#~ msgstr "Квалитет претварања фреквенције узорковања"
+
+#~ msgid "Description:"
+#~ msgstr "Опис:"
+
+#~ msgid "Author(s):"
+#~ msgstr "Аутор(и):"
+
+#~ msgid "Email:"
+#~ msgstr "Е-пошта:"
+
+#~ msgid "Website:"
+#~ msgstr "Интернет адреса:"
+
+#, fuzzy
+#~ msgid "editplaylistdlg"
+#~ msgstr "editplaylistdlg"
+
+#~ msgid ""
+#~ "Format conversions (start with %):\n"
+#~ " [a]rtist, [t]itle, al[b]um, [B]and, [C]omposer\n"
+#~ " track[n]umber, [N]totaltracks,\n"
+#~ " [l]ength, [y]ear, [g]enre, [c]omment,\n"
+#~ " copy[r]ight, [f]ilename, [T]ags\n"
+#~ "Example: %a - %t [%l]"
+#~ msgstr ""
+#~ "Претварања формата (започните са %):\n"
+#~ " извођ[a]ч, [t]-наслов, [b]-албум, [B]-група,\n"
+#~ " [C]-композитор, [n]-број песме, [N]-укупно песама,\n"
+#~ " [l]-трајање, [y]-година, [g]-жанр, [c]-примедба,\n"
+#~ " [r]-ауторска права, [f]-датотека, [T]-ознке\n"
+#~ "На пример: %a - %t [%l]"
+
+#~ msgid "Title / Track Artist"
+#~ msgstr "Наслов / Извођач песме"
+
+#~ msgid "Setup %s"
+#~ msgstr "Подешавање %s"
+
+#~ msgid "ALSA output plugin"
+#~ msgstr "ALSA излазни додатак"
+
+#~ msgid "DeaDBeeF now playing"
+#~ msgstr "Сада се репродукује"
+
+#~ msgid "HVSC path"
+#~ msgstr "Путања за HVSC"
+
+#~ msgid "_Abort"
+#~ msgstr "Одуст_ани"
+
+#~ msgid ""
+#~ "<b>WARNING</b>: tag writing feature is still in development.\n"
+#~ "<b>Make backup copies</b> before using."
+#~ msgstr ""
+#~ "<b>УПОЗОРЕЊЕ</b>: Уписивање ознака у песме је још увек у развоју.\n"
+#~ "Пре употребе <b>направите резервну копију</b> песама."
+
+#~ msgid "Sound (adv.)"
+#~ msgstr "Звук (напредно)"
+
+#~ msgid "Couldn't get enough memory for input buffering."
+#~ msgstr "Не могу резервисати довољно меморије за улазно складиште."
+
+#~ msgid "Error reading first page of Ogg bitstream."
+#~ msgstr "Грешка код читања прве стране Ogg битског тока."
+
+#~ msgid "Error reading initial header packet."
+#~ msgstr "Грешка код читања почетног пакета заглавља."
+
+#~ msgid "Couldn't get enough memory to register new stream serial number."
+#~ msgstr ""
+#~ "Не могу резервисати довољно меморије за регистровање серијског броја "
+#~ "новог тока.."
+
+#~ msgid "Input truncated or empty."
+#~ msgstr "Улаз је или одбачен или празан."
+
+#~ msgid "Input is not an Ogg bitstream."
+#~ msgstr "Улаз није Ogg битски ток."
+
+#~ msgid "Ogg bitstream does not contain Vorbis data."
+#~ msgstr "Ogg битски ток не садржи Vorbis податке."
+
+#, fuzzy
+#~ msgid "EOF before recognised stream."
+#~ msgstr "EOF пре разматрања тока."
+
+#~ msgid "Ogg bitstream does not contain a supported data-type."
+#~ msgstr "Ogg битски ток не садржи подржани тип података."
+
+#~ msgid "Corrupt secondary header."
+#~ msgstr "Оштећено друго заглавље."
+
+#~ msgid "EOF before end of Vorbis headers."
+#~ msgstr "EOF пре краја Vorbis заглавља."
+
+#, fuzzy
+#~ msgid "Corrupt or missing data, continuing..."
+#~ msgstr "Оштећени или недостајући подаци. Настављам..."
+
+#~ msgid ""
+#~ "Error writing stream to output. Output stream may be corrupted or "
+#~ "truncated."
+#~ msgstr ""
+#~ "Грешка у писању на излазни ток. Излазни ток је можда оштећен или одбачен."
diff --git a/streamer.c b/streamer.c
index fef89165..9baac953 100644
--- a/streamer.c
+++ b/streamer.c
@@ -466,6 +466,13 @@ streamer_move_to_nextsong (int reason) {
}
else if (pl_order == PLAYBACK_ORDER_LINEAR) { // linear
playItem_t *it = NULL;
+ if (!curr) {
+ int cur = plt_get_cursor (streamer_playlist, PL_MAIN);
+ if (cur != -1) {
+ curr = plt_get_item_for_idx (streamer_playlist, cur, PL_MAIN);
+ pl_item_unref (curr);
+ }
+ }
if (curr) {
it = curr->next[PL_MAIN];
}
@@ -583,6 +590,13 @@ streamer_move_to_prevsong (void) {
}
else if (pl_order == PLAYBACK_ORDER_LINEAR) { // linear
playItem_t *it = NULL;
+ if (!playlist_track) {
+ int cur = plt_get_cursor (streamer_playlist, PL_MAIN);
+ if (cur != -1) {
+ playlist_track = plt_get_item_for_idx (streamer_playlist, cur, PL_MAIN);
+ pl_item_unref (playlist_track);
+ }
+ }
if (playlist_track) {
it = playlist_track->prev[PL_MAIN];
}
@@ -713,7 +727,9 @@ streamer_set_current (playItem_t *it) {
// try to get content-type
mutex_lock (decodemutex);
trace ("\033[0;34mopening file %s\033[37;0m\n", pl_find_meta (it, ":URI"));
+ pl_lock ();
DB_FILE *fp = streamer_file = vfs_fopen (pl_find_meta (it, ":URI"));
+ pl_unlock ();
mutex_unlock (decodemutex);
const char *plug = NULL;
trace ("\033[0;34mgetting content-type\033[37;0m\n");
@@ -760,8 +776,9 @@ streamer_set_current (playItem_t *it) {
trace ("failed to alloc %d bytes for playlist buffer\n");
goto m3u_error;
}
+ trace ("reading %d bytes\n", size);
int rd = vfs_fread (buf, 1, size, fp);
- if (rd != size) {
+ if (rd <= 0) {
trace ("failed to download %d bytes (got %d bytes)\n", size, rd);
goto m3u_error;
}
@@ -777,13 +794,14 @@ streamer_set_current (playItem_t *it) {
trace ("failed to open temp file %s\n", tempfile);
goto m3u_error;
}
+ trace ("writing to %s\n", tempfile);
out = fdopen (fd, "w+b");
if (!out) {
trace ("fdopen failed for %s\n", tempfile);
goto m3u_error;
}
- int rw = fwrite (buf, 1, size, out);
- if (rw != size) {
+ int rw = fwrite (buf, 1, rd, out);
+ if (rw != rd) {
trace ("failed to write %d bytes into file %s\n", size, tempfile);
goto m3u_error;
}
@@ -791,6 +809,7 @@ streamer_set_current (playItem_t *it) {
fd = -1;
out = NULL;
+ trace ("loading playlist from %s\n", tempfile);
// load playlist
playlist_t *plt = plt_alloc ("temp");
DB_playlist_t **plug = plug_get_playlist_list ();
@@ -815,7 +834,9 @@ streamer_set_current (playItem_t *it) {
pl_item_ref (i);
int res = -1;
while (i) {
+ pl_lock ();
pl_replace_meta (it, "!URI", pl_find_meta_raw (i, ":URI"));
+ pl_unlock ();
res = streamer_set_current (it);
if (!res) {
pl_item_unref (i);
@@ -840,6 +861,7 @@ streamer_set_current (playItem_t *it) {
unlink (tempfile);
m3u_error:
+ err = -1;
if (buf) {
free (buf);
}
@@ -877,6 +899,7 @@ m3u_error:
dec = plug_get_decoder_for_id (decoder_id);
if (!dec) {
// find new decoder by file extension
+ pl_lock ();
const char *fname = pl_find_meta (it, ":URI");
const char *ext = strrchr (fname, '.');
if (ext) {
@@ -897,6 +920,7 @@ m3u_error:
}
}
}
+ pl_unlock ();
}
if (dec) {
trace ("\033[0;33minit decoder for %s (%s)\033[37;0m\n", pl_find_meta (it, ":URI"), decoder_id);
@@ -1201,7 +1225,6 @@ streamer_thread (void *ctx) {
bytes_until_next_song = -1;
trace ("nextsong=-2\n");
nextsong = -1;
- output->stop ();
if (playing_track) {
trace ("sending songfinished to plugins [1]\n");
send_songfinished (playing_track);
@@ -1219,6 +1242,7 @@ streamer_thread (void *ctx) {
pl_item_unref (from);
}
streamer_unlock ();
+ output->stop ();
continue;
}
else if (output->state () == OUTPUT_STATE_STOPPED) {
@@ -1411,6 +1435,9 @@ streamer_thread (void *ctx) {
do {
int prev_buns = bytes_until_next_song;
int nb = streamer_read_async (readbuffer+bytesread,sz-bytesread);
+ if (nb <= 0) {
+ break;
+ }
bytesread += nb;
struct timeval tm2;
gettimeofday (&tm2, NULL);
@@ -1555,29 +1582,47 @@ error:
int
streamer_dsp_chain_save_internal (const char *fname, ddb_dsp_context_t *chain) {
- FILE *fp = fopen (fname, "w+t");
+ char tempfile[PATH_MAX];
+ snprintf (tempfile, sizeof (tempfile), "%s.tmp", fname);
+ FILE *fp = fopen (tempfile, "w+t");
if (!fp) {
return -1;
}
ddb_dsp_context_t *ctx = chain;
while (ctx) {
- fprintf (fp, "%s %d {\n", ctx->plugin->plugin.id, (int)ctx->enabled);
+ if (fprintf (fp, "%s %d {\n", ctx->plugin->plugin.id, (int)ctx->enabled) < 0) {
+ fprintf (stderr, "write to %s failed (%s)\n", tempfile, strerror (errno));
+ goto error;
+ }
if (ctx->plugin->num_params) {
int n = ctx->plugin->num_params ();
int i;
for (i = 0; i < n; i++) {
char v[1000];
ctx->plugin->get_param (ctx, i, v, sizeof (v));
- fprintf (fp, "\t%s\n", v);
+ if (fprintf (fp, "\t%s\n", v) < 0) {
+ fprintf (stderr, "write to %s failed (%s)\n", tempfile, strerror (errno));
+ goto error;
+ }
}
}
- fprintf (fp, "}\n");
+ if (fprintf (fp, "}\n") < 0) {
+ fprintf (stderr, "write to %s failed (%s)\n", tempfile, strerror (errno));
+ goto error;
+ }
ctx = ctx->next;
}
fclose (fp);
+ if (rename (tempfile, fname) != 0) {
+ fprintf (stderr, "dspconfig rename %s -> %s failed: %s\n", tempfile, fname, strerror (errno));
+ return -1;
+ }
return 0;
+error:
+ fclose (fp);
+ return -1;
}
int
@@ -2267,6 +2312,7 @@ streamer_set_dsp_chain (ddb_dsp_context_t *chain) {
if (playing_track && output->state () != OUTPUT_STATE_STOPPED) {
streamer_set_seek (playpos);
}
+ messagepump_push (DB_EV_DSPCHAINCHANGED, 0, 0, 0);
}
void
@@ -2281,6 +2327,7 @@ streamer_notify_order_changed (int prev_order, int new_order) {
playItem_t *curr = playing_track;
if (curr) {
+ pl_lock ();
const char *alb = pl_find_meta_raw (curr, "album");
const char *art = pl_find_meta_raw (curr, "artist");
playItem_t *next = curr->prev[PL_MAIN];
@@ -2293,6 +2340,7 @@ streamer_notify_order_changed (int prev_order, int new_order) {
break;
}
}
+ pl_unlock ();
}
streamer_unlock ();
}
diff --git a/tools/apbuild/apgcc b/tools/apbuild/apgcc
index 2aba0071..ddda846b 100755
--- a/tools/apbuild/apgcc
+++ b/tools/apbuild/apgcc
@@ -19,7 +19,6 @@ use Apbuild::Utils;
# Don't forget to bump the version in Makefile too.
our $APBUILD_VERSION = "2.0.9";
-
######## Initialization ########
# In C mode:
@@ -75,7 +74,7 @@ if (!defined $appath) {
$appath =~ s/\/*$//g;
$appath =~ s/^(.*)\/.*?$/$1/;
$appath .= '/include/apbuild';
- if (! -f "$appath/apsymbols.h" && -f "$FindBin::Bin/apsymbols.h") {
+ if (! -f "$appath/apsymbols.h.i686" && -f "$FindBin::Bin/apsymbols.h.i686") {
$appath = $FindBin::Bin;
}
}
diff --git a/tools/apbuild/apinit b/tools/apbuild/apinit
new file mode 100755
index 00000000..37892303
--- /dev/null
+++ b/tools/apbuild/apinit
@@ -0,0 +1,9 @@
+#!/usr/bin/env perl
+use warnings;
+use strict;
+
+my $arch=`uname -m`;
+chomp $arch;
+`cp apsymbols.h.$arch apsymbols.h`;
+
+
diff --git a/tools/apbuild/apsymbols.h b/tools/apbuild/apsymbols.h.i686
index 32c7b18c..32c7b18c 100644
--- a/tools/apbuild/apsymbols.h
+++ b/tools/apbuild/apsymbols.h.i686
diff --git a/tools/apbuild/apsymbols.h.x86_64 b/tools/apbuild/apsymbols.h.x86_64
new file mode 100644
index 00000000..aaf99264
--- /dev/null
+++ b/tools/apbuild/apsymbols.h.x86_64
@@ -0,0 +1,281 @@
+/* apbuild embedded metadata */
+#define APBUILD_NOTE_METADATA(s) __asm__(".section .metadata, \"MS\", @note, 1\n\t.string \"" s "\"\n\t.previous\n\t")
+
+#ifdef APBUILD_VERSION
+APBUILD_NOTE_METADATA("apbuild.version=" APBUILD_VERSION);
+#endif
+
+/* apbuild generated symbol exclusion list */
+__asm__(".symver clnt_pcreateerror,clnt_pcreateerror@GLIBC_2.2.5");
+__asm__(".symver clnt_spcreateerror,clnt_spcreateerror@GLIBC_2.2.5");
+__asm__(".symver feupdateenv,feupdateenv@GLIBC_2.2.5");
+__asm__(".symver lio_listio,lio_listio@GLIBC_2.2.5");
+__asm__(".symver lio_listio64,lio_listio64@GLIBC_2.2.5");
+__asm__(".symver mkostemps,mkostemps@GLIBC_2.11");
+__asm__(".symver mkostemps64,mkostemps64@GLIBC_2.11");
+__asm__(".symver nftw,nftw@GLIBC_2.2.5");
+__asm__(".symver nftw64,nftw64@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_broadcast,pthread_cond_broadcast@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_destroy,pthread_cond_destroy@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_init,pthread_cond_init@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_signal,pthread_cond_signal@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_timedwait,pthread_cond_timedwait@GLIBC_2.2.5");
+__asm__(".symver pthread_cond_wait,pthread_cond_wait@GLIBC_2.2.5");
+__asm__(".symver regexec,regexec@GLIBC_2.2.5");
+__asm__(".symver rpc_createerr,rpc_createerr@GLIBC_2.2.5");
+__asm__(".symver __rpc_thread_createerr,__rpc_thread_createerr@GLIBC_2.2.5");
+__asm__(".symver __strtoll_l,__strtoll_l@GLIBC_2.2.5");
+__asm__(".symver __strtoull_l,__strtoull_l@GLIBC_2.2.5");
+/*__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.3");
+__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.3");*/
+__asm__(".symver _sys_errlist,_sys_errlist@GLIBC_2.2.5");
+__asm__(".symver sys_errlist,sys_errlist@GLIBC_2.2.5");
+/*__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.3");
+__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.3");*/
+__asm__(".symver _sys_nerr,_sys_nerr@GLIBC_2.2.5");
+__asm__(".symver sys_nerr,sys_nerr@GLIBC_2.2.5");
+__asm__(".symver sys_sigabbrev,sys_sigabbrev@GLIBC_2.2.5");
+__asm__(".symver _sys_siglist,_sys_siglist@GLIBC_2.2.5");
+__asm__(".symver sys_siglist,sys_siglist@GLIBC_2.2.5");
+__asm__(".symver timer_create,timer_create@GLIBC_2.2.5");
+__asm__(".symver timer_delete,timer_delete@GLIBC_2.2.5");
+__asm__(".symver timer_getoverrun,timer_getoverrun@GLIBC_2.2.5");
+__asm__(".symver timer_gettime,timer_gettime@GLIBC_2.2.5");
+__asm__(".symver timer_settime,timer_settime@GLIBC_2.2.5");
+__asm__(".symver __gethostname_chk,__gethostname_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver epoll_create,epoll_create@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __getdomainname_chk,__getdomainname_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vswprintf_chk,__vswprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __stpcpy_chk,__stpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver timerfd_gettime,timerfd_gettime@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inotify_init1,inotify_init1@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcstombs_chk,__wcstombs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __printf_chk,__printf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fgetws_chk,__fgetws_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __register_atfork,__register_atfork@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver gnu_dev_major,gnu_dev_major@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vfwprintf_chk,__vfwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcpcpy_chk,__wcpcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver open_wmemstream,open_wmemstream@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_append,inet6_opt_append@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver timerfd_create,timerfd_create@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __swprintf_chk,__swprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver getipv4sourcefilter,getipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vwprintf_chk,__vwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver readlinkat,readlinkat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wctomb_chk,__wctomb_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __readlink_chk,__readlink_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver setipv4sourcefilter,setipv4sourcefilter@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_sscanf,__isoc99_sscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __getlogin_r_chk,__getlogin_r_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver sync_file_range,sync_file_range@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __open64_2,__open64_2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_init,inet6_rth_init@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_next,inet6_opt_next@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fxstatat64,__fxstatat64@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver unlinkat,unlinkat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fwprintf_chk,__fwprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __mempcpy_chk,__mempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver epoll_wait,epoll_wait@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mkfifoat,mkfifoat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_scanf,__isoc99_scanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __read_chk,__read_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fgetws_unlocked_chk,__fgetws_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vsprintf_chk,__vsprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcsncpy_chk,__wcsncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __stack_chk_fail,__stack_chk_fail@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inotify_rm_watch,inotify_rm_watch@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver xdr_quad_t,xdr_quad_t@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __sched_cpualloc,__sched_cpualloc@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __obstack_vprintf_chk,__obstack_vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_swscanf,__isoc99_swscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vfwscanf,__isoc99_vfwscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __sched_cpufree,__sched_cpufree@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_finish,inet6_opt_finish@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __confstr_chk,__confstr_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcsncat_chk,__wcsncat_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver setsourcefilter,setsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver xdr_u_quad_t,xdr_u_quad_t@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fread_unlocked_chk,__fread_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver eaccess,eaccess@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_alloc,inet6_option_alloc@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __openat64_2,__openat64_2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver sched_setaffinity,sched_setaffinity@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_append,inet6_option_append@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver futimens,futimens@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver renameat,renameat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wmemset_chk,__wmemset_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_get_val,inet6_opt_get_val@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver unshare,unshare@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vsscanf,__isoc99_vsscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver signalfd,signalfd@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_next,inet6_option_next@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_add,inet6_rth_add@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver semtimedop,semtimedop@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver utimensat,utimensat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_segments,inet6_rth_segments@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pread_chk,__pread_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __syslog_chk,__syslog_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver eventfd,eventfd@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fgets_unlocked_chk,__fgets_unlocked_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __getcwd_chk,__getcwd_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver fchmodat,fchmodat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver dup3,dup3@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vprintf_chk,__vprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fprintf_chk,__fprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wmemcpy_chk,__wmemcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_wscanf,__isoc99_wscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcscpy_chk,__wcscpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_fscanf,__isoc99_fscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __mbstowcs_chk,__mbstowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __dprintf_chk,__dprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wmempcpy_chk,__wmempcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver symlinkat,symlinkat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __memmove_chk,__memmove_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __getwd_chk,__getwd_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vsnprintf_chk,__vsnprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mkostemp64,mkostemp64@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver eventfd_read,eventfd_read@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver remap_file_pages,remap_file_pages@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vswscanf,__isoc99_vswscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver fdopendir,fdopendir@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __openat_2,__openat_2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fgets_chk,__fgets_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __strncpy_chk,__strncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __sched_cpucount,__sched_cpucount@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __mbsrtowcs_chk,__mbsrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcscat_chk,__wcscat_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_space,inet6_option_space@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver sched_getaffinity,sched_getaffinity@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __open_2,__open_2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver fchownat,fchownat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver timerfd_settime,timerfd_settime@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver sched_getcpu,sched_getcpu@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __getgroups_chk,__getgroups_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_init,inet6_opt_init@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __snprintf_chk,__snprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mkdirat,mkdirat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __memset_chk,__memset_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __strncat_chk,__strncat_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_space,inet6_rth_space@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __recv_chk,__recv_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_reverse,inet6_rth_reverse@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __realpath_chk,__realpath_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver qsort_r,qsort_r@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __obstack_printf_chk,__obstack_printf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_rth_getaddr,inet6_rth_getaddr@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver splice,splice@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver eventfd_write,eventfd_write@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver vmsplice,vmsplice@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver getsourcefilter,getsourcefilter@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vwscanf,__isoc99_vwscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver epoll_ctl,epoll_ctl@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver gnu_dev_minor,gnu_dev_minor@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __memcpy_chk,__memcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vfscanf,__isoc99_vfscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __stpncpy_chk,__stpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_find,inet6_opt_find@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __mbsnrtowcs_chk,__mbsnrtowcs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver strerror_l,strerror_l@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __fread_chk,__fread_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcsnrtombs_chk,__wcsnrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wprintf_chk,__wprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver epoll_create1,epoll_create1@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vfprintf_chk,__vfprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vsyslog_chk,__vsyslog_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inotify_add_watch,inotify_add_watch@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcrtomb_chk,__wcrtomb_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver epoll_pwait,epoll_pwait@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __strcpy_chk,__strcpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vdprintf_chk,__vdprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __vasprintf_chk,__vasprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __xpg_strerror_r,__xpg_strerror_r@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcpncpy_chk,__wcpncpy_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_init,inet6_option_init@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wmemmove_chk,__wmemmove_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __sprintf_chk,__sprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver futimesat,futimesat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pread64_chk,__pread64_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver strptime_l,strptime_l@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver lchmod,lchmod@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __chk_fail,__chk_fail@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_vscanf,__isoc99_vscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __wcsrtombs_chk,__wcsrtombs_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pipe2,pipe2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __strcat_chk,__strcat_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver faccessat,faccessat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __asprintf_chk,__asprintf_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ppoll,ppoll@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __recvfrom_chk,__recvfrom_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_opt_set_val,inet6_opt_set_val@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __ptsname_r_chk,__ptsname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __isoc99_fwscanf,__isoc99_fwscanf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __gets_chk,__gets_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver gnu_dev_makedev,gnu_dev_makedev@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __xmknodat,__xmknodat@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver inet6_option_find,inet6_option_find@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __ttyname_r_chk,__ttyname_r_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __readlinkat_chk,__readlinkat_chk@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver dlinfo,dlinfo@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver dladdr1,dladdr1@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver dlmopen,dlmopen@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_getprotocol,pthread_mutexattr_getprotocol@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutex_setprioceiling,pthread_mutex_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_setprioceiling,pthread_mutexattr_setprioceiling@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pthread_unregister_cancel_restore,__pthread_unregister_cancel_restore@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_attr_setaffinity_np,pthread_attr_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pthread_cleanup_routine,__pthread_cleanup_routine@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_condattr_getclock,pthread_condattr_getclock@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pthread_register_cancel_defer,__pthread_register_cancel_defer@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __pthread_unwind_next,__pthread_unwind_next@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_timedjoin_np,pthread_timedjoin_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_setaffinity_np,pthread_setaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutex_getprioceiling,pthread_mutex_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_getprioceiling,pthread_mutexattr_getprioceiling@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_attr_getaffinity_np,pthread_attr_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_barrierattr_getpshared,pthread_barrierattr_getpshared@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_condattr_setclock,pthread_condattr_setclock@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_tryjoin_np,pthread_tryjoin_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_setschedprio,pthread_setschedprio@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_getaffinity_np,pthread_getaffinity_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_setrobust_np,pthread_mutexattr_setrobust_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_getrobust_np,pthread_mutexattr_getrobust_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutexattr_setprotocol,pthread_mutexattr_setprotocol@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver pthread_mutex_consistent_np,pthread_mutex_consistent_np@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_put16,ns_put16@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_initparse,ns_initparse@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __p_rcode,__p_rcode@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_msg_getflag,ns_msg_getflag@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_pack,ns_name_pack@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_skiprr,ns_skiprr@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_get32,ns_get32@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_makecanon,ns_makecanon@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_parse_ttl,ns_parse_ttl@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_datetosecs,ns_datetosecs@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_put32,ns_put32@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_format_ttl,ns_format_ttl@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_rollback,ns_name_rollback@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_subdomain,ns_subdomain@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_samedomain,ns_samedomain@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_pton,ns_name_pton@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_parserr,ns_parserr@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_uncompress,ns_name_uncompress@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_unpack,ns_name_unpack@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_skip,ns_name_skip@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_sprintrrf,ns_sprintrrf@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_compress,ns_name_compress@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_ntol,ns_name_ntol@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_name_ntop,ns_name_ntop@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_samename,ns_samename@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver ns_get16,ns_get16@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_timedreceive,mq_timedreceive@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_timedsend,mq_timedsend@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_setattr,mq_setattr@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_send,mq_send@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_unlink,mq_unlink@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver __mq_open_2,__mq_open_2@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_notify,mq_notify@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_receive,mq_receive@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_close,mq_close@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver mq_getattr,mq_getattr@GLIBC_DONT_USE_THIS_SYMBOL");
+__asm__(".symver td_thr_tlsbase,td_thr_tlsbase@GLIBC_DONT_USE_THIS_SYMBOL");
diff --git a/tools/apbuild/ctype.h b/tools/apbuild/ctype.h
index 2db84cc1..ee93b991 100644
--- a/tools/apbuild/ctype.h
+++ b/tools/apbuild/ctype.h
@@ -76,9 +76,15 @@ extern __const unsigned short int *__ctype_b; /* Characteristics. */
extern __const __int32_t *__ctype_tolower; /* Case conversions. */
extern __const __int32_t *__ctype_toupper; /* Case conversions. */
+#if __x86_64__
+__asm__(".symver __ctype_b,__ctype_b@GLIBC_2.2.5");
+__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.2.5");
+__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.2.5");
+#else
__asm__(".symver __ctype_b,__ctype_b@GLIBC_2.0");
-__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.0");
-__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.0");
+__asm__(".symver __ctype_tolower,__ctype_tolower@GLIBC_2.2.5");
+__asm__(".symver __ctype_toupper,__ctype_toupper@GLIBC_2.2.5");
+#endif
#define __isctype(c, type) \
(__ctype_b[(int) (c)] & (unsigned short int) type)
diff --git a/tools/packages/arch.sh b/tools/packages/arch.sh
new file mode 100755
index 00000000..ce171a67
--- /dev/null
+++ b/tools/packages/arch.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+PWD=`pwd`
+VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
+ARCH_VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print' | sed 's/-//'`
+BUILD=`cat PORTABLE_BUILD | perl -ne 'chomp and print'`
+ARCH=`uname -m | perl -ne 'chomp and print'`
+INDIR=$PWD/static/$ARCH/deadbeef-$VERSION
+TEMPDIR=$PWD/package_temp/$ARCH/arch-$VERSION
+PKGINFO=$TEMPDIR/.PKGINFO
+INSTALL=$TEMPDIR/.INSTALL
+OUTDIR=$PWD/package_out/$ARCH/arch
+
+# make dirs
+mkdir -p $TEMPDIR
+mkdir -p $OUTDIR
+
+# copy files
+cp -r $INDIR/* $TEMPDIR/
+# rm unneeded files
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.la
+for i in $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.0.0.0; do
+ n=$TEMPDIR/opt/deadbeef/lib/deadbeef/`basename $i .0.0.0`
+ mv $i $n
+ strip --strip-unneeded $n
+done
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.*
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.a
+
+# move icons and other shit to /usr
+mkdir -p $TEMPDIR/usr/share/
+mv $TEMPDIR/opt/deadbeef/share/applications $TEMPDIR/usr/share/
+sed -i 's/Exec=deadbeef/Exec=\/opt\/deadbeef\/bin\/deadbeef/g' $TEMPDIR/usr/share/applications/deadbeef.desktop
+mv $TEMPDIR/opt/deadbeef/share/icons $TEMPDIR/usr/share/
+
+# generate .PKGINFO
+echo "# `date -u`" >$PKGINFO
+echo "pkgver = $ARCH_VERSION-$BUILD" >>$PKGINFO
+echo "builddate = `date --utc +%s`" >>$PKGINFO
+echo "size = `du -sb $TEMPDIR | awk '{print $1}'`" >>$PKGINFO
+echo "arch = $ARCH" >>$PKGINFO
+cat tools/packages/arch_pkginfo >>$PKGINFO
+
+# generate .INSTALL
+cp tools/packages/arch_install $INSTALL
+
+# archive
+cd $TEMPDIR
+fakeroot -- tar Jcvf $OUTDIR/deadbeef-static-$ARCH_VERSION-$BUILD-$ARCH.pkg.tar.xz * .PKGINFO .INSTALL
diff --git a/tools/packages/arch_install b/tools/packages/arch_install
new file mode 100644
index 00000000..2c5696c8
--- /dev/null
+++ b/tools/packages/arch_install
@@ -0,0 +1,14 @@
+pkgname=deadbeef-static
+
+post_install() {
+ gtk-update-icon-cache -q -t -f usr/share/icons/hicolor
+ update-desktop-database -q
+}
+
+post_upgrade() {
+ post_install
+}
+
+post_remove() {
+ post_install
+}
diff --git a/tools/packages/arch_pkginfo b/tools/packages/arch_pkginfo
new file mode 100644
index 00000000..17d1c0f9
--- /dev/null
+++ b/tools/packages/arch_pkginfo
@@ -0,0 +1,11 @@
+pkgname = deadbeef-static
+pkgdesc = An audio player for GNU/Linux based on GTK2.
+url = http://deadbeef.sourceforge.net
+packager = Alexey Yakovenko <waker@users.sf.net>
+license = GPL2
+depend = gtk2
+depend = hicolor-icon-theme
+depend = desktop-file-utils
+optdepend = libx11: for global hotkeys plugin
+optdepend = alsa-lib: for ALSA output
+optdepend = pulseaudio: for PulseAudio output
diff --git a/tools/packages/deb_control b/tools/packages/deb_control
new file mode 100644
index 00000000..390276cb
--- /dev/null
+++ b/tools/packages/deb_control
@@ -0,0 +1,33 @@
+Package: deadbeef
+Maintainer: Alexey Yakovenko <waker@users.sf.net>
+Depends: libasound2 (>> 1.0.16), libc6 (>= 2.7-1), libcairo2 (>= 1.2.4), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.16.0), libgtk2.0-0 (>= 2.12.0), libpango1.0-0 (>= 1.20.3), libx11-6
+Recommends: libpulse0, libdbus-1-3
+Suggests:
+Section: sound
+Priority: optional
+Homepage: http://deadbeef.sourceforge.net/
+Description: ultimate music player for GNU/Linux systems
+ DeaDBeeF (as in 0xDEADBEEF) is an audio player for GNU/Linux systems with X11.
+ .
+ Features:
+ .
+ * mp3, ogg vorbis, flac, ape, wv, wav
+ * ID3v1, ID3v2.2, ID3v2.3, ID3v2.4, APEv2, xing/info tags support
+ * character set detection for non-unicode ID3 tags - supports cp1251
+ and iso8859-1
+ * unicode tags are fully supported as well (both utf8 and ucs2)
+ * cuesheet support for mp3, ogg, flac, ape
+ * autodetection of utf8/cp1251/iso8859-1 charsets in cuesheets
+ * sid and some popular chiptune formats like nsf
+ * tracker modules like mod, s3m, it, xm, etc
+ * HVSC song length database support for sid
+ * gtk2 interface with custom highly speed/memory optimized widgets
+ * no GNOME or KDE dependencies - just gtk2 and several small libraries
+ * minimize to tray, with scrollwheel volume control
+ * drag and drop, both inside of playlist, and from filemanagers and such
+ * control playback from command line (allows global hotkeys using xbindkeys)
+ * seeking works in all supported formats
+ * plugin support; ships with several standard plugins, such as global hotkeys
+ and last.fm scrobbler; sdk is included
+ * duration calculation is as precise as possible for vbr mp3
+ files (with and without xing/info tags)
diff --git a/tools/packages/deb_postinst b/tools/packages/deb_postinst
new file mode 100755
index 00000000..d0d5f4df
--- /dev/null
+++ b/tools/packages/deb_postinst
@@ -0,0 +1,7 @@
+#!/bin/sh
+set -e
+# Automatically added by dh_installmenu
+if [ "$1" = "configure" ] && [ -x "`which update-menus 2>/dev/null`" ]; then
+ update-menus
+fi
+# End automatically added section
diff --git a/tools/packages/deb_postrm b/tools/packages/deb_postrm
new file mode 100755
index 00000000..a30dbac6
--- /dev/null
+++ b/tools/packages/deb_postrm
@@ -0,0 +1,5 @@
+#!/bin/sh
+set -e
+# Automatically added by dh_installmenu
+if [ -x "`which update-menus 2>/dev/null`" ]; then update-menus ; fi
+# End automatically added section
diff --git a/tools/packages/debian.sh b/tools/packages/debian.sh
new file mode 100755
index 00000000..90d8acdd
--- /dev/null
+++ b/tools/packages/debian.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+PWD=`pwd`
+VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print'`
+DEB_VERSION=`cat PORTABLE_VERSION | perl -ne 'chomp and print' | sed 's/-/~/'`
+BUILD=`cat PORTABLE_BUILD | perl -ne 'chomp and print'`
+ARCH=`uname -m | perl -ne 'chomp and print'`
+INDIR=$PWD/static/$ARCH/deadbeef-$VERSION
+TEMPDIR=$PWD/package_temp/$ARCH/debian-$VERSION
+OUTDIR=$PWD/package_out/$ARCH/debian
+
+if [ "$ARCH" = "i686" ] ; then
+ DEB_ARCH=i386
+elif [ "$ARCH" = "x86_64" ] ; then
+ DEB_ARCH=amd64
+else
+ DEB_ARCH=unknown
+fi
+
+# make dirs
+rm -rf $TEMPDIR
+mkdir -p $TEMPDIR
+mkdir -p $OUTDIR
+
+# copy files
+cp -r $INDIR/* $TEMPDIR/
+# rm unneeded files
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.la
+for i in $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.0.0.0; do
+ n=$TEMPDIR/opt/deadbeef/lib/deadbeef/`basename $i .0.0.0`
+ mv $i $n
+ strip --strip-unneeded $n
+done
+strip --strip-unneeded $TEMPDIR/opt/deadbeef/bin/deadbeef
+
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so.*
+rm $TEMPDIR/opt/deadbeef/lib/deadbeef/*.a
+
+# move icons and other shit to /usr
+mkdir -p $TEMPDIR/usr/share/
+mv $TEMPDIR/opt/deadbeef/share/applications $TEMPDIR/usr/share/
+sed -i 's/Exec=deadbeef/Exec=\/opt\/deadbeef\/bin\/deadbeef/g' $TEMPDIR/usr/share/applications/deadbeef.desktop
+mv $TEMPDIR/opt/deadbeef/share/icons $TEMPDIR/usr/share/
+
+# generate debian-binary
+echo "2.0" >$TEMPDIR/debian-binary
+
+# generate control
+echo "Version: $VERSION-$BUILD" >$TEMPDIR/control
+echo "Installed-Size: `du -sb $TEMPDIR | awk '{print int($1/1024)}'`" >>$TEMPDIR/control
+echo "Architecture: $DEB_ARCH" >>$TEMPDIR/control
+cat $PWD/tools/packages/deb_control >>$TEMPDIR/control
+
+# copy postinst and postrm
+cp $PWD/tools/packages/deb_postinst $TEMPDIR/postinst
+cp $PWD/tools/packages/deb_postrm $TEMPDIR/postrm
+
+# generate md5sums
+cd $TEMPDIR
+rm $TEMPDIR/md5sums
+find ./opt -type f | while read i ; do
+ md5sum "$i" | sed 's/\.\///g' >>$TEMPDIR/md5sums
+done
+cd $PWD
+
+# generate shlibs
+pwd
+rm $TEMPDIR/shlibs
+ls $TEMPDIR/opt/deadbeef/lib/deadbeef/*.so | while read i ; do
+echo "`basename $i .so` 0 deadbeef" >>shlibs
+done
+
+# archive control
+cd $TEMPDIR
+fakeroot -- tar zcvf ./control.tar.gz ./control ./md5sums ./postrm ./postinst ./shlibs
+# archive data
+fakeroot -- tar zcvf ./data.tar.gz ./opt ./usr
+
+# make final archive
+fakeroot -- ar cr $OUTDIR/deadbeef_${DEB_VERSION}-${BUILD}_$DEB_ARCH.deb debian-binary control.tar.gz data.tar.gz
+
diff --git a/translation/extra.c b/translation/extra.c
index c702ac48..844e39db 100644
--- a/translation/extra.c
+++ b/translation/extra.c
@@ -1,6 +1,6 @@
// this file should list extra translatable strings that are not referenced
// directly in source code, e.g. scripted plugin configuration strings
-_("Add Audio CD")
+_("Add audio CD")
_("Lookup on Last.fm")
// ALSA output plugin
_("Use ALSA resampling")
@@ -13,6 +13,7 @@ _("Disable nowplaying")
_("Username")
_("Password")
_("Scrobble URL")
+_("Prefer Album Artist over Artist field")
// OSS output plugin
_("Device file")
_("OSS4 samplerate bug workaround")
@@ -33,8 +34,11 @@ _("Prefer CDDB protocol over HTTP")
_("Enable NRG image support")
// DUMB module player plugin
_("Resampling quality (0..2, higher is better)")
+_("8-bit output (default is 16)")
// Game_Music_Emu decoder plugin
_("Max song length (in minutes)")
+_("Fadeout length (seconds)")
+_("Play loops nr. of times (if available)")
// Standard GTK2 user interface plugin
_("Ask confirmation to delete files from disk")
_("Status icon volume control sensitivity")
@@ -87,5 +91,12 @@ _("File Extensions (separate with ';')")
_("Convert")
// Resampler (Secret Rabbit Code)
_("Target Samplerate")
-_("Quality / Algorythm")
+_("Quality / Algorithm")
_("Automatic Samplerate (overrides Target Samplerate)")
+// shellexecui
+_("Configure custom shell commands")
+// mpgmad
+_("Disable gapless playback (faster scanning)")
+// adplug
+_("Prefer Ken emu over Satoh (surround won't work)")
+_("Enable surround")
diff --git a/translators.txt b/translators.txt
index 93f3822a..5b96a29c 100644
--- a/translators.txt
+++ b/translators.txt
@@ -79,6 +79,7 @@ Ganda
kizito <kbirabwa@yahoo.co.uk>
Lithuanian
+ Algimantas Margevičius <margevicius.algimantas@gmail.com>
Julius <zadintuvas@gmail.com>
Bokmal, Norwegian