summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorHans Fugal <hans@fugal.net>2006-06-22 23:40:55 +0000
committerHans Fugal <hans@fugal.net>2006-06-22 23:40:55 +0000
commit7ff370e79895d7eb293e7214689b791bd98415fb (patch)
treed36f88880be2925593984ee43e73283af48a0119 /libs/ardour
parentfd742b30fa1071c44d053cf4676149641f977a35 (diff)
Merging from trunk
git-svn-id: svn://localhost/ardour2/branches/undo@638 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/SConscript14
-rw-r--r--libs/ardour/ardour/ardour.h2
-rw-r--r--libs/ardour/ardour/audio_diskstream.h (renamed from libs/ardour/ardour/diskstream.h)26
-rw-r--r--libs/ardour/ardour/audio_track.h8
-rw-r--r--libs/ardour/ardour/audiofilesource.h157
-rw-r--r--libs/ardour/ardour/audiofilter.h2
-rw-r--r--libs/ardour/ardour/audioregion.h12
-rw-r--r--libs/ardour/ardour/audiosource.h166
-rw-r--r--libs/ardour/ardour/constsource.h60
-rw-r--r--libs/ardour/ardour/coreaudio_source.h9
-rw-r--r--libs/ardour/ardour/cycle_timer.h18
-rw-r--r--libs/ardour/ardour/destructive_filesource.h19
-rw-r--r--libs/ardour/ardour/externalsource.h67
-rw-r--r--libs/ardour/ardour/filesource.h201
-rw-r--r--libs/ardour/ardour/io.h1
-rw-r--r--libs/ardour/ardour/osc.h2
-rw-r--r--libs/ardour/ardour/playlist.h1
-rw-r--r--libs/ardour/ardour/region.h1
-rw-r--r--libs/ardour/ardour/route.h2
-rw-r--r--libs/ardour/ardour/seqsource.h55
-rw-r--r--libs/ardour/ardour/session.h98
-rw-r--r--libs/ardour/ardour/session_diskstream.h6
-rw-r--r--libs/ardour/ardour/silentsource.h56
-rw-r--r--libs/ardour/ardour/sndfilesource.h46
-rw-r--r--libs/ardour/ardour/source.h130
-rw-r--r--libs/ardour/ardour/types.h40
-rw-r--r--libs/ardour/audio_diskstream.cc (renamed from libs/ardour/diskstream.cc)211
-rw-r--r--libs/ardour/audio_library.cc1
-rw-r--r--libs/ardour/audio_playlist.cc1
-rw-r--r--libs/ardour/audio_track.cc44
-rw-r--r--libs/ardour/audioengine.cc10
-rw-r--r--libs/ardour/audiofilesource.cc662
-rw-r--r--libs/ardour/audiofilter.cc13
-rw-r--r--libs/ardour/audioregion.cc17
-rw-r--r--libs/ardour/audiosource.cc899
-rw-r--r--libs/ardour/auditioner.cc2
-rw-r--r--libs/ardour/automation_event.cc1
-rw-r--r--libs/ardour/configuration.cc5
-rw-r--r--libs/ardour/connection.cc1
-rw-r--r--libs/ardour/control_protocol_manager.cc6
-rw-r--r--libs/ardour/coreaudio_source.cc9
-rw-r--r--libs/ardour/crossfade.cc2
-rw-r--r--libs/ardour/curve.cc1
-rw-r--r--libs/ardour/cycle_timer.cc2
-rw-r--r--libs/ardour/destructive_filesource.cc188
-rw-r--r--libs/ardour/externalsource.cc246
-rw-r--r--libs/ardour/filesource.cc1513
-rw-r--r--libs/ardour/globals.cc7
-rw-r--r--libs/ardour/import.cc16
-rw-r--r--libs/ardour/insert.cc2
-rw-r--r--libs/ardour/io.cc11
-rw-r--r--libs/ardour/jack_slave.cc1
-rw-r--r--libs/ardour/ladspa_plugin.cc1
-rw-r--r--libs/ardour/location.cc1
-rw-r--r--libs/ardour/mtc_slave.cc3
-rw-r--r--libs/ardour/named_selection.cc1
-rw-r--r--libs/ardour/osc.cc1
-rw-r--r--libs/ardour/panner.cc2
-rw-r--r--libs/ardour/playlist.cc2
-rw-r--r--libs/ardour/playlist_factory.cc23
-rw-r--r--libs/ardour/plugin.cc1
-rw-r--r--libs/ardour/plugin_manager.cc1
-rw-r--r--libs/ardour/po/el_GR.po1389
-rw-r--r--libs/ardour/po/it_IT.po1361
-rw-r--r--libs/ardour/po/ru_RU.po1204
-rw-r--r--libs/ardour/recent_sessions.cc2
-rw-r--r--libs/ardour/redirect.cc2
-rw-r--r--libs/ardour/region.cc1
-rw-r--r--libs/ardour/reverse.cc2
-rw-r--r--libs/ardour/route.cc4
-rw-r--r--libs/ardour/route_group.cc2
-rw-r--r--libs/ardour/send.cc1
-rw-r--r--libs/ardour/session.cc199
-rw-r--r--libs/ardour/session_butler.cc28
-rw-r--r--libs/ardour/session_click.cc1
-rw-r--r--libs/ardour/session_control.cc6
-rw-r--r--libs/ardour/session_events.cc8
-rw-r--r--libs/ardour/session_export.cc6
-rw-r--r--libs/ardour/session_feedback.cc5
-rw-r--r--libs/ardour/session_midi.cc16
-rw-r--r--libs/ardour/session_process.cc24
-rw-r--r--libs/ardour/session_state.cc105
-rw-r--r--libs/ardour/session_time.cc393
-rw-r--r--libs/ardour/session_timefx.cc14
-rw-r--r--libs/ardour/session_transport.cc47
-rw-r--r--libs/ardour/sndfilesource.cc467
-rw-r--r--libs/ardour/source.cc777
-rw-r--r--libs/ardour/state_manager.cc1
-rw-r--r--libs/ardour/stateful.cc2
-rw-r--r--libs/ardour/tempo.cc1
-rw-r--r--libs/ardour/utils.cc3
-rw-r--r--libs/ardour/vst_plugin.cc1
92 files changed, 5010 insertions, 6168 deletions
diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript
index 0fb5cfc788..605911d7ef 100644
--- a/libs/ardour/SConscript
+++ b/libs/ardour/SConscript
@@ -27,12 +27,15 @@ ardour.Append(POTFILE = domain + '.pot')
ardour.Append(CPPPATH = '#libs/surfaces/control_protocol')
ardour_files=Split("""
+audio_diskstream.cc
audio_library.cc
audio_playlist.cc
audio_track.cc
audioengine.cc
+audiofilesource.cc
audiofilter.cc
audioregion.cc
+audiosource.cc
auditioner.cc
automation.cc
automation_event.cc
@@ -44,9 +47,6 @@ curve.cc
cycle_timer.cc
default_click.cc
destructive_filesource.cc
-diskstream.cc
-externalsource.cc
-filesource.cc
gain.cc
gdither.cc
globals.cc
@@ -103,6 +103,7 @@ extra_sources = [ ]
if ardour['VST']:
extra_sources += vst_files
+ ardour.Append(CCFLAGS="-DVST_SUPPORT", CPPPATH="#libs/fst")
if ardour['LIBLO']:
extra_sources += osc_files
@@ -178,15 +179,14 @@ if conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Core
if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h') and ardour['COREAUDIO'] == 1:
ardour.Append(CXXFLAGS="-DHAVE_COREAUDIO")
ardour.Append(LINKFLAGS="-framework AudioToolbox")
+ extra_sources += coreaudio_files
if env['CONFIG_ARCH'] == 'apple':
# this next line avoids issues with circular dependencies between libardour and libardour_cp.
# it is based on the (entirely reasonable) assumption that a system with CoreAudio is OS X
#
- print 'APPLE CONFIG'
ardour.Append(LINKFLAGS='-undefined suppress -flat_namespace')
- extra_sources += coreaudio_files
ardour = conf.Finish ()
@@ -201,8 +201,8 @@ ardour.Merge ([
libraries['pbd3'],
libraries['soundtouch'],
libraries['midi++2'],
- libraries['glib2'],
- libraries['glibmm2']
+ libraries['glib2'],
+ libraries['glibmm2']
])
if ardour['LIBLO']:
diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h
index fee6c601a2..c0dfea9a95 100644
--- a/libs/ardour/ardour/ardour.h
+++ b/libs/ardour/ardour/ardour.h
@@ -45,7 +45,7 @@ namespace ARDOUR {
static const jack_nframes_t max_frames = JACK_MAX_FRAMES;
- int init (AudioEngine&, bool with_vst, bool try_optimization, void (*sighandler)(int,siginfo_t*,void*) = 0);
+ int init (AudioEngine&, bool with_vst, bool try_optimization);
int cleanup ();
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/audio_diskstream.h
index 316daba52f..9355a3fccb 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/audio_diskstream.h
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
+ $Id: diskstream.h 579 2006-06-12 19:56:37Z essej $
*/
#ifndef __ardour_diskstream_h__
@@ -52,10 +52,10 @@ class AudioEngine;
class Send;
class Session;
class AudioPlaylist;
-class FileSource;
+class AudioFileSource;
class IO;
-class DiskStream : public Stateful, public sigc::trackable
+class AudioDiskstream : public Stateful, public sigc::trackable
{
public:
enum Flag {
@@ -64,15 +64,15 @@ class DiskStream : public Stateful, public sigc::trackable
Destructive = 0x4
};
- DiskStream (Session &, const string& name, Flag f = Recordable);
- DiskStream (Session &, const XMLNode&);
+ AudioDiskstream (Session &, const string& name, Flag f = Recordable);
+ AudioDiskstream (Session &, const XMLNode&);
string name() const { return _name; }
ARDOUR::IO* io() const { return _io; }
void set_io (ARDOUR::IO& io);
- DiskStream& ref() { _refcnt++; return *this; }
+ AudioDiskstream& ref() { _refcnt++; return *this; }
void unref() { if (_refcnt) _refcnt--; if (_refcnt == 0) delete this; }
uint32_t refcnt() const { return _refcnt; }
@@ -154,7 +154,7 @@ class DiskStream : public Stateful, public sigc::trackable
AudioPlaylist *playlist () { return _playlist; }
- FileSource *write_source (uint32_t n=0) {
+ AudioFileSource *write_source (uint32_t n=0) {
if (n < channels.size())
return channels[n].write_source;
return 0;
@@ -184,8 +184,8 @@ class DiskStream : public Stateful, public sigc::trackable
static sigc::signal<void> DiskOverrun;
static sigc::signal<void> DiskUnderrun;
- static sigc::signal<void,DiskStream*> DiskStreamCreated; // XXX use a ref with sigc2
- static sigc::signal<void,list<Source*>*> DeleteSources;
+ static sigc::signal<void,AudioDiskstream*> AudioDiskstreamCreated; // XXX use a ref with sigc2
+ static sigc::signal<void,list<AudioFileSource*>*> DeleteSources;
/* stateful */
@@ -266,7 +266,7 @@ class DiskStream : public Stateful, public sigc::trackable
/* use unref() to destroy a diskstream */
- ~DiskStream();
+ ~AudioDiskstream();
enum TransitionType {
CaptureStart = 0,
@@ -288,8 +288,8 @@ class DiskStream : public Stateful, public sigc::trackable
float peak_power;
- FileSource *fades_source;
- FileSource *write_source;
+ AudioFileSource *fades_source;
+ AudioFileSource *write_source;
Port *source;
Sample *current_capture_buffer;
@@ -432,7 +432,7 @@ class DiskStream : public Stateful, public sigc::trackable
void non_realtime_set_speed ();
std::list<Region*> _last_capture_regions;
- std::vector<FileSource*> capturing_sources;
+ std::vector<AudioFileSource*> capturing_sources;
int use_pending_capture_data (XMLNode& node);
void get_input_sources ();
diff --git a/libs/ardour/ardour/audio_track.h b/libs/ardour/ardour/audio_track.h
index c7af9fc5d8..1c17cbc859 100644
--- a/libs/ardour/ardour/audio_track.h
+++ b/libs/ardour/ardour/audio_track.h
@@ -26,7 +26,7 @@
namespace ARDOUR {
class Session;
-class DiskStream;
+class AudioDiskstream;
class AudioPlaylist;
class RouteGroup;
@@ -52,8 +52,8 @@ class AudioTrack : public Route
bool can_record() const { return true; }
void set_record_enable (bool yn, void *src);
- DiskStream& disk_stream() const { return *diskstream; }
- int set_diskstream (DiskStream&, void *);
+ AudioDiskstream& disk_stream() const { return *diskstream; }
+ int set_diskstream (AudioDiskstream&, void *);
int use_diskstream (string name);
int use_diskstream (id_t id);
@@ -99,7 +99,7 @@ class AudioTrack : public Route
void set_meter_point (MeterPoint, void* src);
protected:
- DiskStream *diskstream;
+ AudioDiskstream *diskstream;
MeterPoint _saved_meter_point;
TrackMode _mode;
diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h
new file mode 100644
index 0000000000..ecbac569d5
--- /dev/null
+++ b/libs/ardour/ardour/audiofilesource.h
@@ -0,0 +1,157 @@
+/*
+ Copyright (C) 2006 Paul Davis
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_audiofilesource_h__
+#define __ardour_audiofilesource_h__
+
+#include <time.h>
+
+#include <ardour/audiosource.h>
+
+namespace ARDOUR {
+
+struct SoundFileInfo {
+ float samplerate;
+ uint16_t channels;
+ int64_t length;
+ std::string format_name;
+};
+
+class AudioFileSource : public AudioSource {
+ public:
+ enum Flag {
+ Writable = 0x1,
+ CanRename = 0x2,
+ Broadcast = 0x4,
+ Removable = 0x8,
+ RemovableIfEmpty = 0x10,
+ RemoveAtDestroy = 0x20,
+ BuildPeaks = 0x40
+ };
+
+ virtual ~AudioFileSource ();
+
+ int set_name (string newname, bool destructive);
+
+ string path() const { return _path; }
+ string peak_path (string audio_path);
+ string old_peak_path (string audio_path);
+
+ static void set_peak_dir (string dir) { peak_dir = dir; }
+
+ /* factory for an existing but not-used-in-session audio file. this exists
+ because there maybe multiple back-end derivations of AudioFileSource,
+ some of which can handle formats that cannot be handled by others.
+ For example, CoreAudioFileSource can handle MP3 files, which SndFileSource
+ cannot.
+ */
+
+ static AudioFileSource* create (string path_plus_channel);
+ static AudioFileSource* create (const XMLNode&);
+
+ static bool get_soundfile_info (string path, SoundFileInfo& _info, string& error);
+
+ void set_allow_remove_if_empty (bool yn);
+ void mark_for_remove();
+
+ /* this block of methods do nothing for regular file sources, but are significant
+ for files used in destructive recording.
+ */
+
+ virtual jack_nframes_t last_capture_start_frame() const { return 0; }
+ virtual void mark_capture_start (jack_nframes_t) {}
+ virtual void mark_capture_end () {}
+ virtual void clear_capture_marks() {}
+
+ virtual int update_header (jack_nframes_t when, struct tm&, time_t) = 0;
+ virtual int flush_header () = 0;
+
+ int move_to_trash (const string trash_dir_name);
+
+ static bool is_empty (string path);
+ void mark_streaming_write_completed ();
+
+ void mark_take (string);
+ string take_id() const { return _take_id; }
+
+ static void set_bwf_country_code (string x);
+ static void set_bwf_organization_code (string x);
+ static void set_bwf_serial_number (int);
+
+ static void set_search_path (string);
+ static void set_header_position_offset (jack_nframes_t offset, bool negative);
+
+ static sigc::signal<void,struct tm*, time_t> HeaderPositionOffsetChanged;
+
+ XMLNode& get_state ();
+ int set_state (const XMLNode&);
+
+ /* this should really be protected, but C++ is getting stricter
+ and creating slots from protected member functions is starting
+ to cause issues.
+ */
+
+ void handle_header_position_change (struct tm*, time_t tnow);
+
+ protected:
+
+ /* constructor to be called for existing external-to-session files */
+
+ AudioFileSource (std::string path, Flag flags);
+
+ /* constructor to be called for new in-session files */
+
+ AudioFileSource (std::string path, Flag flags,
+ SampleFormat samp_format, HeaderFormat hdr_format);
+
+ /* constructor to be called for existing in-session files */
+
+ AudioFileSource (const XMLNode&);
+
+ int init (string idstr, bool must_exist);
+
+ uint16_t channel;
+ string _path;
+ Flag _flags;
+ string _take_id;
+ bool allow_remove_if_empty;
+ uint64_t timeline_position;
+
+ static string peak_dir;
+ static string search_path;
+
+ static char bwf_country_code[3];
+ static char bwf_organization_code[4];
+ static char bwf_serial_number[13];
+
+ static uint64_t header_position_offset;
+ static bool header_position_negative;
+
+ virtual void set_timeline_position (jack_nframes_t pos);
+ virtual void set_header_timeline_position () = 0;
+
+ bool find (std::string path, bool must_exist, bool& is_new);
+ bool removable() const;
+ bool writable() const { return _flags & Writable; }
+};
+
+}; /* namespace ARDOUR */
+
+#endif /* __ardour_audiofilesource_h__ */
+
diff --git a/libs/ardour/ardour/audiofilter.h b/libs/ardour/ardour/audiofilter.h
index d0fc275cf6..02e5e6f061 100644
--- a/libs/ardour/ardour/audiofilter.h
+++ b/libs/ardour/ardour/audiofilter.h
@@ -28,7 +28,6 @@ namespace ARDOUR {
class AudioRegion;
class Session;
-class FileSource;
class AudioFilter {
@@ -37,7 +36,6 @@ class AudioFilter {
: session (s){}
virtual ~AudioFilter() {}
-
virtual int run (ARDOUR::AudioRegion&) = 0;
std::vector<ARDOUR::AudioRegion*> results;
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index f210fa595b..009aa4b5b0 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -27,7 +27,6 @@
#include <pbd/undo.h>
#include <ardour/ardour.h>
-#include <ardour/source.h>
#include <ardour/gain.h>
#include <ardour/region.h>
#include <ardour/export.h>
@@ -40,6 +39,7 @@ class Route;
class Playlist;
class Session;
class AudioFilter;
+class AudioSource;
struct AudioRegionState : public RegionState
{
@@ -56,7 +56,7 @@ struct AudioRegionState : public RegionState
class AudioRegion : public Region
{
public:
- typedef vector<Source *> SourceList;
+ typedef vector<AudioSource *> SourceList;
static Change FadeInChanged;
static Change FadeOutChanged;
@@ -66,12 +66,12 @@ class AudioRegion : public Region
static Change ScaleAmplitudeChanged;
static Change EnvelopeChanged;
- AudioRegion (Source&, jack_nframes_t start, jack_nframes_t length, bool announce = true);
- AudioRegion (Source&, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags, bool announce = true);
+ AudioRegion (AudioSource&, jack_nframes_t start, jack_nframes_t length, bool announce = true);
+ AudioRegion (AudioSource&, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags, bool announce = true);
AudioRegion (SourceList &, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags, bool announce = true);
AudioRegion (const AudioRegion&, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t = 0, Region::Flag flags = Region::DefaultFlags, bool announce = true);
AudioRegion (const AudioRegion&);
- AudioRegion (Source&, const XMLNode&);
+ AudioRegion (AudioSource&, const XMLNode&);
AudioRegion (SourceList &, const XMLNode&);
~AudioRegion();
@@ -85,7 +85,7 @@ class AudioRegion : public Region
void lock_sources ();
void unlock_sources ();
- Source& source (uint32_t n=0) const { if (n < sources.size()) return *sources[n]; else return *sources[0]; }
+ AudioSource& source (uint32_t n=0) const { if (n < sources.size()) return *sources[n]; else return *sources[0]; }
void set_scale_amplitude (gain_t);
gain_t scale_amplitude() const { return _scale_amplitude; }
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
new file mode 100644
index 0000000000..1dcf5b42f3
--- /dev/null
+++ b/libs/ardour/ardour/audiosource.h
@@ -0,0 +1,166 @@
+/*
+ Copyright (C) 2000 Paul Davis
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id: audio_source.h 486 2006-04-27 09:04:24Z pauld $
+*/
+
+#ifndef __ardour_audio_source_h__
+#define __ardour_audio_source_h__
+
+#include <list>
+#include <vector>
+#include <string>
+
+#include <time.h>
+
+#include <glibmm/thread.h>
+
+#include <sigc++/signal.h>
+
+#include <ardour/source.h>
+#include <ardour/ardour.h>
+#include <ardour/stateful.h>
+#include <pbd/xml++.h>
+
+using std::list;
+using std::vector;
+using std::string;
+
+namespace ARDOUR {
+
+const jack_nframes_t frames_per_peak = 256;
+
+class AudioSource : public Source
+{
+ public:
+ AudioSource (string name);
+ AudioSource (const XMLNode&);
+ virtual ~AudioSource ();
+
+ /* returns the number of items in this `audio_source' */
+
+ virtual jack_nframes_t length() const {
+ return _length;
+ }
+
+ virtual jack_nframes_t available_peaks (double zoom) const;
+
+ virtual jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
+ virtual jack_nframes_t write (Sample *src, jack_nframes_t cnt, char * workbuf);
+
+ virtual float sample_rate () const = 0;
+
+ virtual void mark_for_remove() = 0;
+ virtual void mark_streaming_write_completed () {}
+
+ void set_captured_for (string str) { _captured_for = str; }
+ string captured_for() const { return _captured_for; }
+
+ uint32_t read_data_count() const { return _read_data_count; }
+ uint32_t write_data_count() const { return _write_data_count; }
+
+ int read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_unit) const;
+ int build_peaks ();
+ bool peaks_ready (sigc::slot<void>, sigc::connection&) const;
+
+ static sigc::signal<void,AudioSource*> AudioSourceCreated;
+
+ mutable sigc::signal<void> PeaksReady;
+ mutable sigc::signal<void,jack_nframes_t,jack_nframes_t> PeakRangeReady;
+
+ XMLNode& get_state ();
+ int set_state (const XMLNode&);
+
+ static int start_peak_thread ();
+ static void stop_peak_thread ();
+
+ int rename_peakfile (std::string newpath);
+
+ static void set_build_missing_peakfiles (bool yn) {
+ _build_missing_peakfiles = yn;
+ }
+
+ static void set_build_peakfiles (bool yn) {
+ _build_peakfiles = yn;
+ }
+
+ protected:
+ static bool _build_missing_peakfiles;
+ static bool _build_peakfiles;
+
+ bool _peaks_built;
+ mutable Glib::Mutex _lock;
+ jack_nframes_t _length;
+ bool next_peak_clear_should_notify;
+ string peakpath;
+ string _captured_for;
+
+ mutable uint32_t _read_data_count; // modified in read()
+ mutable uint32_t _write_data_count; // modified in write()
+
+ int initialize_peakfile (bool newfile, string path);
+ void build_peaks_from_scratch ();
+
+ int do_build_peak (jack_nframes_t, jack_nframes_t);
+
+ virtual jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const = 0;
+ virtual jack_nframes_t write_unlocked (Sample *dst, jack_nframes_t cnt, char * workbuf) = 0;
+ virtual string peak_path(string audio_path) = 0;
+ virtual string old_peak_path(string audio_path) = 0;
+
+ void update_length (jack_nframes_t pos, jack_nframes_t cnt);
+
+ static pthread_t peak_thread;
+ static bool have_peak_thread;
+ static void* peak_thread_work(void*);
+
+ static int peak_request_pipe[2];
+
+ struct PeakRequest {
+ enum Type {
+ Build,
+ Quit
+ };
+ };
+
+ static vector<AudioSource*> pending_peak_sources;
+ static Glib::Mutex* pending_peak_sources_lock;
+
+ static void queue_for_peaks (AudioSource&);
+ static void clear_queue_for_peaks ();
+
+ struct PeakBuildRecord {
+ jack_nframes_t frame;
+ jack_nframes_t cnt;
+
+ PeakBuildRecord (jack_nframes_t f, jack_nframes_t c)
+ : frame (f), cnt (c) {}
+ PeakBuildRecord (const PeakBuildRecord& other) {
+ frame = other.frame;
+ cnt = other.cnt;
+ }
+ };
+
+ list<AudioSource::PeakBuildRecord *> pending_peak_builds;
+
+ private:
+ bool file_changed (string path);
+};
+
+}
+
+#endif /* __ardour_audio_source_h__ */
diff --git a/libs/ardour/ardour/constsource.h b/libs/ardour/ardour/constsource.h
deleted file mode 100644
index d000afb347..0000000000
--- a/libs/ardour/ardour/constsource.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
-*/
-
-#ifndef __playlist_const_buffer_h__
-#define __playlist_const_buffer_h__
-
-#include <string>
-#include <cstdlib>
-
-#include "edl.h"
-
-namespace EDL {
-
-class ConstSource : public Source {
- public:
- ConstSource (const gchar *id) {
- _type = Source::Const;
- value = strtod (id, 0);
- strncpy (idstr, id, 15);
- idstr[15] = '\0';
- }
-
- const gchar * const id() { return idstr; }
-
- uint32_t length() { return ~0U; }
-
- uint32_t read (Source::Data *dst, uint32_t start, uint32_t cnt) {
- uint32_t n = cnt;
- while (n--) *dst++ = value;
- return cnt;
- }
- void peak (guint8 *max, guint8 *min, uint32_t start, uint32_t cnt) {
- *max = *min = (guint8) value;
- }
-
- private:
- Source::Data value;
- gchar idstr[16];
-};
-
-}; /* namespace EDL */
-
-#endif /* __playlist_const_buffer_h__ */
diff --git a/libs/ardour/ardour/coreaudio_source.h b/libs/ardour/ardour/coreaudio_source.h
index 736ea32df7..81f1a14050 100644
--- a/libs/ardour/ardour/coreaudio_source.h
+++ b/libs/ardour/ardour/coreaudio_source.h
@@ -20,19 +20,22 @@
#ifndef __coreaudio_source_h__
#define __coreaudio_source_h__
-#include <ardour/externalsource.h>
+#include <ardour/audiofilesource.h>
#include <AudioToolbox/ExtendedAudioFile.h>
namespace ARDOUR {
-class CoreAudioSource : public ExternalSource {
+class CoreAudioSource : public AudioFileSource {
public:
CoreAudioSource (const string& path_plus_channel, bool build_peak = true);
CoreAudioSource (const XMLNode&);
~CoreAudioSource ();
- jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
float sample_rate() const;
+ int update_header (jack_nframes_t when, struct tm&, time_t);
+
+ protected:
+ jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
private:
ExtAudioFileRef af;
diff --git a/libs/ardour/ardour/cycle_timer.h b/libs/ardour/ardour/cycle_timer.h
index 1ec7c74903..b9cbbbf0a8 100644
--- a/libs/ardour/ardour/cycle_timer.h
+++ b/libs/ardour/ardour/cycle_timer.h
@@ -22,29 +22,27 @@
#define __ardour_cycle_timer_h__
#include <string>
-#include <cstdio>
+#include <iostream>
#include <ardour/cycles.h>
-using std::string;
-
class CycleTimer {
private:
static float cycles_per_usec;
- uint32_t long entry;
- uint32_t long exit;
- string _name;
+ cycles_t _entry;
+ cycles_t _exit;
+ std::string _name;
public:
- CycleTimer(string name) : _name (name){
+ CycleTimer(std::string name) : _name (name){
if (cycles_per_usec == 0) {
cycles_per_usec = get_mhz ();
}
- entry = get_cycles();
+ _entry = get_cycles();
}
~CycleTimer() {
- exit = get_cycles();
- printf ("%s: %.9f usecs (%lu-%lu)\n", _name.c_str(), (float) (exit - entry) / cycles_per_usec, entry, exit);
+ _exit = get_cycles();
+ std::cerr << _name << ": " << (float) (_exit - _entry) / cycles_per_usec << " (" << _entry << ", " << _exit << ')' << endl;
}
static float get_mhz ();
diff --git a/libs/ardour/ardour/destructive_filesource.h b/libs/ardour/ardour/destructive_filesource.h
index dbaf379257..c92a0762ee 100644
--- a/libs/ardour/ardour/destructive_filesource.h
+++ b/libs/ardour/ardour/destructive_filesource.h
@@ -23,30 +23,33 @@
#include <string>
-#include <ardour/filesource.h>
+#include <ardour/sndfilesource.h>
struct tm;
namespace ARDOUR {
-class DestructiveFileSource : public FileSource {
+class DestructiveFileSource : public SndFileSource {
public:
- DestructiveFileSource (std::string path, jack_nframes_t rate, bool repair_first = false, SampleFormat samp_format=FormatInt24);
- DestructiveFileSource (const XMLNode&, jack_nframes_t rate);
+ DestructiveFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
+ Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
+ AudioFileSource::BuildPeaks));
+
+ DestructiveFileSource (const XMLNode&);
~DestructiveFileSource ();
- int seek (jack_nframes_t frame);
jack_nframes_t last_capture_start_frame() const;
void mark_capture_start (jack_nframes_t);
void mark_capture_end ();
void clear_capture_marks();
- jack_nframes_t write (Sample *src, jack_nframes_t cnt, char * workbuf);
-
XMLNode& get_state ();
static void setup_standard_crossfades (jack_nframes_t sample_rate);
+ protected:
+ jack_nframes_t write_unlocked (Sample *src, jack_nframes_t cnt, char * workbuf);
+
private:
static jack_nframes_t xfade_frames;
static gain_t* out_coefficient;
@@ -59,7 +62,7 @@ class DestructiveFileSource : public FileSource {
Sample* xfade_buf;
jack_nframes_t crossfade (Sample* data, jack_nframes_t cnt, int dir, char * workbuf);
-
+ void set_timeline_position (jack_nframes_t);
};
}
diff --git a/libs/ardour/ardour/externalsource.h b/libs/ardour/ardour/externalsource.h
deleted file mode 100644
index 17504d0afc..0000000000
--- a/libs/ardour/ardour/externalsource.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- Copyright (C) 2006 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __external_source_h__
-#define __external_source_h__
-
-#include <ardour/source.h>
-
-namespace ARDOUR {
-
-struct SoundFileInfo {
- float samplerate;
- uint16_t channels;
- int64_t length;
- std::string format_name;
-};
-
-class ExternalSource : public Source {
- public:
- virtual ~ExternalSource ();
-
- string path() const { return _path; }
-
- virtual jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const = 0;
-
- void mark_for_remove() {} // we never remove external sndfiles
- string peak_path(string audio_path);
- string old_peak_path(string audio_path);
-
- static void set_peak_dir (string dir) { peak_dir = dir; }
-
- static ExternalSource* create (const string& path_plus_channel, bool build_peak = true);
- static ExternalSource* create (const XMLNode& node);
- static bool get_soundfile_info (string path, SoundFileInfo& _info, string& error);
-
- protected:
- ExternalSource (const string& path_plus_channel, bool build_peak = true);
- ExternalSource (const XMLNode&);
-
- static string peak_dir;
-
- uint16_t channel;
- string _path;
-
- jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
-};
-
-}; /* namespace ARDOUR */
-
-#endif /* __external_source_h__ */
-
diff --git a/libs/ardour/ardour/filesource.h b/libs/ardour/ardour/filesource.h
deleted file mode 100644
index 28a01f0a78..0000000000
--- a/libs/ardour/ardour/filesource.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
-*/
-
-#ifndef __playlist_file_buffer_h__
-#define __playlist_file_buffer_h__
-
-// darwin supports 64 by default and doesn't provide wrapper functions.
-#if defined (__APPLE__)
-typedef off_t off64_t;
-#define open64 open
-#define close64 close
-#define lseek64 lseek
-#define pread64 pread
-#define pwrite64 pwrite
-#endif
-
-#include <vector>
-#include <string>
-
-#include <ardour/source.h>
-
-struct tm;
-
-using std::string;
-
-namespace ARDOUR {
-
-class FileSource : public Source {
- public:
- FileSource (string path, jack_nframes_t rate, bool repair_first = false, SampleFormat samp_format=FormatFloat);
- FileSource (const XMLNode&, jack_nframes_t rate);
- ~FileSource ();
-
- int set_name (std::string str, bool destructive);
-
- void set_allow_remove_if_empty (bool yn);
-
- jack_nframes_t length() const { return _length; }
- jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
- jack_nframes_t write (Sample *src, jack_nframes_t cnt, char * workbuf);
- void mark_for_remove();
- string peak_path(string audio_path);
- string path() const { return _path; }
- float sample_rate () const;
-
- virtual int seek (jack_nframes_t frame) {return 0; }
- virtual jack_nframes_t last_capture_start_frame() const { return 0; }
- virtual void mark_capture_start (jack_nframes_t) {}
- virtual void mark_capture_end () {}
- virtual void clear_capture_marks() {}
-
- int update_header (jack_nframes_t when, struct tm&, time_t);
-
- int move_to_trash (const string trash_dir_name);
-
- static bool is_empty (string path);
- void mark_streaming_write_completed ();
-
- void mark_take (string);
- string take_id() const { return _take_id; }
-
- static void set_bwf_country_code (string x);
- static void set_bwf_organization_code (string x);
- static void set_bwf_serial_number (int);
-
- static void set_search_path (string);
-
- protected:
- int fd;
- string _path;
- bool remove_at_unref;
- bool is_bwf;
- off64_t data_offset;
- string _take_id;
- SampleFormat _sample_format;
- int _sample_size;
- bool allow_remove_if_empty;
-
- static char bwf_country_code[3];
- static char bwf_organization_code[4];
- static char bwf_serial_number[13];
-
- struct GenericChunk {
- char id[4];
- int32_t size;
- };
-
- struct WAVEChunk : public GenericChunk {
- char text[4]; /* wave pseudo-chunk id "WAVE" */
- };
-
- struct FMTChunk : public GenericChunk {
- int16_t formatTag; /* format tag; currently pcm */
- int16_t nChannels; /* number of channels */
- uint32_t nSamplesPerSec; /* sample rate in hz */
- int32_t nAvgBytesPerSec; /* average bytes per second */
- int16_t nBlockAlign; /* number of bytes per sample */
- int16_t nBitsPerSample; /* number of bits in a sample */
- };
-
- struct BroadcastChunk : public GenericChunk {
- char description[256];
- char originator[32];
- char originator_reference[32];
- char origination_date[10];
- char origination_time[8];
- int32_t time_reference_low;
- int32_t time_reference_high;
- int16_t version; /* 1.0 because we have umid and 190 bytes of "reserved" */
- char umid[64];
- char reserved[190];
- /* we don't treat coding history as part of the struct */
- };
-
- struct ChunkInfo {
- std::string name;
- uint32_t size;
- off64_t offset;
-
- ChunkInfo (string s, uint32_t sz, off64_t o)
- : name (s), size (sz), offset (o) {}
- };
-
- vector<ChunkInfo> chunk_info;
-
- struct {
- WAVEChunk wave;
- FMTChunk format;
- GenericChunk data;
- BroadcastChunk bext;
- vector<string> coding_history;
- bool bigendian;
- } header;
-
- int init (string, bool must_exist, jack_nframes_t);
- jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
-
- ssize_t file_write (Sample *src, jack_nframes_t framepos, jack_nframes_t cnt, char * workbuf) {
- switch (_sample_format) {
- case FormatInt24: return write_pcm_24(src, framepos, cnt, workbuf);
- default: return write_float(src, framepos, cnt, workbuf);
- };
- }
-
- ssize_t file_read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const {
- switch (_sample_format) {
- case FormatInt24: return read_pcm_24(dst, start, cnt, workbuf);
- default: return read_float(dst, start, cnt, workbuf);
- };
- }
-
- ssize_t write_float(Sample *src, jack_nframes_t framepos, jack_nframes_t cnt, char * workbuf);
- ssize_t read_float (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
- ssize_t write_pcm_24(Sample *src, jack_nframes_t framepos, jack_nframes_t cnt, char * workbuf);
- ssize_t read_pcm_24 (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
-
- int discover_chunks (bool silent);
- ChunkInfo* lookup_chunk (string name);
-
- int write_header ();
- int read_header (bool silent);
-
- int check_header (jack_nframes_t rate, bool silent);
- int fill_header (jack_nframes_t rate);
-
- int read_broadcast_data (ChunkInfo&);
- void compute_header_size ();
-
- static const int32_t wave_header_size = sizeof (WAVEChunk) + sizeof (FMTChunk) + sizeof (GenericChunk);
- static const int32_t bwf_header_size = wave_header_size + sizeof (BroadcastChunk);
-
- static string search_path;
-
- int repair (string, jack_nframes_t);
-
- void swap_endian (GenericChunk & chunk) const;
- void swap_endian (FMTChunk & chunk) const;
- void swap_endian (BroadcastChunk & chunk) const;
- void swap_endian (Sample *buf, jack_nframes_t cnt) const;
-};
-
-}
-
-#endif /* __playlist_file_buffer_h__ */
diff --git a/libs/ardour/ardour/io.h b/libs/ardour/ardour/io.h
index c80a7abfaa..8ae45fe65c 100644
--- a/libs/ardour/ardour/io.h
+++ b/libs/ardour/ardour/io.h
@@ -321,7 +321,6 @@ public:
Change restore_state (State&);
StateManager::State* state_factory (std::string why) const;
- void send_state_changed();
bool get_midi_node_info (XMLNode * node, MIDI::eventType & ev, MIDI::channel_t & chan, MIDI::byte & additional);
bool set_midi_node_info (XMLNode * node, MIDI::eventType ev, MIDI::channel_t chan, MIDI::byte additional);
diff --git a/libs/ardour/ardour/osc.h b/libs/ardour/ardour/osc.h
index 69ec76eac6..0a34f44a41 100644
--- a/libs/ardour/ardour/osc.h
+++ b/libs/ardour/ardour/osc.h
@@ -32,7 +32,7 @@
#include <ardour/types.h>
-#include "basic_ui.h"
+#include <control_protocol/basic_ui.h>
namespace ARDOUR {
class Session;
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index d322f564ee..c653c8502e 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -37,7 +37,6 @@
#include <ardour/crossfade_compare.h>
#include <ardour/location.h>
#include <ardour/stateful.h>
-#include <ardour/source.h>
#include <ardour/state_manager.h>
namespace ARDOUR {
diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h
index 3c94dad6fd..aae776625e 100644
--- a/libs/ardour/ardour/region.h
+++ b/libs/ardour/ardour/region.h
@@ -233,7 +233,6 @@ class Region : public Stateful, public StateManager
/* state management */
void send_change (Change);
- void send_state_changed ();
/* derived classes need these during their own state management calls */
diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h
index 5699d9ef14..5686dfc908 100644
--- a/libs/ardour/ardour/route.h
+++ b/libs/ardour/ardour/route.h
@@ -95,7 +95,7 @@ class Route : public IO
virtual bool can_record() const { return false; }
virtual void set_record_enable (bool yn, void *src) {}
virtual bool record_enabled() const { return false; }
- virtual void transport_stopped (bool abort, bool did_locate, bool flush_redirects);
+ virtual void handle_transport_stopped (bool abort, bool did_locate, bool flush_redirects);
virtual void set_pending_declick (int);
/* end of vfunc-based API */
diff --git a/libs/ardour/ardour/seqsource.h b/libs/ardour/ardour/seqsource.h
deleted file mode 100644
index 7e38d27915..0000000000
--- a/libs/ardour/ardour/seqsource.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
-*/
-
-#ifndef __playlist_seqsource_h__
-#define __playlist_seqsource_h__
-
-#include <string>
-
-#include "edl.h"
-
-namespace EDL {
-
-class PlaylistSource : public Source {
- public:
- PlaylistSource (Playlist&);
- ~PlaylistSource ();
-
- const gchar * const id() { return playlist.name().c_str(); }
- uint32_t length() { return playlist.length(); }
- uint32_t read (Source::Data *dst, uint32_t start, uint32_t cnt) {
- return playlist.read (dst, start, cnt, false);
- }
- uint32_t write (Source::Data *src, uint32_t where, uint32_t cnt) {
- return playlist.write (src, where, cnt);
- }
-
-// int read_peaks (peak_data_t *, uint32_t npeaks, uint32_t start, uint32_t cnt);
-// int build_peak (uint32_t first_frame, uint32_t cnt);
-
- protected:
-
- private:
- Playlist& playlist;
-};
-
-}; /* namespace EDL */
-
-#endif /* __playlist_seqsource_h__ */
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 3d164a4b05..971e141363 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -60,11 +60,12 @@ namespace ARDOUR {
class Port;
class AudioEngine;
class Slave;
-class DiskStream;
+class AudioDiskstream;
class Route;
class AuxInput;
class Source;
-class FileSource;
+class AudioSource;
+class AudioFileSource;
class Auditioner;
class Insert;
class Send;
@@ -261,25 +262,30 @@ class Session : public sigc::trackable, public Stateful
vector<Sample*>& get_silent_buffers (uint32_t howmany);
vector<Sample*>& get_send_buffers () { return _send_buffers; }
- DiskStream *diskstream_by_id (id_t id);
- DiskStream *diskstream_by_name (string name);
+ AudioDiskstream *diskstream_by_id (id_t id);
+ AudioDiskstream *diskstream_by_name (string name);
bool have_captured() const { return _have_captured; }
void refill_all_diskstream_buffers ();
uint32_t diskstream_buffer_size() const { return dstream_buffer_size; }
- uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
- uint32_t n_diskstreams() const;
- typedef list<DiskStream *> DiskStreamList;
+ /* XXX fix required here when we get new diskstream types *, but
+ not sure of the direction to take this in until then.
+ */
+
+ uint32_t get_next_diskstream_id() const { return n_audio_diskstreams(); }
+ uint32_t n_audio_diskstreams() const;
+
+ typedef list<AudioDiskstream *> AudioDiskstreamList;
- Session::DiskStreamList disk_streams() const {
+ Session::AudioDiskstreamList audio_disk_streams() const {
Glib::RWLock::ReaderLock lm (diskstream_lock);
- return diskstreams; /* XXX yes, force a copy */
+ return audio_diskstreams; /* XXX yes, force a copy */
}
- void foreach_diskstream (void (DiskStream::*func)(void));
- template<class T> void foreach_diskstream (T *obj, void (T::*func)(DiskStream&));
+ void foreach_audio_diskstream (void (AudioDiskstream::*func)(void));
+ template<class T> void foreach_audio_diskstream (T *obj, void (T::*func)(AudioDiskstream&));
typedef list<Route *> RouteList;
@@ -344,7 +350,7 @@ class Session : public sigc::trackable, public Stateful
sigc::signal<void> HaltOnXrun;
sigc::signal<void,Route*> RouteAdded;
- sigc::signal<void,DiskStream*> DiskStreamAdded;
+ sigc::signal<void,AudioDiskstream*> AudioDiskstreamAdded;
void request_roll ();
void request_bounded_roll (jack_nframes_t start, jack_nframes_t end);
@@ -356,15 +362,15 @@ class Session : public sigc::trackable, public Stateful
void goto_start () { request_locate (start_location->start(), false); }
void use_rf_shuttle_speed ();
void request_transport_speed (float speed);
- void request_overwrite_buffer (DiskStream*);
- void request_diskstream_speed (DiskStream&, float speed);
+ void request_overwrite_buffer (AudioDiskstream*);
+ void request_diskstream_speed (AudioDiskstream&, float speed);
void request_input_change_handling ();
bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
bool transport_locked () const;
int wipe ();
- int wipe_diskstream (DiskStream *);
+ int wipe_diskstream (AudioDiskstream *);
int remove_region_from_region_list (Region&);
@@ -584,25 +590,13 @@ class Session : public sigc::trackable, public Stateful
int set_smpte_type (float fps, bool drop_frames);
void bbt_time (jack_nframes_t when, BBT_Time&);
+ void smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const;
+ void sample_to_smpte( jack_nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
+ void smpte_time (SMPTE::Time &);
+ void smpte_time (jack_nframes_t when, SMPTE::Time&);
+ void smpte_time_subframes (jack_nframes_t when, SMPTE::Time&);
- ARDOUR::smpte_wrap_t smpte_increment( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_decrement( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_increment_subframes( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_decrement_subframes( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_increment_seconds( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_increment_minutes( SMPTE_Time& smpte ) const;
- ARDOUR::smpte_wrap_t smpte_increment_hours( SMPTE_Time& smpte ) const;
- void smpte_frames_floor( SMPTE_Time& smpte ) const;
- void smpte_seconds_floor( SMPTE_Time& smpte ) const;
- void smpte_minutes_floor( SMPTE_Time& smpte ) const;
- void smpte_hours_floor( SMPTE_Time& smpte ) const;
- void smpte_to_sample( SMPTE_Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const;
- void sample_to_smpte( jack_nframes_t sample, SMPTE_Time& smpte, bool use_offset, bool use_subframes ) const;
- void smpte_time (SMPTE_Time &);
- void smpte_time (jack_nframes_t when, SMPTE_Time&);
- void smpte_time_subframes (jack_nframes_t when, SMPTE_Time&);
-
- void smpte_duration (jack_nframes_t, SMPTE_Time&) const;
+ void smpte_duration (jack_nframes_t, SMPTE::Time&) const;
void smpte_duration_string (char *, jack_nframes_t) const;
void set_smpte_offset (jack_nframes_t);
@@ -612,7 +606,7 @@ class Session : public sigc::trackable, public Stateful
jack_nframes_t convert_to_frames_at (jack_nframes_t position, AnyTime&);
- sigc::signal<void> SMPTEOffsetChanged;
+ static sigc::signal<void> SMPTEOffsetChanged;
sigc::signal<void> SMPTETypeChanged;
void request_slave_source (SlaveSource, jack_nframes_t pos = 0);
@@ -668,8 +662,9 @@ class Session : public sigc::trackable, public Stateful
int start_audio_export (ARDOUR::AudioExportSpecification&);
int stop_audio_export (ARDOUR::AudioExportSpecification&);
- void add_source (Source *);
- int remove_file_source (FileSource&);
+ void add_audio_source (AudioSource *);
+ void remove_source (Source *);
+ int cleanup_audio_file_source (AudioFileSource&);
struct cleanup_report {
vector<string> paths;
@@ -701,7 +696,8 @@ class Session : public sigc::trackable, public Stateful
sigc::signal<void,Source *> SourceAdded;
sigc::signal<void,Source *> SourceRemoved;
- FileSource *create_file_source (ARDOUR::DiskStream&, int32_t chan, bool destructive);
+ AudioFileSource *create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
+
Source *get_source (ARDOUR::id_t);
/* playlist management */
@@ -745,8 +741,8 @@ class Session : public sigc::trackable, public Stateful
/* flattening stuff */
- int write_one_track (AudioTrack&, jack_nframes_t start, jack_nframes_t cnt, bool overwrite, vector<Source*>&,
- InterThreadInfo& wot);
+ int write_one_audio_track (AudioTrack&, jack_nframes_t start, jack_nframes_t cnt, bool overwrite, vector<AudioSource*>&,
+ InterThreadInfo& wot);
int freeze (InterThreadInfo&);
/* session-wide solo/mute/rec-enable */
@@ -972,7 +968,7 @@ class Session : public sigc::trackable, public Stateful
void set_frame_rate (jack_nframes_t nframes);
protected:
- friend class DiskStream;
+ friend class AudioDiskstream;
void stop_butler ();
void wait_till_butler_finished();
@@ -1338,7 +1334,7 @@ class Session : public sigc::trackable, public Stateful
MIDI::byte mtc_smpte_bits; /* encoding of SMTPE type for MTC */
MIDI::byte midi_msg[16];
jack_nframes_t outbound_mtc_smpte_frame;
- SMPTE_Time transmitting_smpte_time;
+ SMPTE::Time transmitting_smpte_time;
int next_quarter_frame_to_send;
double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
@@ -1354,7 +1350,7 @@ class Session : public sigc::trackable, public Stateful
bool last_smpte_valid;
jack_nframes_t last_smpte_when;
- SMPTE_Time last_smpte;
+ SMPTE::Time last_smpte;
int send_full_time_code ();
int send_midi_time_code ();
@@ -1434,12 +1430,12 @@ class Session : public sigc::trackable, public Stateful
bool waiting_to_start;
void set_auto_loop (bool yn);
- void overwrite_some_buffers (DiskStream*);
+ void overwrite_some_buffers (AudioDiskstream*);
void flush_all_redirects ();
void locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
void start_locate (jack_nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
void force_locate (jack_nframes_t frame, bool with_roll = false);
- void set_diskstream_speed (DiskStream*, float speed);
+ void set_diskstream_speed (AudioDiskstream*, float speed);
void set_transport_speed (float speed, bool abort = false);
void stop_transport (bool abort = false);
void start_transport ();
@@ -1470,10 +1466,10 @@ class Session : public sigc::trackable, public Stateful
/* disk-streams */
- DiskStreamList diskstreams;
+ AudioDiskstreamList audio_diskstreams;
mutable Glib::RWLock diskstream_lock;
uint32_t dstream_buffer_size;
- void add_diskstream (DiskStream*);
+ void add_diskstream (AudioDiskstream*);
int load_diskstreams (const XMLNode&);
/* routes stuff */
@@ -1515,16 +1511,14 @@ class Session : public sigc::trackable, public Stateful
/* SOURCES */
- mutable Glib::Mutex source_lock;
- typedef std::map<id_t, Source *> SourceList;
+ mutable Glib::Mutex audio_source_lock;
+ typedef std::map<id_t, AudioSource *> AudioSourceList;
- SourceList sources;
+ AudioSourceList audio_sources;
int load_sources (const XMLNode& node);
XMLNode& get_sources_as_xml ();
- void remove_source (Source *);
-
Source *XMLSourceFactory (const XMLNode&);
/* PLAYLISTS */
@@ -1543,7 +1537,7 @@ class Session : public sigc::trackable, public Stateful
Playlist *XMLPlaylistFactory (const XMLNode&);
void playlist_length_changed (Playlist *);
- void diskstream_playlist_changed (DiskStream *);
+ void diskstream_playlist_changed (AudioDiskstream *);
/* NAMED SELECTIONS */
diff --git a/libs/ardour/ardour/session_diskstream.h b/libs/ardour/ardour/session_diskstream.h
index 3c888c92c3..33fc5419ba 100644
--- a/libs/ardour/ardour/session_diskstream.h
+++ b/libs/ardour/ardour/session_diskstream.h
@@ -22,15 +22,15 @@
#define __ardour_session_diskstream_h__
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
namespace ARDOUR {
template<class T> void
-Session::foreach_diskstream (T *obj, void (T::*func)(DiskStream&))
+Session::foreach_audio_diskstream (T *obj, void (T::*func)(AudioDiskstream&))
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); i++) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); i++) {
if (!(*i)->hidden()) {
(obj->*func) (**i);
}
diff --git a/libs/ardour/ardour/silentsource.h b/libs/ardour/ardour/silentsource.h
deleted file mode 100644
index 0079e5f103..0000000000
--- a/libs/ardour/ardour/silentsource.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
-*/
-
-#ifndef __playlist_const_buffer_h__
-#define __playlist_const_buffer_h__
-
-#include <string>
-#include <cstdlib>
-
-#include "source.h"
-
-namespace ARDOUR {
-
-class SilentSource : public Source {
- public:
- SilentSource () {
- _name = "Silent Source";
- }
-
- static bool is_silent_source (const string& name) {
- return name == "Silent Source";
- }
-
- jack_nframes_t length() { return ~0U; }
-
- jack_nframes_t read (Source::Data *dst, jack_nframes_t start, jack_nframes_t cnt) {
- jack_nframes_t n = cnt;
- while (n--) *dst++ = 0;
- return cnt;
- }
-
- void peak (guint8 *max, guint8 *min, jack_nframes_t start, jack_nframes_t cnt) {
- *max = *min = 0;
- }
-};
-
-}
-
-#endif /* __playlist_const_buffer_h__ */
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 5d11c9ef09..d146bb5793 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -23,29 +23,57 @@
#include <sndfile.h>
-#include <ardour/externalsource.h>
+#include <ardour/audiofilesource.h>
namespace ARDOUR {
-class SndFileSource : public ExternalSource {
+class SndFileSource : public AudioFileSource {
public:
- SndFileSource (const string& path_plus_channel, bool build_peak = true);
+ /* constructor to be called for existing external-to-session files */
+
+ SndFileSource (std::string path, Flag flags);
+
+ /* constructor to be called for new in-session files */
+
+ SndFileSource (std::string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate,
+ Flag flags = AudioFileSource::Flag (AudioFileSource::Writable|
+ AudioFileSource::Removable|
+ AudioFileSource::RemovableIfEmpty|
+ AudioFileSource::CanRename|
+ AudioFileSource::BuildPeaks));
+
+ /* constructor to be called for existing in-session files */
+
SndFileSource (const XMLNode&);
+
~SndFileSource ();
- jack_nframes_t length() const { return _info.frames; }
- jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
float sample_rate () const;
+ int update_header (jack_nframes_t when, struct tm&, time_t);
+ int flush_header ();
+
+ static Flag default_in_session_flags();
+
+ protected:
+ void set_header_timeline_position ();
+
+ jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const;
+ jack_nframes_t write_unlocked (Sample *dst, jack_nframes_t cnt, char * workbuf);
+
+ jack_nframes_t write_float (Sample* data, jack_nframes_t pos, jack_nframes_t cnt);
private:
SNDFILE *sf;
SF_INFO _info;
+ SF_BROADCAST_INFO *_broadcast_info;
- mutable float *tmpbuf;
- mutable jack_nframes_t tmpbufsize;
- mutable Glib::Mutex _tmpbuf_lock;
+ mutable float *interleave_buf;
+ mutable jack_nframes_t interleave_bufsize;
- void init (const string &str, bool build_peak);
+ void init (const string &str);
+ int open();
+ void close();
+ int setup_broadcast_info (jack_nframes_t when, struct tm&, time_t);
};
}; /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/source.h b/libs/ardour/ardour/source.h
index 3781950fbf..f3133c71cd 100644
--- a/libs/ardour/ardour/source.h
+++ b/libs/ardour/ardour/source.h
@@ -21,166 +21,46 @@
#ifndef __ardour_source_h__
#define __ardour_source_h__
-#include <list>
-#include <vector>
#include <string>
-#include <ctime>
-
#include <sigc++/signal.h>
-#include <glibmm/thread.h>
-
#include <ardour/ardour.h>
#include <ardour/stateful.h>
-#include <pbd/xml++.h>
-
-using std::list;
-using std::vector;
-using std::string;
namespace ARDOUR {
-struct PeakData {
- typedef Sample PeakDatum;
-
- PeakDatum min;
- PeakDatum max;
-};
-
-const jack_nframes_t frames_per_peak = 256;
-
class Source : public Stateful, public sigc::trackable
{
public:
- Source (bool announce=true);
+ Source (std::string name);
Source (const XMLNode&);
virtual ~Source ();
- const string& name() const { return _name; }
+ std::string name() const { return _name; }
+ int set_name (std::string str, bool destructive);
ARDOUR::id_t id() const { return _id; }
- /* returns the number of items in this `source' */
-
- virtual jack_nframes_t length() const {
- return _length;
- }
-
- virtual jack_nframes_t available_peaks (double zoom) const;
-
- virtual jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const {
- return 0;
- }
-
- virtual jack_nframes_t write (Sample *src, jack_nframes_t cnt, char * workbuf) {
- return 0;
- }
-
- virtual float sample_rate () const { return 0; }
-
uint32_t use_cnt() const { return _use_cnt; }
void use ();
void release ();
- virtual void mark_for_remove() = 0;
- virtual void mark_streaming_write_completed () {}
-
time_t timestamp() const { return _timestamp; }
void stamp (time_t when) { _timestamp = when; }
- void set_captured_for (string str) { _captured_for = str; }
- string captured_for() const { return _captured_for; }
-
- uint32_t read_data_count() const { return _read_data_count; }
- uint32_t write_data_count() const { return _write_data_count; }
-
- int read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_unit) const;
- int build_peaks ();
- bool peaks_ready (sigc::slot<void>, sigc::connection&) const;
-
- static sigc::signal<void,Source*> SourceCreated;
-
- sigc::signal<void,Source *> GoingAway;
- mutable sigc::signal<void> PeaksReady;
- mutable sigc::signal<void,jack_nframes_t,jack_nframes_t> PeakRangeReady;
-
XMLNode& get_state ();
int set_state (const XMLNode&);
- static int start_peak_thread ();
- static void stop_peak_thread ();
-
- int rename_peakfile (std::string newpath);
-
- static void set_build_missing_peakfiles (bool yn) {
- _build_missing_peakfiles = yn;
- }
- static void set_build_peakfiles (bool yn) {
- _build_peakfiles = yn;
- }
+ sigc::signal<void,Source *> GoingAway;
protected:
- static bool _build_missing_peakfiles;
- static bool _build_peakfiles;
-
string _name;
- uint32_t _use_cnt;
- bool _peaks_built;
- mutable Glib::Mutex _lock;
- jack_nframes_t _length;
- bool next_peak_clear_should_notify;
- string peakpath;
+ uint32_t _use_cnt;
time_t _timestamp;
- string _captured_for;
-
- mutable uint32_t _read_data_count; // modified in read()
- mutable uint32_t _write_data_count; // modified in write()
-
- int initialize_peakfile (bool newfile, string path);
- void build_peaks_from_scratch ();
-
- int do_build_peak (jack_nframes_t, jack_nframes_t);
- virtual jack_nframes_t read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const = 0;
- virtual string peak_path(string audio_path) = 0;
-
- static pthread_t peak_thread;
- static bool have_peak_thread;
- static void* peak_thread_work(void*);
-
- static int peak_request_pipe[2];
-
- struct PeakRequest {
- enum Type {
- Build,
- Quit
- };
- };
-
- static vector<Source*> pending_peak_sources;
- static Glib::StaticMutex pending_peak_sources_lock;
-
- static void queue_for_peaks (Source&);
- static void clear_queue_for_peaks ();
-
- struct PeakBuildRecord {
- jack_nframes_t frame;
- jack_nframes_t cnt;
-
- PeakBuildRecord (jack_nframes_t f, jack_nframes_t c)
- : frame (f), cnt (c) {}
- PeakBuildRecord (const PeakBuildRecord& other) {
- frame = other.frame;
- cnt = other.cnt;
- }
- };
-
- list<Source::PeakBuildRecord *> pending_peak_builds;
private:
ARDOUR::id_t _id;
-
- bool file_changed (string path);
};
}
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index 3d7ab4b59a..a0a209b569 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -29,6 +29,7 @@
#include <inttypes.h>
#include <jack/types.h>
+#include <control_protocol/smpte.h>
#include <map>
#if __GNUC__ < 3
@@ -98,34 +99,7 @@ namespace ARDOUR {
Normal,
Destructive
};
-
- enum smpte_wrap_t {
- smpte_wrap_none = 0,
- smpte_wrap_frames,
- smpte_wrap_seconds,
- smpte_wrap_minutes,
- smpte_wrap_hours
- };
-
- struct SMPTE_Time {
- bool negative;
- uint32_t hours;
- uint32_t minutes;
- uint32_t seconds;
- uint32_t frames;
- uint32_t subframes; // mostly not used
-
- SMPTE_Time() {
- negative = false;
- hours = 0;
- minutes = 0;
- seconds = 0;
- frames = 0;
- subframes = 0;
- }
-
- };
-
+
struct BBT_Time {
uint32_t bars;
uint32_t beats;
@@ -164,7 +138,7 @@ namespace ARDOUR {
Type type;
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
BBT_Time bbt;
union {
@@ -255,10 +229,18 @@ namespace ARDOUR {
BWF,
WAVE,
WAVE64,
+ CAF,
+ AIFF,
iXML,
RF64
};
+ struct PeakData {
+ typedef Sample PeakDatum;
+
+ PeakDatum min;
+ PeakDatum max;
+ };
};
std::istream& operator>>(std::istream& o, ARDOUR::SampleFormat& sf);
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/audio_diskstream.cc
index 90e8387f3f..69f00efe68 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -15,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
+ $Id: diskstream.cc 567 2006-06-07 14:54:12Z trutkin $
*/
#include <fstream>
@@ -38,10 +38,10 @@
#include <ardour/ardour.h>
#include <ardour/audioengine.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/utils.h>
#include <ardour/configuration.h>
-#include <ardour/filesource.h>
+#include <ardour/audiofilesource.h>
#include <ardour/destructive_filesource.h>
#include <ardour/send.h>
#include <ardour/audioplaylist.h>
@@ -53,15 +53,16 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
-jack_nframes_t DiskStream::disk_io_chunk_frames;
+jack_nframes_t AudioDiskstream::disk_io_chunk_frames;
-sigc::signal<void,DiskStream*> DiskStream::DiskStreamCreated;
-sigc::signal<void,list<Source*>*> DiskStream::DeleteSources;
-sigc::signal<void> DiskStream::DiskOverrun;
-sigc::signal<void> DiskStream::DiskUnderrun;
+sigc::signal<void,AudioDiskstream*> AudioDiskstream::AudioDiskstreamCreated;
+sigc::signal<void,list<AudioFileSource*>*> AudioDiskstream::DeleteSources;
+sigc::signal<void> AudioDiskstream::DiskOverrun;
+sigc::signal<void> AudioDiskstream::DiskUnderrun;
-DiskStream::DiskStream (Session &sess, const string &name, Flag flag)
+AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Flag flag)
: _name (name),
_session (sess)
{
@@ -74,10 +75,10 @@ DiskStream::DiskStream (Session &sess, const string &name, Flag flag)
in_set_state = false;
- DiskStreamCreated (this); /* EMIT SIGNAL */
+ AudioDiskstreamCreated (this); /* EMIT SIGNAL */
}
-DiskStream::DiskStream (Session& sess, const XMLNode& node)
+AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
: _session (sess)
{
@@ -95,11 +96,11 @@ DiskStream::DiskStream (Session& sess, const XMLNode& node)
use_destructive_playlist ();
}
- DiskStreamCreated (this); /* EMIT SIGNAL */
+ AudioDiskstreamCreated (this); /* EMIT SIGNAL */
}
void
-DiskStream::init_channel (ChannelInfo &chan)
+AudioDiskstream::init_channel (ChannelInfo &chan)
{
chan.playback_wrap_buffer = 0;
chan.capture_wrap_buffer = 0;
@@ -128,7 +129,7 @@ DiskStream::init_channel (ChannelInfo &chan)
void
-DiskStream::init (Flag f)
+AudioDiskstream::init (Flag f)
{
_id = new_id();
_refcnt = 0;
@@ -185,7 +186,7 @@ DiskStream::init (Flag f)
}
void
-DiskStream::destroy_channel (ChannelInfo &chan)
+AudioDiskstream::destroy_channel (ChannelInfo &chan)
{
if (chan.write_source) {
chan.write_source->release ();
@@ -211,7 +212,7 @@ DiskStream::destroy_channel (ChannelInfo &chan)
chan.capture_buf = 0;
}
-DiskStream::~DiskStream ()
+AudioDiskstream::~AudioDiskstream ()
{
Glib::Mutex::Lock lm (state_lock);
@@ -227,7 +228,7 @@ DiskStream::~DiskStream ()
}
void
-DiskStream::handle_input_change (IOChange change, void *src)
+AudioDiskstream::handle_input_change (IOChange change, void *src)
{
Glib::Mutex::Lock lm (state_lock);
@@ -238,7 +239,7 @@ DiskStream::handle_input_change (IOChange change, void *src)
}
void
-DiskStream::non_realtime_input_change ()
+AudioDiskstream::non_realtime_input_change ()
{
{
Glib::Mutex::Lock lm (state_lock);
@@ -299,7 +300,7 @@ DiskStream::non_realtime_input_change ()
}
void
-DiskStream::get_input_sources ()
+AudioDiskstream::get_input_sources ()
{
uint32_t ni = _io->n_inputs();
@@ -327,18 +328,18 @@ DiskStream::get_input_sources ()
}
int
-DiskStream::find_and_use_playlist (const string& name)
+AudioDiskstream::find_and_use_playlist (const string& name)
{
Playlist* pl;
AudioPlaylist* playlist;
if ((pl = _session.get_playlist (name)) == 0) {
- error << string_compose(_("DiskStream: Session doesn't know about a Playlist called \"%1\""), name) << endmsg;
+ error << string_compose(_("AudioDiskstream: Session doesn't know about a Playlist called \"%1\""), name) << endmsg;
return -1;
}
if ((playlist = dynamic_cast<AudioPlaylist*> (pl)) == 0) {
- error << string_compose(_("DiskStream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
+ error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
return -1;
}
@@ -346,7 +347,7 @@ DiskStream::find_and_use_playlist (const string& name)
}
int
-DiskStream::use_playlist (AudioPlaylist* playlist)
+AudioDiskstream::use_playlist (AudioPlaylist* playlist)
{
{
Glib::Mutex::Lock lm (state_lock);
@@ -370,9 +371,9 @@ DiskStream::use_playlist (AudioPlaylist* playlist)
reset_write_sources (false);
}
- plstate_connection = _playlist->StateChanged.connect (mem_fun (*this, &DiskStream::playlist_changed));
- plmod_connection = _playlist->Modified.connect (mem_fun (*this, &DiskStream::playlist_modified));
- plgone_connection = _playlist->GoingAway.connect (mem_fun (*this, &DiskStream::playlist_deleted));
+ plstate_connection = _playlist->StateChanged.connect (mem_fun (*this, &AudioDiskstream::playlist_changed));
+ plmod_connection = _playlist->Modified.connect (mem_fun (*this, &AudioDiskstream::playlist_modified));
+ plgone_connection = _playlist->GoingAway.connect (mem_fun (*this, &AudioDiskstream::playlist_deleted));
}
if (!overwrite_queued) {
@@ -387,7 +388,7 @@ DiskStream::use_playlist (AudioPlaylist* playlist)
}
void
-DiskStream::playlist_deleted (Playlist* pl)
+AudioDiskstream::playlist_deleted (Playlist* pl)
{
/* this catches an ordering issue with session destruction. playlists
are destroyed before diskstreams. we have to invalidate any handles
@@ -398,7 +399,7 @@ DiskStream::playlist_deleted (Playlist* pl)
}
int
-DiskStream::use_new_playlist ()
+AudioDiskstream::use_new_playlist ()
{
string newname;
AudioPlaylist* playlist;
@@ -422,14 +423,14 @@ DiskStream::use_new_playlist ()
}
int
-DiskStream::use_copy_playlist ()
+AudioDiskstream::use_copy_playlist ()
{
if (destructive()) {
return 0;
}
if (_playlist == 0) {
- error << string_compose(_("DiskStream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
+ error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
return -1;
}
@@ -447,7 +448,7 @@ DiskStream::use_copy_playlist ()
}
void
-DiskStream::setup_destructive_playlist ()
+AudioDiskstream::setup_destructive_playlist ()
{
AudioRegion::SourceList srcs;
@@ -462,7 +463,7 @@ DiskStream::setup_destructive_playlist ()
}
void
-DiskStream::use_destructive_playlist ()
+AudioDiskstream::use_destructive_playlist ()
{
/* use the sources associated with the single full-extent region */
@@ -485,7 +486,7 @@ DiskStream::use_destructive_playlist ()
ChannelList::iterator chan;
for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
- (*chan).write_source = dynamic_cast<FileSource*>(&region->source (n));
+ (*chan).write_source = dynamic_cast<AudioFileSource*>(&region->source (n));
(*chan).write_source->set_allow_remove_if_empty (false);
}
@@ -493,14 +494,14 @@ DiskStream::use_destructive_playlist ()
}
void
-DiskStream::set_io (IO& io)
+AudioDiskstream::set_io (IO& io)
{
_io = &io;
set_align_style_from_io ();
}
int
-DiskStream::set_name (string str, void *src)
+AudioDiskstream::set_name (string str, void *src)
{
if (str != _name) {
_playlist->set_name (str);
@@ -518,7 +519,7 @@ DiskStream::set_name (string str, void *src)
}
void
-DiskStream::set_speed (double sp)
+AudioDiskstream::set_speed (double sp)
{
_session.request_diskstream_speed (*this, sp);
@@ -527,7 +528,7 @@ DiskStream::set_speed (double sp)
}
bool
-DiskStream::realtime_set_speed (double sp, bool global)
+AudioDiskstream::realtime_set_speed (double sp, bool global)
{
bool changed = false;
double new_speed = sp * _session.transport_speed();
@@ -561,7 +562,7 @@ DiskStream::realtime_set_speed (double sp, bool global)
}
void
-DiskStream::non_realtime_set_speed ()
+AudioDiskstream::non_realtime_set_speed ()
{
if (_buffer_reallocation_required)
{
@@ -584,14 +585,14 @@ DiskStream::non_realtime_set_speed ()
}
void
-DiskStream::prepare ()
+AudioDiskstream::prepare ()
{
_processed = false;
playback_distance = 0;
}
void
-DiskStream::check_record_status (jack_nframes_t transport_frame, jack_nframes_t nframes, bool can_record)
+AudioDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nframes_t nframes, bool can_record)
{
int possibly_recording;
int rolling;
@@ -716,7 +717,7 @@ DiskStream::check_record_status (jack_nframes_t transport_frame, jack_nframes_t
}
int
-DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jack_nframes_t offset, bool can_record, bool rec_monitors_input)
+AudioDiskstream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jack_nframes_t offset, bool can_record, bool rec_monitors_input)
{
uint32_t n;
ChannelList::iterator c;
@@ -731,7 +732,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
just return. this allows multiple routes that are taking input
from this diskstream to call our ::process() method, but have
this stuff only happen once. more commonly, it allows both
- the AudioTrack that is using this DiskStream *and* the Session
+ the AudioTrack that is using this AudioDiskstream *and* the Session
to call process() without problems.
*/
@@ -748,7 +749,7 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
return 0;
}
- /* This lock is held until the end of DiskStream::commit, so these two functions
+ /* This lock is held until the end of AudioDiskstream::commit, so these two functions
must always be called as a pair. The only exception is if this function
returns a non-zero value, in which case, ::commit should not be called.
*/
@@ -1010,14 +1011,14 @@ DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jac
}
void
-DiskStream::recover ()
+AudioDiskstream::recover ()
{
state_lock.unlock();
_processed = false;
}
bool
-DiskStream::commit (jack_nframes_t nframes)
+AudioDiskstream::commit (jack_nframes_t nframes)
{
bool need_butler = false;
@@ -1056,7 +1057,7 @@ DiskStream::commit (jack_nframes_t nframes)
}
void
-DiskStream::set_pending_overwrite (bool yn)
+AudioDiskstream::set_pending_overwrite (bool yn)
{
/* called from audio thread, so we can use the read ptr and playback sample as we wish */
@@ -1067,7 +1068,7 @@ DiskStream::set_pending_overwrite (bool yn)
}
int
-DiskStream::overwrite_existing_buffers ()
+AudioDiskstream::overwrite_existing_buffers ()
{
Sample* mixdown_buffer;
float* gain_buffer;
@@ -1110,7 +1111,7 @@ DiskStream::overwrite_existing_buffers ()
if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, workbuf,
start, to_read, *chan, n, reversed)) {
- error << string_compose(_("DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"),
+ error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
_id, size, playback_sample) << endmsg;
goto out;
}
@@ -1121,7 +1122,7 @@ DiskStream::overwrite_existing_buffers ()
if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer, workbuf,
start, cnt, *chan, n, reversed)) {
- error << string_compose(_("DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"),
+ error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
_id, size, playback_sample) << endmsg;
goto out;
}
@@ -1139,7 +1140,7 @@ DiskStream::overwrite_existing_buffers ()
}
int
-DiskStream::seek (jack_nframes_t frame, bool complete_refill)
+AudioDiskstream::seek (jack_nframes_t frame, bool complete_refill)
{
Glib::Mutex::Lock lm (state_lock);
uint32_t n;
@@ -1149,9 +1150,6 @@ DiskStream::seek (jack_nframes_t frame, bool complete_refill)
for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
(*chan).playback_buf->reset ();
(*chan).capture_buf->reset ();
- if ((*chan).write_source) {
- (*chan).write_source->seek (frame);
- }
}
playback_sample = frame;
@@ -1167,7 +1165,7 @@ DiskStream::seek (jack_nframes_t frame, bool complete_refill)
}
int
-DiskStream::can_internal_playback_seek (jack_nframes_t distance)
+AudioDiskstream::can_internal_playback_seek (jack_nframes_t distance)
{
ChannelList::iterator chan;
@@ -1180,7 +1178,7 @@ DiskStream::can_internal_playback_seek (jack_nframes_t distance)
}
int
-DiskStream::internal_playback_seek (jack_nframes_t distance)
+AudioDiskstream::internal_playback_seek (jack_nframes_t distance)
{
ChannelList::iterator chan;
@@ -1195,7 +1193,7 @@ DiskStream::internal_playback_seek (jack_nframes_t distance)
}
int
-DiskStream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, char * workbuf, jack_nframes_t& start, jack_nframes_t cnt,
+AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, char * workbuf, jack_nframes_t& start, jack_nframes_t cnt,
ChannelInfo& channel_info, int channel, bool reversed)
{
jack_nframes_t this_read = 0;
@@ -1253,7 +1251,7 @@ DiskStream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, char
this_read = min(cnt,this_read);
if (_playlist->read (buf+offset, mixdown_buffer, gain_buffer, workbuf, start, this_read, channel) != this_read) {
- error << string_compose(_("DiskStream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
+ error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
start) << endmsg;
return -1;
}
@@ -1286,7 +1284,7 @@ DiskStream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, char
}
int
-DiskStream::do_refill (Sample* mixdown_buffer, float* gain_buffer, char * workbuf)
+AudioDiskstream::do_refill (Sample* mixdown_buffer, float* gain_buffer, char * workbuf)
{
int32_t ret = 0;
jack_nframes_t to_read;
@@ -1516,7 +1514,7 @@ DiskStream::do_refill (Sample* mixdown_buffer, float* gain_buffer, char * workbu
}
int
-DiskStream::do_flush (char * workbuf, bool force_flush)
+AudioDiskstream::do_flush (char * workbuf, bool force_flush)
{
uint32_t to_write;
int32_t ret = 0;
@@ -1620,7 +1618,7 @@ DiskStream::do_flush (char * workbuf, bool force_flush)
}
if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write, workbuf) != to_write) {
- error << string_compose(_("DiskStream %1: cannot write to disk"), _id) << endmsg;
+ error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
return -1;
}
@@ -1637,7 +1635,7 @@ DiskStream::do_flush (char * workbuf, bool force_flush)
to_write = min ((jack_nframes_t)(disk_io_chunk_frames - to_write), (jack_nframes_t) vector.len[1]);
if ((*chan).write_source->write (vector.buf[1], to_write, workbuf) != to_write) {
- error << string_compose(_("DiskStream %1: cannot write to disk"), _id) << endmsg;
+ error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
return -1;
}
@@ -1653,13 +1651,13 @@ DiskStream::do_flush (char * workbuf, bool force_flush)
}
void
-DiskStream::playlist_changed (Change ignored)
+AudioDiskstream::playlist_changed (Change ignored)
{
playlist_modified ();
}
void
-DiskStream::playlist_modified ()
+AudioDiskstream::playlist_modified ()
{
if (!i_am_the_modifier && !overwrite_queued) {
_session.request_overwrite_buffer (this);
@@ -1668,7 +1666,7 @@ DiskStream::playlist_modified ()
}
void
-DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
+AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
{
uint32_t buffer_position;
bool more_work = true;
@@ -1680,7 +1678,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
ChannelList::iterator chan;
vector<CaptureInfo*>::iterator ci;
uint32_t n = 0;
- list<Source*>* deletion_list;
+ list<AudioFileSource*>* deletion_list;
bool mark_write_completed = false;
finish_capture (true);
@@ -1697,7 +1695,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
case 1:
break;
case -1:
- error << string_compose(_("DiskStream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
+ error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
err++;
}
}
@@ -1713,7 +1711,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
ChannelList::iterator chan;
- deletion_list = new list<Source*>;
+ deletion_list = new list<AudioFileSource*>;
for ( chan = channels.begin(); chan != channels.end(); ++chan) {
@@ -1747,15 +1745,15 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
- Source* s = (*chan).write_source;
+ AudioFileSource* s = (*chan).write_source;
if (s) {
- FileSource* fsrc;
+ AudioFileSource* fsrc;
srcs.push_back (s);
- if ((fsrc = dynamic_cast<FileSource *>(s)) != 0) {
+ if ((fsrc = dynamic_cast<AudioFileSource *>(s)) != 0) {
fsrc->update_header (capture_info.front()->start, when, twhen);
}
@@ -1817,7 +1815,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
}
catch (failed_constructor& err) {
- error << _("DiskStream: could not create region for captured audio!") << endmsg;
+ error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
continue; /* XXX is this OK? */
}
@@ -1850,7 +1848,7 @@ DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture
}
void
-DiskStream::finish_capture (bool rec_monitors_input)
+AudioDiskstream::finish_capture (bool rec_monitors_input)
{
was_recording = false;
@@ -1899,7 +1897,7 @@ DiskStream::finish_capture (bool rec_monitors_input)
}
void
-DiskStream::set_record_enabled (bool yn, void* src)
+AudioDiskstream::set_record_enabled (bool yn, void* src)
{
bool rolling = _session.transport_speed() != 0.0f;
@@ -1958,9 +1956,9 @@ DiskStream::set_record_enabled (bool yn, void* src)
}
XMLNode&
-DiskStream::get_state ()
+AudioDiskstream::get_state ()
{
- XMLNode* node = new XMLNode ("DiskStream");
+ XMLNode* node = new XMLNode ("AudioDiskstream");
char buf[64];
LocaleGuard lg (X_("POSIX"));
@@ -1984,7 +1982,7 @@ DiskStream::get_state ()
XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
XMLNode* cs_grandchild;
- for (vector<FileSource*>::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
+ for (vector<AudioFileSource*>::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
cs_grandchild = new XMLNode (X_("file"));
cs_grandchild->add_property (X_("path"), (*i)->path());
cs_child->add_child_nocopy (*cs_grandchild);
@@ -2012,7 +2010,7 @@ DiskStream::get_state ()
}
int
-DiskStream::set_state (const XMLNode& node)
+AudioDiskstream::set_state (const XMLNode& node)
{
const XMLProperty* prop;
XMLNodeList nlist = node.children();
@@ -2137,14 +2135,14 @@ DiskStream::set_state (const XMLNode& node)
}
int
-DiskStream::use_new_write_source (uint32_t n)
+AudioDiskstream::use_new_write_source (uint32_t n)
{
if (!recordable()) {
return 1;
}
if (n >= channels.size()) {
- error << string_compose (_("DiskStream: channel %1 out of range"), n) << endmsg;
+ error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
return -1;
}
@@ -2152,7 +2150,7 @@ DiskStream::use_new_write_source (uint32_t n)
if (chan.write_source) {
- if (FileSource::is_empty (chan.write_source->path())) {
+ if (AudioFileSource::is_empty (chan.write_source->path())) {
chan.write_source->mark_for_remove ();
chan.write_source->release();
delete chan.write_source;
@@ -2163,7 +2161,7 @@ DiskStream::use_new_write_source (uint32_t n)
}
try {
- if ((chan.write_source = _session.create_file_source (*this, n, destructive())) == 0) {
+ if ((chan.write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
throw failed_constructor();
}
}
@@ -2184,7 +2182,7 @@ DiskStream::use_new_write_source (uint32_t n)
}
void
-DiskStream::reset_write_sources (bool mark_write_complete, bool force)
+AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
{
ChannelList::iterator chan;
uint32_t n;
@@ -2227,7 +2225,7 @@ DiskStream::reset_write_sources (bool mark_write_complete, bool force)
}
int
-DiskStream::rename_write_sources ()
+AudioDiskstream::rename_write_sources ()
{
ChannelList::iterator chan;
uint32_t n;
@@ -2243,7 +2241,7 @@ DiskStream::rename_write_sources ()
}
void
-DiskStream::set_block_size (jack_nframes_t nframes)
+AudioDiskstream::set_block_size (jack_nframes_t nframes)
{
if (_session.get_block_size() > speed_buffer_size) {
speed_buffer_size = _session.get_block_size();
@@ -2257,7 +2255,7 @@ DiskStream::set_block_size (jack_nframes_t nframes)
}
void
-DiskStream::allocate_temporary_buffers ()
+AudioDiskstream::allocate_temporary_buffers ()
{
/* make sure the wrap buffer is at least large enough to deal
with the speeds up to 1.2, to allow for micro-variation
@@ -2281,7 +2279,7 @@ DiskStream::allocate_temporary_buffers ()
}
void
-DiskStream::monitor_input (bool yn)
+AudioDiskstream::monitor_input (bool yn)
{
for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
@@ -2292,7 +2290,7 @@ DiskStream::monitor_input (bool yn)
}
void
-DiskStream::set_capture_offset ()
+AudioDiskstream::set_capture_offset ()
{
if (_io == 0) {
/* can't capture, so forget it */
@@ -2303,13 +2301,13 @@ DiskStream::set_capture_offset ()
}
void
-DiskStream::set_persistent_align_style (AlignStyle a)
+AudioDiskstream::set_persistent_align_style (AlignStyle a)
{
_persistent_alignment_style = a;
}
void
-DiskStream::set_align_style_from_io ()
+AudioDiskstream::set_align_style_from_io ()
{
bool have_physical = false;
@@ -2334,7 +2332,7 @@ DiskStream::set_align_style_from_io ()
}
void
-DiskStream::set_align_style (AlignStyle a)
+AudioDiskstream::set_align_style (AlignStyle a)
{
if (record_enabled() && _session.actively_recording()) {
return;
@@ -2348,7 +2346,7 @@ DiskStream::set_align_style (AlignStyle a)
}
int
-DiskStream::add_channel ()
+AudioDiskstream::add_channel ()
{
/* XXX need to take lock??? */
@@ -2368,7 +2366,7 @@ DiskStream::add_channel ()
}
int
-DiskStream::remove_channel ()
+AudioDiskstream::remove_channel ()
{
if (channels.size() > 1) {
/* XXX need to take lock??? */
@@ -2384,21 +2382,21 @@ DiskStream::remove_channel ()
}
float
-DiskStream::playback_buffer_load () const
+AudioDiskstream::playback_buffer_load () const
{
return (float) ((double) channels.front().playback_buf->read_space()/
(double) channels.front().playback_buf->bufsize());
}
float
-DiskStream::capture_buffer_load () const
+AudioDiskstream::capture_buffer_load () const
{
return (float) ((double) channels.front().capture_buf->write_space()/
(double) channels.front().capture_buf->bufsize());
}
int
-DiskStream::set_loop (Location *location)
+AudioDiskstream::set_loop (Location *location)
{
if (location) {
if (location->start() >= location->end()) {
@@ -2414,7 +2412,7 @@ DiskStream::set_loop (Location *location)
}
jack_nframes_t
-DiskStream::get_capture_start_frame (uint32_t n)
+AudioDiskstream::get_capture_start_frame (uint32_t n)
{
Glib::Mutex::Lock lm (capture_info_lock);
@@ -2427,7 +2425,7 @@ DiskStream::get_capture_start_frame (uint32_t n)
}
jack_nframes_t
-DiskStream::get_captured_frames (uint32_t n)
+AudioDiskstream::get_captured_frames (uint32_t n)
{
Glib::Mutex::Lock lm (capture_info_lock);
@@ -2440,23 +2438,23 @@ DiskStream::get_captured_frames (uint32_t n)
}
void
-DiskStream::punch_in ()
+AudioDiskstream::punch_in ()
{
}
void
-DiskStream::punch_out ()
+AudioDiskstream::punch_out ()
{
}
int
-DiskStream::use_pending_capture_data (XMLNode& node)
+AudioDiskstream::use_pending_capture_data (XMLNode& node)
{
const XMLProperty* prop;
XMLNodeList nlist = node.children();
XMLNodeIterator niter;
- FileSource* fs;
- FileSource* first_fs = 0;
+ AudioFileSource* fs;
+ AudioFileSource* first_fs = 0;
AudioRegion::SourceList pending_sources;
jack_nframes_t position;
@@ -2476,7 +2474,10 @@ DiskStream::use_pending_capture_data (XMLNode& node)
}
try {
- fs = new FileSource (prop->value(), _session.frame_rate(), true, Config->get_native_file_data_format());
+ fs = new SndFileSource (prop->value(),
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ _session.frame_rate());
}
catch (failed_constructor& err) {
@@ -2543,13 +2544,13 @@ DiskStream::use_pending_capture_data (XMLNode& node)
}
void
-DiskStream::set_roll_delay (jack_nframes_t nframes)
+AudioDiskstream::set_roll_delay (jack_nframes_t nframes)
{
_roll_delay = nframes;
}
void
-DiskStream::set_destructive (bool yn)
+AudioDiskstream::set_destructive (bool yn)
{
if (yn != destructive()) {
reset_write_sources (true, true);
diff --git a/libs/ardour/audio_library.cc b/libs/ardour/audio_library.cc
index bf462f7128..7f421e86c8 100644
--- a/libs/ardour/audio_library.cc
+++ b/libs/ardour/audio_library.cc
@@ -42,6 +42,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
static char* SOUNDFILE = "http://ardour.org/ontology/Soundfile";
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc
index 9f3c02ce43..bbbaf42fef 100644
--- a/libs/ardour/audio_playlist.cc
+++ b/libs/ardour/audio_playlist.cc
@@ -37,6 +37,7 @@
using namespace ARDOUR;
using namespace sigc;
using namespace std;
+using namespace PBD;
AudioPlaylist::State::~State ()
{
diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc
index 30adc54d1a..ae24d3a577 100644
--- a/libs/ardour/audio_track.cc
+++ b/libs/ardour/audio_track.cc
@@ -23,10 +23,11 @@
#include <sigc++/bind.h>
#include <ardour/audio_track.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/session.h>
#include <ardour/redirect.h>
#include <ardour/audioregion.h>
+#include <ardour/audiosource.h>
#include <ardour/route_group_specialized.h>
#include <ardour/insert.h>
#include <ardour/audioplaylist.h>
@@ -37,25 +38,26 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
: Route (sess, name, 1, -1, -1, -1, flag),
diskstream (0),
_midi_rec_enable_control (*this, _session.midi_port())
{
- DiskStream::Flag dflags = DiskStream::Flag (0);
+ AudioDiskstream::Flag dflags = AudioDiskstream::Flag (0);
if (_flags & Hidden) {
- dflags = DiskStream::Flag (dflags | DiskStream::Hidden);
+ dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Hidden);
} else {
- dflags = DiskStream::Flag (dflags | DiskStream::Recordable);
+ dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Recordable);
}
if (mode == Destructive) {
- dflags = DiskStream::Flag (dflags | DiskStream::Destructive);
+ dflags = AudioDiskstream::Flag (dflags | AudioDiskstream::Destructive);
}
- DiskStream* ds = new DiskStream (_session, name, dflags);
+ AudioDiskstream* ds = new AudioDiskstream (_session, name, dflags);
_declickable = true;
_freeze_record.state = NoFreeze;
@@ -64,6 +66,8 @@ AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode
set_diskstream (*ds, this);
+ // session.SMPTEOffsetChanged.connect (mem_fun (*this, &AudioTrack::handle_smpte_offset_change));
+
// we do this even though Route already did it in it's init
reset_midi_control (_session.midi_port(), _session.get_midi_control());
@@ -90,6 +94,14 @@ AudioTrack::~AudioTrack ()
}
}
+#if 0
+void
+AudioTrack::handle_smpte_offset_change ()
+{
+ diskstream
+}
+#endif
+
int
AudioTrack::deprecated_use_diskstream_connections ()
{
@@ -143,7 +155,7 @@ AudioTrack::deprecated_use_diskstream_connections ()
}
int
-AudioTrack::set_diskstream (DiskStream& ds, void *src)
+AudioTrack::set_diskstream (AudioDiskstream& ds, void *src)
{
if (diskstream) {
diskstream->unref();
@@ -166,7 +178,7 @@ AudioTrack::set_diskstream (DiskStream& ds, void *src)
diskstream->monitor_input (false);
ic_connection.disconnect();
- ic_connection = input_changed.connect (mem_fun (*diskstream, &DiskStream::handle_input_change));
+ ic_connection = input_changed.connect (mem_fun (*diskstream, &AudioDiskstream::handle_input_change));
diskstream_changed (src); /* EMIT SIGNAL */
@@ -176,7 +188,7 @@ AudioTrack::set_diskstream (DiskStream& ds, void *src)
int
AudioTrack::use_diskstream (string name)
{
- DiskStream *dstream;
+ AudioDiskstream *dstream;
if ((dstream = _session.diskstream_by_name (name)) == 0) {
error << string_compose(_("AudioTrack: diskstream \"%1\" not known by session"), name) << endmsg;
@@ -189,7 +201,7 @@ AudioTrack::use_diskstream (string name)
int
AudioTrack::use_diskstream (id_t id)
{
- DiskStream *dstream;
+ AudioDiskstream *dstream;
if ((dstream = _session.diskstream_by_id (id)) == 0) {
error << string_compose(_("AudioTrack: diskstream \"%1\" not known by session"), id) << endmsg;
@@ -899,23 +911,23 @@ AudioTrack::update_total_latency ()
void
AudioTrack::bounce (InterThreadInfo& itt)
{
- vector<Source*> srcs;
- _session.write_one_track (*this, 0, _session.current_end_frame(), false, srcs, itt);
+ vector<AudioSource*> srcs;
+ _session.write_one_audio_track (*this, 0, _session.current_end_frame(), false, srcs, itt);
}
void
AudioTrack::bounce_range (jack_nframes_t start, jack_nframes_t end, InterThreadInfo& itt)
{
- vector<Source*> srcs;
- _session.write_one_track (*this, start, end, false, srcs, itt);
+ vector<AudioSource*> srcs;
+ _session.write_one_audio_track (*this, start, end, false, srcs, itt);
}
void
AudioTrack::freeze (InterThreadInfo& itt)
{
Insert* insert;
- vector<Source*> srcs;
+ vector<AudioSource*> srcs;
string new_playlist_name;
Playlist* new_playlist;
string dir;
@@ -950,7 +962,7 @@ AudioTrack::freeze (InterThreadInfo& itt)
return;
}
- if (_session.write_one_track (*this, 0, _session.current_end_frame(), true, srcs, itt)) {
+ if (_session.write_one_audio_track (*this, 0, _session.current_end_frame(), true, srcs, itt)) {
return;
}
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 87866e7b31..5a5e200531 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -40,6 +40,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
jack_nframes_t Port::short_over_length = 2;
jack_nframes_t Port::long_over_length = 10;
@@ -91,12 +92,6 @@ _thread_init_callback (void *arg)
*/
PBD::ThreadCreatedWithRequestSize (pthread_self(), X_("Audioengine"), 4096);
-
-#ifdef VST_SUPPORT
- if (Config->get_use_vst()) {
- fst_adopt_thread ();
- }
-#endif
}
int
@@ -229,9 +224,10 @@ AudioEngine::_freewheel_callback (int onoff, void *arg)
int
AudioEngine::process_callback (jack_nframes_t nframes)
{
+ // CycleTimer ct ("AudioEngine::process");
Glib::Mutex::Lock tm (_process_lock, Glib::TRY_LOCK);
jack_nframes_t next_processed_frames;
-
+
/* handle wrap around of total frames counter */
if (max_frames - _processed_frames < nframes) {
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
new file mode 100644
index 0000000000..1e13a29acc
--- /dev/null
+++ b/libs/ardour/audiofilesource.cc
@@ -0,0 +1,662 @@
+/*
+ Copyright (C) 2006 Paul Davis
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <vector>
+
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <pbd/mountpoint.h>
+#include <pbd/pathscanner.h>
+#include <pbd/stl_delete.h>
+#include <pbd/strsplit.h>
+
+#include <sndfile.h>
+
+#include <glibmm/miscutils.h>
+
+#include <ardour/audiofilesource.h>
+#include <ardour/sndfile_helpers.h>
+#include <ardour/sndfilesource.h>
+#include <ardour/destructive_filesource.h>
+#include <ardour/session.h>
+
+// if these headers come before sigc++ is included
+// the parser throws ObjC++ errors. (nil is a keyword)
+#ifdef HAVE_COREAUDIO
+#include <ardour/coreaudio_source.h>
+#include <AudioToolbox/ExtendedAudioFile.h>
+#include <AudioToolbox/AudioFormat.h>
+#endif // HAVE_COREAUDIO
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+
+string AudioFileSource::peak_dir = "";
+string AudioFileSource::search_path;
+
+sigc::signal<void,struct tm*, time_t> AudioFileSource::HeaderPositionOffsetChanged;
+bool AudioFileSource::header_position_negative;
+uint64_t AudioFileSource::header_position_offset;
+
+char AudioFileSource::bwf_country_code[3] = "US";
+char AudioFileSource::bwf_organization_code[4] = "LAS";
+char AudioFileSource::bwf_serial_number[13] = "000000000000";
+
+AudioFileSource::AudioFileSource (string idstr, Flag flags)
+ : AudioSource (idstr), _flags (flags)
+{
+ /* constructor used for existing external to session files. file must exist already */
+
+ if (init (idstr, true)) {
+ throw failed_constructor ();
+ }
+
+}
+
+AudioFileSource::AudioFileSource (std::string path, Flag flags, SampleFormat samp_format, HeaderFormat hdr_format)
+ : AudioSource (path), _flags (flags)
+{
+ /* constructor used for new internal-to-session files. file cannot exist */
+
+ if (init (path, false)) {
+ throw failed_constructor ();
+ }
+}
+
+AudioFileSource::AudioFileSource (const XMLNode& node)
+ : AudioSource (node), _flags (Flag (Writable|CanRename))
+{
+ /* constructor used for existing internal-to-session files. file must exist */
+
+ if (set_state (node)) {
+ throw failed_constructor ();
+ }
+
+ if (init (_name, true)) {
+ throw failed_constructor ();
+ }
+}
+
+AudioFileSource::~AudioFileSource ()
+{
+ if (removable()) {
+ unlink (_path.c_str());
+ unlink (peakpath.c_str());
+ }
+}
+
+bool
+AudioFileSource::removable () const
+{
+ return (_flags & Removable) && ((_flags & RemoveAtDestroy) ||
+ ((_flags & RemovableIfEmpty) && is_empty (_path)));
+}
+
+int
+AudioFileSource::init (string pathstr, bool must_exist)
+{
+ bool is_new = false;
+
+ _length = 0;
+ next_peak_clear_should_notify = false;
+
+ if (!find (pathstr, must_exist, is_new)) {
+ cerr << "cannot find " << pathstr << " with me = " << must_exist << endl;
+ return -1;
+ }
+
+ if (is_new && must_exist) {
+ return -1;
+ }
+
+ return 0;
+}
+
+
+string
+AudioFileSource::peak_path (string audio_path)
+{
+ return Session::peak_path_from_audio_path (audio_path);
+}
+
+string
+AudioFileSource::old_peak_path (string audio_path)
+{
+ /* XXX hardly bombproof! fix me */
+
+ struct stat stat_file;
+ struct stat stat_mount;
+
+ string mp = mountpoint (audio_path);
+
+ stat (audio_path.c_str(), &stat_file);
+ stat (mp.c_str(), &stat_mount);
+
+ char buf[32];
+#ifdef __APPLE__
+ snprintf (buf, sizeof (buf), "%u-%u-%d.peak", stat_mount.st_ino, stat_file.st_ino, channel);
+#else
+ snprintf (buf, sizeof (buf), "%ld-%ld-%d.peak", stat_mount.st_ino, stat_file.st_ino, channel);
+#endif
+
+ string res = peak_dir;
+ res += buf;
+
+ return res;
+}
+
+#ifdef HAVE_COREAUDIO
+
+AudioFileSource*
+AudioFileSource::create (const XMLNode& node)
+{
+ AudioFileSource* es = 0;
+
+ if (node.property (X_("destructive")) != 0) {
+
+ es = new DestructiveFileSource (node);
+
+ } else {
+
+ try {
+ es = new CoreAudioSource (node);
+ }
+
+
+ catch (failed_constructor& err) {
+ es = new SndFileSource (node);
+ }
+ }
+
+ return es;
+}
+
+#else
+
+AudioFileSource*
+AudioFileSource::create (const XMLNode& node)
+{
+ if (node.property (X_("destructive")) != 0) {
+
+ return new DestructiveFileSource (node);
+
+ } else {
+
+ return new SndFileSource (node);
+ }
+}
+
+#endif // HAVE_COREAUDIO
+
+#ifdef HAVE_COREAUDIO
+AudioFileSource*
+AudioFileSource::create (const string& idstr)
+{
+ AudioFileSource* es = 0;
+
+ try {
+ es = new CoreAudioSource (idstr);
+ }
+
+ catch (failed_constructor& err) {
+ es = new SndFileSource (idstr);
+ }
+
+ return es;
+}
+
+#else
+
+AudioFileSource*
+AudioFileSource::create (string idstr)
+{
+ return new SndFileSource (idstr);
+}
+
+#endif // HAVE_COREAUDIO
+
+#ifdef HAVE_COREAUDIO
+std::string
+CFStringRefToStdString(CFStringRef stringRef)
+{
+ CFIndex size =
+ CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) ,
+ kCFStringEncodingASCII);
+ char *buf = new char[size];
+
+ std::string result;
+
+ if(CFStringGetCString(stringRef, buf, size, kCFStringEncodingASCII)) {
+ result = buf;
+ }
+ delete [] buf;
+ return result;
+}
+#endif // HAVE_COREAUDIO
+
+bool
+AudioFileSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg)
+{
+#ifdef HAVE_COREAUDIO
+ OSStatus err = noErr;
+ FSRef ref;
+ ExtAudioFileRef af = 0;
+ size_t size;
+ CFStringRef name;
+
+ err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0);
+ if (err != noErr) {
+ ExtAudioFileDispose (af);
+ goto libsndfile;
+ }
+
+ err = ExtAudioFileOpen(&ref, &af);
+ if (err != noErr) {
+ ExtAudioFileDispose (af);
+ goto libsndfile;
+ }
+
+ AudioStreamBasicDescription absd;
+ memset(&absd, 0, sizeof(absd));
+ size = sizeof(AudioStreamBasicDescription);
+ err = ExtAudioFileGetProperty(af,
+ kExtAudioFileProperty_FileDataFormat, &size, &absd);
+ if (err != noErr) {
+ ExtAudioFileDispose (af);
+ goto libsndfile;
+ }
+
+ _info.samplerate = absd.mSampleRate;
+ _info.channels = absd.mChannelsPerFrame;
+
+ size = sizeof(_info.length);
+ err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length);
+ if (err != noErr) {
+ ExtAudioFileDispose (af);
+ goto libsndfile;
+ }
+
+ size = sizeof(CFStringRef);
+ err = AudioFormatGetProperty(
+ kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name);
+ if (err != noErr) {
+ ExtAudioFileDispose (af);
+ goto libsndfile;
+ }
+
+ _info.format_name = CFStringRefToStdString(name);
+
+ ExtAudioFileDispose (af);
+ return true;
+
+libsndfile:
+#endif // HAVE_COREAUDIO
+
+ SNDFILE *sf;
+ SF_INFO sf_info;
+
+ sf_info.format = 0; // libsndfile says to clear this before sf_open().
+
+ if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) {
+ char errbuf[256];
+ error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+ return false;
+ }
+
+ sf_close (sf);
+
+ _info.samplerate = sf_info.samplerate;
+ _info.channels = sf_info.channels;
+ _info.length = sf_info.frames;
+ _info.format_name = string_compose("Format: %1, %2",
+ sndfile_major_format(sf_info.format),
+ sndfile_minor_format(sf_info.format));
+ return true;
+}
+
+XMLNode&
+AudioFileSource::get_state ()
+{
+ XMLNode& root (AudioSource::get_state());
+ char buf[16];
+ snprintf (buf, sizeof (buf), "0x%x", (int)_flags);
+ root.add_property ("flags", buf);
+ return root;
+}
+
+int
+AudioFileSource::set_state (const XMLNode& node)
+{
+ const XMLProperty* prop;
+
+ if (AudioSource::set_state (node)) {
+ return -1;
+ }
+
+ if ((prop = node.property (X_("flags"))) != 0) {
+
+ int ival;
+ sscanf (prop->value().c_str(), "0x%x", &ival);
+ _flags = Flag (ival);
+
+ } else {
+
+ _flags = Flag (0);
+
+ }
+
+ return 0;
+}
+
+void
+AudioFileSource::mark_for_remove ()
+{
+ if (!writable()) {
+ return;
+ }
+ _flags = Flag (_flags | RemoveAtDestroy);
+}
+
+void
+AudioFileSource::mark_streaming_write_completed ()
+{
+ if (!writable()) {
+ return;
+ }
+
+ Glib::Mutex::Lock lm (_lock);
+
+ next_peak_clear_should_notify = true;
+
+ if (_peaks_built || pending_peak_builds.empty()) {
+ _peaks_built = true;
+ PeaksReady (); /* EMIT SIGNAL */
+ }
+}
+
+void
+AudioFileSource::mark_take (string id)
+{
+ if (writable()) {
+ _take_id = id;
+ }
+}
+
+int
+AudioFileSource::move_to_trash (const string trash_dir_name)
+{
+ string newpath;
+
+ if (!writable()) {
+ return -1;
+ }
+
+ /* don't move the file across filesystems, just
+ stick it in the `trash_dir_name' directory
+ on whichever filesystem it was already on.
+ */
+
+ newpath = Glib::path_get_dirname (_path);
+ newpath = Glib::path_get_dirname (newpath);
+
+ newpath += '/';
+ newpath += trash_dir_name;
+ newpath += '/';
+ newpath += Glib::path_get_basename (_path);
+
+ if (access (newpath.c_str(), F_OK) == 0) {
+
+ /* the new path already exists, try versioning */
+
+ char buf[PATH_MAX+1];
+ int version = 1;
+ string newpath_v;
+
+ snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
+ newpath_v = buf;
+
+ while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
+ snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
+ newpath_v = buf;
+ }
+
+ if (version == 999) {
+ error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
+ newpath)
+ << endmsg;
+ } else {
+ newpath = newpath_v;
+ }
+
+ } else {
+
+ /* it doesn't exist, or we can't read it or something */
+
+ }
+
+ if (::rename (_path.c_str(), newpath.c_str()) != 0) {
+ error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
+ _path, newpath, strerror (errno))
+ << endmsg;
+ return -1;
+ }
+
+ if (::unlink (peakpath.c_str()) != 0) {
+ error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
+ peakpath, _path, strerror (errno))
+ << endmsg;
+ /* try to back out */
+ rename (newpath.c_str(), _path.c_str());
+ return -1;
+ }
+
+ _path = newpath;
+ peakpath = "";
+
+ /* file can not be removed twice, since the operation is not idempotent */
+
+ _flags = Flag (_flags & ~(RemoveAtDestroy|Removable|RemovableIfEmpty));
+
+ return 0;
+}
+
+bool
+AudioFileSource::find (string pathstr, bool must_exist, bool& isnew)
+{
+ string::size_type pos;
+ bool ret = false;
+
+ isnew = false;
+
+ /* clean up PATH:CHANNEL notation so that we are looking for the correct path */
+
+ if ((pos = pathstr.find_last_of (':')) == string::npos) {
+ pathstr = pathstr;
+ } else {
+ pathstr = pathstr.substr (0, pos);
+ }
+
+ if (pathstr[0] != '/') {
+
+ /* non-absolute pathname: find pathstr in search path */
+
+ vector<string> dirs;
+ int cnt;
+ string fullpath;
+ string keeppath;
+
+ if (search_path.length() == 0) {
+ error << _("FileSource: search path not set") << endmsg;
+ goto out;
+ }
+
+ split (search_path, dirs, ':');
+
+ cnt = 0;
+
+ for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
+
+ fullpath = *i;
+ if (fullpath[fullpath.length()-1] != '/') {
+ fullpath += '/';
+ }
+ fullpath += pathstr;
+
+ if (access (fullpath.c_str(), R_OK) == 0) {
+ keeppath = fullpath;
+ ++cnt;
+ }
+ }
+
+ if (cnt > 1) {
+
+ error << string_compose (_("FileSource: \"%1\" is ambigous when searching %2\n\t"), pathstr, search_path) << endmsg;
+ goto out;
+
+ } else if (cnt == 0) {
+
+ if (must_exist) {
+ error << string_compose(_("Filesource: cannot find required file (%1): while searching %2"), pathstr, search_path) << endmsg;
+ goto out;
+ } else {
+ isnew = true;
+ }
+ }
+
+ _name = pathstr;
+ _path = keeppath;
+ ret = true;
+
+ } else {
+
+ /* external files and/or very very old style sessions include full paths */
+
+ _path = pathstr;
+ _name = pathstr.substr (pathstr.find_last_of ('/') + 1);
+
+ if (access (_path.c_str(), R_OK) != 0) {
+
+ /* file does not exist or we cannot read it */
+
+ if (must_exist) {
+ error << string_compose(_("Filesource: cannot find required file (%1): %2"), _path, strerror (errno)) << endmsg;
+ goto out;
+ }
+
+ if (errno != ENOENT) {
+ error << string_compose(_("Filesource: cannot check for existing file (%1): %2"), _path, strerror (errno)) << endmsg;
+ goto out;
+ }
+
+ /* a new file */
+
+ isnew = true;
+ ret = true;
+
+ } else {
+
+ /* already exists */
+
+ ret = true;
+ }
+ }
+
+ out:
+ return ret;
+}
+
+void
+AudioFileSource::set_search_path (string p)
+{
+ search_path = p;
+}
+
+void
+AudioFileSource::set_header_position_offset (jack_nframes_t offset, bool negative)
+{
+ time_t tnow;
+
+ time (&tnow);
+
+ header_position_offset = offset;
+ header_position_negative = negative;
+ HeaderPositionOffsetChanged (localtime (&tnow), tnow); /* EMIT SIGNAL */
+}
+
+void
+AudioFileSource::set_timeline_position (jack_nframes_t pos)
+{
+ timeline_position = pos;
+}
+
+void
+AudioFileSource::handle_header_position_change (struct tm* now, time_t tnow)
+{
+ /* don't do this if the file has never had its header flushed to disk yet */
+
+ if (writable() && _timestamp) {
+ set_header_timeline_position ();
+ flush_header ();
+ }
+}
+
+void
+AudioFileSource::set_allow_remove_if_empty (bool yn)
+{
+ if (writable()) {
+ allow_remove_if_empty = yn;
+ }
+}
+
+int
+AudioFileSource::set_name (string newname, bool destructive)
+{
+ Glib::Mutex::Lock lm (_lock);
+ string oldpath = _path;
+ string newpath = Session::change_audio_path_by_name (oldpath, _name, newname, destructive);
+
+ if (newpath.empty()) {
+ error << string_compose (_("programming error: %1"), "cannot generate a changed audio path") << endmsg;
+ return -1;
+ }
+
+ if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
+ error << string_compose (_("cannot rename audio file for %1 to %2"), _name, newpath) << endmsg;
+ return -1;
+ }
+
+ _name = Glib::path_get_basename (newpath);
+ _path = newpath;
+
+ return rename_peakfile (peak_path (_path));
+}
+
+bool
+AudioFileSource::is_empty (string path)
+{
+ /* XXX fix me */
+
+ return false;
+}
+
diff --git a/libs/ardour/audiofilter.cc b/libs/ardour/audiofilter.cc
index c340bccb2c..a26d9674bd 100644
--- a/libs/ardour/audiofilter.cc
+++ b/libs/ardour/audiofilter.cc
@@ -22,7 +22,7 @@
#include <cerrno>
#include <pbd/basename.h>
-#include <ardour/filesource.h>
+#include <ardour/sndfilesource.h>
#include <ardour/session.h>
#include <ardour/audioregion.h>
#include <ardour/audiofilter.h>
@@ -30,6 +30,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
int
AudioFilter::make_new_sources (AudioRegion& region, AudioRegion::SourceList& nsrcs)
@@ -47,7 +48,10 @@ AudioFilter::make_new_sources (AudioRegion& region, AudioRegion::SourceList& nsr
}
try {
- nsrcs.push_back (new FileSource (path, session.frame_rate(), false, Config->get_native_file_data_format()));
+ nsrcs.push_back (new SndFileSource (path,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ session.frame_rate()));
}
catch (failed_constructor& err) {
@@ -73,7 +77,10 @@ AudioFilter::finish (AudioRegion& region, AudioRegion::SourceList& nsrcs)
now = localtime (&xnow);
for (AudioRegion::SourceList::iterator si = nsrcs.begin(); si != nsrcs.end(); ++si) {
- dynamic_cast<FileSource*>((*si))->update_header (region.position(), *now, xnow);
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*si);
+ if (afs) {
+ afs->update_header (region.position(), *now, xnow);
+ }
}
/* create a new region */
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index 21773d9222..6b118faa51 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -38,6 +38,7 @@
#include <ardour/dB.h>
#include <ardour/playlist.h>
#include <ardour/audiofilter.h>
+#include <ardour/audiosource.h>
#include "i18n.h"
#include <locale.h>
@@ -63,7 +64,7 @@ AudioRegionState::AudioRegionState (string why)
{
}
-AudioRegion::AudioRegion (Source& src, jack_nframes_t start, jack_nframes_t length, bool announce)
+AudioRegion::AudioRegion (AudioSource& src, jack_nframes_t start, jack_nframes_t length, bool announce)
: Region (start, length, PBD::basename_nosuffix(src.name()), 0, Region::Flag(Region::DefaultFlags|Region::External)),
_fade_in (0.0, 2.0, 1.0, false),
_fade_out (0.0, 2.0, 1.0, false),
@@ -89,7 +90,7 @@ AudioRegion::AudioRegion (Source& src, jack_nframes_t start, jack_nframes_t leng
}
}
-AudioRegion::AudioRegion (Source& src, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t layer, Flag flags, bool announce)
+AudioRegion::AudioRegion (AudioSource& src, jack_nframes_t start, jack_nframes_t length, const string& name, layer_t layer, Flag flags, bool announce)
: Region (start, length, name, layer, flags),
_fade_in (0.0, 2.0, 1.0, false),
_fade_out (0.0, 2.0, 1.0, false),
@@ -150,7 +151,7 @@ AudioRegion::AudioRegion (const AudioRegion& other, jack_nframes_t offset, jack_
{
/* create a new AudioRegion, that is part of an existing one */
- set<Source*> unique_srcs;
+ set<AudioSource*> unique_srcs;
for (SourceList::const_iterator i= other.sources.begin(); i != other.sources.end(); ++i) {
sources.push_back (*i);
@@ -209,7 +210,7 @@ AudioRegion::AudioRegion (const AudioRegion &other)
{
/* Pure copy constructor */
- set<Source*> unique_srcs;
+ set<AudioSource*> unique_srcs;
for (SourceList::const_iterator i = other.sources.begin(); i != other.sources.end(); ++i) {
sources.push_back (*i);
@@ -237,7 +238,7 @@ AudioRegion::AudioRegion (const AudioRegion &other)
/* NOTE: no CheckNewRegion signal emitted here. This is the copy constructor */
}
-AudioRegion::AudioRegion (Source& src, const XMLNode& node)
+AudioRegion::AudioRegion (AudioSource& src, const XMLNode& node)
: Region (node),
_fade_in (0.0, 2.0, 1.0, false),
_fade_out (0.0, 2.0, 1.0, false),
@@ -268,7 +269,7 @@ AudioRegion::AudioRegion (SourceList& srcs, const XMLNode& node)
{
/* basic AudioRegion constructor */
- set<Source*> unique_srcs;
+ set<AudioSource*> unique_srcs;
for (SourceList::iterator i=srcs.begin(); i != srcs.end(); ++i) {
sources.push_back (*i);
@@ -1094,7 +1095,7 @@ void
AudioRegion::lock_sources ()
{
SourceList::iterator i;
- set<Source*> unique_srcs;
+ set<AudioSource*> unique_srcs;
for (i = sources.begin(); i != sources.end(); ++i) {
unique_srcs.insert (*i);
@@ -1112,7 +1113,7 @@ void
AudioRegion::unlock_sources ()
{
SourceList::iterator i;
- set<Source*> unique_srcs;
+ set<AudioSource*> unique_srcs;
for (i = sources.begin(); i != sources.end(); ++i) {
unique_srcs.insert (*i);
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
new file mode 100644
index 0000000000..add9364cad
--- /dev/null
+++ b/libs/ardour/audiosource.cc
@@ -0,0 +1,899 @@
+/*
+ Copyright (C) 2000 Paul Davis
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id: source.cc 404 2006-03-17 17:39:21Z pauld $
+*/
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <float.h>
+#include <cerrno>
+#include <ctime>
+#include <cmath>
+#include <iomanip>
+#include <algorithm>
+
+#include <pbd/xml++.h>
+#include <pbd/pthread_utils.h>
+
+#include <ardour/audiosource.h>
+
+#include "i18n.h"
+
+using namespace std;
+using namespace ARDOUR;
+using namespace PBD;
+
+sigc::signal<void,AudioSource *> AudioSource::AudioSourceCreated;
+pthread_t AudioSource::peak_thread;
+bool AudioSource::have_peak_thread = false;
+vector<AudioSource*> AudioSource::pending_peak_sources;
+Glib::Mutex* AudioSource::pending_peak_sources_lock = 0;
+int AudioSource::peak_request_pipe[2];
+
+bool AudioSource::_build_missing_peakfiles = false;
+bool AudioSource::_build_peakfiles = false;
+
+AudioSource::AudioSource (string name)
+ : Source (name)
+{
+ if (pending_peak_sources_lock == 0) {
+ pending_peak_sources_lock = new Glib::Mutex;
+ }
+
+ _peaks_built = false;
+ next_peak_clear_should_notify = true;
+ _read_data_count = 0;
+ _write_data_count = 0;
+}
+
+AudioSource::AudioSource (const XMLNode& node)
+ : Source (node)
+{
+ if (pending_peak_sources_lock == 0) {
+ pending_peak_sources_lock = new Glib::Mutex;
+ }
+
+ _peaks_built = false;
+ next_peak_clear_should_notify = true;
+ _read_data_count = 0;
+ _write_data_count = 0;
+
+ if (set_state (node)) {
+ throw failed_constructor();
+ }
+}
+
+AudioSource::~AudioSource ()
+{
+}
+
+XMLNode&
+AudioSource::get_state ()
+{
+ XMLNode& node (Source::get_state());
+
+ if (_captured_for.length()) {
+ node.add_property ("captured-for", _captured_for);
+ }
+
+ return node;
+}
+
+int
+AudioSource::set_state (const XMLNode& node)
+{
+ const XMLProperty* prop;
+
+ Source::set_state (node);
+
+ if ((prop = node.property ("captured-for")) != 0) {
+ _captured_for = prop->value();
+ }
+
+ return 0;
+}
+
+/***********************************************************************
+ PEAK FILE STUFF
+ ***********************************************************************/
+
+void*
+AudioSource::peak_thread_work (void* arg)
+{
+ PBD::ThreadCreated (pthread_self(), X_("Peak"));
+ struct pollfd pfd[1];
+
+ if (pending_peak_sources_lock == 0) {
+ pending_peak_sources_lock = new Glib::Mutex;
+ }
+
+ Glib::Mutex::Lock lm (*pending_peak_sources_lock);
+
+ while (true) {
+
+ pfd[0].fd = peak_request_pipe[0];
+ pfd[0].events = POLLIN|POLLERR|POLLHUP;
+
+ pending_peak_sources_lock->unlock ();
+
+ if (poll (pfd, 1, -1) < 0) {
+
+ if (errno == EINTR) {
+ pending_peak_sources_lock->lock ();
+ continue;
+ }
+
+ error << string_compose (_("poll on peak request pipe failed (%1)"),
+ strerror (errno))
+ << endmsg;
+ break;
+ }
+
+ if (pfd[0].revents & ~POLLIN) {
+ error << _("Error on peak thread request pipe") << endmsg;
+ break;
+ }
+
+ if (pfd[0].revents & POLLIN) {
+
+ char req;
+
+ /* empty the pipe of all current requests */
+
+ while (1) {
+ size_t nread = ::read (peak_request_pipe[0], &req, sizeof (req));
+
+ if (nread == 1) {
+ switch ((PeakRequest::Type) req) {
+
+ case PeakRequest::Build:
+ break;
+
+ case PeakRequest::Quit:
+ pthread_exit_pbd (0);
+ /*NOTREACHED*/
+ break;
+
+ default:
+ break;
+ }
+
+ } else if (nread == 0) {
+ break;
+ } else if (errno == EAGAIN) {
+ break;
+ } else {
+ fatal << _("Error reading from peak request pipe") << endmsg;
+ /*NOTREACHED*/
+ }
+ }
+ }
+
+ pending_peak_sources_lock->lock ();
+
+ while (!pending_peak_sources.empty()) {
+
+ AudioSource* s = pending_peak_sources.front();
+ pending_peak_sources.erase (pending_peak_sources.begin());
+
+ pending_peak_sources_lock->unlock ();
+ s->build_peaks();
+ pending_peak_sources_lock->lock ();
+ }
+ }
+
+ pthread_exit_pbd (0);
+ /*NOTREACHED*/
+ return 0;
+}
+
+int
+AudioSource::start_peak_thread ()
+{
+ if (!_build_peakfiles) {
+ return 0;
+ }
+
+ if (pipe (peak_request_pipe)) {
+ error << string_compose(_("Cannot create transport request signal pipe (%1)"), strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ if (fcntl (peak_request_pipe[0], F_SETFL, O_NONBLOCK)) {
+ error << string_compose(_("UI: cannot set O_NONBLOCK on peak request pipe (%1)"), strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ if (fcntl (peak_request_pipe[1], F_SETFL, O_NONBLOCK)) {
+ error << string_compose(_("UI: cannot set O_NONBLOCK on peak request pipe (%1)"), strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ if (pthread_create_and_store ("peak file builder", &peak_thread, 0, peak_thread_work, 0)) {
+ error << _("AudioSource: could not create peak thread") << endmsg;
+ return -1;
+ }
+
+ have_peak_thread = true;
+ return 0;
+}
+
+void
+AudioSource::stop_peak_thread ()
+{
+ if (!have_peak_thread) {
+ return;
+ }
+
+ void* status;
+
+ char c = (char) PeakRequest::Quit;
+ ::write (peak_request_pipe[1], &c, 1);
+ pthread_join (peak_thread, &status);
+}
+
+void
+AudioSource::queue_for_peaks (AudioSource& source)
+{
+ if (have_peak_thread) {
+
+ Glib::Mutex::Lock lm (*pending_peak_sources_lock);
+
+ source.next_peak_clear_should_notify = true;
+
+ if (find (pending_peak_sources.begin(),
+ pending_peak_sources.end(),
+ &source) == pending_peak_sources.end()) {
+ pending_peak_sources.push_back (&source);
+ }
+
+ char c = (char) PeakRequest::Build;
+ ::write (peak_request_pipe[1], &c, 1);
+ }
+}
+
+void AudioSource::clear_queue_for_peaks ()
+{
+ /* this is done to cancel a group of running peak builds */
+ if (have_peak_thread) {
+ Glib::Mutex::Lock lm (*pending_peak_sources_lock);
+ pending_peak_sources.clear ();
+ }
+}
+
+
+bool
+AudioSource::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
+{
+ bool ret;
+ Glib::Mutex::Lock lm (_lock);
+
+ /* check to see if the peak data is ready. if not
+ connect the slot while still holding the lock.
+ */
+
+ if (!(ret = _peaks_built)) {
+ conn = PeaksReady.connect (the_slot);
+ }
+
+ return ret;
+}
+
+int
+AudioSource::rename_peakfile (string newpath)
+{
+ /* caller must hold _lock */
+
+ string oldpath = peakpath;
+
+ if (access (oldpath.c_str(), F_OK) == 0) {
+ if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
+ error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
+ return -1;
+ }
+ }
+
+ peakpath = newpath;
+
+ return 0;
+}
+
+int
+AudioSource::initialize_peakfile (bool newfile, string audio_path)
+{
+ struct stat statbuf;
+
+ peakpath = peak_path (audio_path);
+
+ /* Nasty band-aid for older sessions that were created before we
+ used libsndfile for all audio files.
+ */
+
+ if (!newfile && access (peakpath.c_str(), R_OK) != 0) {
+ string str = old_peak_path (audio_path);
+ if (access (str.c_str(), R_OK) == 0) {
+ peakpath = str;
+ }
+ }
+
+ if (newfile) {
+
+ if (!_build_peakfiles) {
+ return 0;
+ }
+
+ _peaks_built = false;
+
+ } else {
+
+ if (stat (peakpath.c_str(), &statbuf)) {
+ if (errno != ENOENT) {
+ /* it exists in the peaks dir, but there is some kind of error */
+
+ error << string_compose(_("AudioSource: cannot stat peakfile \"%1\""), peakpath) << endmsg;
+ return -1;
+ }
+
+ } else {
+
+ /* we found it in the peaks dir */
+ }
+
+ if (statbuf.st_size == 0) {
+ _peaks_built = false;
+ } else {
+ // Check if the audio file has changed since the peakfile was built.
+ struct stat stat_file;
+ int err = stat (audio_path.c_str(), &stat_file);
+
+ if (!err && stat_file.st_mtime > statbuf.st_mtime){
+ _peaks_built = false;
+ } else {
+ _peaks_built = true;
+ }
+ }
+ }
+
+ if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
+ build_peaks_from_scratch ();
+ }
+
+ return 0;
+}
+
+jack_nframes_t
+AudioSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
+{
+ Glib::Mutex::Lock lm (_lock);
+ return read_unlocked (dst, start, cnt, workbuf);
+}
+
+jack_nframes_t
+AudioSource::write (Sample *dst, jack_nframes_t cnt, char * workbuf)
+{
+ Glib::Mutex::Lock lm (_lock);
+ return write_unlocked (dst, cnt, workbuf);
+}
+
+int
+AudioSource::read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_visual_peak) const
+{
+ Glib::Mutex::Lock lm (_lock);
+ double scale;
+ double expected_peaks;
+ PeakData::PeakDatum xmax;
+ PeakData::PeakDatum xmin;
+ int32_t to_read;
+ uint32_t nread;
+ jack_nframes_t zero_fill = 0;
+ int ret = -1;
+ PeakData* staging = 0;
+ Sample* raw_staging = 0;
+ char * workbuf = 0;
+ int peakfile = -1;
+
+ expected_peaks = (cnt / (double) frames_per_peak);
+ scale = npeaks/expected_peaks;
+
+#if 0
+ cerr << "======>RP: npeaks = " << npeaks
+ << " start = " << start
+ << " cnt = " << cnt
+ << " len = " << _length
+ << " samples_per_visual_peak =" << samples_per_visual_peak
+ << " expected was " << expected_peaks << " ... scale = " << scale
+ << " PD ptr = " << peaks
+ <<endl;
+
+#endif
+
+ /* fix for near-end-of-file conditions */
+
+ if (cnt > _length - start) {
+ // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
+ cnt = _length - start;
+ jack_nframes_t old = npeaks;
+ npeaks = min ((jack_nframes_t) floor (cnt / samples_per_visual_peak), npeaks);
+ zero_fill = old - npeaks;
+ }
+
+ // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
+
+ if (npeaks == cnt) {
+
+ // cerr << "RAW DATA\n";
+
+ /* no scaling at all, just get the sample data and duplicate it for
+ both max and min peak values.
+ */
+
+ Sample* raw_staging = new Sample[cnt];
+ workbuf = new char[cnt*4];
+
+ if (read_unlocked (raw_staging, start, cnt, workbuf) != cnt) {
+ error << _("cannot read sample data for unscaled peak computation") << endmsg;
+ return -1;
+ }
+
+ for (jack_nframes_t i = 0; i < npeaks; ++i) {
+ peaks[i].max = raw_staging[i];
+ peaks[i].min = raw_staging[i];
+ }
+
+ delete [] raw_staging;
+ delete [] workbuf;
+ return 0;
+ }
+
+ if (scale == 1.0) {
+
+ off_t first_peak_byte = (start / frames_per_peak) * sizeof (PeakData);
+
+ /* open, read, close */
+
+ if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
+ error << string_compose(_("AudioSource: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ // cerr << "DIRECT PEAKS\n";
+
+ nread = ::pread (peakfile, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
+ close (peakfile);
+
+ if (nread != sizeof (PeakData) * npeaks) {
+ cerr << "AudioSource["
+ << _name
+ << "]: cannot read peaks from peakfile! (read only "
+ << nread
+ << " not "
+ << npeaks
+ << "at sample "
+ << start
+ << " = byte "
+ << first_peak_byte
+ << ')'
+ << endl;
+ return -1;
+ }
+
+ if (zero_fill) {
+ memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
+ }
+
+ return 0;
+ }
+
+
+ jack_nframes_t tnp;
+
+ if (scale < 1.0) {
+
+ // cerr << "DOWNSAMPLE\n";
+
+ /* the caller wants:
+
+ - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
+ - less peaks than the peakfile holds for the same range
+
+ So, read a block into a staging area, and then downsample from there.
+
+ to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
+ */
+
+ const uint32_t chunksize = (uint32_t) min (expected_peaks, 4096.0);
+
+ staging = new PeakData[chunksize];
+
+ /* compute the rounded up frame position */
+
+ jack_nframes_t current_frame = start;
+ jack_nframes_t current_stored_peak = (jack_nframes_t) ceil (current_frame / (double) frames_per_peak);
+ uint32_t next_visual_peak = (uint32_t) ceil (current_frame / samples_per_visual_peak);
+ double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
+ uint32_t stored_peak_before_next_visual_peak = (jack_nframes_t) next_visual_peak_frame / frames_per_peak;
+ uint32_t nvisual_peaks = 0;
+ uint32_t stored_peaks_read = 0;
+ uint32_t i = 0;
+
+ /* handle the case where the initial visual peak is on a pixel boundary */
+
+ current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
+
+ /* open ... close during out: handling */
+
+ if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
+ error << string_compose(_("AudioSource: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return 0;
+ }
+
+ while (nvisual_peaks < npeaks) {
+
+ if (i == stored_peaks_read) {
+
+ uint32_t start_byte = current_stored_peak * sizeof(PeakData);
+ tnp = min ((_length/frames_per_peak - current_stored_peak), (jack_nframes_t) expected_peaks);
+ to_read = min (chunksize, tnp);
+
+ off_t fend = lseek (peakfile, 0, SEEK_END);
+
+ if ((nread = ::pread (peakfile, staging, sizeof (PeakData) * to_read, start_byte))
+ != sizeof (PeakData) * to_read) {
+ cerr << "AudioSource["
+ << _name
+ << "]: cannot read peak data from peakfile ("
+ << (nread / sizeof(PeakData))
+ << " peaks instead of "
+ << to_read
+ << ") ("
+ << strerror (errno)
+ << ')'
+ << " at start_byte = " << start_byte
+ << " _length = " << _length << " versus len = " << fend
+ << " expected maxpeaks = " << (_length - current_frame)/frames_per_peak
+ << " npeaks was " << npeaks
+ << endl;
+ goto out;
+ }
+
+ i = 0;
+ stored_peaks_read = nread / sizeof(PeakData);
+ }
+
+ xmax = -1.0;
+ xmin = 1.0;
+
+ while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
+
+ xmax = max (xmax, staging[i].max);
+ xmin = min (xmin, staging[i].min);
+ ++i;
+ ++current_stored_peak;
+ --expected_peaks;
+ }
+
+ peaks[nvisual_peaks].max = xmax;
+ peaks[nvisual_peaks].min = xmin;
+ ++nvisual_peaks;
+ ++next_visual_peak;
+
+ //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
+ next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
+ stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / frames_per_peak;
+ }
+
+ if (zero_fill) {
+ memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
+ }
+
+ ret = 0;
+
+ } else {
+
+ // cerr << "UPSAMPLE\n";
+
+ /* the caller wants
+
+ - less frames-per-peak (more resolution)
+ - more peaks than stored in the Peakfile
+
+ So, fetch data from the raw source, and generate peak
+ data on the fly.
+ */
+
+ jack_nframes_t frames_read = 0;
+ jack_nframes_t current_frame = start;
+ jack_nframes_t i = 0;
+ jack_nframes_t nvisual_peaks = 0;
+ jack_nframes_t chunksize = (jack_nframes_t) min (cnt, (jack_nframes_t) 4096);
+ raw_staging = new Sample[chunksize];
+ workbuf = new char[chunksize *4];
+
+ jack_nframes_t frame_pos = start;
+ double pixel_pos = floor (frame_pos / samples_per_visual_peak);
+ double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
+ double pixels_per_frame = 1.0 / samples_per_visual_peak;
+
+ xmin = 1.0;
+ xmax = -1.0;
+
+ while (nvisual_peaks < npeaks) {
+
+ if (i == frames_read) {
+
+ to_read = min (chunksize, (_length - current_frame));
+
+ if ((frames_read = read_unlocked (raw_staging, current_frame, to_read, workbuf)) < 0) {
+ error << string_compose(_("AudioSource[%1]: peak read - cannot read %2 samples at offset %3")
+ , _name, to_read, current_frame)
+ << endmsg;
+ goto out;
+ }
+
+ i = 0;
+ }
+
+ xmax = max (xmax, raw_staging[i]);
+ xmin = min (xmin, raw_staging[i]);
+ ++i;
+ ++current_frame;
+ pixel_pos += pixels_per_frame;
+
+ if (pixel_pos >= next_pixel_pos) {
+
+ peaks[nvisual_peaks].max = xmax;
+ peaks[nvisual_peaks].min = xmin;
+ ++nvisual_peaks;
+ xmin = 1.0;
+ xmax = -1.0;
+
+ next_pixel_pos = ceil (pixel_pos + 0.5);
+ }
+ }
+
+ if (zero_fill) {
+ memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
+ }
+
+ ret = 0;
+ }
+
+ out:
+ if (peakfile >= 0) {
+ close (peakfile);
+ }
+
+ if (staging) {
+ delete [] staging;
+ }
+
+ if (raw_staging) {
+ delete [] raw_staging;
+ }
+
+ if (workbuf) {
+ delete [] workbuf;
+ }
+
+ return ret;
+}
+
+#undef DEBUG_PEAK_BUILD
+
+int
+AudioSource::build_peaks ()
+{
+ vector<PeakBuildRecord*> built;
+ int status = -1;
+ bool pr_signal = false;
+ list<PeakBuildRecord*> copy;
+
+ {
+ Glib::Mutex::Lock lm (_lock);
+ copy = pending_peak_builds;
+ pending_peak_builds.clear ();
+ }
+
+#ifdef DEBUG_PEAK_BUILD
+ cerr << "build peaks with " << copy.size() << " requests pending\n";
+#endif
+
+ for (list<PeakBuildRecord *>::iterator i = copy.begin(); i != copy.end(); ++i) {
+
+ if ((status = do_build_peak ((*i)->frame, (*i)->cnt)) != 0) {
+ unlink (peakpath.c_str());
+ break;
+ }
+ built.push_back (new PeakBuildRecord (*(*i)));
+ delete *i;
+ }
+
+ {
+ Glib::Mutex::Lock lm (_lock);
+
+ if (status == 0) {
+ _peaks_built = true;
+
+ if (next_peak_clear_should_notify) {
+ next_peak_clear_should_notify = false;
+ pr_signal = true;
+ }
+ }
+ }
+
+ if (status == 0) {
+ for (vector<PeakBuildRecord *>::iterator i = built.begin(); i != built.end(); ++i) {
+ PeakRangeReady ((*i)->frame, (*i)->cnt); /* EMIT SIGNAL */
+ delete *i;
+ }
+
+ if (pr_signal) {
+ PeaksReady (); /* EMIT SIGNAL */
+ }
+ }
+
+ return status;
+}
+
+int
+AudioSource::do_build_peak (jack_nframes_t first_frame, jack_nframes_t cnt)
+{
+ jack_nframes_t current_frame;
+ Sample buf[frames_per_peak];
+ Sample xmin, xmax;
+ uint32_t peaki;
+ PeakData* peakbuf;
+ char * workbuf = 0;
+ jack_nframes_t frames_read;
+ jack_nframes_t frames_to_read;
+ off_t first_peak_byte;
+ int peakfile = -1;
+ int ret = -1;
+
+#ifdef DEBUG_PEAK_BUILD
+ cerr << pthread_self() << ": " << _name << ": building peaks for " << first_frame << " to " << first_frame + cnt - 1 << endl;
+#endif
+
+ first_peak_byte = (first_frame / frames_per_peak) * sizeof (PeakData);
+
+#ifdef DEBUG_PEAK_BUILD
+ cerr << "seeking to " << first_peak_byte << " before writing new peak data\n";
+#endif
+
+ current_frame = first_frame;
+ peakbuf = new PeakData[(cnt/frames_per_peak)+1];
+ peaki = 0;
+
+ workbuf = new char[max(frames_per_peak, cnt) * 4];
+
+ if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
+ error << string_compose(_("AudioSource: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return -1;
+ }
+
+ while (cnt) {
+
+ frames_to_read = min (frames_per_peak, cnt);
+
+ /* lock for every read */
+
+ if ((frames_read = read (buf, current_frame, frames_to_read, workbuf)) != frames_to_read) {
+ error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
+ goto out;
+ }
+
+ xmin = buf[0];
+ xmax = buf[0];
+
+ for (jack_nframes_t n = 1; n < frames_read; ++n) {
+ xmax = max (xmax, buf[n]);
+ xmin = min (xmin, buf[n]);
+
+// if (current_frame < frames_read) {
+// cerr << "sample = " << buf[n] << " max = " << xmax << " min = " << xmin << " max of 2 = " << max (xmax, buf[n]) << endl;
+// }
+ }
+
+ peakbuf[peaki].max = xmax;
+ peakbuf[peaki].min = xmin;
+ peaki++;
+
+ current_frame += frames_read;
+ cnt -= frames_read;
+ }
+
+ if (::pwrite (peakfile, peakbuf, sizeof (PeakData) * peaki, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaki)) {
+ error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
+ goto out;
+ }
+
+ ret = 0;
+
+ out:
+ delete [] peakbuf;
+ if (peakfile >= 0) {
+ close (peakfile);
+ }
+ if (workbuf)
+ delete [] workbuf;
+ return ret;
+}
+
+void
+AudioSource::build_peaks_from_scratch ()
+{
+ Glib::Mutex::Lock lp (_lock);
+
+ next_peak_clear_should_notify = true;
+ pending_peak_builds.push_back (new PeakBuildRecord (0, _length));
+ queue_for_peaks (*this);
+}
+
+bool
+AudioSource::file_changed (string path)
+{
+ struct stat stat_file;
+ struct stat stat_peak;
+
+ int e1 = stat (path.c_str(), &stat_file);
+ int e2 = stat (peak_path(path).c_str(), &stat_peak);
+
+ if (!e1 && !e2 && stat_file.st_mtime > stat_peak.st_mtime){
+ return true;
+ } else {
+ return false;
+ }
+}
+
+jack_nframes_t
+AudioSource::available_peaks (double zoom_factor) const
+{
+ int peakfile;
+ off_t end;
+
+ if (zoom_factor < frames_per_peak) {
+ return length(); // peak data will come from the audio file
+ }
+
+ /* peak data comes from peakfile */
+
+ if ((peakfile = ::open (peakpath.c_str(), O_RDONLY)) < 0) {
+ error << string_compose(_("AudioSource: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
+ return 0;
+ }
+
+ {
+ Glib::Mutex::Lock lm (_lock);
+ end = lseek (peakfile, 0, SEEK_END);
+ }
+
+ close (peakfile);
+
+ return (end/sizeof(PeakData)) * frames_per_peak;
+}
+
+void
+AudioSource::update_length (jack_nframes_t pos, jack_nframes_t cnt)
+{
+ if (pos + cnt > _length) {
+ _length = pos+cnt;
+ }
+}
+
diff --git a/libs/ardour/auditioner.cc b/libs/ardour/auditioner.cc
index ce7b9a3e6f..2f0b943c0e 100644
--- a/libs/ardour/auditioner.cc
+++ b/libs/ardour/auditioner.cc
@@ -20,7 +20,7 @@
#include <glibmm/thread.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/audioregion.h>
#include <ardour/route.h>
#include <ardour/session.h>
diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc
index 17888c4a7c..3df7dd94f7 100644
--- a/libs/ardour/automation_event.cc
+++ b/libs/ardour/automation_event.cc
@@ -31,6 +31,7 @@
using namespace std;
using namespace ARDOUR;
using namespace sigc;
+using namespace PBD;
#if 0
static void dumpit (const AutomationList& al, string prefix = "")
diff --git a/libs/ardour/configuration.cc b/libs/ardour/configuration.cc
index b7b1d65815..fc708f805d 100644
--- a/libs/ardour/configuration.cc
+++ b/libs/ardour/configuration.cc
@@ -26,7 +26,7 @@
#include <ardour/ardour.h>
#include <ardour/configuration.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/destructive_filesource.h>
#include <ardour/control_protocol_manager.h>
@@ -34,6 +34,7 @@
using namespace ARDOUR;
using namespace std;
+using namespace PBD;
/* this is global so that we do not have to indirect through an object pointer
to reference it.
@@ -231,7 +232,7 @@ Configuration::set_state (const XMLNode& root)
}
}
- DiskStream::set_disk_io_chunk_frames (minimum_disk_io_bytes.get() / sizeof (Sample));
+ AudioDiskstream::set_disk_io_chunk_frames (minimum_disk_io_bytes.get() / sizeof (Sample));
return 0;
}
diff --git a/libs/ardour/connection.cc b/libs/ardour/connection.cc
index 719751f7ba..fbfd02d509 100644
--- a/libs/ardour/connection.cc
+++ b/libs/ardour/connection.cc
@@ -28,6 +28,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
Connection::Connection (const XMLNode& node)
{
diff --git a/libs/ardour/control_protocol_manager.cc b/libs/ardour/control_protocol_manager.cc
index 57a89cc2d9..c2fb188953 100644
--- a/libs/ardour/control_protocol_manager.cc
+++ b/libs/ardour/control_protocol_manager.cc
@@ -4,16 +4,14 @@
#include <pbd/error.h>
#include <pbd/pathscanner.h>
-#include "control_protocol.h"
+#include <control_protocol/control_protocol.h>
#include <ardour/session.h>
#include <ardour/control_protocol_manager.h>
-
-
-
using namespace ARDOUR;
using namespace std;
+using namespace PBD;
#include "i18n.h"
diff --git a/libs/ardour/coreaudio_source.cc b/libs/ardour/coreaudio_source.cc
index 67aaabfb88..1b0ee565e7 100644
--- a/libs/ardour/coreaudio_source.cc
+++ b/libs/ardour/coreaudio_source.cc
@@ -26,21 +26,22 @@
#include <AudioToolbox/AudioFormat.h>
using namespace ARDOUR;
+using namespace PBD;
CoreAudioSource::CoreAudioSource (const XMLNode& node)
- : ExternalSource (node)
+ : AudioFileSource (node)
{
init (_name, true);
- SourceCreated (this); /* EMIT SIGNAL */
+ AudioSourceCreated (this); /* EMIT SIGNAL */
}
CoreAudioSource::CoreAudioSource (const string& idstr, bool build_peak)
- : ExternalSource(idstr, build_peak)
+ : AudioFileSource(idstr, build_peak)
{
init (idstr, build_peak);
if (build_peak) {
- SourceCreated (this); /* EMIT SIGNAL */
+ AudioSourceCreated (this); /* EMIT SIGNAL */
}
}
diff --git a/libs/ardour/crossfade.cc b/libs/ardour/crossfade.cc
index 767fdd85e6..5d36c63f01 100644
--- a/libs/ardour/crossfade.cc
+++ b/libs/ardour/crossfade.cc
@@ -33,7 +33,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
jack_nframes_t Crossfade::_short_xfade_length = 0;
Change Crossfade::ActiveChanged = ARDOUR::new_change();
diff --git a/libs/ardour/curve.cc b/libs/ardour/curve.cc
index a515c3a39a..977b6dfd7b 100644
--- a/libs/ardour/curve.cc
+++ b/libs/ardour/curve.cc
@@ -38,6 +38,7 @@
using namespace std;
using namespace ARDOUR;
using namespace sigc;
+using namespace PBD;
Curve::Curve (double minv, double maxv, double canv, bool nostate)
: AutomationList (canv, nostate)
diff --git a/libs/ardour/cycle_timer.cc b/libs/ardour/cycle_timer.cc
index c48b7fb861..3031d5a7ec 100644
--- a/libs/ardour/cycle_timer.cc
+++ b/libs/ardour/cycle_timer.cc
@@ -24,6 +24,8 @@
#include "i18n.h"
+using namespace PBD;
+
float CycleTimer::cycles_per_usec = 0;
float
diff --git a/libs/ardour/destructive_filesource.cc b/libs/ardour/destructive_filesource.cc
index 9a4c2425e9..cce757509a 100644
--- a/libs/ardour/destructive_filesource.cc
+++ b/libs/ardour/destructive_filesource.cc
@@ -61,18 +61,15 @@ typedef off_t off64_t;
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
gain_t* DestructiveFileSource::out_coefficient = 0;
gain_t* DestructiveFileSource::in_coefficient = 0;
jack_nframes_t DestructiveFileSource::xfade_frames = 64;
-DestructiveFileSource::DestructiveFileSource (string path, jack_nframes_t rate, bool repair_first, SampleFormat samp_format)
- : FileSource (path, rate, repair_first, samp_format)
+DestructiveFileSource::DestructiveFileSource (string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate, Flag flags)
+ : SndFileSource (path, samp_format, hdr_format, rate, flags)
{
- if (out_coefficient == 0) {
- setup_standard_crossfades (rate);
- }
-
xfade_buf = new Sample[xfade_frames];
_capture_start = false;
@@ -80,13 +77,9 @@ DestructiveFileSource::DestructiveFileSource (string path, jack_nframes_t rate,
file_pos = 0;
}
-DestructiveFileSource::DestructiveFileSource (const XMLNode& node, jack_nframes_t rate)
- : FileSource (node, rate)
+DestructiveFileSource::DestructiveFileSource (const XMLNode& node)
+ : SndFileSource (node)
{
- if (out_coefficient == 0) {
- setup_standard_crossfades (rate);
- }
-
xfade_buf = new Sample[xfade_frames];
_capture_start = false;
@@ -102,6 +95,10 @@ DestructiveFileSource::~DestructiveFileSource()
void
DestructiveFileSource::setup_standard_crossfades (jack_nframes_t rate)
{
+ /* This static method is assumed to have been called by the Session
+ before any DFS's are created.
+ */
+
xfade_frames = (jack_nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate);
if (out_coefficient) {
@@ -124,12 +121,6 @@ DestructiveFileSource::setup_standard_crossfades (jack_nframes_t rate)
}
}
-int
-DestructiveFileSource::seek (jack_nframes_t frame)
-{
- return 0;
-}
-
void
DestructiveFileSource::mark_capture_start (jack_nframes_t pos)
{
@@ -188,7 +179,7 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in,
}
if (file_cnt) {
- if ((retval = file_read (xfade_buf, fade_position, file_cnt, workbuf)) != (ssize_t) file_cnt) {
+ if ((retval = write_float (xfade_buf, fade_position, file_cnt)) != (ssize_t) file_cnt) {
if (retval >= 0 && errno == EAGAIN) {
/* XXX - can we really trust that errno is meaningful here? yes POSIX, i'm talking to you.
* short or no data there */
@@ -206,7 +197,7 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in,
}
if (nofade && !fade_in) {
- if (file_write (data, file_pos, nofade, workbuf) != (ssize_t) nofade) {
+ if (write_float (data, file_pos, nofade) != nofade) {
error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
return 0;
}
@@ -248,14 +239,14 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in,
}
if (xfade) {
- if (file_write (xfade_buf, fade_position, xfade, workbuf) != (ssize_t) xfade) {
+ if (write_float (xfade_buf, fade_position, xfade) != xfade) {
error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
return 0;
}
}
if (fade_in && nofade) {
- if (file_write (data + xfade, file_pos + xfade, nofade, workbuf) != (ssize_t) nofade) {
+ if (write_float (data + xfade, file_pos + xfade, nofade) != nofade) {
error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
return 0;
}
@@ -265,96 +256,98 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in,
}
jack_nframes_t
-DestructiveFileSource::write (Sample* data, jack_nframes_t cnt, char * workbuf)
+DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt, char * workbuf)
{
- {
- Glib::Mutex::Lock lm (_lock);
-
- jack_nframes_t old_file_pos;
+ jack_nframes_t old_file_pos;
- if (_capture_start && _capture_end) {
- _capture_start = false;
- _capture_end = false;
-
- /* move to the correct location place */
- file_pos = capture_start_frame;
-
- // split cnt in half
- jack_nframes_t subcnt = cnt / 2;
- jack_nframes_t ofilepos = file_pos;
-
- // fade in
- if (crossfade (data, subcnt, 1, workbuf) != subcnt) {
- return 0;
- }
+ if (!writable()) {
+ return 0;
+ }
- file_pos += subcnt;
- Sample * tmpdata = data + subcnt;
-
- // fade out
- subcnt = cnt - subcnt;
- if (crossfade (tmpdata, subcnt, 0, workbuf) != subcnt) {
- return 0;
- }
+ if (_capture_start && _capture_end) {
+ _capture_start = false;
+ _capture_end = false;
+
+ /* move to the correct location place */
+ file_pos = capture_start_frame;
+
+ // split cnt in half
+ jack_nframes_t subcnt = cnt / 2;
+ jack_nframes_t ofilepos = file_pos;
+
+ // fade in
+ if (crossfade (data, subcnt, 1, workbuf) != subcnt) {
+ return 0;
+ }
+
+ file_pos += subcnt;
+ Sample * tmpdata = data + subcnt;
+
+ // fade out
+ subcnt = cnt - subcnt;
+ if (crossfade (tmpdata, subcnt, 0, workbuf) != subcnt) {
+ return 0;
+ }
+
+ file_pos = ofilepos; // adjusted below
+ }
+ else if (_capture_start) {
- file_pos = ofilepos; // adjusted below
+ _capture_start = false;
+ _capture_end = false;
+
+ /* move to the correct location place */
+ file_pos = capture_start_frame;
+
+ if (crossfade (data, cnt, 1, workbuf) != cnt) {
+ return 0;
}
- else if (_capture_start) {
- _capture_start = false;
- _capture_end = false;
+
+ } else if (_capture_end) {
- /* move to the correct location place */
- file_pos = capture_start_frame;
-
- if (crossfade (data, cnt, 1, workbuf) != cnt) {
- return 0;
- }
+ _capture_start = false;
+ _capture_end = false;
+
+ if (crossfade (data, cnt, 0, workbuf) != cnt) {
+ return 0;
+ }
- } else if (_capture_end) {
- _capture_start = false;
- _capture_end = false;
+ } else {
- if (crossfade (data, cnt, 0, workbuf) != cnt) {
- return 0;
- }
- } else {
- if (file_write(data, file_pos, cnt, workbuf) != (ssize_t) cnt) {
- return 0;
- }
+ if (write_float (data, file_pos, cnt) != cnt) {
+ return 0;
}
-
- old_file_pos = file_pos;
- if (file_pos + cnt > _length) {
- _length = file_pos + cnt;
+ }
+
+ old_file_pos = file_pos;
+ update_length (file_pos, cnt);
+ file_pos += cnt;
+
+ if (_build_peakfiles) {
+ PeakBuildRecord *pbr = 0;
+
+ if (pending_peak_builds.size()) {
+ pbr = pending_peak_builds.back();
}
- file_pos += cnt;
- if (_build_peakfiles) {
- PeakBuildRecord *pbr = 0;
-
- if (pending_peak_builds.size()) {
- pbr = pending_peak_builds.back();
- }
+ if (pbr && pbr->frame + pbr->cnt == old_file_pos) {
- if (pbr && pbr->frame + pbr->cnt == old_file_pos) {
-
- /* the last PBR extended to the start of the current write,
- so just extend it again.
- */
-
- pbr->cnt += cnt;
- } else {
- pending_peak_builds.push_back (new PeakBuildRecord (old_file_pos, cnt));
- }
+ /* the last PBR extended to the start of the current write,
+ so just extend it again.
+ */
- _peaks_built = false;
+ pbr->cnt += cnt;
+ } else {
+ pending_peak_builds.push_back (new PeakBuildRecord (old_file_pos, cnt));
}
+
+ _peaks_built = false;
}
if (_build_peakfiles) {
queue_for_peaks (*this);
}
-
+
return cnt;
}
@@ -367,7 +360,14 @@ DestructiveFileSource::last_capture_start_frame () const
XMLNode&
DestructiveFileSource::get_state ()
{
- XMLNode& node = FileSource::get_state ();
+ XMLNode& node = AudioFileSource::get_state ();
node.add_property (X_("destructive"), "true");
return node;
}
+
+void
+DestructiveFileSource::set_timeline_position (jack_nframes_t pos)
+{
+ /* destructive tracks always start at where our reference frame zero is */
+ timeline_position = 0;
+}
diff --git a/libs/ardour/externalsource.cc b/libs/ardour/externalsource.cc
deleted file mode 100644
index 7f478b6f53..0000000000
--- a/libs/ardour/externalsource.cc
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- Copyright (C) 2006 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/time.h>
-
-#include <sndfile.h>
-
-#include <pbd/mountpoint.h>
-#include <ardour/externalsource.h>
-#include <ardour/sndfilesource.h>
-#include <ardour/sndfile_helpers.h>
-
-// if these headers come before sigc++ is included
-// the parser throws ObjC++ errors. (nil is a keyword)
-#ifdef HAVE_COREAUDIO
-#include <ardour/coreaudio_source.h>
-#include <AudioToolbox/ExtendedAudioFile.h>
-#include <AudioToolbox/AudioFormat.h>
-#endif // HAVE_COREAUDIO
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-
-string ExternalSource::peak_dir = "";
-
-ExternalSource::ExternalSource (const XMLNode& node)
- : Source (node)
-{
-}
-
-ExternalSource::ExternalSource (const string& idstr, bool build_peak)
- : Source(build_peak)
-{
-}
-
-ExternalSource::~ExternalSource ()
-{
-}
-
-jack_nframes_t
-ExternalSource::read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
-{
- return read (dst, start, cnt, workbuf);
-}
-
-string
-ExternalSource::peak_path (string audio_path)
-{
- /* XXX hardly bombproof! fix me */
-
- struct stat stat_file;
- struct stat stat_mount;
-
- string mp = mountpoint (audio_path);
-
- stat (audio_path.c_str(), &stat_file);
- stat (mp.c_str(), &stat_mount);
-
- char buf[32];
-#ifdef __APPLE__
- snprintf (buf, sizeof (buf), "%u-%u-%d.peak", stat_mount.st_ino, stat_file.st_ino, channel);
-#else
- snprintf (buf, sizeof (buf), "%ld-%ld-%d.peak", stat_mount.st_ino, stat_file.st_ino, channel);
-#endif
-
- string res = peak_dir;
- res += buf;
-
- return res;
-}
-
-#ifdef HAVE_COREAUDIO
-
-ExternalSource*
-ExternalSource::create (const XMLNode& node)
-{
- ExternalSource* es = 0;
-
- try {
- es = new CoreAudioSource (node);
- }
-
- catch (failed_constructor& err) {
- es = new SndFileSource (node);
- }
-
- es = new SndFileSource (node);
-
- return es;
-}
-
-#else
-
-ExternalSource*
-ExternalSource::create (const XMLNode& node)
-{
- return new SndFileSource (node);
-}
-
-#endif // HAVE_COREAUDIO
-
-#ifdef HAVE_COREAUDIO
-ExternalSource*
-ExternalSource::create (const string& idstr, bool build_peak)
-{
- ExternalSource* es = 0;
-
- try {
- es = new CoreAudioSource (idstr, build_peak);
- }
-
- catch (failed_constructor& err) {
- es = new SndFileSource (idstr, build_peak);
- }
-
- return es;
-}
-
-#else
-
-ExternalSource*
-ExternalSource::create (const string& idstr, bool build_peak)
-{
- return new SndFileSource (idstr, build_peak);
-}
-
-#endif // HAVE_COREAUDIO
-
-#ifdef HAVE_COREAUDIO
-std::string
-CFStringRefToStdString(CFStringRef stringRef)
-{
- CFIndex size =
- CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) ,
- kCFStringEncodingASCII);
- char *buf = new char[size];
-
- std::string result;
-
- if(CFStringGetCString(stringRef, buf, size, kCFStringEncodingASCII)) {
- result = buf;
- }
- delete [] buf;
- return result;
-}
-#endif // HAVE_COREAUDIO
-
-bool
-ExternalSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg)
-{
-#ifdef HAVE_COREAUDIO
- OSStatus err = noErr;
- FSRef ref;
- ExtAudioFileRef af = 0;
- size_t size;
- CFStringRef name;
-
- err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0);
- if (err != noErr) {
- ExtAudioFileDispose (af);
- goto libsndfile;
- }
-
- err = ExtAudioFileOpen(&ref, &af);
- if (err != noErr) {
- ExtAudioFileDispose (af);
- goto libsndfile;
- }
-
- AudioStreamBasicDescription absd;
- memset(&absd, 0, sizeof(absd));
- size = sizeof(AudioStreamBasicDescription);
- err = ExtAudioFileGetProperty(af,
- kExtAudioFileProperty_FileDataFormat, &size, &absd);
- if (err != noErr) {
- ExtAudioFileDispose (af);
- goto libsndfile;
- }
-
- _info.samplerate = absd.mSampleRate;
- _info.channels = absd.mChannelsPerFrame;
-
- size = sizeof(_info.length);
- err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length);
- if (err != noErr) {
- ExtAudioFileDispose (af);
- goto libsndfile;
- }
-
- size = sizeof(CFStringRef);
- err = AudioFormatGetProperty(
- kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name);
- if (err != noErr) {
- ExtAudioFileDispose (af);
- goto libsndfile;
- }
-
- _info.format_name = CFStringRefToStdString(name);
-
- ExtAudioFileDispose (af);
- return true;
-
-libsndfile:
-#endif // HAVE_COREAUDIO
-
- SNDFILE *sf;
- SF_INFO sf_info;
-
- sf_info.format = 0; // libsndfile says to clear this before sf_open().
-
- if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) {
- char errbuf[256];
- error_msg = sf_error_str (0, errbuf, sizeof (errbuf) - 1);
- return false;
- }
-
- sf_close (sf);
-
- _info.samplerate = sf_info.samplerate;
- _info.channels = sf_info.channels;
- _info.length = sf_info.frames;
- _info.format_name = string_compose("Format: %1, %2",
- sndfile_major_format(sf_info.format),
- sndfile_minor_format(sf_info.format));
-
- return true;
-}
diff --git a/libs/ardour/filesource.cc b/libs/ardour/filesource.cc
deleted file mode 100644
index 63a9a3d014..0000000000
--- a/libs/ardour/filesource.cc
+++ /dev/null
@@ -1,1513 +0,0 @@
-/*
- Copyright (C) 2000 Paul Davis
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- $Id$
-*/
-
-#include <algorithm>
-
-/* This is is very hacky way to get pread and pwrite declarations.
- First, include <features.h> so that we can avoid its #undef __USE_UNIX98.
- Then define __USE_UNIX98, include <unistd.h>, and then undef it
- again. If #define _XOPEN_SOURCE actually worked, I'd use that, but
- despite claims in the header that it does, it doesn't.
-
- features.h isn't available on osx and it compiles fine without it.
-*/
-
-#ifdef HAVE_FEATURES_H
-#include <features.h>
-#endif
-
-#if __GNUC__ >= 3
-// #define _XOPEN_SOURCE 500
-#include <unistd.h>
-#else
-#define __USE_UNIX98
-#include <unistd.h>
-#undef __USE_UNIX98
-#endif
-
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <climits>
-#include <cerrno>
-#include <sys/types.h>
-#include <pwd.h>
-#include <time.h>
-#include <sys/utsname.h>
-#include <vector>
-#include <cstdio> /* for rename(2) */
-
-#include <glibmm.h>
-
-#include <pbd/stl_delete.h>
-
-#include <glibmm/thread.h>
-#include <pbd/pathscanner.h>
-
-#include <ardour/ardour.h>
-#include <ardour/version.h>
-#include <ardour/source.h>
-#include <ardour/filesource.h>
-#include <ardour/session.h>
-#include <ardour/cycle_timer.h>
-#include <ardour/pcm_utils.h>
-
-#include "i18n.h"
-
-using namespace ARDOUR;
-
-string prepare_string(string& regex);
-
-char FileSource::bwf_country_code[3] = "us";
-char FileSource::bwf_organization_code[4] = "las";
-char FileSource::bwf_serial_number[13] = "000000000000";
-string FileSource::search_path;
-
-#undef WE_ARE_BIGENDIAN
-#ifdef __BIG_ENDIAN__
-#define WE_ARE_BIGENDIAN true
-#else
-#define WE_ARE_BIGENDIAN false
-#endif
-
-#define Swap_32(value) \
- (((((uint32_t)value)<<24) & 0xFF000000) | \
- ((((uint32_t)value)<< 8) & 0x00FF0000) | \
- ((((uint32_t)value)>> 8) & 0x0000FF00) | \
- ((((uint32_t)value)>>24) & 0x000000FF))
-
-#define Swap_16(value) \
- (((((uint16_t)value)>> 8) & 0x000000FF) | \
- ((((uint16_t)value)<< 8) & 0x0000FF00))
-
-
-void
-FileSource::set_search_path (string p)
-{
- search_path = p;
-}
-
-FileSource::FileSource (string pathstr, jack_nframes_t rate, bool repair_first, SampleFormat samp_format)
-{
- /* constructor used when the file cannot already exist or might be damaged */
- _sample_format = samp_format;
- if (samp_format == FormatInt24) {
- _sample_size = 3;
- } else {
- _sample_size = sizeof(float);
- }
-
- if (repair_first && repair (pathstr, rate)) {
- throw failed_constructor ();
- }
-
- if (init (pathstr, false, rate)) {
- throw failed_constructor ();
- }
-
- SourceCreated (this); /* EMIT SIGNAL */
-}
-
-FileSource::FileSource (const XMLNode& node, jack_nframes_t rate)
- : Source (node)
-{
- _sample_format = FormatFloat;
- _sample_size = sizeof(float);
-
- if (set_state (node)) {
- throw failed_constructor();
- }
-
- /* constructor used when the file must already exist */
-
- if (init (_name, true, rate)) {
- throw failed_constructor ();
- }
-
- SourceCreated (this); /* EMIT SIGNAL */
-}
-
-int
-FileSource::init (string pathstr, bool must_exist, jack_nframes_t rate)
-{
- bool new_file = false;
- int ret = -1;
- PathScanner scanner;
-
- /* all native files end in .wav. this lets us discard
- SndFileSource paths, which have ":N" at the end to
- indicate which channel to read from, as well as any
- other kind of non-native file. obviously, there
- are more subtle checks later on.
- */
-
- if (pathstr.length() < 4 || pathstr.rfind (".wav") != pathstr.length() - 4) {
- return ret;
- }
-
- is_bwf = false;
- _length = 0;
- fd = -1;
- remove_at_unref = false;
- next_peak_clear_should_notify = false;
- allow_remove_if_empty = true;
-
- if (pathstr[0] != '/') {
-
- /* find pathstr in search path */
-
- if (search_path.length() == 0) {
- error << _("FileSource: search path not set") << endmsg;
- goto out;
- }
-
- /* force exact match on the filename component by prefixing the regexp.
- otherwise, "Drums-2.wav" matches "Comp_Drums-2.wav".
- */
-
- string regexp = "^";
- regexp += prepare_string(pathstr);
- regexp += '$';
-
- vector<string*>* result = scanner (search_path, regexp, false, true, -1);
-
- if (result == 0 || result->size() == 0) {
- error << string_compose (_("FileSource: \"%1\" not found when searching %2 using %3"),
- pathstr, search_path, regexp) << endmsg;
- goto out;
- }
-
- if (result->size() > 1) {
- string msg = string_compose (_("FileSource: \"%1\" is ambigous when searching %2\n\t"), pathstr, search_path);
- vector<string*>::iterator x = result->begin();
-
- while (true) {
- msg += *(*x);
- ++x;
-
- if (x == result->end()) {
- break;
- }
-
- msg += "\n\t";
- }
-
- error << msg << endmsg;
- goto out;
- }
-
- _name = pathstr;
- _path = *(result->front());
-
- vector_delete (result);
- delete result;
-
- } else {
-
- /* old style sessions include full paths */
-
- _path = pathstr;
- _name = pathstr.substr (pathstr.find_last_of ('/') + 1);
-
- }
-
- if (access (_path.c_str(), F_OK) != 0) {
- if (must_exist) {
- error << string_compose(_("Filesource: cannot find required file (%1): %2"), _path, strerror (errno)) << endmsg;
- goto out;
-
- }
-
- if (errno == ENOENT) {
- new_file = true;
- } else {
- error << string_compose(_("Filesource: cannot check for existing file (%1): %2"), _path, strerror (errno)) << endmsg;
- goto out;
- }
- }
-
- if ((fd = open64 (_path.c_str(), O_RDWR|O_CREAT, 0644)) < 0) {
- error << string_compose(_("FileSource: could not open \"%1\": (%2)"), _path, strerror (errno)) << endmsg;
- goto out;
- }
-
- /* if there was no timestamp available via XML,
- then get it from the filesystem.
- */
-
- if (_timestamp == 0) {
- struct stat statbuf;
-
- fstat (fd, &statbuf);
- _timestamp = statbuf.st_mtime;
- }
-
- if (lseek (fd, 0, SEEK_END) == 0) {
- new_file = true;
- }
-
- /* check that its a RIFF/WAVE format file */
-
- if (new_file) {
-
- switch (Config->get_native_file_header_format()) {
- case BWF:
- is_bwf = true;
- break;
- default:
- is_bwf = false;
- break;
- }
-
- if (fill_header (rate)) {
- error << string_compose (_("FileSource: cannot write header in %1"), _path) << endmsg;
- goto out;
- }
-
- struct tm* now;
- time_t xnow;
-
- time (&xnow);
- now = localtime (&xnow);
-
- update_header (0, *now, xnow);
-
- } else {
-
- if (discover_chunks (must_exist)) {
- error << string_compose (_("FileSource: cannot locate chunks in %1"), _path) << endmsg;
- goto out;
- }
-
- if (read_header (must_exist)) {
- error << string_compose (_("FileSource: cannot read header in %1"), _path) << endmsg;
- goto out;
- }
-
- if (check_header (rate, must_exist)) {
- error << string_compose (_("FileSource: cannot check header in %1"), _path) << endmsg;
- goto out;
- }
-
- compute_header_size ();
- }
-
- if ((ret = initialize_peakfile (new_file, _path))) {
- error << string_compose (_("FileSource: cannot initialize peakfile for %1 as %2"), _path, peakpath) << endmsg;
- }
-
- out:
- if (ret) {
-
- if (fd >= 0) {
- close (fd);
- }
-
- if (new_file) {
- unlink (_path.c_str());
- }
- }
-
- return ret;
-
-}
-
-FileSource::~FileSource ()
-{
- GoingAway (this); /* EMIT SIGNAL */
-
- if (fd >= 0) {
-
- if (remove_at_unref || (is_empty (_path) && allow_remove_if_empty)) {
- unlink (_path.c_str());
- unlink (peakpath.c_str());
- }
-
- close (fd);
- }
-}
-
-void
-FileSource::set_allow_remove_if_empty (bool yn)
-{
- allow_remove_if_empty = yn;
-}
-
-int
-FileSource::set_name (string newname, bool destructive)
-{
- Glib::Mutex::Lock lm (_lock);
- string oldpath = _path;
- string newpath = Session::change_audio_path_by_name (oldpath, _name, newname, destructive);
-
- if (newpath.empty()) {
- error << string_compose (_("programming error: %1"), "cannot generate a changed audio path") << endmsg;
- return -1;
- }
-
- if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
- error << string_compose (_("cannot rename audio file for %1 to %2"), _name, newpath) << endmsg;
- return -1;
- }
-
- _name = Glib::path_get_basename (newpath);
- _path = newpath;
-
- return rename_peakfile (peak_path (_path));
-}
-
-string
-FileSource::peak_path (string audio_path)
-{
- return Session::peak_path_from_audio_path (audio_path);
-}
-
-int
-FileSource::discover_chunks (bool silent)
-{
- WAVEChunk rw;
- off64_t end;
- off64_t offset;
- char null_terminated_id[5];
- bool doswap = false;
-
- if ((end = lseek (fd, 0, SEEK_END)) < 0) {
- error << _("FileSource: cannot seek to end of file") << endmsg;
- return -1;
- }
-
- if (::pread64 (fd, &rw, sizeof (rw), 0) != sizeof (rw)) {
- error << _("FileSource: cannot read RIFF/WAVE chunk from file") << endmsg;
- return -1;
- }
-
- if (memcmp (rw.id, "RIFF", 4) == 0 && memcmp (rw.text, "WAVE", 4) == 0) {
- header.bigendian = false;
- }
- else if (memcmp(rw.id, "RIFX", 4) == 0 && memcmp (rw.text, "WAVE", 4) == 0) {
- header.bigendian = true;
- }
- else {
- if (!silent) {
- error << string_compose (_("FileSource %1: not a RIFF/WAVE file"), _path) << endmsg;
- }
- return -1;
- }
-
- null_terminated_id[4] = '\0';
-
- /* OK, its a RIFF/WAVE file. Find each chunk */
-
- doswap = header.bigendian != WE_ARE_BIGENDIAN;
-
- if (doswap) {
- swap_endian(rw);
- }
-
-
-
- memcpy (null_terminated_id, rw.id, 4);
- chunk_info.push_back (ChunkInfo (null_terminated_id, rw.size, 0));
-
- offset = sizeof (rw);
-
- while (offset < end) {
-
- GenericChunk this_chunk;
-
- if (::pread64 (fd, &this_chunk, sizeof (this_chunk), offset) != sizeof (this_chunk)) {
- error << _("FileSource: can't read a chunk") << endmsg;
- return -1;
- }
-
- if (doswap) {
- swap_endian(this_chunk);
- }
-
- memcpy (null_terminated_id, this_chunk.id, 4);
-
- /* do sanity check and possible correction to legacy ardour RIFF wavs
- created on big endian platforms. after swapping, the size field will not be
- in range for the fmt chunk
- */
- if ((memcmp(null_terminated_id, "fmt ", 4) == 0 || memcmp(null_terminated_id, "bext", 4) == 0)
- && !header.bigendian && (this_chunk.size > 700 || this_chunk.size < 0))
- {
- warning << _("filesource: correcting mis-written RIFF file to become a RIFX: ") << name() << endmsg;
-
- memcpy (&rw.id, "RIFX", 4);
- ::pwrite64 (fd, &rw.id, 4, 0);
- header.bigendian = true;
- // fix wave chunk already read
- swap_endian(rw);
-
- doswap = header.bigendian != WE_ARE_BIGENDIAN;
-
- // now reset offset and continue the loop
- // to reread all the chunks
- chunk_info.clear();
- memcpy (null_terminated_id, rw.id, 4);
- chunk_info.push_back (ChunkInfo (null_terminated_id, rw.size, 0));
- offset = sizeof (rw);
- continue;
- }
-
-
- if (end != 44)
- if ((memcmp(null_terminated_id, "data", 4) == 0))
- if ((this_chunk.size == 0) || (this_chunk.size > (end - offset)))
- this_chunk.size = end - offset;
-
- chunk_info.push_back (ChunkInfo (null_terminated_id, this_chunk.size, offset));
-
- /* skip to the next chunk */
-
- offset += sizeof(GenericChunk) + this_chunk.size;
- }
-
- return 0;
-}
-
-void
-FileSource::swap_endian (GenericChunk & chunk) const
-{
- chunk.size = Swap_32(chunk.size);
-}
-
-void
-FileSource::swap_endian (FMTChunk & chunk) const
-{
- chunk.size = Swap_32(chunk.size);
-
- chunk.formatTag = Swap_16(chunk.formatTag);
- chunk.nChannels = Swap_16(chunk.nChannels);
- chunk.nSamplesPerSec = Swap_32(chunk.nSamplesPerSec);
- chunk.nAvgBytesPerSec = Swap_32(chunk.nAvgBytesPerSec);
- chunk.nBlockAlign = Swap_16(chunk.nBlockAlign);
- chunk.nBitsPerSample = Swap_16(chunk.nBitsPerSample);
-}
-
-void
-FileSource::swap_endian (BroadcastChunk & chunk) const
-{
- chunk.size = Swap_32(chunk.size);
-
- chunk.time_reference_low = Swap_32(chunk.time_reference_low);
- chunk.time_reference_high = Swap_32(chunk.time_reference_high);
- chunk.version = Swap_16(chunk.version);
-}
-
-void FileSource::swap_endian (Sample *buf, jack_nframes_t cnt) const
-{
- for (jack_nframes_t n=0; n < cnt; ++n) {
- uint32_t * tmp = (uint32_t *) &buf[n];
- *tmp = Swap_32(*tmp);
- }
-}
-
-
-FileSource::ChunkInfo*
-FileSource::lookup_chunk (string what)
-{
- for (vector<ChunkInfo>::iterator i = chunk_info.begin(); i != chunk_info.end(); ++i) {
- if ((*i).name == what) {
- return &*i;
- }
- }
- return 0;
-}
-
-int
-FileSource::fill_header (jack_nframes_t rate)
-{
- /* RIFF/WAVE */
-
- if (WE_ARE_BIGENDIAN) {
- memcpy (header.wave.id, "RIFX", 4);
- header.bigendian = true;
- }
- else {
- memcpy (header.wave.id, "RIFF", 4);
- header.bigendian = false;
- }
- header.wave.size = 0; /* file size */
- memcpy (header.wave.text, "WAVE", 4);
-
- /* BROADCAST WAVE EXTENSION */
-
- if (is_bwf) {
-
- /* fill the entire BWF header with nulls */
-
- memset (&header.bext, 0, sizeof (header.bext));
-
- memcpy (header.bext.id, "bext", 4);
-
- snprintf (header.bext.description, sizeof (header.bext.description), "%s", "ambiguity is clearer than precision.");
-
- struct passwd *pwinfo;
- struct utsname utsinfo;
-
- if ((pwinfo = getpwuid (getuid())) == 0) {
- error << string_compose(_("FileSource: cannot get user information for BWF header (%1)"), strerror(errno)) << endmsg;
- return -1;
- }
- if (uname (&utsinfo)) {
- error << string_compose(_("FileSource: cannot get host information for BWF header (%1)"), strerror(errno)) << endmsg;
- return -1;
- }
-
- snprintf (header.bext.originator, sizeof (header.bext.originator), "ardour:%s:%s:%s:%s:%s)",
- pwinfo->pw_gecos,
- utsinfo.nodename,
- utsinfo.sysname,
- utsinfo.release,
- utsinfo.version);
-
- header.bext.version = 1;
-
- /* XXX do something about this field */
-
- snprintf (header.bext.umid, sizeof (header.bext.umid), "%s", "fnord");
-
- /* add some coding history */
-
- char buf[64];
-
- /* encode: PCM,rate,mono,24bit,ardour-version
-
- Note that because we use JACK, there is no way to tell
- what the original bit depth of the signal was.
- */
-
- snprintf (buf, sizeof(buf), "F=%u,A=PCM,M=mono,W=24,T=ardour-%d.%d.%d",
- rate,
- libardour_major_version,
- libardour_minor_version,
- libardour_micro_version);
-
- header.coding_history.push_back (buf);
-
- /* initial size reflects coding history + "\r\n" */
-
- header.bext.size = sizeof (BroadcastChunk) - sizeof (GenericChunk) + strlen (buf) + 2;
- }
-
- memcpy (header.format.id, "fmt ", 4);
- header.format.size = sizeof (FMTChunk) - sizeof (GenericChunk);
-
- if (_sample_format == FormatInt24) {
- header.format.formatTag = 1; // PCM
- header.format.nBlockAlign = 3;
- header.format.nBitsPerSample = 24;
- }
- else {
- header.format.formatTag = 3; /* little-endian IEEE float format */
- header.format.nBlockAlign = 4;
- header.format.nBitsPerSample = 32;
- }
- header.format.nChannels = 1; /* mono */
- header.format.nSamplesPerSec = rate;
- header.format.nAvgBytesPerSec = rate * _sample_size;
-
- /* DATA */
-
- memcpy (header.data.id, "data", 4);
- header.data.size = 0;
-
- return 0;
-}
-
-void
-FileSource::compute_header_size ()
-{
- off64_t end_of_file;
- int32_t coding_history_size = 0;
-
- end_of_file = lseek (fd, 0, SEEK_END);
-
- if (is_bwf) {
-
- /* include the coding history */
-
- for (vector<string>::iterator i = header.coding_history.begin(); i != header.coding_history.end(); ++i) {
- coding_history_size += (*i).length() + 2; // include "\r\n";
- }
-
- header.bext.size = sizeof (BroadcastChunk) - sizeof (GenericChunk) + coding_history_size;
- data_offset = bwf_header_size + coding_history_size;
-
- } else {
- data_offset = wave_header_size;
- }
-
- if (end_of_file == 0) {
-
- /* newfile condition */
-
- if (is_bwf) {
- /* include "WAVE" then all the chunk sizes (bext, fmt, data) */
- header.wave.size = 4 + sizeof (BroadcastChunk) + coding_history_size + sizeof (FMTChunk) + sizeof (GenericChunk);
- } else {
- /* include "WAVE" then all the chunk sizes (fmt, data) */
- header.wave.size = 4 + sizeof (FMTChunk) + sizeof (GenericChunk);
- }
-
- header.data.size = 0;
-
- } else {
-
- header.wave.size = end_of_file - 8; /* size of initial RIFF+size pseudo-chunk */
- header.data.size = end_of_file - data_offset;
- }
-}
-
-int
-FileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow)
-{
- Glib::Mutex::Lock lm (_lock);
-
- if (is_bwf) {
- /* random code is 9 digits */
-
- int random_code = random() % 999999999;
-
- snprintf (header.bext.originator_reference, sizeof (header.bext.originator_reference), "%2s%3s%12s%02d%02d%02d%9d",
- bwf_country_code,
- bwf_organization_code,
- bwf_serial_number,
- now.tm_hour,
- now.tm_min,
- now.tm_sec,
- random_code);
-
- snprintf (header.bext.origination_date, sizeof (header.bext.origination_date), "%4d-%02d-%02d",
- 1900 + now.tm_year,
- now.tm_mon,
- now.tm_mday);
-
- snprintf (header.bext.origination_time, sizeof (header.bext.origination_time), "%02d-%02d-%02d",
- now.tm_hour,
- now.tm_min,
- now.tm_sec);
-
- header.bext.time_reference_high = 0;
- header.bext.time_reference_low = when;
- }
-
- compute_header_size ();
-
- if (write_header()) {
- error << string_compose(_("FileSource[%1]: cannot update data size: %2"), _path, strerror (errno)) << endmsg;
- return -1;
- }
-
- stamp (tnow);
-
- return 0;
-}
-
-int
-FileSource::read_header (bool silent)
-{
- /* we already have the chunk info, so just load up whatever we have */
-
- ChunkInfo* info;
-
- if (header.bigendian == false && (info = lookup_chunk ("RIFF")) == 0) {
- error << _("FileSource: can't find RIFF chunk info") << endmsg;
- return -1;
- }
- else if (header.bigendian == true && (info = lookup_chunk ("RIFX")) == 0) {
- error << _("FileSource: can't find RIFX chunk info") << endmsg;
- return -1;
- }
-
-
- /* just fill this chunk/header ourselves, disk i/o is stupid */
-
- if (header.bigendian) {
- memcpy (header.wave.id, "RIFX", 4);
- }
- else {
- memcpy (header.wave.id, "RIFF", 4);
- }
- header.wave.size = 0;
- memcpy (header.wave.text, "WAVE", 4);
-
- if ((info = lookup_chunk ("bext")) != 0) {
-
- is_bwf = true;
-
- if (::pread64 (fd, &header.bext, sizeof (header.bext), info->offset) != sizeof (header.bext)) {
- error << _("FileSource: can't read RIFF chunk") << endmsg;
- return -1;
- }
-
- if (read_broadcast_data (*info)) {
- return -1;
- }
- }
-
- if ((info = lookup_chunk ("fmt ")) == 0) {
- error << _("FileSource: can't find format chunk info") << endmsg;
- return -1;
- }
-
- if (::pread64 (fd, &header.format, sizeof (header.format), info->offset) != sizeof (header.format)) {
- error << _("FileSource: can't read format chunk") << endmsg;
- return -1;
- }
-
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (header.format);
- }
-
- if ((info = lookup_chunk ("data")) == 0) {
- error << _("FileSource: can't find data chunk info") << endmsg;
- return -1;
- }
-
- if (::pread64 (fd, &header.data, sizeof (header.data), info->offset) != sizeof (header.data)) {
- error << _("FileSource: can't read data chunk") << endmsg;
- return -1;
- }
-
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (header.data);
- }
-
- return 0;
-}
-
-int
-FileSource::read_broadcast_data (ChunkInfo& info)
-{
- int32_t coding_history_size;
-
- if (::pread64 (fd, (char *) &header.bext, sizeof (header.bext), info.offset + sizeof (GenericChunk)) != sizeof (header.bext)) {
- error << string_compose(_("FileSource: cannot read Broadcast Wave data from existing audio file \"%1\" (%2)"),
- _path, strerror (errno)) << endmsg;
- return -1;
- }
-
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (header.bext);
- }
-
- if (info.size > sizeof (header.bext)) {
-
- coding_history_size = info.size - (sizeof (header.bext) - sizeof (GenericChunk));
-
- char data[coding_history_size];
-
- if (::pread64 (fd, data, coding_history_size, info.offset + sizeof (BroadcastChunk)) != coding_history_size) {
- error << string_compose(_("FileSource: cannot read Broadcast Wave coding history from audio file \"%1\" (%2)"),
- _path, strerror (errno)) << endmsg;
- return -1;
- }
-
- /* elements of the coding history are divided by \r\n */
-
- char *p = data;
- char *end = data + coding_history_size;
- string tmp;
-
- while (p < end) {
- if (*p == '\r' && (p+1) != end && *(p+1) == '\n') {
- if (tmp.length()) {
- header.coding_history.push_back (tmp);
- tmp = "";
- }
- p += 2;
- } else {
- tmp += *p;
- p++;
- }
- }
- }
-
- return 0;
-}
-
-int
-FileSource::check_header (jack_nframes_t rate, bool silent)
-{
- if (header.format.formatTag == 1 && header.format.nBitsPerSample == 24) {
- // 24 bit PCM
- _sample_format = FormatInt24;
- _sample_size = 3;
- } else if (header.format.formatTag == 3) {
- /* IEEE float */
- _sample_format = FormatFloat;
- _sample_size = 4;
- }
- else {
- if (!silent) {
- error << string_compose(_("FileSource \"%1\" does not use valid sample format.\n"
- "This is probably a programming error."), _path) << endmsg;
- }
- return -1;
- }
-
- /* compute the apparent length of the data */
-
- data_offset = 0;
-
- for (vector<ChunkInfo>::iterator i = chunk_info.begin(); i != chunk_info.end();) {
- vector<ChunkInfo>::iterator n;
-
- n = i;
- ++n;
-
- if ((*i).name == "data") {
-
- data_offset = (*i).offset + sizeof (GenericChunk);
-
- if (n == chunk_info.end()) {
- off64_t end_of_file;
- end_of_file = lseek (fd, 0, SEEK_END);
-
- _length = end_of_file - data_offset;
-
- } else {
- _length = (*n).offset - data_offset;
- }
-
- _length /= sizeof (Sample);
-
- break;
- }
-
- i = n;
- }
-
- if (data_offset == 0) {
- error << string_compose(_("FileSource \"%1\" has no \"data\" chunk"), _path) << endmsg;
- return -1;
- }
-
- if (_length * sizeof (Sample) != (jack_nframes_t) header.data.size) {
- warning << string_compose(_("%1: data length in header (%2) differs from implicit size in file (%3)"),
- _path, header.data.size, _length * sizeof (Sample)) << endmsg;
- }
-
-// if ((jack_nframes_t) header.format.nSamplesPerSec != rate) {
-// warning << string_compose(_("\"%1\" has a sample rate of %2 instead of %3 as used by this session"),
-// _path, header.format.nSamplesPerSec, rate) << endmsg;
-// }
-
- return 0;
-}
-
-float
-FileSource::sample_rate () const
-{
- return header.format.nSamplesPerSec;
-}
-
-int
-FileSource::write_header()
-{
- off64_t pos;
-
- /* write RIFF/WAVE boilerplate */
-
- pos = 0;
-
- WAVEChunk wchunk = header.wave;
-
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian(wchunk);
- }
-
- if (::pwrite64 (fd, (char *) &wchunk, sizeof (wchunk), pos) != sizeof (wchunk)) {
- error << string_compose(_("FileSource: cannot write WAVE chunk: %1"), strerror (errno)) << endmsg;
- return -1;
- }
-
- pos += sizeof (header.wave);
-
- if (is_bwf) {
-
- /* write broadcast chunk data without copy history */
-
- BroadcastChunk bchunk = header.bext;
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (bchunk);
- }
-
- if (::pwrite64 (fd, (char *) &bchunk, sizeof (bchunk), pos) != sizeof (bchunk)) {
- return -1;
- }
-
- pos += sizeof (header.bext);
-
- /* write copy history */
-
- for (vector<string>::iterator i = header.coding_history.begin(); i != header.coding_history.end(); ++i) {
- string x;
-
- x = *i;
- x += "\r\n";
-
- if (::pwrite64 (fd, x.c_str(), x.length(), pos) != (int32_t) x.length()) {
- return -1;
- }
-
- pos += x.length();
- }
- }
-
- /* write fmt and data chunks */
- FMTChunk fchunk = header.format;
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (fchunk);
- }
-
- if (::pwrite64 (fd, (char *) &fchunk, sizeof (fchunk), pos) != sizeof (fchunk)) {
- error << string_compose(_("FileSource: cannot write format chunk: %1"), strerror (errno)) << endmsg;
- return -1;
- }
-
- pos += sizeof (header.format);
-
- GenericChunk dchunk = header.data;
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian (dchunk);
- }
-
- if (::pwrite64 (fd, (char *) &dchunk, sizeof (dchunk), pos) != sizeof (dchunk)) {
- error << string_compose(_("FileSource: cannot data chunk: %1"), strerror (errno)) << endmsg;
- return -1;
- }
-
- return 0;
-}
-
-void
-FileSource::mark_for_remove ()
-{
- remove_at_unref = true;
-}
-
-jack_nframes_t
-FileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
-{
- Glib::Mutex::Lock lm (_lock);
- return read_unlocked (dst, start, cnt, workbuf);
-}
-
-jack_nframes_t
-FileSource::read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
-{
- jack_nframes_t file_cnt;
-
- if (start > _length) {
-
- /* read starts beyond end of data, just memset to zero */
-
- file_cnt = 0;
-
- } else if (start + cnt > _length) {
-
- /* read ends beyond end of data, read some, memset the rest */
-
- file_cnt = _length - start;
-
- } else {
-
- /* read is entirely within data */
-
- file_cnt = cnt;
- }
-
- if (file_cnt) {
- if (file_read(dst, start, file_cnt, workbuf) != (ssize_t) file_cnt) {
- return 0;
- }
- }
-
- if (file_cnt != cnt) {
- jack_nframes_t delta = cnt - file_cnt;
- memset (dst+file_cnt, 0, sizeof (Sample) * delta);
- }
-
- return cnt;
-}
-
-jack_nframes_t
-FileSource::write (Sample *data, jack_nframes_t cnt, char * workbuf)
-{
- {
- Glib::Mutex::Lock lm (_lock);
-
- jack_nframes_t oldlen;
- int32_t frame_pos = _length;
-
- if (file_write(data, frame_pos, cnt, workbuf) != (ssize_t) cnt) {
- return 0;
- }
-
- oldlen = _length;
- _length += cnt;
-
- if (_build_peakfiles) {
- PeakBuildRecord *pbr = 0;
-
- if (pending_peak_builds.size()) {
- pbr = pending_peak_builds.back();
- }
-
- if (pbr && pbr->frame + pbr->cnt == oldlen) {
-
- /* the last PBR extended to the start of the current write,
- so just extend it again.
- */
-
- pbr->cnt += cnt;
- } else {
- pending_peak_builds.push_back (new PeakBuildRecord (oldlen, cnt));
- }
-
- _peaks_built = false;
- }
-
- }
-
-
- if (_build_peakfiles) {
- queue_for_peaks (*this);
- }
-
- return cnt;
-}
-
-ssize_t
-FileSource::write_float(Sample *data, jack_nframes_t framepos, jack_nframes_t cnt, char * workbuf)
-{
- int32_t byte_cnt = cnt * _sample_size;
- int32_t byte_pos = data_offset + (framepos * _sample_size);
- ssize_t retval;
-
- if ((retval = ::pwrite64 (fd, (char *) data, byte_cnt, byte_pos)) != (ssize_t) byte_cnt) {
- error << string_compose(_("FileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
- if (retval > 0) {
- return retval / _sample_size;
- }
- else {
- return retval;
- }
- }
-
- _write_data_count = byte_cnt;
-
- return cnt;
-}
-
-ssize_t
-FileSource::read_float (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
-{
- ssize_t nread;
- ssize_t byte_cnt = (ssize_t) cnt * sizeof (Sample);
- int readfd;
-
- /* open, read, close */
-
- if ((readfd = open64 (_path.c_str(), O_RDONLY)) < 0) {
- error << string_compose(_("FileSource: could not open \"%1\": (%2)"), _path, strerror (errno)) << endmsg;
- return 0;
- }
-
- nread = ::pread64 (readfd, (char *) dst, byte_cnt, data_offset + (start * _sample_size));
- close (readfd);
-
- if (nread != byte_cnt) {
-
- cerr << "FileSource: \""
- << _path
- << "\" bad read at frame "
- << start
- << ", of "
- << cnt
- << " (bytes="
- << byte_cnt
- << ") frames [length = " << _length
- << " eor = " << start + cnt << "] ("
- << strerror (errno)
- << ") (read "
- << nread / sizeof (Sample)
- << " (bytes=" <<nread
- << ")) pos was"
- << data_offset
- << '+'
- << start << '*' << sizeof(Sample)
- << " = " << data_offset + (start * sizeof(Sample))
- << endl;
-
- if (nread > 0) {
- return nread / _sample_size;
- } else {
- return nread;
- }
- }
-
- if (header.bigendian != WE_ARE_BIGENDIAN) {
- swap_endian(dst, cnt);
- }
-
- _read_data_count = byte_cnt;
-
- return cnt;
-}
-
-ssize_t
-FileSource::write_pcm_24(Sample *data, jack_nframes_t framepos, jack_nframes_t cnt, char * workbuf)
-{
- int32_t byte_cnt = cnt * _sample_size;
- int32_t byte_pos = data_offset + (framepos * _sample_size);
- ssize_t retval;
-
- // convert to int24
- if (header.bigendian) {
- pcm_f2bet_clip_array (data, workbuf, cnt);
- } else {
- pcm_f2let_clip_array (data, workbuf, cnt);
- }
-
- if ((retval = ::pwrite64 (fd, (char *) workbuf, byte_cnt, byte_pos)) != (ssize_t) byte_cnt) {
- error << string_compose(_("FileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
- if (retval > 0) {
- return retval / _sample_size;
- }
- else {
- return retval;
- }
- }
-
- return (ssize_t) cnt;
-}
-
-ssize_t
-FileSource::read_pcm_24 (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
-{
- ssize_t nread;
- ssize_t byte_cnt = (ssize_t) cnt * _sample_size;
- int readfd;
-
- /* open, read, close */
-
- if ((readfd = open64 (_path.c_str(), O_RDONLY)) < 0) {
- error << string_compose(_("FileSource: could not open \"%1\": (%2)"), _path, strerror (errno)) << endmsg;
- return 0;
- }
-
- nread = ::pread64 (readfd, (char *) workbuf, byte_cnt, data_offset + (start * _sample_size));
- close (readfd);
-
- if (nread != byte_cnt) {
-
- cerr << "May be OK - FileSource: \""
- << _path
- << "\" bad 24bit read at frame "
- << start
- << ", of "
- << cnt
- << " (bytes="
- << byte_cnt
- << ") frames [length = " << _length
- << " eor = " << start + cnt << "] ("
- << strerror (errno)
- << ") (read "
- << nread / sizeof (Sample)
- << " (bytes=" <<nread
- << ")) pos was"
- << data_offset
- << '+'
- << start << '*' << sizeof(Sample)
- << " = " << data_offset + (start * sizeof(Sample))
- << endl;
-
- if (nread > 0) {
- return nread / _sample_size;
- }
- else {
- return nread;
- }
- }
-
- // convert from 24bit->float
-
- if (header.bigendian) {
- pcm_bet2f_array (workbuf, cnt, dst);
- } else {
- pcm_let2f_array (workbuf, cnt, dst);
- }
-
- _read_data_count = byte_cnt;
-
- return (ssize_t) cnt;
-}
-
-
-bool
-FileSource::is_empty (string path)
-{
- struct stat statbuf;
-
- stat (path.c_str(), &statbuf);
-
- /* its a bit of a problem if an audio file happens
- to be a regular WAVE file with just enough data
- to match the size of an empty BWF. hmmm. not very
- likely however - that represents a duration of
- less than 1msec at typical sample rates.
- */
-
- /* NOTE: 698 bytes is the size of a BWF header structure *plus* our minimal coding history */
-
- return (statbuf.st_size == 0 || statbuf.st_size == wave_header_size || statbuf.st_size == 698);
-}
-
-void
-FileSource::mark_streaming_write_completed ()
-{
- Glib::Mutex::Lock lm (_lock);
-
- next_peak_clear_should_notify = true;
-
- if (_peaks_built || pending_peak_builds.empty()) {
- _peaks_built = true;
- PeaksReady (); /* EMIT SIGNAL */
- }
-}
-
-void
-FileSource::mark_take (string id)
-{
- _take_id = id;
-}
-
-int
-FileSource::move_to_trash (const string trash_dir_name)
-{
- string newpath;
-
- /* don't move the file across filesystems, just
- stick it in the `trash_dir_name' directory
- on whichever filesystem it was already on.
- */
-
- // XXX Portability
-
- newpath = Glib::path_get_dirname (_path);
- newpath = Glib::path_get_dirname (newpath);
-
- newpath += '/';
- newpath += trash_dir_name;
- newpath += '/';
- newpath += Glib::path_get_basename (_path);
-
- if (access (newpath.c_str(), F_OK) == 0) {
-
- /* the new path already exists, try versioning */
-
- char buf[PATH_MAX+1];
- int version = 1;
- string newpath_v;
-
- snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), version);
- newpath_v = buf;
-
- while (access (newpath_v.c_str(), F_OK) == 0 && version < 999) {
- snprintf (buf, sizeof (buf), "%s.%d", newpath.c_str(), ++version);
- newpath_v = buf;
- }
-
- if (version == 999) {
- error << string_compose (_("there are already 1000 files with names like %1; versioning discontinued"),
- newpath)
- << endmsg;
- } else {
- newpath = newpath_v;
- }
-
- } else {
-
- /* it doesn't exist, or we can't read it or something */
-
- }
-
- if (::rename (_path.c_str(), newpath.c_str()) != 0) {
- error << string_compose (_("cannot rename audio file source from %1 to %2 (%3)"),
- _path, newpath, strerror (errno))
- << endmsg;
- return -1;
- }
-
- if (::unlink (peakpath.c_str()) != 0) {
- error << string_compose (_("cannot remove peakfile %1 for %2 (%3)"),
- peakpath, _path, strerror (errno))
- << endmsg;
- /* try to back out */
- rename (newpath.c_str(), _path.c_str());
- return -1;
- }
-
- _path = newpath;
- peakpath = "";
- remove_at_unref = false;
-
- return 0;
-}
-
-string
-prepare_string(string& str)
-{
- string prepared;
-
- for (uint32_t i = 0; i < str.size(); ++i){
- char c = str[i];
- if (isdigit(c) || isalpha(c)){
- prepared += c;
- } else {
- prepared += '\\';
- prepared += c;
- }
- }
-
- return prepared;
-}
-
-int
-FileSource::repair (string path, jack_nframes_t rate)
-{
- FILE* in;
- char buf[700];
- char* ptr;
- struct stat statbuf;
- size_t i;
- int ret = -1;
- bool bigend = false;
- bool doswap = false;
-
- if (stat (path.c_str(), &statbuf)) {
- return -1;
- }
-
- if (statbuf.st_size <= (off_t) sizeof (buf)) {
- /* nothing was ever written to the file, so there is nothing
- really to do.
- */
- return 0;
- }
-
- if ((in = fopen (path.c_str(), "r+")) == NULL) {
- return -1;
- }
-
- if (fread (buf, sizeof (buf), 1, in) != 1) {
- goto out;
- }
-
- if ((memcmp (&buf[0], "RIFF", 4) && memcmp (&buf[0], "RIFX", 4)) || memcmp (&buf[8], "WAVE", 4)) {
- /* no header. too dangerous to proceed */
- goto out;
- }
-
- if (memcmp (&buf[0], "RIFX", 4)==0) {
- bigend = true;
- }
-
- doswap = bigend != WE_ARE_BIGENDIAN;
-
- /* reset the size of the RIFF chunk header */
-
- if (doswap) {
- *((int32_t *)&buf[4]) = Swap_32((int32_t)(statbuf.st_size - 8));
- }
- else {
- *((int32_t *)&buf[4]) = statbuf.st_size - 8;
- }
-
- /* find data chunk and reset the size */
-
- ptr = buf;
-
- for (i = 0; i < sizeof (buf); ) {
-
- if (memcmp (ptr, "fmt ", 4) == 0) {
-
- FMTChunk fmt;
-
- memcpy (&fmt, ptr, sizeof (fmt));
- if (doswap) {
- swap_endian(fmt);
- }
-
- fmt.nSamplesPerSec = rate;
- fmt.nAvgBytesPerSec = rate * 4;
-
- /* put it back */
- if (doswap) {
- swap_endian(fmt);
- }
-
- memcpy (ptr, &fmt, sizeof (fmt));
- ptr += sizeof (fmt);
- i += sizeof (fmt);
-
- } else if (memcmp (ptr, "data", 4) == 0) {
- GenericChunk dchunk;
- memcpy(&dchunk, ptr, sizeof(dchunk));
-
- if(doswap) {
- swap_endian(dchunk);
- }
-
- dchunk.size = statbuf.st_size - i - 8;
-
- if (doswap) {
- swap_endian(dchunk);
- }
- memcpy (ptr, &dchunk, sizeof (dchunk));
- break;
-
- } else {
- ++ptr;
- ++i;
- }
- }
-
- /* now flush it back to disk */
-
- rewind (in);
-
- if (fwrite (buf, sizeof (buf), 1, in) != 1) {
- goto out;
- }
-
- ret = 0;
- fflush (in);
-
- out:
- fclose (in);
- return ret;
-}
-
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 762ee101f8..f80c9dc287 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -43,7 +43,7 @@
#include <ardour/audio_library.h>
#include <ardour/configuration.h>
#include <ardour/plugin_manager.h>
-#include <ardour/source.h>
+#include <ardour/audiosource.h>
#include <ardour/utils.h>
#include <ardour/session.h>
#include <ardour/control_protocol_manager.h>
@@ -69,6 +69,7 @@ ARDOUR::OSC* ARDOUR::osc = 0;
using namespace ARDOUR;
using namespace std;
+using namespace PBD;
MIDI::Port *default_mmc_port = 0;
MIDI::Port *default_mtc_port = 0;
@@ -188,7 +189,7 @@ setup_midi ()
}
int
-ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*sighandler)(int,siginfo_t*,void*))
+ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization)
{
bool generic_mix_functions = true;
@@ -213,7 +214,7 @@ ARDOUR::init (AudioEngine& engine, bool use_vst, bool try_optimization, void (*s
#endif
#ifdef VST_SUPPORT
- if (Config->get_use_vst() && fst_init (sighandler)) {
+ if (Config->get_use_vst() && fst_init ()) {
return -1;
}
#endif
diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc
index c13816e648..b70a7bbc9c 100644
--- a/libs/ardour/import.cc
+++ b/libs/ardour/import.cc
@@ -36,14 +36,15 @@
#include <ardour/ardour.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
-#include <ardour/filesource.h>
+#include <ardour/audio_diskstream.h>
+#include <ardour/sndfilesource.h>
#include <ardour/sndfile_helpers.h>
#include <ardour/audioregion.h>
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
#define BLOCKSIZE 4096U
@@ -51,8 +52,8 @@ int
Session::import_audiofile (import_status& status)
{
SNDFILE *in;
- FileSource **newfiles = 0;
- ARDOUR::AudioRegion::SourceList sources;
+ AudioFileSource **newfiles = 0;
+ AudioRegion::SourceList sources;
SF_INFO info;
float *data = 0;
Sample **channel_data = 0;
@@ -94,7 +95,7 @@ Session::import_audiofile (import_status& status)
}
}
- newfiles = new FileSource *[info.channels];
+ newfiles = new AudioFileSource *[info.channels];
for (n = 0; n < info.channels; ++n) {
newfiles[n] = 0;
}
@@ -137,7 +138,10 @@ Session::import_audiofile (import_status& status)
try {
- newfiles[n] = new FileSource (buf, frame_rate(), false, Config->get_native_file_data_format());
+ newfiles[n] = new SndFileSource (buf,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate ());
}
catch (failed_constructor& err) {
diff --git a/libs/ardour/insert.cc b/libs/ardour/insert.cc
index c3c3462016..fc05355d4a 100644
--- a/libs/ardour/insert.cc
+++ b/libs/ardour/insert.cc
@@ -38,7 +38,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
Insert::Insert(Session& s, Placement p)
: Redirect (s, s.next_insert_name(), p)
diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc
index fa30463bd4..87c03c6b70 100644
--- a/libs/ardour/io.cc
+++ b/libs/ardour/io.cc
@@ -55,7 +55,8 @@ extern "C" int isinf (double);
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
+
static float current_automation_version_number = 1.0;
@@ -2443,12 +2444,6 @@ IO::state_factory (std::string why) const
return state;
}
-void
-IO::send_state_changed ()
-{
- return;
-}
-
/**
Update the peak meters.
@@ -2493,7 +2488,7 @@ IO::meter ()
} else {
// do falloff
new_peak = _visible_peak_power[n] - _session.meter_falloff();
- _visible_peak_power[n] = max (new_peak, -200.0f);
+ _visible_peak_power[n] = max (new_peak, -INFINITY);
}
}
}
diff --git a/libs/ardour/jack_slave.cc b/libs/ardour/jack_slave.cc
index be8d585aaa..352bcaeee5 100644
--- a/libs/ardour/jack_slave.cc
+++ b/libs/ardour/jack_slave.cc
@@ -23,7 +23,6 @@
#include <errno.h>
#include <jack/jack.h>
#include <jack/transport.h>
-#include <pbd/error.h>
#include <ardour/slave.h>
#include <ardour/session.h>
diff --git a/libs/ardour/ladspa_plugin.cc b/libs/ardour/ladspa_plugin.cc
index 50757f9acd..11001655d2 100644
--- a/libs/ardour/ladspa_plugin.cc
+++ b/libs/ardour/ladspa_plugin.cc
@@ -49,6 +49,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
LadspaPlugin::LadspaPlugin (void *mod, AudioEngine& e, Session& session, uint32_t index, jack_nframes_t rate)
: Plugin (e, session)
diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc
index 28ec42a394..b2af52284e 100644
--- a/libs/ardour/location.cc
+++ b/libs/ardour/location.cc
@@ -36,6 +36,7 @@
using namespace std;
using namespace ARDOUR;
using namespace sigc;
+using namespace PBD;
Location::Location (const Location& other)
: _name (other._name),
diff --git a/libs/ardour/mtc_slave.cc b/libs/ardour/mtc_slave.cc
index cb35c0c785..32642d570d 100644
--- a/libs/ardour/mtc_slave.cc
+++ b/libs/ardour/mtc_slave.cc
@@ -37,6 +37,7 @@
using namespace ARDOUR;
using namespace sigc;
using namespace MIDI;
+using namespace PBD;
MTC_Slave::MTC_Slave (Session& s, MIDI::Port& p)
: session (s)
@@ -87,7 +88,7 @@ void
MTC_Slave::update_mtc_time (const byte *msg, bool was_full)
{
jack_nframes_t now = session.engine().frame_time();
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
smpte.hours = msg[3];
smpte.minutes = msg[2];
diff --git a/libs/ardour/named_selection.cc b/libs/ardour/named_selection.cc
index 9c5830dfc1..605d7cae13 100644
--- a/libs/ardour/named_selection.cc
+++ b/libs/ardour/named_selection.cc
@@ -29,6 +29,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
sigc::signal<void,NamedSelection*> NamedSelection::NamedSelectionCreated;
diff --git a/libs/ardour/osc.cc b/libs/ardour/osc.cc
index 67b70fba0c..5aaf9d5591 100644
--- a/libs/ardour/osc.cc
+++ b/libs/ardour/osc.cc
@@ -309,7 +309,6 @@ OSC::osc_receiver()
if ((ret = poll (pfd, nfds, timeout)) < 0) {
if (errno == EINTR) {
/* gdb at work, perhaps */
- cerr << "EINTR hit " << endl;
goto again;
}
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index bc7b472732..83c9e6eb4d 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -44,9 +44,9 @@
#include <pbd/mathfix.h>
-
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
float Panner::current_automation_version_number = 1.0;
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index 1bc6ccac6d..7dee866767 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -41,7 +41,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
sigc::signal<void,Playlist*> Playlist::PlaylistCreated;
diff --git a/libs/ardour/playlist_factory.cc b/libs/ardour/playlist_factory.cc
index fc4618d1dc..7c7060dae8 100644
--- a/libs/ardour/playlist_factory.cc
+++ b/libs/ardour/playlist_factory.cc
@@ -1,3 +1,25 @@
+/*
+ Copyright (C) 2000-2006 Paul Davis
+
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id$
+*/
+
+#include <pbd/error.h>
+
#include <ardour/session.h>
#include <ardour/playlist.h>
@@ -10,6 +32,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
Region*
ARDOUR::createRegion (const Region& region, jack_nframes_t start,
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index e9665908a3..2d1f8ffcbd 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -48,6 +48,7 @@
#include <locale.h>
using namespace ARDOUR;
+using namespace PBD;
Plugin::Plugin (AudioEngine& e, Session& s)
: _engine (e), _session (s)
diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc
index e1f34199d6..b096e81785 100644
--- a/libs/ardour/plugin_manager.cc
+++ b/libs/ardour/plugin_manager.cc
@@ -44,6 +44,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
PluginManager* PluginManager::_manager = 0;
diff --git a/libs/ardour/po/el_GR.po b/libs/ardour/po/el_GR.po
index 9a36b31c83..fb235155f3 100644
--- a/libs/ardour/po/el_GR.po
+++ b/libs/ardour/po/el_GR.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-04-25 17:46-0400\n"
+"POT-Creation-Date: 2006-06-21 15:09-0400\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Muadibas\n"
"Language-Team: Hellenic(Greek)\n"
@@ -15,38 +15,124 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: libs/ardour/audio_library.cc:91
-msgid "channels"
+#: libs/ardour/audio_diskstream.cc:337
+#, fuzzy
+msgid "AudioDiskstream: Session doesn't know about a Playlist called \"%1\""
+msgstr ""
+"DiskStream: Η ΣυνεδÏία δεν γνωÏίζει για την λίστα ΑναπαÏ/γής με όνομα \"%1\""
+
+#: libs/ardour/audio_diskstream.cc:342
+#, fuzzy
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
+msgstr "DiskStream: Η Λίστα \"%1\" δεν είναι ηχητική λίστα αναπαÏ/γής"
+
+#: libs/ardour/audio_diskstream.cc:433
+#, fuzzy
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "DiskStream %1: δεν υπάÏχει λίστα αναπαÏ/γής για να γίνει αντιγÏαφή!"
+
+#: libs/ardour/audio_diskstream.cc:1114 libs/ardour/audio_diskstream.cc:1125
+#, fuzzy
+msgid ""
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr ""
+"DiskStream %1: κατα την αναγόμωση, δεν μπόÏεσα να διαβάσω %2 από τη λίστα "
+"αναπαÏ/γής στο frame %3"
+
+#: libs/ardour/audio_diskstream.cc:1254
+#, fuzzy
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr ""
+"DiskStream %1: δεν μπόÏεσα να διαβάσω %2 από τη λίστα αναπαÏ/γής στο frame %3"
+
+#: libs/ardour/audio_diskstream.cc:1621 libs/ardour/audio_diskstream.cc:1638
+#, fuzzy
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr "DiskStream %1: δεν μποÏÏŽ να γÏάψω στο δίσκο"
+
+#: libs/ardour/audio_diskstream.cc:1698
+#, fuzzy
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr ""
+"DiskStream \"%1\": δεν γίνεται να αποÏÏιφθοÏν δειγματοληψίες στο δίσκο!"
+
+#: libs/ardour/audio_diskstream.cc:1795
+msgid "%1: could not create region for complete audio file"
+msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file"
+
+#: libs/ardour/audio_diskstream.cc:1818
+#, fuzzy
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr "DiskStream: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για δειγματοληψίες!"
+
+#: libs/ardour/audio_diskstream.cc:1873
+#, fuzzy
+msgid "programmer error: %1"
+msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
+
+#: libs/ardour/audio_diskstream.cc:2145
+#, fuzzy
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr "DiskStream: κανάλι εκτός διαστήματος"
+
+#: libs/ardour/audio_diskstream.cc:2170
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr "%1:%2 νέα δειγματοληψία δεν εκκινήθη σωστά"
+
+#: libs/ardour/audio_diskstream.cc:2403
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr "Η Τοποθεσία \"%1\" δεν είναι ικανή για track loop (αÏχή >= τέλος)"
+
+#: libs/ardour/audio_diskstream.cc:2484
+#, fuzzy
+msgid "%1: cannot restore pending capture source file %2"
+msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το εισαγμένο αÏχείο ήχου \"%1\""
+
+#: libs/ardour/audio_diskstream.cc:2506
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
msgstr ""
+#: libs/ardour/audio_diskstream.cc:2522
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2534
+#, fuzzy
+msgid "%1: cannot create region from pending capture sources"
+msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file"
+
#: libs/ardour/audio_library.cc:92
+msgid "channels"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:93
#, fuzzy
msgid "samplerate"
msgstr "ξεχωÏιστό"
-#: libs/ardour/audio_library.cc:93
+#: libs/ardour/audio_library.cc:94
msgid "resolution"
msgstr ""
-#: libs/ardour/audio_library.cc:94
+#: libs/ardour/audio_library.cc:95
#, fuzzy
msgid "format"
msgstr "float"
-#: libs/ardour/audio_library.cc:101
+#: libs/ardour/audio_library.cc:102
msgid "Could not open %1. Audio Library not saved"
msgstr "Δεν μπόÏεσα να ανοίξω το %1. Η Audio Library δεν αποθηκεÏθηκε"
-#: libs/ardour/audio_playlist.cc:52 libs/ardour/audio_playlist.cc:62
-#: libs/ardour/audio_playlist.cc:73 libs/ardour/audio_playlist.cc:120
+#: libs/ardour/audio_playlist.cc:53 libs/ardour/audio_playlist.cc:63
+#: libs/ardour/audio_playlist.cc:74 libs/ardour/audio_playlist.cc:121
#: libs/ardour/insert.cc:76 libs/ardour/insert.cc:95 libs/ardour/insert.cc:120
-#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:38
-#: libs/ardour/send.cc:52 libs/ardour/send.cc:61
-#: libs/ardour/session_state.cc:1620 libs/ardour/session_state.cc:1666
+#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:39
+#: libs/ardour/send.cc:53 libs/ardour/send.cc:62
+#: libs/ardour/session_state.cc:1621 libs/ardour/session_state.cc:1667
msgid "initial state"
msgstr "Ï€ÏωταÏχική κατάσταση"
-#: libs/ardour/audio_playlist.cc:274 libs/ardour/audio_playlist.cc:768
+#: libs/ardour/audio_playlist.cc:275 libs/ardour/audio_playlist.cc:769
msgid ""
"programming error: non-audio Region passed to remove_overlap in audio "
"playlist"
@@ -54,51 +140,51 @@ msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: μη-ηχητική ΠεÏιοχή πέÏασε σε remove_overlap στην "
"audio playlist"
-#: libs/ardour/audio_playlist.cc:401
+#: libs/ardour/audio_playlist.cc:402
msgid ""
"programming error: non-audio Region tested for overlap in audio playlist"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: μη-ηχητική ΠεÏιοχή ελέγχθη για υπεÏπήδηση(overlap) "
"στην λίστα αναπαÏ/γής του ήχου"
-#: libs/ardour/audio_playlist.cc:877
+#: libs/ardour/audio_playlist.cc:878
msgid "xfade change"
msgstr "αλλαγή xfade"
-#: libs/ardour/audio_playlist.cc:926
+#: libs/ardour/audio_playlist.cc:933
msgid "region modified"
msgstr "η πεÏιοχή μετεβλήθη"
-#: libs/ardour/audio_track.cc:121 libs/ardour/io.cc:1703
-#: libs/ardour/io.cc:1813
+#: libs/ardour/audio_track.cc:133 libs/ardour/io.cc:1716
+#: libs/ardour/io.cc:1826
msgid "Unknown connection \"%1\" listed for input of %2"
msgstr "Άγνωστη σÏνδεση \"%1\" στη λίστα εισόδου του %2"
-#: libs/ardour/audio_track.cc:123 libs/ardour/io.cc:1705
-#: libs/ardour/io.cc:1815
+#: libs/ardour/audio_track.cc:135 libs/ardour/io.cc:1718
+#: libs/ardour/io.cc:1828
#, fuzzy
msgid "in 1"
msgstr "in %lu"
-#: libs/ardour/audio_track.cc:124 libs/ardour/io.cc:1706
-#: libs/ardour/io.cc:1816
+#: libs/ardour/audio_track.cc:136 libs/ardour/io.cc:1719
+#: libs/ardour/io.cc:1829
msgid "No input connections available as a replacement"
msgstr ""
-#: libs/ardour/audio_track.cc:128 libs/ardour/io.cc:1710
-#: libs/ardour/io.cc:1820
+#: libs/ardour/audio_track.cc:140 libs/ardour/io.cc:1723
+#: libs/ardour/io.cc:1833
msgid "Connection %1 was not available - \"in 1\" used instead"
msgstr ""
-#: libs/ardour/audio_track.cc:137 libs/ardour/io.cc:1829
+#: libs/ardour/audio_track.cc:149 libs/ardour/io.cc:1842
msgid "improper input channel list in XML node (%1)"
msgstr "ακατάλληλη λίστα καναλιών εισόδου στον κόμβο XML (%1)"
-#: libs/ardour/audio_track.cc:182 libs/ardour/audio_track.cc:195
+#: libs/ardour/audio_track.cc:194 libs/ardour/audio_track.cc:207
msgid "AudioTrack: diskstream \"%1\" not known by session"
msgstr "AudioTrack: το diskstream \"%1\" είναι μή αναγνωÏίσιμο από τη συνεδÏία"
-#: libs/ardour/audio_track.cc:293
+#: libs/ardour/audio_track.cc:305
#, fuzzy
msgid ""
"MIDI rec_enable control specification for %1 is incomplete, so it has been "
@@ -107,214 +193,325 @@ msgstr ""
"Η Ï€ÏοδιαγÏαφή ελέγχου του MIDI gain για το %1 είναι ημιτελής, με αποτέλεσμα "
"να αγνοηθεί"
-#: libs/ardour/audio_track.cc:305
+#: libs/ardour/audio_track.cc:317
msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: εδόθη κατάσταση στην AudioTrack δίχως diskstream!"
-#: libs/ardour/audioengine.cc:147
+#: libs/ardour/audioengine.cc:150
msgid "cannot activate JACK client"
msgstr "Ο JACK δεν μποÏεί να ενεÏγοποιηθεί"
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:401
msgid "register audio input port called before engine was started"
msgstr "η register audio input port εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:463
+#: libs/ardour/audioengine.cc:432
msgid "register audio output port called before engine was started"
msgstr "η register audio output port εκλήθη Ï€Ïίν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:524
+#: libs/ardour/audioengine.cc:493
msgid "connect called before engine was started"
msgstr "η σÏνδεση εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:540
+#: libs/ardour/audioengine.cc:509
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:553 libs/ardour/audioengine.cc:582
+#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
msgid "disconnect called before engine was started"
msgstr "η αποσÏνδεση εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:640
+#: libs/ardour/audioengine.cc:609
msgid "get_port_by_name() called before engine was started"
msgstr "η Ïουτίνα get_port_by_name() εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:673
+#: libs/ardour/audioengine.cc:642
msgid "get_ports called before engine was started"
msgstr "η Ïουτίνα get_ports εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:748
+#: libs/ardour/audioengine.cc:717
msgid "get_nth_physical called before engine was started"
msgstr "η Ïουτίνα get_nth_physical εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:776
+#: libs/ardour/audioengine.cc:745
#, fuzzy
msgid "get_port_total_latency() called with no JACK client connection"
msgstr "η Ïουτίνα get_port_total_latency() εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:782
+#: libs/ardour/audioengine.cc:751
msgid "get_port_total_latency() called before engine was started"
msgstr "η Ïουτίνα get_port_total_latency() εκλήθη Ï€Ïιν να εκκινηθεί η engine"
-#: libs/ardour/audioengine.cc:906
+#: libs/ardour/audioengine.cc:875
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:909
+#: libs/ardour/audioengine.cc:878
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:914
+#: libs/ardour/audioengine.cc:883
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:948
+#: libs/ardour/audioengine.cc:917
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:973
+#: libs/ardour/audioengine.cc:942
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:989
+#: libs/ardour/audioengine.cc:958
#, fuzzy
msgid "could not reregister %1"
msgstr "Σφάλμα: δεν μπόÏεσα να γÏάψω %1"
-#: libs/ardour/audioengine.cc:1046
+#: libs/ardour/audioengine.cc:1015
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
-#: libs/ardour/audiofilter.cc:44
+#: libs/ardour/audiofilesource.cc:445 libs/ardour/session_state.cc:3095
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως %1; μη-συνεχές versioning"
+
+#: libs/ardour/audiofilesource.cc:459 libs/ardour/session_state.cc:3109
+msgid "cannot rename audio file source from %1 to %2 (%3)"
+msgstr "δεν μποÏÏŽ να μετονομάσω την πηγή του audio file από %1 σε %2 (%3)"
+
+#: libs/ardour/audiofilesource.cc:466 libs/ardour/session_state.cc:3124
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)"
+
+#: libs/ardour/audiofilesource.cc:510
+msgid "FileSource: search path not set"
+msgstr "FileSource: μονοπάτι αναζητήσεως δεν ετέθη"
+
+#: libs/ardour/audiofilesource.cc:534
+msgid ""
+"FileSource: \"%1\" is ambigous when searching %2\n"
+"\t"
+msgstr ""
+"FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n"
+"\t"
+
+#: libs/ardour/audiofilesource.cc:540
+#, fuzzy
+msgid "Filesource: cannot find required file (%1): while searching %2"
+msgstr "Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:563
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr "Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:568
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr "Filesource: δεν μποÏÏŽ να ελέγξω για το υπάÏχον αÏχείο (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:640 libs/ardour/insert.cc:525
+#: libs/ardour/sndfilesource.cc:112
+msgid "programming error: %1"
+msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
+
+#: libs/ardour/audiofilesource.cc:645
+#, fuzzy
+msgid "cannot rename audio file for %1 to %2"
+msgstr "δεν μποÏÏŽ να μετονομάσω την πηγή του audio file από %1 σε %2 (%3)"
+
+#: libs/ardour/audiofilter.cc:45
msgid "audiofilter: error creating name for new audio file based on %1"
msgstr ""
"audiofilter: σφάλμα στη δημιουÏγία ονόματος για νέο audio file βασισμένο σε %"
"1"
-#: libs/ardour/audiofilter.cc:54
+#: libs/ardour/audiofilter.cc:58
msgid "audiofilter: error creating new audio file %1 (%2)"
msgstr "audiofilter: σφάλμα στη δημιουÏγία νέου audio file %1 (%2)"
-#: libs/ardour/audioregion.cc:855 libs/ardour/audioregion.cc:917
+#: libs/ardour/audioregion.cc:857 libs/ardour/audioregion.cc:919
#, fuzzy
msgid "fade in change"
msgstr "αλλαγή xfade"
-#: libs/ardour/audioregion.cc:1341
+#: libs/ardour/audioregion.cc:1349
#, c-format
msgid "normalized to %.2fdB"
msgstr "εξομαλÏνθηκε στα %.2fdB"
-#: libs/ardour/audioregion.cc:1359
+#: libs/ardour/audioregion.cc:1367
#, fuzzy
msgid "envelope change"
msgstr "αλλαγή ενεÏγοÏ"
-#: libs/ardour/automation_event.cc:64 libs/ardour/location.cc:344
-#: libs/ardour/tempo.cc:225
+#: libs/ardour/audiosource.cc:143
+msgid "poll on peak request pipe failed (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:150
+#, fuzzy
+msgid "Error on peak thread request pipe"
+msgstr "Σφάλμα στο transport thread request pipe"
+
+#: libs/ardour/audiosource.cc:183
+#, fuzzy
+msgid "Error reading from peak request pipe"
+msgstr "Σφάλμα στην ανάγνωση από transport request pipe"
+
+#: libs/ardour/audiosource.cc:215 libs/ardour/session_butler.cc:80
+#: libs/ardour/session_midi.cc:1183
+msgid "Cannot create transport request signal pipe (%1)"
+msgstr "Δεν μποÏÏŽ να δημιουÏγήσω transport request signal pipe (%1)"
+
+#: libs/ardour/audiosource.cc:220 libs/ardour/audiosource.cc:225
+#, fuzzy
+msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
+msgstr "UI: δεν μποÏÏŽ να θέσω O_NONBLOCK στο signal read pipe (%1)"
+
+#: libs/ardour/audiosource.cc:230
+#, fuzzy
+msgid "AudioSource: could not create peak thread"
+msgstr "Source: δεν μπόÏεσα να δημιουÏγήσω peak δέσμη"
+
+#: libs/ardour/audiosource.cc:308
+#, fuzzy
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)"
+
+#: libs/ardour/audiosource.cc:350
+#, fuzzy
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr "Source: δεν μποÏÏŽ να μετÏήσω το αυτοστιγμεί peakfile \"%1\""
+
+#: libs/ardour/audiosource.cc:451
+msgid "cannot read sample data for unscaled peak computation"
+msgstr ""
+"δεν μποÏÏŽ να διαβάσω δεδομένα δείγματος για υπολογισμό μη-κλιμακώτου peak"
+
+#: libs/ardour/audiosource.cc:472 libs/ardour/audiosource.cc:543
+#: libs/ardour/audiosource.cc:787 libs/ardour/audiosource.cc:878
+#, fuzzy
+msgid "AudioSource: cannot open peakpath \"%1\" (%2)"
+msgstr "Source: δεν μποÏÏŽ να ανοίξω το peakpath \"%1\" (%2)"
+
+#: libs/ardour/audiosource.cc:644
+#, fuzzy
+msgid "AudioSource[%1]: peak read - cannot read %2 samples at offset %3"
+msgstr ""
+"Source[%1]: ανάγνωση peak - δεν μποÏÏŽ να διαβάσω %2 δείγματα στην αÏχή"
+"(offset) %3"
+
+#: libs/ardour/audiosource.cc:798
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr ""
+"%1: δεν μποÏεσα να γÏάψω ανεγνωσμένα raw δεδομένα για τον υπολογισμό του "
+"peak (%2)"
+
+#: libs/ardour/audiosource.cc:823
+msgid "%1: could not write peak file data (%2)"
+msgstr "%1: δεν μπόÏεσα να γÏάψω δεδομένα του αÏχείου peak (%2)"
+
+#: libs/ardour/automation_event.cc:65 libs/ardour/location.cc:345
+#: libs/ardour/tempo.cc:226
msgid "initial"
msgstr "Ï€ÏωταÏχικό"
-#: libs/ardour/automation_event.cc:231
+#: libs/ardour/automation_event.cc:232
msgid "cleared"
msgstr "εκκαθαÏίσθη"
-#: libs/ardour/automation_event.cc:403
+#: libs/ardour/automation_event.cc:404
msgid "added event"
msgstr "συμβάν Ï€Ïοστέθηκε"
-#: libs/ardour/automation_event.cc:420
+#: libs/ardour/automation_event.cc:421
msgid "removed event"
msgstr "συμβάν απαλοίφθηκε"
-#: libs/ardour/automation_event.cc:435
+#: libs/ardour/automation_event.cc:436
msgid "removed multiple events"
msgstr "πολλαπλά συμβάντα απαλοίφθηκαν"
-#: libs/ardour/automation_event.cc:461
+#: libs/ardour/automation_event.cc:467 libs/ardour/automation_event.cc:498
msgid "removed range"
msgstr "διάστημα απαλοίφθηκε"
-#: libs/ardour/automation_event.cc:491
+#: libs/ardour/automation_event.cc:528
msgid "event range adjusted"
msgstr "διάστημα συμβάντων Ïυθμίστηκε"
-#: libs/ardour/automation_event.cc:513
+#: libs/ardour/automation_event.cc:550
msgid "event adjusted"
msgstr "συμβάν Ïυθμίστηκε"
-#: libs/ardour/automation_event.cc:628 libs/ardour/automation_event.cc:733
-#: libs/ardour/panner.cc:1040
+#: libs/ardour/automation_event.cc:665 libs/ardour/automation_event.cc:770
+#: libs/ardour/panner.cc:1041
msgid "programming error:"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ:"
-#: libs/ardour/automation_event.cc:1042
+#: libs/ardour/automation_event.cc:1079
msgid "cut/copy/clear"
msgstr "κοπή/αντιγÏαφή/εκκαθάÏιση"
-#: libs/ardour/automation_event.cc:1075
+#: libs/ardour/automation_event.cc:1112
msgid "copy"
msgstr "αντιγÏαφή"
-#: libs/ardour/automation_event.cc:1143 libs/ardour/playlist.cc:939
+#: libs/ardour/automation_event.cc:1180 libs/ardour/playlist.cc:939
msgid "paste"
msgstr "επικόλληση"
-#: libs/ardour/automation_event.cc:1198
+#: libs/ardour/automation_event.cc:1235
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"λίστα αυτοματισμοÏ: καμία x-συντεταγμένη αποθηκευμένη για σημείο ελέγχου (το "
"σημείο αγνοήθηκε)"
-#: libs/ardour/automation_event.cc:1204
+#: libs/ardour/automation_event.cc:1241
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"λίστα αυτοματισμοÏ: καμία y-συντεταγμένη αποθηκευμένη για σημείο ελέγχου (το "
"σημείο αγνοήθηκε)"
-#: libs/ardour/basic_ui.cc:68
-msgid "unnamed"
-msgstr ""
-
-#: libs/ardour/configuration.cc:79
+#: libs/ardour/configuration.cc:80
#, fuzzy
msgid "loading system configuration file %1"
msgstr ""
"Ardour: δεν μποÏÏŽ να διαβάσω το αÏχείο διαÏÏυθμίσεως του συστήματος \"%1\""
-#: libs/ardour/configuration.cc:82
+#: libs/ardour/configuration.cc:83
msgid "Ardour: cannot read system configuration file \"%1\""
msgstr ""
"Ardour: δεν μποÏÏŽ να διαβάσω το αÏχείο διαÏÏυθμίσεως του συστήματος \"%1\""
-#: libs/ardour/configuration.cc:87
+#: libs/ardour/configuration.cc:88
msgid "Ardour: system configuration file \"%1\" not loaded successfully."
msgstr ""
"Ardour: το αÏχείο διαÏÏυθμίσεως του συστήματος \"%1\" δεν φοÏτώθηκε επιτυχώς."
-#: libs/ardour/configuration.cc:104
+#: libs/ardour/configuration.cc:105
#, fuzzy
msgid "loading user configuration file %1"
msgstr "Ardour: αÏχείο διαÏÏυθμίσεως μή αναγνώσιμο \"%1\""
-#: libs/ardour/configuration.cc:107
+#: libs/ardour/configuration.cc:108
msgid "Ardour: cannot read configuration file \"%1\""
msgstr "Ardour: αÏχείο διαÏÏυθμίσεως μή αναγνώσιμο \"%1\""
-#: libs/ardour/configuration.cc:112
+#: libs/ardour/configuration.cc:113
#, fuzzy
msgid "Ardour: user configuration file \"%1\" not loaded successfully."
msgstr "Ardour: αÏχείο διαÏÏυθμίσεως \"%1\" δεν φοÏτώθηκε επιτυχώς."
-#: libs/ardour/configuration.cc:136
+#: libs/ardour/configuration.cc:137
#, fuzzy
msgid "Config file %1 not saved"
msgstr "ΑÏχείο διαÏÏυθμίσεως δεν αποθηκεÏθηκε"
-#: libs/ardour/configuration.cc:209
+#: libs/ardour/configuration.cc:210
msgid "ill-formed MIDI port specification in ardour rcfile (ignored)"
msgstr "κακοσχηματισμένος καθοÏισμός MIDI θÏÏας στο ardour rcfile (αγνοήθηκε)"
@@ -326,28 +523,41 @@ msgstr "Κόμβος Ï€Ïος ΣÏνδεση δεν έχει \"όνομα\" ιδ
msgid "Node for Connection has no \"connections\" property"
msgstr "Κόμβος Ï€Ïος ΣÏνδεση δεν έχει \"συνδέσεις\" ιδιότητα"
-#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1889
+#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1902
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: κακοφτιαγμένη γÏαμμή στον XML κόμβο για εισόδους \"%1\""
-#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1894
+#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1907
msgid "bad input string in XML node \"%1\""
msgstr "κακή γÏαμμή εισόδου στον XML κόμβο \"%1\""
-#: libs/ardour/control_protocol_manager.cc:79
+#: libs/ardour/control_protocol_manager.cc:80
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:84
+#: libs/ardour/control_protocol_manager.cc:85
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:180
+#: libs/ardour/control_protocol_manager.cc:141
+msgid "Instantiating mandatory control protocol %1"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:175
+#, fuzzy
+msgid "Control protocol %1 not usable"
+msgstr "ΧωÏίς έλεγχο MMC (θÏÏα MIDI \"%1\" μη διαθέσιμη)"
+
+#: libs/ardour/control_protocol_manager.cc:187
+msgid "Control surface protocol discovered: \"%1\""
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:205
#, fuzzy
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)"
-#: libs/ardour/control_protocol_manager.cc:188
+#: libs/ardour/control_protocol_manager.cc:213
#, fuzzy
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "LADSPA: το module \"%1\" δεν έχει λειτουÏγία πεÏιγÏαφής."
@@ -381,372 +591,104 @@ msgstr "αλλαγή ενεÏγοÏ"
msgid "old-style crossfade information - no position information"
msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληÏοφοÏίες ενάÏξεως"
-#: libs/ardour/curve.cc:112 libs/ardour/insert.cc:454
-#: libs/ardour/session.cc:2452 libs/ardour/session.cc:2504
+#: libs/ardour/curve.cc:112 libs/ardour/globals.cc:340
+#: libs/ardour/insert.cc:454 libs/ardour/session.cc:2466
+#: libs/ardour/session.cc:2518
msgid "programming error: "
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: "
-#: libs/ardour/cycle_timer.cc:35
+#: libs/ardour/cycle_timer.cc:37
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): δεν ανοίγει το /proc/cpuinfo"
-#: libs/ardour/cycle_timer.cc:47
+#: libs/ardour/cycle_timer.cc:49
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): δεν ευÏέθη το cpu MHz στο /proc/cpuinfo"
-#: libs/ardour/cycle_timer.cc:70
+#: libs/ardour/cycle_timer.cc:72
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "δεν ευÏέθη το cpu MHz στο /proc/cpuinfo"
-#: libs/ardour/destructive_filesource.cc:197
+#: libs/ardour/destructive_filesource.cc:188
msgid "DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: libs/ardour/destructive_filesource.cc:210
-#: libs/ardour/destructive_filesource.cc:252
-#: libs/ardour/destructive_filesource.cc:259
+#: libs/ardour/destructive_filesource.cc:201
+#: libs/ardour/destructive_filesource.cc:243
+#: libs/ardour/destructive_filesource.cc:250
#, fuzzy
msgid "DestructiveFileSource: \"%1\" bad write (%2)"
msgstr "FileSource: \"%1\" κακή εγγÏαφή (%2)"
-#: libs/ardour/diskstream.cc:337
-msgid "DiskStream: Session doesn't know about a Playlist called \"%1\""
-msgstr ""
-"DiskStream: Η ΣυνεδÏία δεν γνωÏίζει για την λίστα ΑναπαÏ/γής με όνομα \"%1\""
-
-#: libs/ardour/diskstream.cc:342
-msgid "DiskStream: Playlist \"%1\" isn't an audio playlist"
-msgstr "DiskStream: Η Λίστα \"%1\" δεν είναι ηχητική λίστα αναπαÏ/γής"
-
-#: libs/ardour/diskstream.cc:433
-msgid "DiskStream %1: there is no existing playlist to make a copy of!"
-msgstr "DiskStream %1: δεν υπάÏχει λίστα αναπαÏ/γής για να γίνει αντιγÏαφή!"
-
-#: libs/ardour/diskstream.cc:1113 libs/ardour/diskstream.cc:1124
-msgid "DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"
-msgstr ""
-"DiskStream %1: κατα την αναγόμωση, δεν μπόÏεσα να διαβάσω %2 από τη λίστα "
-"αναπαÏ/γής στο frame %3"
-
-#: libs/ardour/diskstream.cc:1256
-msgid "DiskStream %1: cannot read %2 from playlist at frame %3"
-msgstr ""
-"DiskStream %1: δεν μπόÏεσα να διαβάσω %2 από τη λίστα αναπαÏ/γής στο frame %3"
-
-#: libs/ardour/diskstream.cc:1623 libs/ardour/diskstream.cc:1640
-msgid "DiskStream %1: cannot write to disk"
-msgstr "DiskStream %1: δεν μποÏÏŽ να γÏάψω στο δίσκο"
-
-#: libs/ardour/diskstream.cc:1700
-msgid "DiskStream \"%1\": cannot flush captured data to disk!"
-msgstr ""
-"DiskStream \"%1\": δεν γίνεται να αποÏÏιφθοÏν δειγματοληψίες στο δίσκο!"
-
-#: libs/ardour/diskstream.cc:1797
-msgid "%1: could not create region for complete audio file"
-msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file"
-
-#: libs/ardour/diskstream.cc:1820
-msgid "DiskStream: could not create region for captured audio!"
-msgstr "DiskStream: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για δειγματοληψίες!"
-
-#: libs/ardour/diskstream.cc:1875
-#, fuzzy
-msgid "programmer error: %1"
-msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
-
-#: libs/ardour/diskstream.cc:2155
-#, fuzzy
-msgid "DiskStream: channel %1 out of range"
-msgstr "DiskStream: κανάλι εκτός διαστήματος"
-
-#: libs/ardour/diskstream.cc:2180
-msgid "%1:%2 new capture file not initialized correctly"
-msgstr "%1:%2 νέα δειγματοληψία δεν εκκινήθη σωστά"
-
-#: libs/ardour/diskstream.cc:2413
-msgid "Location \"%1\" not valid for track loop (start >= end)"
-msgstr "Η Τοποθεσία \"%1\" δεν είναι ικανή για track loop (αÏχή >= τέλος)"
-
-#: libs/ardour/diskstream.cc:2491
-#, fuzzy
-msgid "%1: cannot restore pending capture source file %2"
-msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το εισαγμένο αÏχείο ήχου \"%1\""
-
-#: libs/ardour/diskstream.cc:2513
-msgid "%1: incorrect number of pending sources listed - ignoring them all"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2529
-msgid "%1: cannot create whole-file region from pending capture sources"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2541
-#, fuzzy
-msgid "%1: cannot create region from pending capture sources"
-msgstr "%1: δεν μπόÏεσα να δημιουÏγήσω πεÏιοχή για ολόκληÏο audio file"
-
-#: libs/ardour/filesource.cc:175
-msgid "FileSource: search path not set"
-msgstr "FileSource: μονοπάτι αναζητήσεως δεν ετέθη"
-
-#: libs/ardour/filesource.cc:190
-msgid "FileSource: \"%1\" not found when searching %2 using %3"
-msgstr "FileSource: \"%1\" δεν ευÏέθη όταν αναζητείτο %2 χÏησιμοποιώντας %3"
-
-#: libs/ardour/filesource.cc:196
-msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
-"\t"
-msgstr ""
-"FileSource: \"%1\" είναι αμφίβολο κατά την αναζήτηση του %2\n"
-"\t"
-
-#: libs/ardour/filesource.cc:231
-msgid "Filesource: cannot find required file (%1): %2"
-msgstr "Filesource: δεν ευÏέθη το απαιτοÏμενο αÏχείο (%1): %2"
-
-#: libs/ardour/filesource.cc:239
-msgid "Filesource: cannot check for existing file (%1): %2"
-msgstr "Filesource: δεν μποÏÏŽ να ελέγξω για το υπάÏχον αÏχείο (%1): %2"
-
-#: libs/ardour/filesource.cc:245 libs/ardour/filesource.cc:1127
-#: libs/ardour/filesource.cc:1210
-msgid "FileSource: could not open \"%1\": (%2)"
-msgstr "FileSource: δεν μπόÏεσα να ανοίξω \"%1\": (%2)"
-
-#: libs/ardour/filesource.cc:278
-msgid "FileSource: cannot write header in %1"
-msgstr "FileSource: δεν μποÏÏŽ να γÏάψω επικεφαλίδα στο %1"
-
-#: libs/ardour/filesource.cc:293
-msgid "FileSource: cannot locate chunks in %1"
-msgstr "FileSource: δεν μποÏÏŽ να ανιχνεÏσω κομμάτια στο %1"
-
-#: libs/ardour/filesource.cc:298
-msgid "FileSource: cannot read header in %1"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω επικεφαλίδα στο %1"
-
-#: libs/ardour/filesource.cc:303
-msgid "FileSource: cannot check header in %1"
-msgstr "FileSource: δεν μποÏÏŽ να ελέγξω επικεφαλίδα στο %1"
-
-#: libs/ardour/filesource.cc:311
-#, fuzzy
-msgid "FileSource: cannot initialize peakfile for %1 as %2"
-msgstr "FileSource: δεν μποÏÏŽ να εκκινήσω το peakfile για %1"
-
-#: libs/ardour/filesource.cc:359 libs/ardour/insert.cc:525
-msgid "programming error: %1"
-msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
-
-#: libs/ardour/filesource.cc:364
-#, fuzzy
-msgid "cannot rename audio file for %1 to %2"
-msgstr "δεν μποÏÏŽ να μετονομάσω την πηγή του audio file από %1 σε %2 (%3)"
-
-#: libs/ardour/filesource.cc:390
-msgid "FileSource: cannot seek to end of file"
-msgstr "FileSource: δεν μποÏÏŽ να ανιχνεÏσω το τέλος του αÏχείου"
-
-#: libs/ardour/filesource.cc:395
-msgid "FileSource: cannot read RIFF/WAVE chunk from file"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω κομμάτι RIFF/WAVE από το αÏχείο"
-
-#: libs/ardour/filesource.cc:407
-msgid "FileSource %1: not a RIFF/WAVE file"
-msgstr "FileSource %1: δεν είναι RIFF/WAVE αÏχείο"
-
-#: libs/ardour/filesource.cc:434
-msgid "FileSource: can't read a chunk"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω κομμάτι"
-
-#: libs/ardour/filesource.cc:451
-msgid "filesource: correcting mis-written RIFF file to become a RIFX: "
-msgstr ""
-
-#: libs/ardour/filesource.cc:567
-msgid "FileSource: cannot get user information for BWF header (%1)"
-msgstr ""
-"FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες χÏήστη για επικεφαλίδα BWF (%1)"
-
-#: libs/ardour/filesource.cc:571
-msgid "FileSource: cannot get host information for BWF header (%1)"
-msgstr ""
-"FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες οικοδεσπότη(host) για επικεφαλίδα "
-"BWF (%1)"
-
-#: libs/ardour/filesource.cc:716
-msgid "FileSource[%1]: cannot update data size: %2"
-msgstr "FileSource[%1]: δεν μποÏÏŽ να ανανεώσω το μέγεθος δεδομένων: %2"
-
-#: libs/ardour/filesource.cc:733
-msgid "FileSource: can't find RIFF chunk info"
-msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για RIFF κομμάτι"
-
-#: libs/ardour/filesource.cc:737
-#, fuzzy
-msgid "FileSource: can't find RIFX chunk info"
-msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για RIFF κομμάτι"
-
-#: libs/ardour/filesource.cc:758
-msgid "FileSource: can't read RIFF chunk"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω RIFF κομμάτι"
-
-#: libs/ardour/filesource.cc:768
-msgid "FileSource: can't find format chunk info"
-msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για το κομμάτι φοÏμαÏίσματος"
-
-#: libs/ardour/filesource.cc:773
-msgid "FileSource: can't read format chunk"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω το κομμάτι φοÏμαÏίσματος"
-
-#: libs/ardour/filesource.cc:782
-msgid "FileSource: can't find data chunk info"
-msgstr "FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες για το κομμάτι δεδομένων"
-
-#: libs/ardour/filesource.cc:787
-msgid "FileSource: can't read data chunk"
-msgstr "FileSource: δεν μποÏÏŽ να διαβάσω το κομμάτι δεδομένων"
-
-#: libs/ardour/filesource.cc:804
-msgid ""
-"FileSource: cannot read Broadcast Wave data from existing audio file \"%1"
-"\" (%2)"
-msgstr ""
-"FileSource: δεν μποÏÏŽ να διαβάσω δεδομένα Broadcast Wave από το υπάÏχον "
-"αÏχείο \"%1\" (%2)"
-
-#: libs/ardour/filesource.cc:820
-msgid ""
-"FileSource: cannot read Broadcast Wave coding history from audio file \"%1"
-"\" (%2)"
-msgstr ""
-"FileSource: δεν μποÏÏŽ να διαβάσω το ιστοÏικό του κώδικα Broadcast Wave από "
-"το αÏχείο \"%1\" (%2)"
-
-#: libs/ardour/filesource.cc:862
-#, fuzzy
-msgid ""
-"FileSource \"%1\" does not use valid sample format.\n"
-"This is probably a programming error."
-msgstr ""
-"FileSource \"%1\" δεν χÏησιμοποιεί format μεταβλητής υποδιαστολής.\n"
-"Αυτό πιθανόν να είναι σφάλμα Ï€ÏογÏαμματισμοÏ."
-
-#: libs/ardour/filesource.cc:901
-msgid "FileSource \"%1\" has no \"data\" chunk"
-msgstr "FileSource \"%1\" δεν έχει \"data\" κομμάτι"
-
-#: libs/ardour/filesource.cc:906
-msgid "%1: data length in header (%2) differs from implicit size in file (%3)"
-msgstr ""
-"%1: το μέγεθος δεδομένων της επικεφαλίδας (%2) διαφέÏει από το δεδηλωμένο "
-"μέγεθος στο αÏχείο (%3)"
-
-#: libs/ardour/filesource.cc:911
-msgid "\"%1\" has a sample rate of %2 instead of %3 as used by this session"
-msgstr ""
-"\"%1\" έχει Ïυθμό δειγματοληψίας %2 αντί του %3 όπως στην παÏοÏσα συνεδÏία"
-
-#: libs/ardour/filesource.cc:934
-msgid "FileSource: cannot write WAVE chunk: %1"
-msgstr "FileSource: δεν μποÏÏŽ να γÏάψω WAVE κομμάτι: %1"
-
-#: libs/ardour/filesource.cc:978
-msgid "FileSource: cannot write format chunk: %1"
-msgstr "FileSource: δεν μποÏÏŽ να γÏάψω format κομμάτι: %1"
-
-#: libs/ardour/filesource.cc:990
-msgid "FileSource: cannot data chunk: %1"
-msgstr "FileSource: cδεν μποÏÏŽ να γÏάψω κομμάτι δεδομένων: %1"
-
-#: libs/ardour/filesource.cc:1103 libs/ardour/filesource.cc:1188
-msgid "FileSource: \"%1\" bad write (%2)"
-msgstr "FileSource: \"%1\" κακή εγγÏαφή (%2)"
-
-#: libs/ardour/filesource.cc:1335 libs/ardour/session_state.cc:3093
-msgid ""
-"there are already 1000 files with names like %1; versioning discontinued"
-msgstr "ΥπάÏχουν ήδη 1000 αÏχεία με ονόματα όπως %1; μη-συνεχές versioning"
-
-#: libs/ardour/filesource.cc:1349 libs/ardour/session_state.cc:3107
-msgid "cannot rename audio file source from %1 to %2 (%3)"
-msgstr "δεν μποÏÏŽ να μετονομάσω την πηγή του audio file από %1 σε %2 (%3)"
-
-#: libs/ardour/filesource.cc:1356 libs/ardour/session_state.cc:3122
-msgid "cannot remove peakfile %1 for %2 (%3)"
-msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)"
-
-#: libs/ardour/globals.cc:82
+#: libs/ardour/globals.cc:109
msgid "no MIDI ports specified: no MMC or MTC control possible"
msgstr "καμία MIDI θÏÏα δεν επελέχθη: έλεγχος MMC ή MTC αδÏνατος"
-#: libs/ardour/globals.cc:97
+#: libs/ardour/globals.cc:124
msgid "MIDI port specifications for \"%1\" are not understandable."
msgstr "Οι Ï€ÏοδιαγÏαφές της θÏÏας MIDI για το \"%1\" δεν είναι κατανοητές."
-#: libs/ardour/globals.cc:110 libs/ardour/globals.cc:114
-#: libs/ardour/globals.cc:118
+#: libs/ardour/globals.cc:137 libs/ardour/globals.cc:141
+#: libs/ardour/globals.cc:145
msgid "default"
msgstr "Ï€ÏοκαθοÏισμένο"
-#: libs/ardour/globals.cc:146
+#: libs/ardour/globals.cc:173
msgid "No MMC control (MIDI port \"%1\" not available)"
msgstr "ΧωÏίς έλεγχο MMC (θÏÏα MIDI \"%1\" μη διαθέσιμη)"
-#: libs/ardour/globals.cc:152
+#: libs/ardour/globals.cc:179
msgid "No MTC support (MIDI port \"%1\" not available)"
msgstr "ΧωÏίς έλεγχο MTC (θÏÏα MIDI \"%1\" μη διαθέσιμη)"
-#: libs/ardour/globals.cc:157
+#: libs/ardour/globals.cc:184
#, fuzzy
msgid "No MIDI parameter support (MIDI port \"%1\" not available)"
msgstr "ΧωÏίς έλεγχο MTC (θÏÏα MIDI \"%1\" μη διαθέσιμη)"
-#: libs/ardour/import.cc:71
+#: libs/ardour/import.cc:75
msgid "Import: cannot open input sound file \"%1\""
msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το εισαγμένο αÏχείο ήχου \"%1\""
-#: libs/ardour/import.cc:76
+#: libs/ardour/import.cc:80
msgid "resampling audio"
msgstr "επανά-ληψη(resampling) ήχου"
-#: libs/ardour/import.cc:80
+#: libs/ardour/import.cc:84
msgid "Import: cannot open converted sound file \"%1\""
msgstr "Εισαγωγή: δεν μποÏÏŽ να ανοίξω το Ï„Ïοποποιημένο αÏχείο ήχου \"%1\""
-#: libs/ardour/import.cc:85
+#: libs/ardour/import.cc:89
msgid "Import: error while resampling sound file \"%1\""
msgstr "Εισαγωγή: σφάλμα κατά την Ï„Ïοποποίηση αÏχείου \"%1\""
-#: libs/ardour/import.cc:141
+#: libs/ardour/import.cc:148
msgid "Session::import_audiofile: cannot open new file source for channel %1"
msgstr ""
"ΣυνεδÏία::εισαγωγή_αÏχείου: δεν μποÏÏŽ να ανοίξω νέα πηγή αÏχείου για το "
"κανάλι %1"
-#: libs/ardour/import.cc:160
+#: libs/ardour/import.cc:167
msgid "converting audio"
msgstr "μετατÏοπή ήχου"
-#: libs/ardour/import.cc:192
+#: libs/ardour/import.cc:199
msgid "building region"
msgstr "χτίσιμο πεÏιοχής"
-#: libs/ardour/import.cc:194
+#: libs/ardour/import.cc:201
msgid "building regions"
msgstr "χτίσιμο πεÏιοχών"
-#: libs/ardour/import.cc:318
+#: libs/ardour/import.cc:325
msgid "Import: could not open temp file: %1"
msgstr "Εισαγωγή: δεν μπόÏεσα να ανοίξω το temp αÏχείο: %1"
-#: libs/ardour/import.cc:327
+#: libs/ardour/import.cc:334
msgid "Import: src_new() failed : %1"
msgstr "Εισαγωγή: src_new() απέτυχε : %1"
-#: libs/ardour/import.cc:355
+#: libs/ardour/import.cc:362
msgid "Import: %1"
msgstr "Εισαγωγή: %1"
@@ -805,153 +747,153 @@ msgstr "PortInsert: δεν μποÏεί να Ï€Ïοστεθεί θÏÏα εξόÎ
msgid "non-port insert XML used for port plugin insert"
msgstr "εισαγωγή μη-θÏÏας XML για χÏήση σε εισαγωγή plugin θÏÏας"
-#: libs/ardour/io.cc:585
+#: libs/ardour/io.cc:598
msgid "IO: cannot disconnect input port %1 from %2"
msgstr "IO: δεν μποÏει να αποσυνδεθεί η θÏÏα εισόδου %1 από %2"
-#: libs/ardour/io.cc:653
+#: libs/ardour/io.cc:666
msgid "IO: cannot disconnect output port %1 from %2"
msgstr "IO: δεν μποÏεί να αποσυνδεθεί η θÏÏα εξόδου %1 από %2"
-#: libs/ardour/io.cc:794 libs/ardour/io.cc:1138 libs/ardour/io.cc:1264
+#: libs/ardour/io.cc:807 libs/ardour/io.cc:1151 libs/ardour/io.cc:1277
#, c-format
msgid "%s/out"
msgstr "%s/out"
-#: libs/ardour/io.cc:796 libs/ardour/io.cc:1140 libs/ardour/io.cc:1266
-#: libs/ardour/io.cc:2826
+#: libs/ardour/io.cc:809 libs/ardour/io.cc:1153 libs/ardour/io.cc:1279
+#: libs/ardour/io.cc:2849
#, c-format
msgid "%s/out %u"
msgstr "%s/out %u"
-#: libs/ardour/io.cc:800 libs/ardour/io.cc:1145 libs/ardour/io.cc:1270
+#: libs/ardour/io.cc:813 libs/ardour/io.cc:1158 libs/ardour/io.cc:1283
msgid "IO: cannot register output port %1"
msgstr "IO: δεν μποÏει να καταχώÏηθεί η θÏÏα εξόδου %1"
-#: libs/ardour/io.cc:895 libs/ardour/io.cc:998 libs/ardour/io.cc:1104
+#: libs/ardour/io.cc:908 libs/ardour/io.cc:1011 libs/ardour/io.cc:1117
#, c-format
msgid "%s/in"
msgstr "%s/in"
-#: libs/ardour/io.cc:897 libs/ardour/io.cc:1001 libs/ardour/io.cc:1107
-#: libs/ardour/io.cc:2796
+#: libs/ardour/io.cc:910 libs/ardour/io.cc:1014 libs/ardour/io.cc:1120
+#: libs/ardour/io.cc:2819
#, c-format
msgid "%s/in %u"
msgstr "%s/in %u"
-#: libs/ardour/io.cc:901 libs/ardour/io.cc:1007 libs/ardour/io.cc:1112
+#: libs/ardour/io.cc:914 libs/ardour/io.cc:1020 libs/ardour/io.cc:1125
msgid "IO: cannot register input port %1"
msgstr "IO: δεν μποÏεί να καταχώÏηθεί η θÏÏα εισόδου %1"
-#: libs/ardour/io.cc:1528
+#: libs/ardour/io.cc:1541
msgid "IO::connecting_became_legal() called without a pending state node"
msgstr ""
"IO::connecting_became_legal() εκλήθη χωÏίς κόμβο καταστάσεως εν αναμονή"
-#: libs/ardour/io.cc:1551
+#: libs/ardour/io.cc:1564
msgid "IO::ports_became_legal() called without a pending state node"
msgstr "IO::ports_became_legal() εκλήθη χωÏίς κόμβο καταστάσεως εν αναμονή"
-#: libs/ardour/io.cc:1581
+#: libs/ardour/io.cc:1594
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr "μη-σωστός κόμβος XML \"%1\" πέÏασε στο IO αντικείμενο"
-#: libs/ardour/io.cc:1636
+#: libs/ardour/io.cc:1649
msgid ""
"MIDI gain control specification for %1 is incomplete, so it has been ignored"
msgstr ""
"Η Ï€ÏοδιαγÏαφή ελέγχου του MIDI gain για το %1 είναι ημιτελής, με αποτέλεσμα "
"να αγνοηθεί"
-#: libs/ardour/io.cc:1726 libs/ardour/io.cc:1838
+#: libs/ardour/io.cc:1739 libs/ardour/io.cc:1851
msgid "Unknown connection \"%1\" listed for output of %2"
msgstr "Άγνωστη σÏνδεση \"%1\" καταχωÏήθη για την έξοδο του %2"
-#: libs/ardour/io.cc:1728 libs/ardour/io.cc:1840
+#: libs/ardour/io.cc:1741 libs/ardour/io.cc:1853
#, fuzzy
msgid "out 1"
msgstr "out %lu"
-#: libs/ardour/io.cc:1729 libs/ardour/io.cc:1841
+#: libs/ardour/io.cc:1742 libs/ardour/io.cc:1854
msgid "No output connections available as a replacement"
msgstr ""
-#: libs/ardour/io.cc:1733 libs/ardour/io.cc:1845
+#: libs/ardour/io.cc:1746 libs/ardour/io.cc:1858
msgid "Connection %1 was not available - \"out 1\" used instead"
msgstr ""
-#: libs/ardour/io.cc:1747
+#: libs/ardour/io.cc:1760
msgid "%1: cannot create I/O ports"
msgstr "%1: θÏÏες I/O δεν μποÏοÏν να δημιουÏγηθοÏν"
-#: libs/ardour/io.cc:1854
+#: libs/ardour/io.cc:1867
msgid "improper output channel list in XML node (%1)"
msgstr "ασαφής λίστα καναλιών εξόδου στον κόμβο XML (%1)"
-#: libs/ardour/io.cc:1939
+#: libs/ardour/io.cc:1952
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: δÏσμοÏφη γÏαμμή στον κόμβο XML για τις εξόδους \"%1\""
-#: libs/ardour/io.cc:1944
+#: libs/ardour/io.cc:1957
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: κακή γÏαμμή εξόδουστον κόμβο XML \"%1\""
-#: libs/ardour/io.cc:2502
+#: libs/ardour/io.cc:2525
msgid "%1: could not open automation event file \"%2\""
msgstr "%1: δεν μπόÏεσα να ανοίξω το αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï \"%2\""
-#: libs/ardour/io.cc:2541
+#: libs/ardour/io.cc:2564
msgid "%1: cannot open automation event file \"%2\""
msgstr "%1: δεν μποÏÏŽ να ανοίξω το αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï \"%2\""
-#: libs/ardour/io.cc:2556
+#: libs/ardour/io.cc:2579
msgid "badly formed version number in automation event file \"%1\""
msgstr "δÏσμοÏφος αÏιθμός εκδόσεως στο αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï \"%1\""
-#: libs/ardour/io.cc:2560
+#: libs/ardour/io.cc:2583
msgid "no version information in automation event file \"%1\""
msgstr ""
"δεν υπάÏχουν πληÏοφοÏίες πεÏί εκδόσεων στο αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï \"%1"
"\""
-#: libs/ardour/io.cc:2565
+#: libs/ardour/io.cc:2588
msgid "mismatched automation event file version (%1)"
msgstr "αταίÏιαστη έκδοση αÏχείου συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï (%1)"
-#: libs/ardour/io.cc:2573
+#: libs/ardour/io.cc:2596
msgid "badly formatted automation event record at line %1 of %2 (ignored)"
msgstr ""
"κακώς φοÏμαÏισμένη καταγÏαφή συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î· γÏαμμή %1 of %2 "
"(αγνοήθηκε)"
-#: libs/ardour/io.cc:2593
+#: libs/ardour/io.cc:2616
msgid "dubious automation event found (and ignored)"
msgstr "αβέβαιο συμβάν Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÏ…Ïέθηκε (και αγνοήθηκε)"
-#: libs/ardour/io.cc:2597 libs/ardour/panner.cc:437
+#: libs/ardour/io.cc:2620 libs/ardour/panner.cc:438
#: libs/ardour/redirect.cc:148
msgid "loaded from disk"
msgstr "φοÏτώθηκε από το δίσκο"
-#: libs/ardour/io.cc:2768
+#: libs/ardour/io.cc:2791
msgid "automation write/touch"
msgstr "αυτοματισμός εγγÏαφή/αφή(write/touch)"
-#: libs/ardour/ladspa_plugin.cc:86
+#: libs/ardour/ladspa_plugin.cc:87
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: το module δεν έχει ενδεικτική λειτουÏγία."
-#: libs/ardour/ladspa_plugin.cc:91
+#: libs/ardour/ladspa_plugin.cc:92
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: το plugin την 'κοπάνισε' μετά την ανακάλυψη του!"
-#: libs/ardour/ladspa_plugin.cc:98
+#: libs/ardour/ladspa_plugin.cc:99
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" δεν μποÏεί να χÏησιμοποιηθεί, εφ'όσον δεν μποÏεί να κάνει επι "
"τόπου επεξεÏγασία"
-#: libs/ardour/ladspa_plugin.cc:328
+#: libs/ardour/ladspa_plugin.cc:329
msgid ""
"illegal parameter number used with plugin \"%1\". This mayindicate a change "
"in the plugin design, and presets may beinvalid"
@@ -960,20 +902,20 @@ msgstr ""
"ενδείκνυται αλλαγή στο σχεδιασμό του plugin, και οι Ïυθμίσεις ίσως να είναι "
"άκυÏες"
-#: libs/ardour/ladspa_plugin.cc:429
+#: libs/ardour/ladspa_plugin.cc:430
#, fuzzy
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr "Κακή αποστολή κόμβου εστάλη στο LadspaPlugin::set_state"
-#: libs/ardour/ladspa_plugin.cc:442
+#: libs/ardour/ladspa_plugin.cc:443
msgid "LADSPA: no ladspa port number"
msgstr "LADSPA: κανείς αÏιθμός θÏÏας ladspa"
-#: libs/ardour/ladspa_plugin.cc:448
+#: libs/ardour/ladspa_plugin.cc:449
msgid "LADSPA: no ladspa port data"
msgstr "LADSPA: κανένα δεδομένο θÏÏας ladspa"
-#: libs/ardour/ladspa_plugin.cc:497
+#: libs/ardour/ladspa_plugin.cc:498
msgid ""
"LADSPA LadspaPlugin MIDI control specification for port %1 is incomplete, so "
"it has been ignored"
@@ -981,131 +923,131 @@ msgstr ""
"Ο καθοÏισμός ελέγχου LADSPA LadspaPlugin για MIDI για την θÏÏα %1 είναι "
"ημιτελής, έτσι αγνοήθηκε."
-#: libs/ardour/location.cc:268
+#: libs/ardour/location.cc:269
msgid "incorrect XML node passed to Location::set_state"
msgstr "λανθασμένος κόμβος XML πέÏασε στην Τοποθεσία::set_state"
-#: libs/ardour/location.cc:275
+#: libs/ardour/location.cc:276
msgid "XML node for Location has no name information"
msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληÏοφοÏίες ονόματος"
-#: libs/ardour/location.cc:282
+#: libs/ardour/location.cc:283
msgid "XML node for Location has no start information"
msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληÏοφοÏίες ενάÏξεως"
-#: libs/ardour/location.cc:293
+#: libs/ardour/location.cc:294
msgid "XML node for Location has no end information"
msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληÏοφοÏίες τέλους"
-#: libs/ardour/location.cc:302
+#: libs/ardour/location.cc:303
msgid "XML node for Location has no flags information"
msgstr "Ο κόμβος XML για την Τοποθεσία δεν έχει πληÏοφοÏίες για σημαίες(flags)"
-#: libs/ardour/location.cc:390
+#: libs/ardour/location.cc:391
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
"Τοποθεσίες: απόπειÏα να χÏησιμοποιηθεί άγνωστη τοποθεσία σαν επιλεγμένη "
"τοποθεσία"
-#: libs/ardour/location.cc:417 libs/ardour/playlist.cc:1187
+#: libs/ardour/location.cc:418 libs/ardour/playlist.cc:1187
msgid "clear"
msgstr "εκκαθάÏιση"
-#: libs/ardour/location.cc:442
+#: libs/ardour/location.cc:443
msgid "clear markers"
msgstr "εκκαθάÏιση στιγμάτων"
-#: libs/ardour/location.cc:470
+#: libs/ardour/location.cc:471
msgid "clear ranges"
msgstr "εκκαθάÏιση διαστημάτων"
-#: libs/ardour/location.cc:488
+#: libs/ardour/location.cc:489
msgid "add"
msgstr "Ï€Ïόσθεση"
-#: libs/ardour/location.cc:526
+#: libs/ardour/location.cc:527
msgid "remove"
msgstr "απαλοιφή"
-#: libs/ardour/location.cc:566
+#: libs/ardour/location.cc:567
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "λανθασμένο XML mode πέÏασε στις Τοποθεσίες::set_state"
-#: libs/ardour/mtc_slave.cc:195
+#: libs/ardour/mtc_slave.cc:196
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
"MTC Slave: ατομική ανάγνωση του Ï„Ïέχοντος χÏόνου απέτυχε, πίσω για Ïπνο!"
-#: libs/ardour/named_selection.cc:76
+#: libs/ardour/named_selection.cc:77
msgid "Chunk %1 uses an unknown playlist \"%2\""
msgstr "Το κομμάτι %1 χÏησιμοποιεί άγνωστη λίστα αναπαÏ/γής \"%2\""
-#: libs/ardour/named_selection.cc:79
+#: libs/ardour/named_selection.cc:80
msgid "Chunk %1 contains misformed playlist information"
msgstr "Το κομμάτι %1 πεÏιέχει δÏσμοÏφες πληÏοφοÏίες για τη λίστα αναπαÏ/γής"
-#: libs/ardour/panner.cc:255
+#: libs/ardour/panner.cc:256
#, fuzzy
msgid "MIDI pan control specification is incomplete, so it has been ignored"
msgstr ""
"Η Ï€ÏοδιαγÏαφή ελέγχου του MIDI gain για το %1 είναι ημιτελής, με αποτέλεσμα "
"να αγνοηθεί"
-#: libs/ardour/panner.cc:360
+#: libs/ardour/panner.cc:361
msgid "automation write pass"
msgstr "πέÏασμα εγγÏαφής αυτοματισμοÏ"
-#: libs/ardour/panner.cc:400
+#: libs/ardour/panner.cc:401
#, c-format
msgid "error writing pan automation file (%s)"
msgstr "σφάλμα στην εγγÏαφή του pan στο αÏχείο Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï (%s)"
-#: libs/ardour/panner.cc:428
+#: libs/ardour/panner.cc:429
msgid ""
"badly formatted pan automation event record at line %1 of %2 (ignored) [%3]"
msgstr ""
"δÏσμοÏφη εγγÏαφή συμβάντος pan Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î· γÏαμμή %1 of %2 (αγνοήθηκε) "
"[%3]"
-#: libs/ardour/panner.cc:943
+#: libs/ardour/panner.cc:944
msgid "badly-formed positional data for Multi2dPanner - ignored"
msgstr "δÏσμοÏφα δεδομένα θέσεως για το Multi2dPanner - αγνοήθηκε"
-#: libs/ardour/panner.cc:1236
+#: libs/ardour/panner.cc:1237
msgid "cannot open pan automation file \"%1\" for saving (%s)"
msgstr ""
"δεν μποÏÏŽ να ανοίξω αÏχείο Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï„Î¿Ï… pan \"%1\" για αποθήκευση (%s)"
-#: libs/ardour/panner.cc:1272
+#: libs/ardour/panner.cc:1273
msgid "cannot open pan automation file %1 (%2)"
msgstr "δεν μποÏÏŽ να ανοίξω αÏχείο Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï„Î¿Ï… pan %1 (%2)"
-#: libs/ardour/panner.cc:1285
+#: libs/ardour/panner.cc:1286
msgid "badly formed version number in pan automation event file \"%1\""
msgstr ""
"δÏσμοÏφος αÏιθμός εκδόσεως στο αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï„Î¿Ï… pan \"%1\""
-#: libs/ardour/panner.cc:1289
+#: libs/ardour/panner.cc:1290
msgid ""
"no version information in pan automation event file \"%1\" (first line = %2)"
msgstr ""
"καμία πληÏοφοÏία εκδόσεως στο αÏχείο συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï„Î¿Ï… pan \"%1"
"\" (Ï€Ïώτη γÏαμμή = %2)"
-#: libs/ardour/panner.cc:1295
+#: libs/ardour/panner.cc:1296
msgid "mismatched pan automation event file version (%1)"
msgstr "αταίÏιαστη έκδοση αÏχείου συμβάντων Î±Ï…Ï„Î¿Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î³Î¹Î± το pan (%1)"
-#: libs/ardour/panner.cc:1309
+#: libs/ardour/panner.cc:1310
msgid "too many panner states found in pan automation file %1"
msgstr ""
"πάÏα πολλές καταστάσεις panner ευÏέθησαν στο αÏχείο των αυτοματισμών pan %1"
-#: libs/ardour/panner.cc:1450
+#: libs/ardour/panner.cc:1451
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "Άγνωστο plugin για panner \"%1\" ευÏέθη στην κατάσταση pan - αγνοήθηκε"
-#: libs/ardour/panner.cc:1456
+#: libs/ardour/panner.cc:1457
msgid "panner plugin node has no type information!"
msgstr "ο κόμβος για τα plugin του panner δεν έχει πληÏοφοÏίες Ï„Ïπου!"
@@ -1160,63 +1102,63 @@ msgstr "Playlist: δεν μποÏÏŽ να δημιουÏγήσω ΠεÏιοχή Î
msgid "nudged"
msgstr "νυχθέν"
-#: libs/ardour/playlist_factory.cc:26 libs/ardour/playlist_factory.cc:41
+#: libs/ardour/playlist_factory.cc:49 libs/ardour/playlist_factory.cc:64
msgid ""
"programming error: Playlist::createRegion called with unknown Region type"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: Playlist::createRegion εκλήθη με άγνωστο Ï„Ïπο Πε"
-#: libs/ardour/playlist_factory.cc:63
+#: libs/ardour/playlist_factory.cc:86
msgid ""
"programming error: Playlist::copyPlaylist called with unknown Playlist type"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: Playlist::copyPlaylist με άγνωστο Ï„Ïπο Playlist"
-#: libs/ardour/plugin.cc:327
+#: libs/ardour/plugin.cc:328
msgid "Could not locate HOME. Preset not saved."
msgstr "Δεν μπόÏεσα να βÏÏŽ το HOME. ΠÏο-ÏÏθμιση δεν αποθηκεÏθηκε."
-#: libs/ardour/plugin.cc:337 libs/ardour/plugin.cc:343
+#: libs/ardour/plugin.cc:338 libs/ardour/plugin.cc:344
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Δεν μπόÏεσα να δημιουÏγήσω το %1. ΠÏο-ÏÏθμιση δεν αποθηκεÏθηκε. (%2)"
-#: libs/ardour/plugin.cc:348
+#: libs/ardour/plugin.cc:349
msgid "Error saving presets file %1."
msgstr "Σφάλμα στην αποθήκευση αÏχείου Ï€Ïο-Ïυθμίσεων %1."
-#: libs/ardour/plugin_manager.cc:193
+#: libs/ardour/plugin_manager.cc:194
msgid "Could not parse rdf file: %1"
msgstr "Δεν μπόÏεσα να αναλÏσω το αÏχείο rdf: %1"
-#: libs/ardour/plugin_manager.cc:234
+#: libs/ardour/plugin_manager.cc:235
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω το module \"%1\" (%2)"
-#: libs/ardour/plugin_manager.cc:241
+#: libs/ardour/plugin_manager.cc:242
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: το module \"%1\" δεν έχει λειτουÏγία πεÏιγÏαφής."
-#: libs/ardour/plugin_manager.cc:296
+#: libs/ardour/plugin_manager.cc:297
msgid "VST: cannot load module from \"%1\""
msgstr "VST: δεν μποÏÏŽ να φοÏτώσω module από \"%1\""
-#: libs/ardour/plugin_manager.cc:301
+#: libs/ardour/plugin_manager.cc:302
msgid "You asked ardour to not use any VST plugins"
msgstr ""
-#: libs/ardour/plugin_manager.cc:304
+#: libs/ardour/plugin_manager.cc:305
msgid "This version of ardour has no support for VST plugins"
msgstr "Η παÏοÏσα έκδοση του ardour δεν υποστηÏίζει VST plugins"
-#: libs/ardour/plugin_manager.cc:311
+#: libs/ardour/plugin_manager.cc:312
msgid "LADSPA: cannot load module from \"%1\""
msgstr "LADSPA: δεν μποÏÏŽ να φοÏτώσω module από \"%1\""
-#: libs/ardour/plugin_manager.cc:373 libs/ardour/plugin_manager.cc:385
+#: libs/ardour/plugin_manager.cc:374 libs/ardour/plugin_manager.cc:386
msgid "Unknown"
msgstr "Άγνωστο"
-#: libs/ardour/plugin_manager.cc:463
+#: libs/ardour/plugin_manager.cc:464
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in "
"ardour at this time"
@@ -1232,11 +1174,11 @@ msgstr "δεν μποÏÏŽ να ανοίξω το Ï€Ïόσφατο αÏχείο Ï
msgid "programming error: unknown Redirect type in Redirect::Clone!\n"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: άγνωστος Ï„Ïπος Redirect στο Redirect::Clone!\n"
-#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:199
+#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:203
msgid "pre"
msgstr "pre"
-#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:202
+#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:206
msgid "post"
msgstr "post"
@@ -1293,67 +1235,67 @@ msgstr ""
msgid "active_changed"
msgstr "αλλαγή_ενεÏγοÏ"
-#: libs/ardour/region.cc:884
+#: libs/ardour/region.cc:885
msgid "Session: XMLNode describing a Region is incomplete (no id)"
msgstr "ΣυνεδÏία: XMLΚόμβος που πεÏιγÏάφει ΠεÏιοχή είναι ημιτελής (χωÏίς id)"
-#: libs/ardour/region.cc:891
+#: libs/ardour/region.cc:892
msgid "Session: XMLNode describing a Region is incomplete (no name)"
msgstr ""
"ΣυνεδÏία: XMLΚόμβος που πεÏιγÏάφει ΠεÏιοχή είναι ημιτελής (χωÏίς όνομα)"
-#: libs/ardour/route.cc:79 libs/ardour/session.cc:1541
-#: libs/ardour/session.cc:1547 libs/ardour/session.cc:3064
+#: libs/ardour/route.cc:79 libs/ardour/session.cc:1554
+#: libs/ardour/session.cc:1560 libs/ardour/session.cc:3093
msgid "signal"
msgstr "σήμα"
-#: libs/ardour/route.cc:1433
+#: libs/ardour/route.cc:1430
msgid "Could not get state of route. Problem with save_automation"
msgstr ""
"Δεν μπόÏεσα να πάÏω κατάσταση διαδÏομής. ΠÏόβλημα με αποθήκευση_αυτοματισμοÏ"
-#: libs/ardour/route.cc:1485
+#: libs/ardour/route.cc:1482
msgid "Send construction failed"
msgstr "Αποστολή κατασκευής απέτυχε"
-#: libs/ardour/route.cc:1507
+#: libs/ardour/route.cc:1504
msgid "unknown Insert type \"%1\"; ignored"
msgstr "άγνωστος Ï„Ïπος Λήψης(Insert) \"%1\"... αγνοήθηκε"
-#: libs/ardour/route.cc:1513
+#: libs/ardour/route.cc:1510
msgid "Insert XML node has no type property"
msgstr "Εισηχθέντας κόμβος XML δεν έχει στοιχεία Ï„Ïπου"
-#: libs/ardour/route.cc:1518
+#: libs/ardour/route.cc:1515
msgid "insert could not be created. Ignored."
msgstr "εισαγωγή δεν μπόÏεσε να δημιουÏγηθεί. Αγνοήθηκε."
-#: libs/ardour/route.cc:1536
+#: libs/ardour/route.cc:1533
msgid "Bad node sent to Route::set_state() [%1]"
msgstr "Κακός κόμβος εστάλη στο Route::set_state() [%1]"
-#: libs/ardour/route.cc:1595
+#: libs/ardour/route.cc:1592
msgid "Route %1: unknown edit group \"%2 in saved state (ignored)"
msgstr ""
"Route %1: άγνωστη ομάδα επεξεÏγασίας \"%2 στην αποθηκευμένη κατάσταση "
"(αγνοήθηκε)"
-#: libs/ardour/route.cc:1611 libs/ardour/route.cc:1615
+#: libs/ardour/route.cc:1608 libs/ardour/route.cc:1612
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
"δÏσμοÏφη γÏαμμή ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Ï„Î±Î¾Î¹Î½Î¿Î¼Î®ÏƒÎµÏ‰Ï‚ στο αÏχείο καταστάσεως ! [%1] ... "
"αγνοήθηκε."
-#: libs/ardour/route.cc:1696 libs/ardour/route.cc:1823
+#: libs/ardour/route.cc:1693 libs/ardour/route.cc:1820
msgid "[control]"
msgstr "[έλεγχος]"
-#: libs/ardour/route.cc:1716
+#: libs/ardour/route.cc:1713
msgid "Route %1: unknown mix group \"%2 in saved state (ignored)"
msgstr ""
"Route %1: άγνωστη ομάδα μίξεως \"%2 στην αποθηκευμένη κατάσταση (αγνοήθηκε)"
-#: libs/ardour/route.cc:1745 libs/ardour/route.cc:1753
+#: libs/ardour/route.cc:1742 libs/ardour/route.cc:1750
#, fuzzy
msgid ""
"MIDI mute control specification for %1 is incomplete, so it has been ignored"
@@ -1361,207 +1303,202 @@ msgstr ""
"Η Ï€ÏοδιαγÏαφή ελέγχου του MIDI gain για το %1 είναι ημιτελής, με αποτέλεσμα "
"να αγνοηθεί"
-#: libs/ardour/send.cc:98
+#: libs/ardour/send.cc:99
msgid "XML node describing a send is missing a Redirect node"
msgstr "Στον κόμβο XML όπου πεÏιγÏάφεται ένα send λείπει ένας κόμβος Redirect"
-#: libs/ardour/session.cc:99
+#: libs/ardour/session.cc:103
#, fuzzy
msgid "Could not resolve path: %1 (%2)"
msgstr "Source: δεν μποÏÏŽ να ανοίξω το peakpath \"%1\" (%2)"
-#: libs/ardour/session.cc:111
+#: libs/ardour/session.cc:115
msgid "cannot check session path %1 (%2)"
msgstr "δεν μποÏÏŽ να ελέγξω το μονοπάτι συνεδÏίας %1 (%2)"
-#: libs/ardour/session.cc:141
+#: libs/ardour/session.cc:145
msgid "cannot check statefile %1 (%2)"
msgstr "δεν μποÏÏŽ να ελέγξω το αÏχείο κατάστασεως %1 (%2)"
-#: libs/ardour/session.cc:177
+#: libs/ardour/session.cc:181
msgid "%1 is not an Ardour snapshot file"
msgstr "Το %1 δεν έιναι αÏχείο-στιγμιότυπο του Ardour"
-#: libs/ardour/session.cc:194
+#: libs/ardour/session.cc:198
msgid "cannot determine current working directory (%1)"
msgstr "δεν μποÏÏŽ να καθοÏίσω τον Ï„Ïέχοντα ενεÏγό φάκελο(directory) (%1)"
-#: libs/ardour/session.cc:211
+#: libs/ardour/session.cc:215
msgid "unknown file type for session %1"
msgstr "άγνωστος Ï„Ïπος αÏχείου για την συνεδÏία %1"
-#: libs/ardour/session.cc:316
+#: libs/ardour/session.cc:320
msgid "monitor"
msgstr "monitor"
-#: libs/ardour/session.cc:323
+#: libs/ardour/session.cc:327
msgid "master"
msgstr "master"
-#: libs/ardour/session.cc:607
+#: libs/ardour/session.cc:611
msgid "could not setup Click I/O"
msgstr "Δεν μπόÏεσα να διαμοÏφώσω το I/O του ΜετÏονόμου(click)"
-#: libs/ardour/session.cc:628
+#: libs/ardour/session.cc:632
msgid "cannot setup Click I/O"
msgstr "Δεν μποÏÏŽ να διαμοÏφώσω το I/O του ΜετÏονόμου(click)"
-#: libs/ardour/session.cc:650
+#: libs/ardour/session.cc:654
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω τον ΑκÏοατή: καμία ακÏόαση πεÏιοχών δυνατή"
-#: libs/ardour/session.cc:662
+#: libs/ardour/session.cc:666
#, fuzzy, c-format
msgid "out %<PRIu32>"
msgstr "out %lu"
-#: libs/ardour/session.cc:674
+#: libs/ardour/session.cc:678
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:688
+#: libs/ardour/session.cc:692
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:702
+#: libs/ardour/session.cc:706
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:735
+#: libs/ardour/session.cc:739
msgid "cannot setup master inputs"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω τις master εισόδους"
-#: libs/ardour/session.cc:743
+#: libs/ardour/session.cc:747
msgid "cannot setup master outputs"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω τις master εξόδους"
-#: libs/ardour/session.cc:754
+#: libs/ardour/session.cc:758
#, fuzzy
msgid "Master Out"
msgstr "master"
-#: libs/ardour/session.cc:820
+#: libs/ardour/session.cc:830
msgid "cannot setup control inputs"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω τις εισόδους ελέγχου"
-#: libs/ardour/session.cc:828
+#: libs/ardour/session.cc:838
msgid "cannot set up master outputs"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω τις εξόδους ελέγχου"
-#: libs/ardour/session.cc:1100
+#: libs/ardour/session.cc:1110
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"ΣυνεδÏία: δεν μποÏείτε να χÏησιμοποιήσετε αυτήν την τοποθεσία για auto punch "
"(αÏχή <= τέλος)"
-#: libs/ardour/session.cc:1179
+#: libs/ardour/session.cc:1189
msgid "Session: you can't use a mark for auto loop"
msgstr "ΣυνεδÏία: δεν μποÏείτε να χÏησιμοποιήσετε στίγμα για auto loop"
-#: libs/ardour/session.cc:1559
+#: libs/ardour/session.cc:1572
msgid "feedback loop setup between %1 and %2"
msgstr "διαμόÏφωση feedback loop ανάμεσα σε %1 και %2"
-#: libs/ardour/session.cc:1711 libs/ardour/session.cc:1808
+#: libs/ardour/session.cc:1724 libs/ardour/session.cc:1821
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "δεν μποÏÏŽ να διαμοÏφώσω %1 in/%2 out διάταξη για νέο κανάλι ήχου"
-#: libs/ardour/session.cc:1767
+#: libs/ardour/session.cc:1780
msgid "Session: could not create new audio track."
msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω νέο κανάλι ήχου."
-#: libs/ardour/session.cc:1857
+#: libs/ardour/session.cc:1870
msgid "Session: could not create new route."
msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω διαδÏομή."
-#: libs/ardour/session.cc:2340
+#: libs/ardour/session.cc:2354
msgid "cannot create new name for region \"%1\""
msgstr "δεν μποÏÏŽ να δημιουÏγήσω νέο όνομα για την πεÏιοχή \"%1\""
-#: libs/ardour/session.cc:2404
+#: libs/ardour/session.cc:2418
msgid "too many regions with names like %1"
msgstr "πάÏα πολλές πεÏιοχές με ονόματα σαν %1"
-#: libs/ardour/session.cc:2860
+#: libs/ardour/session.cc:2883
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "ΥπάÏχουν ήδη %1 εγγÏαφές για %2, τις οποίες θεωÏÏŽ πάÏα πολλές."
-#: libs/ardour/session.cc:3229
+#: libs/ardour/session.cc:3258
msgid "programming error: unknown type of Insert created!"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: άγνωστος Ï„Ïπος Εισόδου εδημιουÏγήθη!"
-#: libs/ardour/session.cc:3235
+#: libs/ardour/session.cc:3264
msgid "programming error: unknown type of Redirect created!"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: άγνωστος Ï„Ïπος Redirect εδημιουÏγήθη!"
-#: libs/ardour/session.cc:3258
+#: libs/ardour/session.cc:3287
msgid "programming error: unknown type of Insert deleted!"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: άγνωστος Ï„Ïπος of Insert διεγÏάφη!"
-#: libs/ardour/session.cc:3264
+#: libs/ardour/session.cc:3293
msgid "programming error: unknown type of Redirect deleted!"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: άγνωστος Ï„Ïπος of Redirect διεγÏάφη!"
-#: libs/ardour/session.cc:3605
+#: libs/ardour/session.cc:3636
msgid "too many bounced versions of playlist \"%1\""
msgstr "πάÏα πολλές bounced εκδόσεις της Playlist \"%1\""
-#: libs/ardour/session.cc:3614
+#: libs/ardour/session.cc:3649
msgid "cannot create new audio file \"%1\" for %2"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω νέο αÏχείο ήχου \"%1\" για %2"
-#: libs/ardour/session_butler.cc:81 libs/ardour/session_midi.cc:1183
-#: libs/ardour/source.cc:233
-msgid "Cannot create transport request signal pipe (%1)"
-msgstr "Δεν μποÏÏŽ να δημιουÏγήσω transport request signal pipe (%1)"
-
-#: libs/ardour/session_butler.cc:86 libs/ardour/session_butler.cc:91
+#: libs/ardour/session_butler.cc:85 libs/ardour/session_butler.cc:90
#, fuzzy
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr "UI: δεν μποÏÏŽ να θέσω O_NONBLOCK στο signal read pipe (%1)"
-#: libs/ardour/session_butler.cc:96
+#: libs/ardour/session_butler.cc:95
msgid "Session: could not create butler thread"
msgstr "ΣυνεδÏία: δεν μπόÏεσα να δημιουÏγήσω δέσμη με τον butler"
-#: libs/ardour/session_butler.cc:190
+#: libs/ardour/session_butler.cc:189
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: libs/ardour/session_butler.cc:197
+#: libs/ardour/session_butler.cc:196
#, fuzzy
msgid "Error on butler thread request pipe"
msgstr "Σφάλμα στο transport thread request pipe"
-#: libs/ardour/session_butler.cc:239
+#: libs/ardour/session_butler.cc:238
#, fuzzy
msgid "Error reading from butler request pipe"
msgstr "Σφάλμα στην ανάγνωση από transport request pipe"
-#: libs/ardour/session_butler.cc:276
+#: libs/ardour/session_butler.cc:275
msgid "Butler read ahead failure on dstream %1"
msgstr "Αποτυχία Ï€Ïοανάγνωσης Butler στο dstream %1"
-#: libs/ardour/session_butler.cc:320
+#: libs/ardour/session_butler.cc:319
msgid "Butler write-behind failure on dstream %1"
msgstr "Αποτυχία οπισθεγγÏαφής Butler στο dstream %1"
-#: libs/ardour/session_click.cc:157
+#: libs/ardour/session_click.cc:158
msgid "cannot open click soundfile %1 (%2)"
msgstr "δεν μποÏÏŽ να ανοίξω τοsoundfile μετÏονόμου%1 (%2)"
-#: libs/ardour/session_click.cc:166
+#: libs/ardour/session_click.cc:167
msgid "cannot read data from click soundfile"
msgstr "δεν μποÏÏŽ να διαβάσω δεδομένα από το soundfile μετÏονόμου"
-#: libs/ardour/session_click.cc:191
+#: libs/ardour/session_click.cc:192
msgid "cannot open click emphasis soundfile %1 (%2)"
msgstr "δεν μποÏÏŽ να ανοίξω το soundfile εμφάσεως μετÏονόμου %1 (%2)"
-#: libs/ardour/session_click.cc:199
+#: libs/ardour/session_click.cc:200
msgid "cannot read data from click emphasis soundfile"
msgstr "δεν μποÏÏŽ να διαβάσω δεδομένα από το soundfile εμφάσεως μετÏονόμου"
@@ -1666,7 +1603,7 @@ msgstr "Σφάλμα στο transport thread request pipe"
msgid "Error reading from transport request pipe"
msgstr "Σφάλμα στην ανάγνωση από transport request pipe"
-#: libs/ardour/session_process.cc:105
+#: libs/ardour/session_process.cc:104
msgid "Session: error in no roll for %1"
msgstr "ΣυνεδÏία: σφάλμα στο no roll για %1"
@@ -1684,212 +1621,223 @@ msgstr "τέλος"
msgid "start"
msgstr "ξεχωÏιστό"
-#: libs/ardour/session_state.cc:501
+#: libs/ardour/session_state.cc:502
msgid "Session: cannot create session dir \"%1\" (%2)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο συνεδÏίας \"%1\" (%2)"
-#: libs/ardour/session_state.cc:512
+#: libs/ardour/session_state.cc:513
#, fuzzy
msgid "Session: cannot create session peakfile dir \"%1\" (%2)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο συνεδÏίας \"%1\" (%2)"
-#: libs/ardour/session_state.cc:521
+#: libs/ardour/session_state.cc:522
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο ήχων συνεδÏίας \"%1\" (%2)"
-#: libs/ardour/session_state.cc:530
+#: libs/ardour/session_state.cc:531
#, fuzzy
msgid "Session: cannot create session tape dir \"%1\" (%2)"
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο συνεδÏίας \"%1\" (%2)"
-#: libs/ardour/session_state.cc:539
+#: libs/ardour/session_state.cc:540
msgid "Session: cannot create session dead sounds dir \"%1\" (%2)"
msgstr ""
"ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο 'νεκÏών' ήχων συνεδÏίας \"%1\" (%2)"
-#: libs/ardour/session_state.cc:548
+#: libs/ardour/session_state.cc:549
msgid "Session: cannot create session automation dir \"%1\" (%2)"
msgstr ""
"ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω φάκελο αυτοματισμών της συνεδÏίας \"%1"
"\" (%2)"
-#: libs/ardour/session_state.cc:579
+#: libs/ardour/session_state.cc:580
msgid "Could not open %1 for writing mix template"
msgstr "Δεν μπόÏεσα να ανοίξω %1 για γÏάψιμο του Ï€Ïοσχεδίου μίξεως"
-#: libs/ardour/session_state.cc:585
+#: libs/ardour/session_state.cc:586
msgid "Could not open mix template %1 for reading"
msgstr "Δεν μπόÏεσα να ανοίξω Ï€Ïοσχέδιο μίξεως %1 για ανάγνωση"
-#: libs/ardour/session_state.cc:592
+#: libs/ardour/session_state.cc:593
msgid "Session already exists. Not overwriting"
msgstr "Η ΣυνεδÏία ήδη υπάÏχει. ΑκÏÏωση overwriting"
-#: libs/ardour/session_state.cc:635
+#: libs/ardour/session_state.cc:636
msgid "Session: could not load diskstream via XML state"
msgstr "ΣυνεδÏία: δεν μπόÏεσα να φοÏτώσω diskstream μέσω καταστάσεως XML"
-#: libs/ardour/session_state.cc:684
+#: libs/ardour/session_state.cc:685
msgid "could not backup old state file, current state not saved."
msgstr ""
"δεν μπόÏεσα να διασώσω το παλαιό αÏχείο καταστάσεως, η Ï„Ïέχουσα κατάσταση "
"δεν αποθηκεÏτηκε."
-#: libs/ardour/session_state.cc:697
+#: libs/ardour/session_state.cc:698
msgid "state could not be saved to %1"
msgstr "η κατάσταση δεν μποÏοÏσε να σωθεί στο %1"
-#: libs/ardour/session_state.cc:704
+#: libs/ardour/session_state.cc:705
#, fuzzy
msgid "could not remove corrupt state file %1"
msgstr "Δεν μπόÏεσα να αναλÏσω το αÏχείο rdf: %1"
-#: libs/ardour/session_state.cc:708
+#: libs/ardour/session_state.cc:709
#, fuzzy
msgid "could not restore state file from backup %1"
msgstr "Σφάλμα: δεν μπόÏεσα να γÏάψω %1"
-#: libs/ardour/session_state.cc:777
+#: libs/ardour/session_state.cc:778
msgid "%1: session state information file \"%2\" doesn't exist!"
msgstr "%1: το αÏχείο πληÏοφοÏιών καταστάσεως συνεδÏίας \"%2\" δεν υπάÏχει!"
-#: libs/ardour/session_state.cc:788
+#: libs/ardour/session_state.cc:789
msgid "Could not understand ardour file %1"
msgstr "Δεν μπόÏεσα να κατανοήσω το ardour αÏχείο %1"
-#: libs/ardour/session_state.cc:1492
+#: libs/ardour/session_state.cc:1493
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: ΣυνεδÏία: λανθασμένος κόμβος XML εστάλη στην "
"set_state()"
-#: libs/ardour/session_state.cc:1538
+#: libs/ardour/session_state.cc:1539
msgid "Session: XML state has no options section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα επιλογών(options)"
-#: libs/ardour/session_state.cc:1543
+#: libs/ardour/session_state.cc:1544
msgid "Session: XML state has no sources section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα πηγών"
-#: libs/ardour/session_state.cc:1550
+#: libs/ardour/session_state.cc:1551
msgid "Session: XML state has no Regions section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα ΠεÏιοχών"
-#: libs/ardour/session_state.cc:1557
+#: libs/ardour/session_state.cc:1558
msgid "Session: XML state has no playlists section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα playlists"
-#: libs/ardour/session_state.cc:1576
+#: libs/ardour/session_state.cc:1577
msgid "Session: XML state has no diskstreams section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα diskstreams"
-#: libs/ardour/session_state.cc:1583
+#: libs/ardour/session_state.cc:1584
msgid "Session: XML state has no connections section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα συνδέσεων"
-#: libs/ardour/session_state.cc:1590
+#: libs/ardour/session_state.cc:1591
msgid "Session: XML state has no locations section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα τοποθεσιών"
-#: libs/ardour/session_state.cc:1623
+#: libs/ardour/session_state.cc:1624
msgid "Session: XML state has no edit groups section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα επεξεÏ/σίας ομάδων"
-#: libs/ardour/session_state.cc:1630
+#: libs/ardour/session_state.cc:1631
msgid "Session: XML state has no mix groups section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα μίξεως ομάδων"
-#: libs/ardour/session_state.cc:1637
+#: libs/ardour/session_state.cc:1638
msgid "Session: XML state has no Tempo Map section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα Tempo Map"
-#: libs/ardour/session_state.cc:1644
+#: libs/ardour/session_state.cc:1645
msgid "Session: XML state has no routes section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα διαδÏομών"
-#: libs/ardour/session_state.cc:1651
+#: libs/ardour/session_state.cc:1652
msgid "Session: XML state has no click section"
msgstr "ΣυνεδÏία: η XML κατάσταση δεν έχει τομέα μετÏονόμου"
-#: libs/ardour/session_state.cc:1696
+#: libs/ardour/session_state.cc:1697
msgid "Session: cannot create Route from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΔιαδÏομή από XML πεÏιγÏαφή."
-#: libs/ardour/session_state.cc:1734
+#: libs/ardour/session_state.cc:1735
msgid "Session: cannot create Region from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω ΠεÏιοχή από XML πεÏιγÏαφή."
-#: libs/ardour/session_state.cc:1762
+#: libs/ardour/session_state.cc:1764
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή είναι ημιτελής (δίχως πηγή)"
-#: libs/ardour/session_state.cc:1770 libs/ardour/session_state.cc:1784
+#: libs/ardour/session_state.cc:1772 libs/ardour/session_state.cc:1792
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή αναφέÏει άγνωστο id πηγής ="
"%1"
-#: libs/ardour/session_state.cc:1852
+#: libs/ardour/session_state.cc:1778 libs/ardour/session_state.cc:1798
+#, fuzzy
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id =%"
+"1"
+msgstr ""
+"ΣυνεδÏία: Ο XMLΚόμβος που πεÏιγÏάφει AudioΠεÏιοχή αναφέÏει άγνωστο id πηγής ="
+"%1"
+
+#: libs/ardour/session_state.cc:1868
msgid "Session: cannot create Source from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω Πηγή από XML πεÏιγÏαφή."
-#: libs/ardour/session_state.cc:1883
-msgid "Found a sound file that cannot be used by Ardour. See the progammers."
+#: libs/ardour/session_state.cc:1889
+#, fuzzy
+msgid ""
+"Found a sound file that cannot be used by Ardour. Talk to the progammers."
msgstr ""
"Î’Ïήκα ένα sound file που δεν μποÏεί να χÏησιμοποιηθεί από τον Ardour. "
"Επικοινωνήστε με τους Ï€ÏογÏαμματιστές."
-#: libs/ardour/session_state.cc:1908
+#: libs/ardour/session_state.cc:1913
msgid "Could not create mix templates directory \"%1\" (%2)"
msgstr "Δεν μπόÏεσα να δημιουÏγήσω φάκελο Ï€Ïοσχεδίων μίξεως \"%1\" (%2)"
-#: libs/ardour/session_state.cc:1922
+#: libs/ardour/session_state.cc:1927
msgid "Template \"%1\" already exists - new version not created"
msgstr "Το Ï€Ïοσχέδιο \"%1\" ήδη υπάÏχει - νέα έκδοση δεν δημιουÏγήθηκε"
-#: libs/ardour/session_state.cc:1929
+#: libs/ardour/session_state.cc:1934
msgid "mix template not saved"
msgstr "Ï€Ïοσχέδιο μίξεως δεν αποθηκεÏτηκε"
-#: libs/ardour/session_state.cc:1989
+#: libs/ardour/session_state.cc:1994
msgid "cannot create session directory \"%1\"; ignored"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω φάκελο συνεδÏίας \"%1\"; αγνοήθηκε"
-#: libs/ardour/session_state.cc:2002
+#: libs/ardour/session_state.cc:2007
msgid "cannot create sounds directory \"%1\"; ignored"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω τον φάκελο 'sounds' \"%1\"; αγνοήθηκε"
-#: libs/ardour/session_state.cc:2013
+#: libs/ardour/session_state.cc:2018
msgid "cannot create dead sounds directory \"%1\"; ignored"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω τον φάκελο 'dead sounds' \"%1\"; αγνοήθηκε"
-#: libs/ardour/session_state.cc:2024
+#: libs/ardour/session_state.cc:2029
#, fuzzy
msgid "cannot create peak file directory \"%1\"; ignored"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω φάκελο συνεδÏίας \"%1\"; αγνοήθηκε"
-#: libs/ardour/session_state.cc:2163 libs/ardour/session_state.cc:2184
+#: libs/ardour/session_state.cc:2168 libs/ardour/session_state.cc:2189
msgid "Session: cannot create Playlist from XML description."
msgstr "ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω την Playlist από την XML πεÏιγÏαφή."
-#: libs/ardour/session_state.cc:2223
+#: libs/ardour/session_state.cc:2228
msgid "Session: cannot create Named Selection from XML description."
msgstr ""
"ΣυνεδÏία: δεν μποÏÏŽ να δημιουÏγήσω την ονομασμένη επιλογή από την XML "
"πεÏιγÏαφή."
-#: libs/ardour/session_state.cc:2355
+#: libs/ardour/session_state.cc:2360
msgid "Unknown node \"%1\" found in Connections list from state file"
msgstr ""
"Άγνωστος κόμβος \"%1\" ευÏέθη στη λίστα 'Συνδέσεις' από το αÏχείο καταστάσεως"
-#: libs/ardour/session_state.cc:3195
+#: libs/ardour/session_state.cc:3197
msgid "cannot remove dead sound file %1 (%2)"
msgstr "δεν μποÏÏŽ να απαλοίψω το 'νεκÏο' ηχο-αÏχείο %1 (%2)"
-#: libs/ardour/session_time.cc:736
+#: libs/ardour/session_time.cc:375
msgid "Unknown JACK transport state %1 in sync callback"
msgstr "Άγνωστη κατάσταση του JACK transport %1 στην ανάκληση sync"
@@ -1898,28 +1846,28 @@ msgid "tempoize: error creating name for new audio file based on %1"
msgstr ""
"tempoize: σφάλμα στη δημιουÏγία ονόματος για νέο αÏχείο ήχου βασισμένο σε %1"
-#: libs/ardour/session_timefx.cc:85
+#: libs/ardour/session_timefx.cc:88
msgid "tempoize: error creating new audio file %1 (%2)"
msgstr "tempoize: σφάλμα στη δημιουÏγία νέου αÏχείου ήχου %1 (%2)"
-#: libs/ardour/session_timefx.cc:111
+#: libs/ardour/session_timefx.cc:114
msgid "tempoize: error reading data from %1"
msgstr "tempoize: σφάλμα στην ανάγνωση δεδομένων από %1"
-#: libs/ardour/session_timefx.cc:124 libs/ardour/session_timefx.cc:136
+#: libs/ardour/session_timefx.cc:127 libs/ardour/session_timefx.cc:139
msgid "error writing tempo-adjusted data to %1"
msgstr "σφάλμα στην εγγÏαφή χÏονο-Ïυθμισμένων δεδομένων στο %1"
-#: libs/ardour/session_timefx.cc:142
+#: libs/ardour/session_timefx.cc:145
msgid "timefx code failure. please notify ardour-developers."
msgstr ""
"αποτυχία κώδικα timefx. παÏακαλώ ειδοποιήστε τους Ï€ÏογÏαμματιστές του ardour."
-#: libs/ardour/session_transport.cc:116
+#: libs/ardour/session_transport.cc:117
msgid "Cannot loop - no loop range defined"
msgstr "Δεν γίνεται loop - κανένα διάστημα loop δεν Ï€ÏοσδιοÏίστηκε"
-#: libs/ardour/session_transport.cc:478
+#: libs/ardour/session_transport.cc:479
msgid ""
"Seamless looping cannot be supported while Ardour is using JACK transport.\n"
"Recommend changing the configured options"
@@ -1928,7 +1876,7 @@ msgstr ""
"transport.\n"
"ΣυνιστοÏμε την αλλαγή των διαμοÏφωμένων Ïυθμίσεων"
-#: libs/ardour/session_transport.cc:754
+#: libs/ardour/session_transport.cc:755
msgid ""
"Global varispeed cannot be supported while Ardour is connected to JACK "
"transport control"
@@ -1936,12 +1884,12 @@ msgstr ""
"Η Global varispeed δεν μποÏεί να υποστηÏιχθεί ενώ ο Ardour είναι "
"συνδεδεμένος με τον JACK transport control"
-#: libs/ardour/session_transport.cc:954
+#: libs/ardour/session_transport.cc:955
msgid "please stop the transport before adjusting slave settings"
msgstr ""
"παÏακαλώ σταματήστε το transport Ï€Ïιν την ÏÏθμιση των επιλογων εξαÏτήσεως"
-#: libs/ardour/session_transport.cc:990
+#: libs/ardour/session_transport.cc:991
msgid "No MTC port defined: MTC slaving is impossible."
msgstr ""
"Καμμία θÏÏα MTC δεν Ï€ÏοσδιοÏίστηκε: η εξάÏτηση του MTC (slaving) είναι "
@@ -2031,11 +1979,24 @@ msgstr "Little-endian (Intel)"
msgid "Big-endian (Mac)"
msgstr "Big-endian (Mac)"
-#: libs/ardour/sndfilesource.cc:75
-msgid "SndFileSource: cannot open file \"%1\" (%2)"
+#: libs/ardour/sndfilesource.cc:146
+msgid "FileSource: cannot get host information for BWF header (%1)"
+msgstr ""
+"FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες οικοδεσπότη(host) για επικεφαλίδα "
+"BWF (%1)"
+
+#: libs/ardour/sndfilesource.cc:168
+msgid ""
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:224
+#, fuzzy
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: δεν μποÏÏŽ να ανοίξω το αÏχείο \"%1\" (%2)"
-#: libs/ardour/sndfilesource.cc:80
+#: libs/ardour/sndfilesource.cc:230
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -2043,74 +2004,32 @@ msgstr ""
"SndFileSource: το αÏχείο πεÏιέχει μόνο %1 κανάλια; %2 δεν έχει αξία σαν "
"κανάλι number"
-#: libs/ardour/sndfilesource.cc:122
+#: libs/ardour/sndfilesource.cc:307
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: δεν μποÏοÏσα να αναζητήσω στο frame %1 μέσα στο %2 (%3)"
-#: libs/ardour/source.cc:161
-msgid "poll on peak request pipe failed (%1)"
-msgstr ""
-
-#: libs/ardour/source.cc:168
-#, fuzzy
-msgid "Error on peak thread request pipe"
-msgstr "Σφάλμα στο transport thread request pipe"
-
-#: libs/ardour/source.cc:201
+#: libs/ardour/sndfilesource.cc:358
#, fuzzy
-msgid "Error reading from peak request pipe"
-msgstr "Σφάλμα στην ανάγνωση από transport request pipe"
-
-#: libs/ardour/source.cc:238 libs/ardour/source.cc:243
-#, fuzzy
-msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
-msgstr "UI: δεν μποÏÏŽ να θέσω O_NONBLOCK στο signal read pipe (%1)"
-
-#: libs/ardour/source.cc:248
-msgid "Source: could not create peak thread"
-msgstr "Source: δεν μπόÏεσα να δημιουÏγήσω peak δέσμη"
-
-#: libs/ardour/source.cc:326
-#, fuzzy
-msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
-msgstr "δεν μποÏÏŽ να απαλοίψω το peakfile %1 για %2 (%3)"
-
-#: libs/ardour/source.cc:357
-msgid "Source: cannot stat peakfile \"%1\""
-msgstr "Source: δεν μποÏÏŽ να μετÏήσω το αυτοστιγμεί peakfile \"%1\""
-
-#: libs/ardour/source.cc:444
-msgid "cannot read sample data for unscaled peak computation"
-msgstr ""
-"δεν μποÏÏŽ να διαβάσω δεδομένα δείγματος για υπολογισμό μη-κλιμακώτου peak"
-
-#: libs/ardour/source.cc:465 libs/ardour/source.cc:536
-#: libs/ardour/source.cc:780 libs/ardour/source.cc:881
-msgid "Source: cannot open peakpath \"%1\" (%2)"
-msgstr "Source: δεν μποÏÏŽ να ανοίξω το peakpath \"%1\" (%2)"
-
-#: libs/ardour/source.cc:637
-msgid "Source[%1]: peak read - cannot read %2 samples at offset %3"
-msgstr ""
-"Source[%1]: ανάγνωση peak - δεν μποÏÏŽ να διαβάσω %2 δείγματα στην αÏχή"
-"(offset) %3"
+msgid "programming error: %1 %2"
+msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: %1"
-#: libs/ardour/source.cc:789
-msgid "%1: could not write read raw data for peak computation (%2)"
+#: libs/ardour/sndfilesource.cc:458
+msgid ""
+"cannot set broadcast info for audio file %1; Dropping broadcast info for "
+"this file"
msgstr ""
-"%1: δεν μποÏεσα να γÏάψω ανεγνωσμένα raw δεδομένα για τον υπολογισμό του "
-"peak (%2)"
-#: libs/ardour/source.cc:814
-msgid "%1: could not write peak file data (%2)"
-msgstr "%1: δεν μπόÏεσα να γÏάψω δεδομένα του αÏχείου peak (%2)"
+#: libs/ardour/sndfilesource.cc:500
+#, fuzzy
+msgid "%1: cannot seek to %2"
+msgstr "%1: δεν μποÏÏŽ να αναζητήσω στο %2 για εξαγωγή"
-#: libs/ardour/state_manager.cc:46
+#: libs/ardour/state_manager.cc:47
#, fuzzy
msgid "cleared history"
msgstr "εκκαθαÏίσθη"
-#: libs/ardour/state_manager.cc:59
+#: libs/ardour/state_manager.cc:60
#, fuzzy
msgid ""
"programming error: illegal state ID (%1) passed to StateManager::set_state() "
@@ -2119,135 +2038,135 @@ msgstr ""
"σφάλμα Ï€ÏογÏαμματισμοÏ: αθέμιτη κατάσταση ID (%1) πέÏασε στον StateManager::"
"set_state() (range = 0-%3)"
-#: libs/ardour/stateful.cc:100
+#: libs/ardour/stateful.cc:102
msgid "Error: could not write %1"
msgstr "Σφάλμα: δεν μπόÏεσα να γÏάψω %1"
-#: libs/ardour/stateful.cc:114
+#: libs/ardour/stateful.cc:116
msgid "Could not understand XML file %1"
msgstr "Δεν μπόÏεσα να κατανοήσω το XML αÏχείο %1"
-#: libs/ardour/tempo.cc:66
+#: libs/ardour/tempo.cc:67
msgid "TempoSection XML node has no \"start\" property"
msgstr "Κόμβος του TempoSection XML δεν έχει ιδιότητα \"έναÏξη\""
-#: libs/ardour/tempo.cc:74
+#: libs/ardour/tempo.cc:75
msgid "TempoSection XML node has an illegal \"start\" value"
msgstr "Κόμβος του TempoSection XML έχει αθέμιτη αξία \"έναÏξη\""
-#: libs/ardour/tempo.cc:81
+#: libs/ardour/tempo.cc:82
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr "Κόμβος του TempoSection XML δεν έχει \"κτÏπων-ανά-λεπτό\" ιδιότητα"
-#: libs/ardour/tempo.cc:86
+#: libs/ardour/tempo.cc:87
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr "Κόμβος του TempoSection XML έχει αθέμιτη \"κτÏπων_ανά_λεπτό\" αξία"
-#: libs/ardour/tempo.cc:91
+#: libs/ardour/tempo.cc:92
msgid "TempoSection XML node has no \"movable\" property"
msgstr "Κόμβος του TempoSection XML δεν έχει \"κινητή\" ιδιότητα"
-#: libs/ardour/tempo.cc:130
+#: libs/ardour/tempo.cc:131
msgid "MeterSection XML node has no \"start\" property"
msgstr "Κόμβος του MeterSection XML δεν έχει \"έναÏξη\" ιδιότητα"
-#: libs/ardour/tempo.cc:138
+#: libs/ardour/tempo.cc:139
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr "Κόμβος του MeterSection XML έχει αθέμιτη \"έναÏξη\" αξία"
-#: libs/ardour/tempo.cc:145
+#: libs/ardour/tempo.cc:146
msgid "MeterSection XML node has no \"beats-per-bar\" property"
msgstr "Κόμβος του MeterSection XML δεν έχει \"κτÏπων-ανά-μπάÏα\" ιδιότητα"
-#: libs/ardour/tempo.cc:150
+#: libs/ardour/tempo.cc:151
msgid "MeterSection XML node has an illegal \"beats-per-bar\" value"
msgstr "Κόμβος του MeterSection XML έχει αθέμιτη \"κτÏπων-ανά-μπάÏα\" αξία"
-#: libs/ardour/tempo.cc:155
+#: libs/ardour/tempo.cc:156
msgid "MeterSection XML node has no \"note-type\" property"
msgstr "Κόμβος του MeterSection XML δεν έχει \"Ï„Ïπος-νότας\" ιδιότητα"
-#: libs/ardour/tempo.cc:160
+#: libs/ardour/tempo.cc:161
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr "Κόμβος του MeterSection XML έχει αθέμιτη \"Ï„Ïπος-νότας\" αξία"
-#: libs/ardour/tempo.cc:165
+#: libs/ardour/tempo.cc:166
msgid "MeterSection XML node has no \"movable\" property"
msgstr "Κόμβος του MeterSection XML δεν έχει \"κινητή\" ιδιότητα"
-#: libs/ardour/tempo.cc:258
+#: libs/ardour/tempo.cc:259
msgid "move metric"
msgstr "μετακίνηση μετÏικοÏ"
-#: libs/ardour/tempo.cc:329
+#: libs/ardour/tempo.cc:330
msgid "metric removed"
msgstr "μετÏικό απεσÏÏθη"
-#: libs/ardour/tempo.cc:372
+#: libs/ardour/tempo.cc:373
msgid "add tempo"
msgstr "Ï€Ïόσθεση ÏυθμοÏ"
-#: libs/ardour/tempo.cc:401
+#: libs/ardour/tempo.cc:402
msgid "replace tempo"
msgstr "αντικατάσταση ÏυθμοÏ"
-#: libs/ardour/tempo.cc:434
+#: libs/ardour/tempo.cc:435
msgid "add meter"
msgstr "Ï€Ïόσθεση μετÏητή"
-#: libs/ardour/tempo.cc:462
+#: libs/ardour/tempo.cc:463
msgid "replaced meter"
msgstr "αντικατεστημένος μετÏητής"
-#: libs/ardour/tempo.cc:482 libs/ardour/tempo.cc:498
+#: libs/ardour/tempo.cc:483 libs/ardour/tempo.cc:499
msgid "programming error: no tempo section in tempo map!"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: κανένας τομέας ÏÏ…Î¸Î¼Î¿Ï ÏƒÏ„Î¿ χάÏτη Ïυθμών!"
-#: libs/ardour/tempo.cc:537
+#: libs/ardour/tempo.cc:538
msgid "programming error: unhandled MetricSection type"
msgstr "σφάλμα Ï€ÏογÏαμματισμοÏ: αχείÏιστος Ï„Ïπος MetricSection"
-#: libs/ardour/tempo.cc:1225 libs/ardour/tempo.cc:1237
+#: libs/ardour/tempo.cc:1226 libs/ardour/tempo.cc:1238
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
"ΧάÏτης Ïυθμών: δεν μπόÏεσα να θέσω νέα κατάσταση, επιστÏοφή Ï€ÏοηγοÏμενης."
-#: libs/ardour/tempo.cc:1261
+#: libs/ardour/tempo.cc:1262
msgid "load XML data"
msgstr ""
-#: libs/ardour/utils.cc:242
+#: libs/ardour/utils.cc:246
#, fuzzy
msgid "illegal or badly-formed string used for path (%1)"
msgstr "παÏάνομη ή κακοσχηματισμένη γÏαμμή για το μονοπάτι RAID"
-#: libs/ardour/utils.cc:247
+#: libs/ardour/utils.cc:251
#, fuzzy
msgid "path (%1) is ambiguous"
msgstr "Το μονοπάτι αναζήτησης του RAID είναι αμφίβολο"
-#: libs/ardour/vst_plugin.cc:186
+#: libs/ardour/vst_plugin.cc:187
msgid "cannot create VST chunk directory: %1"
msgstr "δεν μποÏÏŽ να δημιουÏγήσω φάκελο κομματιών VST: %1"
-#: libs/ardour/vst_plugin.cc:194
+#: libs/ardour/vst_plugin.cc:195
msgid "cannot check VST chunk directory: %1"
msgstr "δεν μποÏÏŽ να ελέγξω το φάκελο κομματιών VST: %1"
-#: libs/ardour/vst_plugin.cc:201
+#: libs/ardour/vst_plugin.cc:202
msgid "%1 exists but is not a directory"
msgstr "%1 υπάÏχει αλλά δεν είναι φάκελος"
-#: libs/ardour/vst_plugin.cc:239
+#: libs/ardour/vst_plugin.cc:240
msgid "Bad node sent to VSTPlugin::set_state"
msgstr "Κακός κόμβος εστάλη στο VSTPlugin::set_state"
-#: libs/ardour/vst_plugin.cc:342 libs/ardour/vst_plugin.cc:353
+#: libs/ardour/vst_plugin.cc:343 libs/ardour/vst_plugin.cc:354
msgid "no support for presets using chunks at this time"
msgstr ""
"καμμία υποστήÏιξη αυτή τη στιγμή για Ïυθμίσεις που χÏησιμοποιοÏν κομμάτια"
-#: libs/ardour/coreaudio_source.cc:93
+#: libs/ardour/coreaudio_source.cc:99
#, fuzzy
msgid ""
"CoreAudioSource: file only contains %1 channels; %2 is invalid as a channel "
@@ -2256,11 +2175,121 @@ msgstr ""
"SndFileSource: το αÏχείο πεÏιέχει μόνο %1 κανάλια; %2 δεν έχει αξία σαν "
"κανάλι number"
-#: libs/ardour/coreaudio_source.cc:157
+#: libs/ardour/coreaudio_source.cc:164
#, fuzzy
msgid "CoreAudioSource: could not seek to frame %1 within %2 (%3)"
msgstr "SndFileSource: δεν μποÏοÏσα να αναζητήσω στο frame %1 μέσα στο %2 (%3)"
+#~ msgid "FileSource: \"%1\" not found when searching %2 using %3"
+#~ msgstr "FileSource: \"%1\" δεν ευÏέθη όταν αναζητείτο %2 χÏησιμοποιώντας %3"
+
+#~ msgid "FileSource: could not open \"%1\": (%2)"
+#~ msgstr "FileSource: δεν μπόÏεσα να ανοίξω \"%1\": (%2)"
+
+#~ msgid "FileSource: cannot write header in %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να γÏάψω επικεφαλίδα στο %1"
+
+#~ msgid "FileSource: cannot locate chunks in %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να ανιχνεÏσω κομμάτια στο %1"
+
+#~ msgid "FileSource: cannot read header in %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω επικεφαλίδα στο %1"
+
+#~ msgid "FileSource: cannot check header in %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να ελέγξω επικεφαλίδα στο %1"
+
+#, fuzzy
+#~ msgid "FileSource: cannot initialize peakfile for %1 as %2"
+#~ msgstr "FileSource: δεν μποÏÏŽ να εκκινήσω το peakfile για %1"
+
+#~ msgid "FileSource: cannot seek to end of file"
+#~ msgstr "FileSource: δεν μποÏÏŽ να ανιχνεÏσω το τέλος του αÏχείου"
+
+#~ msgid "FileSource: cannot read RIFF/WAVE chunk from file"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω κομμάτι RIFF/WAVE από το αÏχείο"
+
+#~ msgid "FileSource %1: not a RIFF/WAVE file"
+#~ msgstr "FileSource %1: δεν είναι RIFF/WAVE αÏχείο"
+
+#~ msgid "FileSource: can't read a chunk"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω κομμάτι"
+
+#~ msgid "FileSource: cannot get user information for BWF header (%1)"
+#~ msgstr ""
+#~ "FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες χÏήστη για επικεφαλίδα BWF (%1)"
+
+#~ msgid "FileSource[%1]: cannot update data size: %2"
+#~ msgstr "FileSource[%1]: δεν μποÏÏŽ να ανανεώσω το μέγεθος δεδομένων: %2"
+
+#~ msgid "FileSource: can't find RIFF chunk info"
+#~ msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για RIFF κομμάτι"
+
+#, fuzzy
+#~ msgid "FileSource: can't find RIFX chunk info"
+#~ msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για RIFF κομμάτι"
+
+#~ msgid "FileSource: can't read RIFF chunk"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω RIFF κομμάτι"
+
+#~ msgid "FileSource: can't find format chunk info"
+#~ msgstr "FileSource: δεν ευÏέθησαν πληÏοφοÏίες για το κομμάτι φοÏμαÏίσματος"
+
+#~ msgid "FileSource: can't read format chunk"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω το κομμάτι φοÏμαÏίσματος"
+
+#~ msgid "FileSource: can't find data chunk info"
+#~ msgstr "FileSource: δεν μποÏÏŽ να βÏÏŽ πληÏοφοÏίες για το κομμάτι δεδομένων"
+
+#~ msgid "FileSource: can't read data chunk"
+#~ msgstr "FileSource: δεν μποÏÏŽ να διαβάσω το κομμάτι δεδομένων"
+
+#~ msgid ""
+#~ "FileSource: cannot read Broadcast Wave data from existing audio file \"%1"
+#~ "\" (%2)"
+#~ msgstr ""
+#~ "FileSource: δεν μποÏÏŽ να διαβάσω δεδομένα Broadcast Wave από το υπάÏχον "
+#~ "αÏχείο \"%1\" (%2)"
+
+#~ msgid ""
+#~ "FileSource: cannot read Broadcast Wave coding history from audio file \"%1"
+#~ "\" (%2)"
+#~ msgstr ""
+#~ "FileSource: δεν μποÏÏŽ να διαβάσω το ιστοÏικό του κώδικα Broadcast Wave "
+#~ "από το αÏχείο \"%1\" (%2)"
+
+#, fuzzy
+#~ msgid ""
+#~ "FileSource \"%1\" does not use valid sample format.\n"
+#~ "This is probably a programming error."
+#~ msgstr ""
+#~ "FileSource \"%1\" δεν χÏησιμοποιεί format μεταβλητής υποδιαστολής.\n"
+#~ "Αυτό πιθανόν να είναι σφάλμα Ï€ÏογÏαμματισμοÏ."
+
+#~ msgid "FileSource \"%1\" has no \"data\" chunk"
+#~ msgstr "FileSource \"%1\" δεν έχει \"data\" κομμάτι"
+
+#~ msgid ""
+#~ "%1: data length in header (%2) differs from implicit size in file (%3)"
+#~ msgstr ""
+#~ "%1: το μέγεθος δεδομένων της επικεφαλίδας (%2) διαφέÏει από το δεδηλωμένο "
+#~ "μέγεθος στο αÏχείο (%3)"
+
+#~ msgid "\"%1\" has a sample rate of %2 instead of %3 as used by this session"
+#~ msgstr ""
+#~ "\"%1\" έχει Ïυθμό δειγματοληψίας %2 αντί του %3 όπως στην παÏοÏσα συνεδÏία"
+
+#~ msgid "FileSource: cannot write WAVE chunk: %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να γÏάψω WAVE κομμάτι: %1"
+
+#~ msgid "FileSource: cannot write format chunk: %1"
+#~ msgstr "FileSource: δεν μποÏÏŽ να γÏάψω format κομμάτι: %1"
+
+#~ msgid "FileSource: cannot data chunk: %1"
+#~ msgstr "FileSource: cδεν μποÏÏŽ να γÏάψω κομμάτι δεδομένων: %1"
+
+#~ msgid "FileSource: \"%1\" bad write (%2)"
+#~ msgstr "FileSource: \"%1\" κακή εγγÏαφή (%2)"
+
#, fuzzy
#~ msgid "cannot create feedback request pipe (%1)"
#~ msgstr "Δεν μποÏÏŽ να δημιουÏγήσω transport request signal pipe (%1)"
diff --git a/libs/ardour/po/it_IT.po b/libs/ardour/po/it_IT.po
index 7f2412e5d2..55368c2d5a 100644
--- a/libs/ardour/po/it_IT.po
+++ b/libs/ardour/po/it_IT.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.664.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-04-25 17:46-0400\n"
+"POT-Creation-Date: 2006-06-21 15:09-0400\n"
"PO-Revision-Date: 2003-05-21 12:50+0500\n"
"Last-Translator: Filippo Pappalardo <filippo@email.it>\n"
"Language-Team: Italian\n"
@@ -15,308 +15,494 @@ msgstr ""
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
-#: libs/ardour/audio_library.cc:91
-msgid "channels"
+#: libs/ardour/audio_diskstream.cc:337
+#, fuzzy
+msgid "AudioDiskstream: Session doesn't know about a Playlist called \"%1\""
+msgstr "DiskStream: La sessione non riconosce la Playlist chiamata \"%1\""
+
+#: libs/ardour/audio_diskstream.cc:342
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
msgstr ""
+#: libs/ardour/audio_diskstream.cc:433
+#, fuzzy
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr "DiskStream %1: non esiste alcuna playlist di cui fare una copia!"
+
+#: libs/ardour/audio_diskstream.cc:1114 libs/ardour/audio_diskstream.cc:1125
+#, fuzzy
+msgid ""
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr "DiskStream %1: impossibile leggere %2 dalla playlista al frame %3"
+
+#: libs/ardour/audio_diskstream.cc:1254
+#, fuzzy
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr "DiskStream %1: impossibile leggere %2 dalla playlista al frame %3"
+
+#: libs/ardour/audio_diskstream.cc:1621 libs/ardour/audio_diskstream.cc:1638
+#, fuzzy
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr "DiskStream %1: impossibile scrivere sul disco"
+
+#: libs/ardour/audio_diskstream.cc:1698
+#, fuzzy
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr "DiskStream \"%1\": impossibile scaricare i dati acquisiti sul disco!"
+
+#: libs/ardour/audio_diskstream.cc:1795
+msgid "%1: could not create region for complete audio file"
+msgstr "%1: impossibile creare una regione per il file audio completo"
+
+#: libs/ardour/audio_diskstream.cc:1818
+#, fuzzy
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr "DiskStream: impossibile creare una regione per l'audio registrato!"
+
+#: libs/ardour/audio_diskstream.cc:1873
+#, fuzzy
+msgid "programmer error: %1"
+msgstr "errore di programmazione: %1"
+
+#: libs/ardour/audio_diskstream.cc:2145
+#, fuzzy
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr "DiskStream: canale fuori margine"
+
+#: libs/ardour/audio_diskstream.cc:2170
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente"
+
+#: libs/ardour/audio_diskstream.cc:2403
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr "La Location \"%1\" non valida per il loop (inizio >= fine)"
+
+#: libs/ardour/audio_diskstream.cc:2484
+#, fuzzy
+msgid "%1: cannot restore pending capture source file %2"
+msgstr "Import: impossibile aprire il file audio di input \"%1\""
+
+#: libs/ardour/audio_diskstream.cc:2506
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2522
+#, fuzzy
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr "Playlist: impossibile creare la Regione dal file di stato"
+
+#: libs/ardour/audio_diskstream.cc:2534
+#, fuzzy
+msgid "%1: cannot create region from pending capture sources"
+msgstr "Playlist: impossibile creare la Regione dal file di stato"
+
#: libs/ardour/audio_library.cc:92
+msgid "channels"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:93
#, fuzzy
msgid "samplerate"
msgstr "separa"
-#: libs/ardour/audio_library.cc:93
+#: libs/ardour/audio_library.cc:94
msgid "resolution"
msgstr ""
-#: libs/ardour/audio_library.cc:94
+#: libs/ardour/audio_library.cc:95
msgid "format"
msgstr ""
-#: libs/ardour/audio_library.cc:101
+#: libs/ardour/audio_library.cc:102
msgid "Could not open %1. Audio Library not saved"
msgstr "Impossibile accedere a %1. Libreria Audio non salvata"
-#: libs/ardour/audio_playlist.cc:52 libs/ardour/audio_playlist.cc:62
-#: libs/ardour/audio_playlist.cc:73 libs/ardour/audio_playlist.cc:120
+#: libs/ardour/audio_playlist.cc:53 libs/ardour/audio_playlist.cc:63
+#: libs/ardour/audio_playlist.cc:74 libs/ardour/audio_playlist.cc:121
#: libs/ardour/insert.cc:76 libs/ardour/insert.cc:95 libs/ardour/insert.cc:120
-#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:38
-#: libs/ardour/send.cc:52 libs/ardour/send.cc:61
-#: libs/ardour/session_state.cc:1620 libs/ardour/session_state.cc:1666
+#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:39
+#: libs/ardour/send.cc:53 libs/ardour/send.cc:62
+#: libs/ardour/session_state.cc:1621 libs/ardour/session_state.cc:1667
msgid "initial state"
msgstr "stato iniziale"
-#: libs/ardour/audio_playlist.cc:274 libs/ardour/audio_playlist.cc:768
+#: libs/ardour/audio_playlist.cc:275 libs/ardour/audio_playlist.cc:769
msgid ""
"programming error: non-audio Region passed to remove_overlap in audio "
"playlist"
msgstr ""
-#: libs/ardour/audio_playlist.cc:401
+#: libs/ardour/audio_playlist.cc:402
msgid ""
"programming error: non-audio Region tested for overlap in audio playlist"
msgstr ""
-#: libs/ardour/audio_playlist.cc:877
+#: libs/ardour/audio_playlist.cc:878
msgid "xfade change"
msgstr "cambio dello smorzamento incrociato"
-#: libs/ardour/audio_playlist.cc:926
+#: libs/ardour/audio_playlist.cc:933
msgid "region modified"
msgstr "regione modificata"
-#: libs/ardour/audio_track.cc:121 libs/ardour/io.cc:1703
-#: libs/ardour/io.cc:1813
+#: libs/ardour/audio_track.cc:133 libs/ardour/io.cc:1716
+#: libs/ardour/io.cc:1826
msgid "Unknown connection \"%1\" listed for input of %2"
msgstr "Connessione sconosciuta \"%1\" come input di %2"
-#: libs/ardour/audio_track.cc:123 libs/ardour/io.cc:1705
-#: libs/ardour/io.cc:1815
+#: libs/ardour/audio_track.cc:135 libs/ardour/io.cc:1718
+#: libs/ardour/io.cc:1828
msgid "in 1"
msgstr ""
-#: libs/ardour/audio_track.cc:124 libs/ardour/io.cc:1706
-#: libs/ardour/io.cc:1816
+#: libs/ardour/audio_track.cc:136 libs/ardour/io.cc:1719
+#: libs/ardour/io.cc:1829
msgid "No input connections available as a replacement"
msgstr ""
-#: libs/ardour/audio_track.cc:128 libs/ardour/io.cc:1710
-#: libs/ardour/io.cc:1820
+#: libs/ardour/audio_track.cc:140 libs/ardour/io.cc:1723
+#: libs/ardour/io.cc:1833
msgid "Connection %1 was not available - \"in 1\" used instead"
msgstr ""
-#: libs/ardour/audio_track.cc:137 libs/ardour/io.cc:1829
+#: libs/ardour/audio_track.cc:149 libs/ardour/io.cc:1842
msgid "improper input channel list in XML node (%1)"
msgstr ""
-#: libs/ardour/audio_track.cc:182 libs/ardour/audio_track.cc:195
+#: libs/ardour/audio_track.cc:194 libs/ardour/audio_track.cc:207
msgid "AudioTrack: diskstream \"%1\" not known by session"
msgstr "AudioTrack: diskstream \"%1\" non riconosciuto dalla sessione"
-#: libs/ardour/audio_track.cc:293
+#: libs/ardour/audio_track.cc:305
msgid ""
"MIDI rec_enable control specification for %1 is incomplete, so it has been "
"ignored"
msgstr ""
-#: libs/ardour/audio_track.cc:305
+#: libs/ardour/audio_track.cc:317
msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
-#: libs/ardour/audioengine.cc:147
+#: libs/ardour/audioengine.cc:150
msgid "cannot activate JACK client"
msgstr "impossibile attivare il client JACK"
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:401
msgid "register audio input port called before engine was started"
msgstr ""
"la richiesta di registrazione di una porta di entrata avvenuta prima "
"dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:463
+#: libs/ardour/audioengine.cc:432
msgid "register audio output port called before engine was started"
msgstr ""
"la richiesta di registrazione di una porta di uscita avvenuta prima "
"dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:524
+#: libs/ardour/audioengine.cc:493
msgid "connect called before engine was started"
msgstr "richiesta di connessione avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:540
+#: libs/ardour/audioengine.cc:509
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:553 libs/ardour/audioengine.cc:582
+#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
msgid "disconnect called before engine was started"
msgstr ""
"richiesta di disconnessione avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:640
+#: libs/ardour/audioengine.cc:609
msgid "get_port_by_name() called before engine was started"
msgstr ""
"richiesta get_port_by_name() avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:673
+#: libs/ardour/audioengine.cc:642
msgid "get_ports called before engine was started"
msgstr "richiesta di get_ports avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:748
+#: libs/ardour/audioengine.cc:717
msgid "get_nth_physical called before engine was started"
msgstr ""
"richiesta di get_nth_physical avvenuta prima dell'avvio dell'applicazione"
-#: libs/ardour/audioengine.cc:776
+#: libs/ardour/audioengine.cc:745
#, fuzzy
msgid "get_port_total_latency() called with no JACK client connection"
msgstr ""
"richiesta di get_port_total_latency() avvenuta prima dell'avvio "
"dell'applicazione"
-#: libs/ardour/audioengine.cc:782
+#: libs/ardour/audioengine.cc:751
msgid "get_port_total_latency() called before engine was started"
msgstr ""
"richiesta di get_port_total_latency() avvenuta prima dell'avvio "
"dell'applicazione"
-#: libs/ardour/audioengine.cc:906
+#: libs/ardour/audioengine.cc:875
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:909
+#: libs/ardour/audioengine.cc:878
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:914
+#: libs/ardour/audioengine.cc:883
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:948
+#: libs/ardour/audioengine.cc:917
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:973
+#: libs/ardour/audioengine.cc:942
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:989
+#: libs/ardour/audioengine.cc:958
#, fuzzy
msgid "could not reregister %1"
msgstr "Esportazione: impossibile scrivere dati sul file di output (%1)"
-#: libs/ardour/audioengine.cc:1046
+#: libs/ardour/audioengine.cc:1015
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
-#: libs/ardour/audiofilter.cc:44
+#: libs/ardour/audiofilesource.cc:445 libs/ardour/session_state.cc:3095
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr ""
+"ci sono gia' 1000 file con nomi come %1; tracciamento di versione interrotto"
+
+#: libs/ardour/audiofilesource.cc:459 libs/ardour/session_state.cc:3109
+msgid "cannot rename audio file source from %1 to %2 (%3)"
+msgstr "impossibile rinominare file audio sorgente da %1 a %2 (%3)"
+
+#: libs/ardour/audiofilesource.cc:466 libs/ardour/session_state.cc:3124
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
+
+#: libs/ardour/audiofilesource.cc:510
+msgid "FileSource: search path not set"
+msgstr "FileSource: percorso di ricerca non specificato"
+
+#: libs/ardour/audiofilesource.cc:534
+msgid ""
+"FileSource: \"%1\" is ambigous when searching %2\n"
+"\t"
+msgstr ""
+"FileSource: \"%1\" è risultato ambiguo nel cercare %2\n"
+"\t"
+
+#: libs/ardour/audiofilesource.cc:540
+#, fuzzy
+msgid "Filesource: cannot find required file (%1): while searching %2"
+msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:563
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:568
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr "FileSource: impossibile controllare il file esistente (%1): %2"
+
+#: libs/ardour/audiofilesource.cc:640 libs/ardour/insert.cc:525
+#: libs/ardour/sndfilesource.cc:112
+msgid "programming error: %1"
+msgstr "errore di programmazione: %1"
+
+#: libs/ardour/audiofilesource.cc:645
+#, fuzzy
+msgid "cannot rename audio file for %1 to %2"
+msgstr "impossibile rinominare file audio sorgente da %1 a %2 (%3)"
+
+#: libs/ardour/audiofilter.cc:45
msgid "audiofilter: error creating name for new audio file based on %1"
msgstr ""
"audiofilter: errore nel creare il nome per il nuovo file audio basato su %1"
-#: libs/ardour/audiofilter.cc:54
+#: libs/ardour/audiofilter.cc:58
msgid "audiofilter: error creating new audio file %1 (%2)"
msgstr "audiofilter: errore nel creare un nuovo file audio %1 (%2)"
-#: libs/ardour/audioregion.cc:855 libs/ardour/audioregion.cc:917
+#: libs/ardour/audioregion.cc:857 libs/ardour/audioregion.cc:919
#, fuzzy
msgid "fade in change"
msgstr "cambio dello smorzamento incrociato"
-#: libs/ardour/audioregion.cc:1341
+#: libs/ardour/audioregion.cc:1349
#, c-format
msgid "normalized to %.2fdB"
msgstr "normalizzato a %.2fdB"
-#: libs/ardour/audioregion.cc:1359
+#: libs/ardour/audioregion.cc:1367
#, fuzzy
msgid "envelope change"
msgstr "livello cambiato"
-#: libs/ardour/automation_event.cc:64 libs/ardour/location.cc:344
-#: libs/ardour/tempo.cc:225
+#: libs/ardour/audiosource.cc:143
+msgid "poll on peak request pipe failed (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:150
+msgid "Error on peak thread request pipe"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:183
+#, fuzzy
+msgid "Error reading from peak request pipe"
+msgstr "Errore nel leggere dalla porta MIDI %1"
+
+#: libs/ardour/audiosource.cc:215 libs/ardour/session_butler.cc:80
+#: libs/ardour/session_midi.cc:1183
+msgid "Cannot create transport request signal pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:220 libs/ardour/audiosource.cc:225
+msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:230
+#, fuzzy
+msgid "AudioSource: could not create peak thread"
+msgstr "Sessione: impossibile creare un nuovo route"
+
+#: libs/ardour/audiosource.cc:308
+#, fuzzy
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
+
+#: libs/ardour/audiosource.cc:350
+#, fuzzy
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr "FileSource: impossibile avviare il peakfile per %1"
+
+#: libs/ardour/audiosource.cc:451
+msgid "cannot read sample data for unscaled peak computation"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:472 libs/ardour/audiosource.cc:543
+#: libs/ardour/audiosource.cc:787 libs/ardour/audiosource.cc:878
+#, fuzzy
+msgid "AudioSource: cannot open peakpath \"%1\" (%2)"
+msgstr "SndFileSource: impossibile accedere al file \"%1\" (%2)"
+
+#: libs/ardour/audiosource.cc:644
+#, fuzzy
+msgid "AudioSource[%1]: peak read - cannot read %2 samples at offset %3"
+msgstr "DiskStream %1: impossibile leggere %2 dalla playlista al frame %3"
+
+#: libs/ardour/audiosource.cc:798
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:823
+msgid "%1: could not write peak file data (%2)"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:65 libs/ardour/location.cc:345
+#: libs/ardour/tempo.cc:226
msgid "initial"
msgstr "iniziale"
-#: libs/ardour/automation_event.cc:231
+#: libs/ardour/automation_event.cc:232
msgid "cleared"
msgstr "pulito"
-#: libs/ardour/automation_event.cc:403
+#: libs/ardour/automation_event.cc:404
msgid "added event"
msgstr "aggiunto evento"
-#: libs/ardour/automation_event.cc:420
+#: libs/ardour/automation_event.cc:421
msgid "removed event"
msgstr "rimosso evento"
-#: libs/ardour/automation_event.cc:435
+#: libs/ardour/automation_event.cc:436
msgid "removed multiple events"
msgstr "rimossi molteplici eventi"
-#: libs/ardour/automation_event.cc:461
+#: libs/ardour/automation_event.cc:467 libs/ardour/automation_event.cc:498
msgid "removed range"
msgstr "rimosso intervallo"
-#: libs/ardour/automation_event.cc:491
+#: libs/ardour/automation_event.cc:528
msgid "event range adjusted"
msgstr ""
-#: libs/ardour/automation_event.cc:513
+#: libs/ardour/automation_event.cc:550
msgid "event adjusted"
msgstr ""
-#: libs/ardour/automation_event.cc:628 libs/ardour/automation_event.cc:733
-#: libs/ardour/panner.cc:1040
+#: libs/ardour/automation_event.cc:665 libs/ardour/automation_event.cc:770
+#: libs/ardour/panner.cc:1041
msgid "programming error:"
msgstr "errore di programmazione:"
-#: libs/ardour/automation_event.cc:1042
+#: libs/ardour/automation_event.cc:1079
msgid "cut/copy/clear"
msgstr "taglia/copia/pulisci"
-#: libs/ardour/automation_event.cc:1075
+#: libs/ardour/automation_event.cc:1112
msgid "copy"
msgstr "copia"
-#: libs/ardour/automation_event.cc:1143 libs/ardour/playlist.cc:939
+#: libs/ardour/automation_event.cc:1180 libs/ardour/playlist.cc:939
msgid "paste"
msgstr "incolla"
-#: libs/ardour/automation_event.cc:1198
+#: libs/ardour/automation_event.cc:1235
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
"lista automazione: nessuna coordinata X salvata per punto di controllo "
"(ignorato)"
-#: libs/ardour/automation_event.cc:1204
+#: libs/ardour/automation_event.cc:1241
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
"lista automazione: nessuna coordinata Y salvata per punto di controllo "
"(ignorato)"
-#: libs/ardour/basic_ui.cc:68
-msgid "unnamed"
-msgstr ""
-
-#: libs/ardour/configuration.cc:79
+#: libs/ardour/configuration.cc:80
#, fuzzy
msgid "loading system configuration file %1"
msgstr ""
"Ardour: impossibile leggere il file di configurazione di sistema \"%1\""
-#: libs/ardour/configuration.cc:82
+#: libs/ardour/configuration.cc:83
msgid "Ardour: cannot read system configuration file \"%1\""
msgstr ""
"Ardour: impossibile leggere il file di configurazione di sistema \"%1\""
-#: libs/ardour/configuration.cc:87
+#: libs/ardour/configuration.cc:88
msgid "Ardour: system configuration file \"%1\" not loaded successfully."
msgstr ""
"Ardour: il file di configurazione di sistema \"%1\" non stato caricato con "
"successo"
-#: libs/ardour/configuration.cc:104
+#: libs/ardour/configuration.cc:105
#, fuzzy
msgid "loading user configuration file %1"
msgstr "Ardour: impossibile la lettura del file di configurazione \"%1\""
-#: libs/ardour/configuration.cc:107
+#: libs/ardour/configuration.cc:108
msgid "Ardour: cannot read configuration file \"%1\""
msgstr "Ardour: impossibile la lettura del file di configurazione \"%1\""
-#: libs/ardour/configuration.cc:112
+#: libs/ardour/configuration.cc:113
#, fuzzy
msgid "Ardour: user configuration file \"%1\" not loaded successfully."
msgstr ""
"Ardour: il file di configurazione \"%1\" non stato caricato con successo"
-#: libs/ardour/configuration.cc:136
+#: libs/ardour/configuration.cc:137
#, fuzzy
msgid "Config file %1 not saved"
msgstr "File di configurazione non salvato"
-#: libs/ardour/configuration.cc:209
+#: libs/ardour/configuration.cc:210
msgid "ill-formed MIDI port specification in ardour rcfile (ignored)"
msgstr ""
"porta MIDI mal configurata nel file di configurazione di ardour (ignorato)"
@@ -329,28 +515,41 @@ msgstr "Il nodo per la connessione non possiede l'attributo \"nome\""
msgid "Node for Connection has no \"connections\" property"
msgstr "Il nodo per la connessione non ha l'attributo \"connessioni\""
-#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1889
+#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1902
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr "IO: stringa malformata nel nodo XML per le entrate \"%1\""
-#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1894
+#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1907
msgid "bad input string in XML node \"%1\""
msgstr "stringa malformata nel nodo XML \"%1\""
-#: libs/ardour/control_protocol_manager.cc:79
+#: libs/ardour/control_protocol_manager.cc:80
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:84
+#: libs/ardour/control_protocol_manager.cc:85
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:180
+#: libs/ardour/control_protocol_manager.cc:141
+msgid "Instantiating mandatory control protocol %1"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:175
+#, fuzzy
+msgid "Control protocol %1 not usable"
+msgstr "La porta MIDI \"%1\" non disponibile: nessun controllo MTC possibile"
+
+#: libs/ardour/control_protocol_manager.cc:187
+msgid "Control surface protocol discovered: \"%1\""
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:205
#, fuzzy
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)"
-#: libs/ardour/control_protocol_manager.cc:188
+#: libs/ardour/control_protocol_manager.cc:213
#, fuzzy
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor."
@@ -381,365 +580,103 @@ msgstr "livello cambiato"
msgid "old-style crossfade information - no position information"
msgstr "il nodo XML per la Location non ha informazioni sull'inizio"
-#: libs/ardour/curve.cc:112 libs/ardour/insert.cc:454
-#: libs/ardour/session.cc:2452 libs/ardour/session.cc:2504
+#: libs/ardour/curve.cc:112 libs/ardour/globals.cc:340
+#: libs/ardour/insert.cc:454 libs/ardour/session.cc:2466
+#: libs/ardour/session.cc:2518
msgid "programming error: "
msgstr "errore di programmazione: "
-#: libs/ardour/cycle_timer.cc:35
+#: libs/ardour/cycle_timer.cc:37
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr "CycleTimer::get_mhz(): impossibile accedere a /proc/cpuinfo"
-#: libs/ardour/cycle_timer.cc:47
+#: libs/ardour/cycle_timer.cc:49
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
"CycleTimer::get_mhz(): impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
-#: libs/ardour/cycle_timer.cc:70
+#: libs/ardour/cycle_timer.cc:72
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr "impossibile localizzare \"cpu MHz\" in /proc/cpuinfo"
-#: libs/ardour/destructive_filesource.cc:197
+#: libs/ardour/destructive_filesource.cc:188
msgid "DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: libs/ardour/destructive_filesource.cc:210
-#: libs/ardour/destructive_filesource.cc:252
-#: libs/ardour/destructive_filesource.cc:259
+#: libs/ardour/destructive_filesource.cc:201
+#: libs/ardour/destructive_filesource.cc:243
+#: libs/ardour/destructive_filesource.cc:250
msgid "DestructiveFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: libs/ardour/diskstream.cc:337
-msgid "DiskStream: Session doesn't know about a Playlist called \"%1\""
-msgstr "DiskStream: La sessione non riconosce la Playlist chiamata \"%1\""
-
-#: libs/ardour/diskstream.cc:342
-msgid "DiskStream: Playlist \"%1\" isn't an audio playlist"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:433
-msgid "DiskStream %1: there is no existing playlist to make a copy of!"
-msgstr "DiskStream %1: non esiste alcuna playlist di cui fare una copia!"
-
-#: libs/ardour/diskstream.cc:1113 libs/ardour/diskstream.cc:1124
-msgid "DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"
-msgstr "DiskStream %1: impossibile leggere %2 dalla playlista al frame %3"
-
-#: libs/ardour/diskstream.cc:1256
-msgid "DiskStream %1: cannot read %2 from playlist at frame %3"
-msgstr "DiskStream %1: impossibile leggere %2 dalla playlista al frame %3"
-
-#: libs/ardour/diskstream.cc:1623 libs/ardour/diskstream.cc:1640
-msgid "DiskStream %1: cannot write to disk"
-msgstr "DiskStream %1: impossibile scrivere sul disco"
-
-#: libs/ardour/diskstream.cc:1700
-msgid "DiskStream \"%1\": cannot flush captured data to disk!"
-msgstr "DiskStream \"%1\": impossibile scaricare i dati acquisiti sul disco!"
-
-#: libs/ardour/diskstream.cc:1797
-msgid "%1: could not create region for complete audio file"
-msgstr "%1: impossibile creare una regione per il file audio completo"
-
-#: libs/ardour/diskstream.cc:1820
-msgid "DiskStream: could not create region for captured audio!"
-msgstr "DiskStream: impossibile creare una regione per l'audio registrato!"
-
-#: libs/ardour/diskstream.cc:1875
-#, fuzzy
-msgid "programmer error: %1"
-msgstr "errore di programmazione: %1"
-
-#: libs/ardour/diskstream.cc:2155
-#, fuzzy
-msgid "DiskStream: channel %1 out of range"
-msgstr "DiskStream: canale fuori margine"
-
-#: libs/ardour/diskstream.cc:2180
-msgid "%1:%2 new capture file not initialized correctly"
-msgstr "%1:%2 nuovo file di registrazione non è stato avviato correttamente"
-
-#: libs/ardour/diskstream.cc:2413
-msgid "Location \"%1\" not valid for track loop (start >= end)"
-msgstr "La Location \"%1\" non valida per il loop (inizio >= fine)"
-
-#: libs/ardour/diskstream.cc:2491
-#, fuzzy
-msgid "%1: cannot restore pending capture source file %2"
-msgstr "Import: impossibile aprire il file audio di input \"%1\""
-
-#: libs/ardour/diskstream.cc:2513
-msgid "%1: incorrect number of pending sources listed - ignoring them all"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2529
-#, fuzzy
-msgid "%1: cannot create whole-file region from pending capture sources"
-msgstr "Playlist: impossibile creare la Regione dal file di stato"
-
-#: libs/ardour/diskstream.cc:2541
-#, fuzzy
-msgid "%1: cannot create region from pending capture sources"
-msgstr "Playlist: impossibile creare la Regione dal file di stato"
-
-#: libs/ardour/filesource.cc:175
-msgid "FileSource: search path not set"
-msgstr "FileSource: percorso di ricerca non specificato"
-
-#: libs/ardour/filesource.cc:190
-msgid "FileSource: \"%1\" not found when searching %2 using %3"
-msgstr "FileSource: \"%1\" non trovato nel cercare %2 utilizzando %3"
-
-#: libs/ardour/filesource.cc:196
-msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
-"\t"
-msgstr ""
-"FileSource: \"%1\" è risultato ambiguo nel cercare %2\n"
-"\t"
-
-#: libs/ardour/filesource.cc:231
-msgid "Filesource: cannot find required file (%1): %2"
-msgstr "FileSource: impossibile trovare il file richiesto (%1): %2"
-
-#: libs/ardour/filesource.cc:239
-msgid "Filesource: cannot check for existing file (%1): %2"
-msgstr "FileSource: impossibile controllare il file esistente (%1): %2"
-
-#: libs/ardour/filesource.cc:245 libs/ardour/filesource.cc:1127
-#: libs/ardour/filesource.cc:1210
-msgid "FileSource: could not open \"%1\": (%2)"
-msgstr "FileSource: impossibile aprire \"%1\": (%2)"
-
-#: libs/ardour/filesource.cc:278
-msgid "FileSource: cannot write header in %1"
-msgstr "FileSource: impossibile scrivere header in %1"
-
-#: libs/ardour/filesource.cc:293
-msgid "FileSource: cannot locate chunks in %1"
-msgstr "FileSource: impossibile trovare spezzoni in %1"
-
-#: libs/ardour/filesource.cc:298
-msgid "FileSource: cannot read header in %1"
-msgstr "FileSource: impossibile leggere header in %1"
-
-#: libs/ardour/filesource.cc:303
-msgid "FileSource: cannot check header in %1"
-msgstr "FileSource: impossibile controllare header in %1"
-
-#: libs/ardour/filesource.cc:311
-#, fuzzy
-msgid "FileSource: cannot initialize peakfile for %1 as %2"
-msgstr "FileSource: impossibile avviare il peakfile per %1"
-
-#: libs/ardour/filesource.cc:359 libs/ardour/insert.cc:525
-msgid "programming error: %1"
-msgstr "errore di programmazione: %1"
-
-#: libs/ardour/filesource.cc:364
-#, fuzzy
-msgid "cannot rename audio file for %1 to %2"
-msgstr "impossibile rinominare file audio sorgente da %1 a %2 (%3)"
-
-#: libs/ardour/filesource.cc:390
-msgid "FileSource: cannot seek to end of file"
-msgstr "FileSource: impossibile cercare fino alla fine del file"
-
-#: libs/ardour/filesource.cc:395
-msgid "FileSource: cannot read RIFF/WAVE chunk from file"
-msgstr "FileSource: impossibile accedere allo spezzone RIFF/WAVE dal file"
-
-#: libs/ardour/filesource.cc:407
-msgid "FileSource %1: not a RIFF/WAVE file"
-msgstr "FileSource %1: il file non un file RIFF/WAVE"
-
-#: libs/ardour/filesource.cc:434
-msgid "FileSource: can't read a chunk"
-msgstr "FileSource: impossibile accedere ad uno spezzone"
-
-#: libs/ardour/filesource.cc:451
-msgid "filesource: correcting mis-written RIFF file to become a RIFX: "
-msgstr ""
-
-#: libs/ardour/filesource.cc:567
-msgid "FileSource: cannot get user information for BWF header (%1)"
-msgstr "FileSource: impossibile otterene info utente dall'header BWF (%1)"
-
-#: libs/ardour/filesource.cc:571
-msgid "FileSource: cannot get host information for BWF header (%1)"
-msgstr "FileSource: impossibile ottenere info sull'host dall'header BWF (%1)"
-
-#: libs/ardour/filesource.cc:716
-msgid "FileSource[%1]: cannot update data size: %2"
-msgstr "FileSource[%1]: impossibile aggiornare la dimensione dei dati: %2"
-
-#: libs/ardour/filesource.cc:733
-msgid "FileSource: can't find RIFF chunk info"
-msgstr "FileSource: impossibile trovare info sullo spezzone RIFF"
-
-#: libs/ardour/filesource.cc:737
-#, fuzzy
-msgid "FileSource: can't find RIFX chunk info"
-msgstr "FileSource: impossibile trovare info sullo spezzone RIFF"
-
-#: libs/ardour/filesource.cc:758
-msgid "FileSource: can't read RIFF chunk"
-msgstr "FileSource: impossibile accedere allo spezzone RIFF"
-
-#: libs/ardour/filesource.cc:768
-msgid "FileSource: can't find format chunk info"
-msgstr "FileSource: impossibile trovare info sul formato dello spezzone"
-
-#: libs/ardour/filesource.cc:773
-msgid "FileSource: can't read format chunk"
-msgstr "FileSource: impossibile leggere il formato dello spezzone"
-
-#: libs/ardour/filesource.cc:782
-msgid "FileSource: can't find data chunk info"
-msgstr "FileSource: impossibile trovare info sui dati dello spezzone"
-
-#: libs/ardour/filesource.cc:787
-msgid "FileSource: can't read data chunk"
-msgstr "FileSource: impossibile leggere dati dello spezzone"
-
-#: libs/ardour/filesource.cc:804
-msgid ""
-"FileSource: cannot read Broadcast Wave data from existing audio file \"%1"
-"\" (%2)"
-msgstr ""
-"FileSource: impossibile leggere dati Broadcast Wave dal file audio esistente "
-"\"%1\" (%2) "
-
-#: libs/ardour/filesource.cc:820
-msgid ""
-"FileSource: cannot read Broadcast Wave coding history from audio file \"%1"
-"\" (%2)"
-msgstr ""
-"FileSource: impossibile leggere lo storico del Broadcast Wave dal file audio "
-"\"%1\" (%2)"
-
-#: libs/ardour/filesource.cc:862
-#, fuzzy
-msgid ""
-"FileSource \"%1\" does not use valid sample format.\n"
-"This is probably a programming error."
-msgstr ""
-"FileSource \"%1\" non usa il formato floating point.\n"
-"Questo probabilmente un errore di programmazione."
-
-#: libs/ardour/filesource.cc:901
-msgid "FileSource \"%1\" has no \"data\" chunk"
-msgstr "FileSource \"%1\" non ha uno spezzone di \"dati\""
-
-#: libs/ardour/filesource.cc:906
-msgid "%1: data length in header (%2) differs from implicit size in file (%3)"
-msgstr ""
-"%1: la lunghezza dei dati nell'header (%2) diversa dalla dimensione "
-"implicita nel file (%3)"
-
-#: libs/ardour/filesource.cc:911
-msgid "\"%1\" has a sample rate of %2 instead of %3 as used by this session"
-msgstr ""
-"\"%1\" ha una sample rate di %2 anzicch di %3 come il resto della sessione"
-
-#: libs/ardour/filesource.cc:934
-msgid "FileSource: cannot write WAVE chunk: %1"
-msgstr "FileSource: impossibile scrivere lo spezzone WAVE: %1"
-
-#: libs/ardour/filesource.cc:978
-msgid "FileSource: cannot write format chunk: %1"
-msgstr "FileSource: impossibile scrivere il formato dello spezzone: %1"
-
-#: libs/ardour/filesource.cc:990
-msgid "FileSource: cannot data chunk: %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1103 libs/ardour/filesource.cc:1188
-msgid "FileSource: \"%1\" bad write (%2)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1335 libs/ardour/session_state.cc:3093
-msgid ""
-"there are already 1000 files with names like %1; versioning discontinued"
-msgstr ""
-"ci sono gia' 1000 file con nomi come %1; tracciamento di versione interrotto"
-
-#: libs/ardour/filesource.cc:1349 libs/ardour/session_state.cc:3107
-msgid "cannot rename audio file source from %1 to %2 (%3)"
-msgstr "impossibile rinominare file audio sorgente da %1 a %2 (%3)"
-
-#: libs/ardour/filesource.cc:1356 libs/ardour/session_state.cc:3122
-msgid "cannot remove peakfile %1 for %2 (%3)"
-msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
-
-#: libs/ardour/globals.cc:82
+#: libs/ardour/globals.cc:109
msgid "no MIDI ports specified: no MMC or MTC control possible"
msgstr "Nessuna porta MIDI specificata: impossibile alcun controllo MMC o MTC"
-#: libs/ardour/globals.cc:97
+#: libs/ardour/globals.cc:124
msgid "MIDI port specifications for \"%1\" are not understandable."
msgstr "Le specifiche per la porta MIDI \"%1\" non sono state capite"
-#: libs/ardour/globals.cc:110 libs/ardour/globals.cc:114
-#: libs/ardour/globals.cc:118
+#: libs/ardour/globals.cc:137 libs/ardour/globals.cc:141
+#: libs/ardour/globals.cc:145
msgid "default"
msgstr ""
-#: libs/ardour/globals.cc:146
+#: libs/ardour/globals.cc:173
msgid "No MMC control (MIDI port \"%1\" not available)"
msgstr "La porta MIDI \"%1\" non disponibile: nessun controllo MTC possibile"
-#: libs/ardour/globals.cc:152
+#: libs/ardour/globals.cc:179
msgid "No MTC support (MIDI port \"%1\" not available)"
msgstr "La porta MIDI \"%1\" non disponibile: nessun controllo MTC possibile"
-#: libs/ardour/globals.cc:157
+#: libs/ardour/globals.cc:184
#, fuzzy
msgid "No MIDI parameter support (MIDI port \"%1\" not available)"
msgstr "La porta MIDI \"%1\" non disponibile: nessun controllo MTC possibile"
-#: libs/ardour/import.cc:71
+#: libs/ardour/import.cc:75
msgid "Import: cannot open input sound file \"%1\""
msgstr "Import: impossibile aprire il file audio di input \"%1\""
-#: libs/ardour/import.cc:76
+#: libs/ardour/import.cc:80
msgid "resampling audio"
msgstr ""
-#: libs/ardour/import.cc:80
+#: libs/ardour/import.cc:84
msgid "Import: cannot open converted sound file \"%1\""
msgstr "Import: impossibile aprire il file audio convertito \"%1\""
-#: libs/ardour/import.cc:85
+#: libs/ardour/import.cc:89
msgid "Import: error while resampling sound file \"%1\""
msgstr "Import: errore nel resampling deil file audio \"%1\""
-#: libs/ardour/import.cc:141
+#: libs/ardour/import.cc:148
msgid "Session::import_audiofile: cannot open new file source for channel %1"
msgstr ""
"Session::import_audiofile: impossibile aprire il nuovo file per il canale %1"
-#: libs/ardour/import.cc:160
+#: libs/ardour/import.cc:167
msgid "converting audio"
msgstr "conversione dell'audio"
-#: libs/ardour/import.cc:192
+#: libs/ardour/import.cc:199
msgid "building region"
msgstr "costruzione della regione"
-#: libs/ardour/import.cc:194
+#: libs/ardour/import.cc:201
msgid "building regions"
msgstr "costruzione delle regioni"
-#: libs/ardour/import.cc:318
+#: libs/ardour/import.cc:325
msgid "Import: could not open temp file: %1"
msgstr "Import: impossibile aprire il file audio temporaneo \"%1\""
-#: libs/ardour/import.cc:327
+#: libs/ardour/import.cc:334
msgid "Import: src_new() failed : %1"
msgstr ""
-#: libs/ardour/import.cc:355
+#: libs/ardour/import.cc:362
msgid "Import: %1"
msgstr ""
@@ -796,280 +733,280 @@ msgstr "PortInsert: impossibile aggiungere una porta d'uscita"
msgid "non-port insert XML used for port plugin insert"
msgstr "insert non-port XML usato per insert di plugin di porta"
-#: libs/ardour/io.cc:585
+#: libs/ardour/io.cc:598
msgid "IO: cannot disconnect input port %1 from %2"
msgstr "IO: impossibile disconnettere la porta d'entrata %1 da %2"
-#: libs/ardour/io.cc:653
+#: libs/ardour/io.cc:666
msgid "IO: cannot disconnect output port %1 from %2"
msgstr "IO: impossibile disconnettere la porta d'uscita %1 da %2"
-#: libs/ardour/io.cc:794 libs/ardour/io.cc:1138 libs/ardour/io.cc:1264
+#: libs/ardour/io.cc:807 libs/ardour/io.cc:1151 libs/ardour/io.cc:1277
#, c-format
msgid "%s/out"
msgstr ""
-#: libs/ardour/io.cc:796 libs/ardour/io.cc:1140 libs/ardour/io.cc:1266
-#: libs/ardour/io.cc:2826
+#: libs/ardour/io.cc:809 libs/ardour/io.cc:1153 libs/ardour/io.cc:1279
+#: libs/ardour/io.cc:2849
#, c-format
msgid "%s/out %u"
msgstr ""
-#: libs/ardour/io.cc:800 libs/ardour/io.cc:1145 libs/ardour/io.cc:1270
+#: libs/ardour/io.cc:813 libs/ardour/io.cc:1158 libs/ardour/io.cc:1283
msgid "IO: cannot register output port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/io.cc:895 libs/ardour/io.cc:998 libs/ardour/io.cc:1104
+#: libs/ardour/io.cc:908 libs/ardour/io.cc:1011 libs/ardour/io.cc:1117
#, c-format
msgid "%s/in"
msgstr ""
-#: libs/ardour/io.cc:897 libs/ardour/io.cc:1001 libs/ardour/io.cc:1107
-#: libs/ardour/io.cc:2796
+#: libs/ardour/io.cc:910 libs/ardour/io.cc:1014 libs/ardour/io.cc:1120
+#: libs/ardour/io.cc:2819
#, c-format
msgid "%s/in %u"
msgstr ""
-#: libs/ardour/io.cc:901 libs/ardour/io.cc:1007 libs/ardour/io.cc:1112
+#: libs/ardour/io.cc:914 libs/ardour/io.cc:1020 libs/ardour/io.cc:1125
msgid "IO: cannot register input port %1"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/io.cc:1528
+#: libs/ardour/io.cc:1541
msgid "IO::connecting_became_legal() called without a pending state node"
msgstr ""
-#: libs/ardour/io.cc:1551
+#: libs/ardour/io.cc:1564
msgid "IO::ports_became_legal() called without a pending state node"
msgstr ""
-#: libs/ardour/io.cc:1581
+#: libs/ardour/io.cc:1594
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: libs/ardour/io.cc:1636
+#: libs/ardour/io.cc:1649
msgid ""
"MIDI gain control specification for %1 is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/io.cc:1726 libs/ardour/io.cc:1838
+#: libs/ardour/io.cc:1739 libs/ardour/io.cc:1851
msgid "Unknown connection \"%1\" listed for output of %2"
msgstr ""
-#: libs/ardour/io.cc:1728 libs/ardour/io.cc:1840
+#: libs/ardour/io.cc:1741 libs/ardour/io.cc:1853
msgid "out 1"
msgstr ""
-#: libs/ardour/io.cc:1729 libs/ardour/io.cc:1841
+#: libs/ardour/io.cc:1742 libs/ardour/io.cc:1854
msgid "No output connections available as a replacement"
msgstr ""
-#: libs/ardour/io.cc:1733 libs/ardour/io.cc:1845
+#: libs/ardour/io.cc:1746 libs/ardour/io.cc:1858
msgid "Connection %1 was not available - \"out 1\" used instead"
msgstr ""
-#: libs/ardour/io.cc:1747
+#: libs/ardour/io.cc:1760
msgid "%1: cannot create I/O ports"
msgstr ""
-#: libs/ardour/io.cc:1854
+#: libs/ardour/io.cc:1867
msgid "improper output channel list in XML node (%1)"
msgstr ""
-#: libs/ardour/io.cc:1939
+#: libs/ardour/io.cc:1952
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr "IO: stringa mal formata nel nodo XML per le uscite \"%1\""
-#: libs/ardour/io.cc:1944
+#: libs/ardour/io.cc:1957
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: stringa mal formata nel nodo XML \"%1\""
-#: libs/ardour/io.cc:2502
+#: libs/ardour/io.cc:2525
msgid "%1: could not open automation event file \"%2\""
msgstr ""
-#: libs/ardour/io.cc:2541
+#: libs/ardour/io.cc:2564
msgid "%1: cannot open automation event file \"%2\""
msgstr ""
-#: libs/ardour/io.cc:2556
+#: libs/ardour/io.cc:2579
msgid "badly formed version number in automation event file \"%1\""
msgstr ""
-#: libs/ardour/io.cc:2560
+#: libs/ardour/io.cc:2583
msgid "no version information in automation event file \"%1\""
msgstr ""
-#: libs/ardour/io.cc:2565
+#: libs/ardour/io.cc:2588
msgid "mismatched automation event file version (%1)"
msgstr ""
-#: libs/ardour/io.cc:2573
+#: libs/ardour/io.cc:2596
msgid "badly formatted automation event record at line %1 of %2 (ignored)"
msgstr ""
-#: libs/ardour/io.cc:2593
+#: libs/ardour/io.cc:2616
msgid "dubious automation event found (and ignored)"
msgstr ""
-#: libs/ardour/io.cc:2597 libs/ardour/panner.cc:437
+#: libs/ardour/io.cc:2620 libs/ardour/panner.cc:438
#: libs/ardour/redirect.cc:148
msgid "loaded from disk"
msgstr ""
-#: libs/ardour/io.cc:2768
+#: libs/ardour/io.cc:2791
msgid "automation write/touch"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:86
+#: libs/ardour/ladspa_plugin.cc:87
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: il modulo non ha alcuna funzione descriptor."
-#: libs/ardour/ladspa_plugin.cc:91
+#: libs/ardour/ladspa_plugin.cc:92
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: il plugin è stato rimosso"
-#: libs/ardour/ladspa_plugin.cc:98
+#: libs/ardour/ladspa_plugin.cc:99
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:328
+#: libs/ardour/ladspa_plugin.cc:329
msgid ""
"illegal parameter number used with plugin \"%1\". This mayindicate a change "
"in the plugin design, and presets may beinvalid"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:429
+#: libs/ardour/ladspa_plugin.cc:430
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:442
+#: libs/ardour/ladspa_plugin.cc:443
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:448
+#: libs/ardour/ladspa_plugin.cc:449
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:497
+#: libs/ardour/ladspa_plugin.cc:498
msgid ""
"LADSPA LadspaPlugin MIDI control specification for port %1 is incomplete, so "
"it has been ignored"
msgstr ""
-#: libs/ardour/location.cc:268
+#: libs/ardour/location.cc:269
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: libs/ardour/location.cc:275
+#: libs/ardour/location.cc:276
msgid "XML node for Location has no name information"
msgstr "il nodo XML per la Location non ha informazioni sul nome"
-#: libs/ardour/location.cc:282
+#: libs/ardour/location.cc:283
msgid "XML node for Location has no start information"
msgstr "il nodo XML per la Location non ha informazioni sull'inizio"
-#: libs/ardour/location.cc:293
+#: libs/ardour/location.cc:294
msgid "XML node for Location has no end information"
msgstr "il nodo XML per la Location non ha informazioni sulla fine"
-#: libs/ardour/location.cc:302
+#: libs/ardour/location.cc:303
msgid "XML node for Location has no flags information"
msgstr "il nodo XML per la Location non ha informazioni sui flags"
-#: libs/ardour/location.cc:390
+#: libs/ardour/location.cc:391
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: libs/ardour/location.cc:417 libs/ardour/playlist.cc:1187
+#: libs/ardour/location.cc:418 libs/ardour/playlist.cc:1187
msgid "clear"
msgstr "pulisci"
-#: libs/ardour/location.cc:442
+#: libs/ardour/location.cc:443
msgid "clear markers"
msgstr ""
-#: libs/ardour/location.cc:470
+#: libs/ardour/location.cc:471
msgid "clear ranges"
msgstr ""
-#: libs/ardour/location.cc:488
+#: libs/ardour/location.cc:489
msgid "add"
msgstr ""
-#: libs/ardour/location.cc:526
+#: libs/ardour/location.cc:527
msgid "remove"
msgstr "rimuovi"
-#: libs/ardour/location.cc:566
+#: libs/ardour/location.cc:567
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: libs/ardour/mtc_slave.cc:195
+#: libs/ardour/mtc_slave.cc:196
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: libs/ardour/named_selection.cc:76
+#: libs/ardour/named_selection.cc:77
msgid "Chunk %1 uses an unknown playlist \"%2\""
msgstr "Lo spezzone %1 usa una playlist sconosciuta \"%2\""
-#: libs/ardour/named_selection.cc:79
+#: libs/ardour/named_selection.cc:80
msgid "Chunk %1 contains misformed playlist information"
msgstr "Lo spezzone %1 contiene informazioni sulla playlist mal formate"
-#: libs/ardour/panner.cc:255
+#: libs/ardour/panner.cc:256
msgid "MIDI pan control specification is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/panner.cc:360
+#: libs/ardour/panner.cc:361
msgid "automation write pass"
msgstr ""
-#: libs/ardour/panner.cc:400
+#: libs/ardour/panner.cc:401
#, c-format
msgid "error writing pan automation file (%s)"
msgstr "errore nello scrivere il file per l'automazione pan (%s)"
-#: libs/ardour/panner.cc:428
+#: libs/ardour/panner.cc:429
msgid ""
"badly formatted pan automation event record at line %1 of %2 (ignored) [%3]"
msgstr ""
-#: libs/ardour/panner.cc:943
+#: libs/ardour/panner.cc:944
msgid "badly-formed positional data for Multi2dPanner - ignored"
msgstr ""
-#: libs/ardour/panner.cc:1236
+#: libs/ardour/panner.cc:1237
msgid "cannot open pan automation file \"%1\" for saving (%s)"
msgstr ""
"impossibile aprire il file dell'automazione pan \"%1\" per salvare (%s)"
-#: libs/ardour/panner.cc:1272
+#: libs/ardour/panner.cc:1273
msgid "cannot open pan automation file %1 (%2)"
msgstr "impossibile accedere al file dell'automazione pan %1 (%2)"
-#: libs/ardour/panner.cc:1285
+#: libs/ardour/panner.cc:1286
msgid "badly formed version number in pan automation event file \"%1\""
msgstr ""
-#: libs/ardour/panner.cc:1289
+#: libs/ardour/panner.cc:1290
msgid ""
"no version information in pan automation event file \"%1\" (first line = %2)"
msgstr ""
-#: libs/ardour/panner.cc:1295
+#: libs/ardour/panner.cc:1296
msgid "mismatched pan automation event file version (%1)"
msgstr ""
-#: libs/ardour/panner.cc:1309
+#: libs/ardour/panner.cc:1310
msgid "too many panner states found in pan automation file %1"
msgstr ""
-#: libs/ardour/panner.cc:1450
+#: libs/ardour/panner.cc:1451
#, fuzzy
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr "Nodo sconosciuto \"%1\" trovato in Connections list dal file di stato"
-#: libs/ardour/panner.cc:1456
+#: libs/ardour/panner.cc:1457
#, fuzzy
msgid "panner plugin node has no type information!"
msgstr "il nodo XML per la Location non ha informazioni sulla fine"
@@ -1123,63 +1060,63 @@ msgstr "Playlist: impossibile creare la Regione dal file di stato"
msgid "nudged"
msgstr "spostato"
-#: libs/ardour/playlist_factory.cc:26 libs/ardour/playlist_factory.cc:41
+#: libs/ardour/playlist_factory.cc:49 libs/ardour/playlist_factory.cc:64
msgid ""
"programming error: Playlist::createRegion called with unknown Region type"
msgstr ""
-#: libs/ardour/playlist_factory.cc:63
+#: libs/ardour/playlist_factory.cc:86
msgid ""
"programming error: Playlist::copyPlaylist called with unknown Playlist type"
msgstr ""
-#: libs/ardour/plugin.cc:327
+#: libs/ardour/plugin.cc:328
msgid "Could not locate HOME. Preset not saved."
msgstr "impossibile localizzare HOME. Preset non salvato."
-#: libs/ardour/plugin.cc:337 libs/ardour/plugin.cc:343
+#: libs/ardour/plugin.cc:338 libs/ardour/plugin.cc:344
msgid "Could not create %1. Preset not saved. (%2)"
msgstr "Impossibile creare %1 . Preset non salvato. (%2)"
-#: libs/ardour/plugin.cc:348
+#: libs/ardour/plugin.cc:349
msgid "Error saving presets file %1."
msgstr "Errore nel salvare il file di preset %1."
-#: libs/ardour/plugin_manager.cc:193
+#: libs/ardour/plugin_manager.cc:194
#, fuzzy
msgid "Could not parse rdf file: %1"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/plugin_manager.cc:234
+#: libs/ardour/plugin_manager.cc:235
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: impossibile caricare il modulo \"%1\" (%2)"
-#: libs/ardour/plugin_manager.cc:241
+#: libs/ardour/plugin_manager.cc:242
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr "LADSPA: il modulo \"%1\" non ha alcuna funzione descriptor."
-#: libs/ardour/plugin_manager.cc:296
+#: libs/ardour/plugin_manager.cc:297
#, fuzzy
msgid "VST: cannot load module from \"%1\""
msgstr "LADPSA: impossibile caricare il modulo da \"%1\""
-#: libs/ardour/plugin_manager.cc:301
+#: libs/ardour/plugin_manager.cc:302
msgid "You asked ardour to not use any VST plugins"
msgstr ""
-#: libs/ardour/plugin_manager.cc:304
+#: libs/ardour/plugin_manager.cc:305
msgid "This version of ardour has no support for VST plugins"
msgstr ""
-#: libs/ardour/plugin_manager.cc:311
+#: libs/ardour/plugin_manager.cc:312
msgid "LADSPA: cannot load module from \"%1\""
msgstr "LADPSA: impossibile caricare il modulo da \"%1\""
-#: libs/ardour/plugin_manager.cc:373 libs/ardour/plugin_manager.cc:385
+#: libs/ardour/plugin_manager.cc:374 libs/ardour/plugin_manager.cc:386
msgid "Unknown"
msgstr ""
-#: libs/ardour/plugin_manager.cc:463
+#: libs/ardour/plugin_manager.cc:464
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in "
"ardour at this time"
@@ -1194,11 +1131,11 @@ msgstr "impossibile accedere al file di sessione recente %1 (%2)"
msgid "programming error: unknown Redirect type in Redirect::Clone!\n"
msgstr ""
-#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:199
+#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:203
msgid "pre"
msgstr ""
-#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:202
+#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:206
#, fuzzy
msgid "post"
msgstr "incolla"
@@ -1253,265 +1190,260 @@ msgstr ""
msgid "active_changed"
msgstr "livello cambiato"
-#: libs/ardour/region.cc:884
+#: libs/ardour/region.cc:885
msgid "Session: XMLNode describing a Region is incomplete (no id)"
msgstr ""
-#: libs/ardour/region.cc:891
+#: libs/ardour/region.cc:892
msgid "Session: XMLNode describing a Region is incomplete (no name)"
msgstr ""
-#: libs/ardour/route.cc:79 libs/ardour/session.cc:1541
-#: libs/ardour/session.cc:1547 libs/ardour/session.cc:3064
+#: libs/ardour/route.cc:79 libs/ardour/session.cc:1554
+#: libs/ardour/session.cc:1560 libs/ardour/session.cc:3093
msgid "signal"
msgstr "segnale"
-#: libs/ardour/route.cc:1433
+#: libs/ardour/route.cc:1430
msgid "Could not get state of route. Problem with save_automation"
msgstr ""
-#: libs/ardour/route.cc:1485
+#: libs/ardour/route.cc:1482
msgid "Send construction failed"
msgstr ""
-#: libs/ardour/route.cc:1507
+#: libs/ardour/route.cc:1504
msgid "unknown Insert type \"%1\"; ignored"
msgstr ""
-#: libs/ardour/route.cc:1513
+#: libs/ardour/route.cc:1510
msgid "Insert XML node has no type property"
msgstr ""
-#: libs/ardour/route.cc:1518
+#: libs/ardour/route.cc:1515
msgid "insert could not be created. Ignored."
msgstr ""
-#: libs/ardour/route.cc:1536
+#: libs/ardour/route.cc:1533
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: libs/ardour/route.cc:1595
+#: libs/ardour/route.cc:1592
msgid "Route %1: unknown edit group \"%2 in saved state (ignored)"
msgstr ""
-#: libs/ardour/route.cc:1611 libs/ardour/route.cc:1615
+#: libs/ardour/route.cc:1608 libs/ardour/route.cc:1612
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: libs/ardour/route.cc:1696 libs/ardour/route.cc:1823
+#: libs/ardour/route.cc:1693 libs/ardour/route.cc:1820
msgid "[control]"
msgstr ""
-#: libs/ardour/route.cc:1716
+#: libs/ardour/route.cc:1713
msgid "Route %1: unknown mix group \"%2 in saved state (ignored)"
msgstr ""
-#: libs/ardour/route.cc:1745 libs/ardour/route.cc:1753
+#: libs/ardour/route.cc:1742 libs/ardour/route.cc:1750
msgid ""
"MIDI mute control specification for %1 is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/send.cc:98
+#: libs/ardour/send.cc:99
msgid "XML node describing a send is missing a Redirect node"
msgstr ""
-#: libs/ardour/session.cc:99
+#: libs/ardour/session.cc:103
#, fuzzy
msgid "Could not resolve path: %1 (%2)"
msgstr "impossibile controllare il percorso %1 (%2)"
-#: libs/ardour/session.cc:111
+#: libs/ardour/session.cc:115
msgid "cannot check session path %1 (%2)"
msgstr "impossibile controllare il percorso %1 (%2)"
-#: libs/ardour/session.cc:141
+#: libs/ardour/session.cc:145
msgid "cannot check statefile %1 (%2)"
msgstr "impossibile controllare il file di stato %1 (%2)"
-#: libs/ardour/session.cc:177
+#: libs/ardour/session.cc:181
msgid "%1 is not an Ardour snapshot file"
msgstr "%1 non è un file di istantanea di Ardour"
-#: libs/ardour/session.cc:194
+#: libs/ardour/session.cc:198
msgid "cannot determine current working directory (%1)"
msgstr "impossibile determinare la cartella di lavoro corrente (%1)"
-#: libs/ardour/session.cc:211
+#: libs/ardour/session.cc:215
msgid "unknown file type for session %1"
msgstr "tipo di fle sconosciuto per la sessione %1"
-#: libs/ardour/session.cc:316
+#: libs/ardour/session.cc:320
msgid "monitor"
msgstr ""
-#: libs/ardour/session.cc:323
+#: libs/ardour/session.cc:327
msgid "master"
msgstr ""
-#: libs/ardour/session.cc:607
+#: libs/ardour/session.cc:611
msgid "could not setup Click I/O"
msgstr "impossibile impostare entrata/uscita del click"
-#: libs/ardour/session.cc:628
+#: libs/ardour/session.cc:632
msgid "cannot setup Click I/O"
msgstr "impossibile impostare entrata/uscita del click"
-#: libs/ardour/session.cc:650
+#: libs/ardour/session.cc:654
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr "impossibile creare l'Auditioner"
-#: libs/ardour/session.cc:662
+#: libs/ardour/session.cc:666
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:674
+#: libs/ardour/session.cc:678
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:688
+#: libs/ardour/session.cc:692
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:702
+#: libs/ardour/session.cc:706
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:735
+#: libs/ardour/session.cc:739
#, fuzzy
msgid "cannot setup master inputs"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/session.cc:743
+#: libs/ardour/session.cc:747
#, fuzzy
msgid "cannot setup master outputs"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/session.cc:754
+#: libs/ardour/session.cc:758
msgid "Master Out"
msgstr ""
-#: libs/ardour/session.cc:820
+#: libs/ardour/session.cc:830
#, fuzzy
msgid "cannot setup control inputs"
msgstr "impossibile impostare entrata/uscita del click"
-#: libs/ardour/session.cc:828
+#: libs/ardour/session.cc:838
#, fuzzy
msgid "cannot set up master outputs"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/session.cc:1100
+#: libs/ardour/session.cc:1110
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Sessione: non si può usare quella location per l'auto punch (inizio <= fine)"
-#: libs/ardour/session.cc:1179
+#: libs/ardour/session.cc:1189
msgid "Session: you can't use a mark for auto loop"
msgstr "Sessione: non si può usare un marcatore per l'auto loop"
-#: libs/ardour/session.cc:1559
+#: libs/ardour/session.cc:1572
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: libs/ardour/session.cc:1711 libs/ardour/session.cc:1808
+#: libs/ardour/session.cc:1724 libs/ardour/session.cc:1821
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: libs/ardour/session.cc:1767
+#: libs/ardour/session.cc:1780
msgid "Session: could not create new audio track."
msgstr "Sessione: impossibile creare una nuova traccia audio"
-#: libs/ardour/session.cc:1857
+#: libs/ardour/session.cc:1870
msgid "Session: could not create new route."
msgstr "Sessione: impossibile creare un nuovo route"
-#: libs/ardour/session.cc:2340
+#: libs/ardour/session.cc:2354
msgid "cannot create new name for region \"%1\""
msgstr "impossibile creare un nuovo nome per la regione \"%1\""
-#: libs/ardour/session.cc:2404
+#: libs/ardour/session.cc:2418
msgid "too many regions with names like %1"
msgstr "troppe regioni con nomi come %1"
-#: libs/ardour/session.cc:2860
+#: libs/ardour/session.cc:2883
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Ci sono già %1 registrazioni per %2, che io considero troppe"
-#: libs/ardour/session.cc:3229
+#: libs/ardour/session.cc:3258
msgid "programming error: unknown type of Insert created!"
msgstr ""
-#: libs/ardour/session.cc:3235
+#: libs/ardour/session.cc:3264
msgid "programming error: unknown type of Redirect created!"
msgstr ""
-#: libs/ardour/session.cc:3258
+#: libs/ardour/session.cc:3287
msgid "programming error: unknown type of Insert deleted!"
msgstr ""
-#: libs/ardour/session.cc:3264
+#: libs/ardour/session.cc:3293
msgid "programming error: unknown type of Redirect deleted!"
msgstr ""
-#: libs/ardour/session.cc:3605
+#: libs/ardour/session.cc:3636
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: libs/ardour/session.cc:3614
+#: libs/ardour/session.cc:3649
msgid "cannot create new audio file \"%1\" for %2"
msgstr "impossibile creare un nuovo file audio \"%1\" per %2"
-#: libs/ardour/session_butler.cc:81 libs/ardour/session_midi.cc:1183
-#: libs/ardour/source.cc:233
-msgid "Cannot create transport request signal pipe (%1)"
-msgstr ""
-
-#: libs/ardour/session_butler.cc:86 libs/ardour/session_butler.cc:91
+#: libs/ardour/session_butler.cc:85 libs/ardour/session_butler.cc:90
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: libs/ardour/session_butler.cc:96
+#: libs/ardour/session_butler.cc:95
msgid "Session: could not create butler thread"
msgstr ""
-#: libs/ardour/session_butler.cc:190
+#: libs/ardour/session_butler.cc:189
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: libs/ardour/session_butler.cc:197
+#: libs/ardour/session_butler.cc:196
msgid "Error on butler thread request pipe"
msgstr ""
-#: libs/ardour/session_butler.cc:239
+#: libs/ardour/session_butler.cc:238
#, fuzzy
msgid "Error reading from butler request pipe"
msgstr "Errore nel leggere dalla porta MIDI %1"
-#: libs/ardour/session_butler.cc:276
+#: libs/ardour/session_butler.cc:275
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: libs/ardour/session_butler.cc:320
+#: libs/ardour/session_butler.cc:319
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: libs/ardour/session_click.cc:157
+#: libs/ardour/session_click.cc:158
msgid "cannot open click soundfile %1 (%2)"
msgstr "impossibile accedere al file audio per il click %1 (%2)"
-#: libs/ardour/session_click.cc:166
+#: libs/ardour/session_click.cc:167
msgid "cannot read data from click soundfile"
msgstr "impossibile leggere dati dal file audio per il click"
-#: libs/ardour/session_click.cc:191
+#: libs/ardour/session_click.cc:192
msgid "cannot open click emphasis soundfile %1 (%2)"
msgstr "impossibile accedere al file audio di enfasi per il click %1 (%2)"
-#: libs/ardour/session_click.cc:199
+#: libs/ardour/session_click.cc:200
msgid "cannot read data from click emphasis soundfile"
msgstr "impossibile leggere dati dal file audio di enfasi per il click"
@@ -1611,7 +1543,7 @@ msgstr ""
msgid "Error reading from transport request pipe"
msgstr ""
-#: libs/ardour/session_process.cc:105
+#: libs/ardour/session_process.cc:104
msgid "Session: error in no roll for %1"
msgstr ""
@@ -1629,154 +1561,154 @@ msgstr ""
msgid "start"
msgstr "separa"
-#: libs/ardour/session_state.cc:501
+#: libs/ardour/session_state.cc:502
msgid "Session: cannot create session dir \"%1\" (%2)"
msgstr "Sessione: impossibile creare la cartella per la sessione \"%1\" (%2)"
-#: libs/ardour/session_state.cc:512
+#: libs/ardour/session_state.cc:513
#, fuzzy
msgid "Session: cannot create session peakfile dir \"%1\" (%2)"
msgstr "Sessione: impossibile creare la cartella per la sessione \"%1\" (%2)"
-#: libs/ardour/session_state.cc:521
+#: libs/ardour/session_state.cc:522
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)"
-#: libs/ardour/session_state.cc:530
+#: libs/ardour/session_state.cc:531
#, fuzzy
msgid "Session: cannot create session tape dir \"%1\" (%2)"
msgstr "Sessione: impossibile creare la cartella per la sessione \"%1\" (%2)"
-#: libs/ardour/session_state.cc:539
+#: libs/ardour/session_state.cc:540
#, fuzzy
msgid "Session: cannot create session dead sounds dir \"%1\" (%2)"
msgstr ""
"Sessione: impossibile creare la cartella sounds per la sessione \"%1\" (%2)"
-#: libs/ardour/session_state.cc:548
+#: libs/ardour/session_state.cc:549
msgid "Session: cannot create session automation dir \"%1\" (%2)"
msgstr ""
"Sessione: impossibile creare la cartella automation per la sessione \"%1\" (%"
"2)"
-#: libs/ardour/session_state.cc:579
+#: libs/ardour/session_state.cc:580
#, fuzzy
msgid "Could not open %1 for writing mix template"
msgstr "Impossibile accedere a %1 per scrivere il modello di mixaggio"
-#: libs/ardour/session_state.cc:585
+#: libs/ardour/session_state.cc:586
#, fuzzy
msgid "Could not open mix template %1 for reading"
msgstr "Impossibile aprire il modello di mixaggio %1 per leggere"
-#: libs/ardour/session_state.cc:592
+#: libs/ardour/session_state.cc:593
msgid "Session already exists. Not overwriting"
msgstr "La sessione esiste già. Non sovrascrivo"
-#: libs/ardour/session_state.cc:635
+#: libs/ardour/session_state.cc:636
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: libs/ardour/session_state.cc:684
+#: libs/ardour/session_state.cc:685
msgid "could not backup old state file, current state not saved."
msgstr ""
"impossibile fare copia di sicurezza del file di stato, stato attuale non "
"salvato"
-#: libs/ardour/session_state.cc:697
+#: libs/ardour/session_state.cc:698
#, fuzzy
msgid "state could not be saved to %1"
msgstr "stato non salvato"
-#: libs/ardour/session_state.cc:704
+#: libs/ardour/session_state.cc:705
#, fuzzy
msgid "could not remove corrupt state file %1"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/session_state.cc:708
+#: libs/ardour/session_state.cc:709
#, fuzzy
msgid "could not restore state file from backup %1"
msgstr "Esportazione: impossibile scrivere dati sul file di output (%1)"
-#: libs/ardour/session_state.cc:777
+#: libs/ardour/session_state.cc:778
msgid "%1: session state information file \"%2\" doesn't exist!"
msgstr ""
"%1: il file di informazioni sullo stato della sessione \"%2\" non esiste!"
-#: libs/ardour/session_state.cc:788
+#: libs/ardour/session_state.cc:789
#, fuzzy
msgid "Could not understand ardour file %1"
msgstr "IO: impossibile registrare la porta %1"
-#: libs/ardour/session_state.cc:1492
+#: libs/ardour/session_state.cc:1493
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: libs/ardour/session_state.cc:1538
+#: libs/ardour/session_state.cc:1539
msgid "Session: XML state has no options section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione option"
-#: libs/ardour/session_state.cc:1543
+#: libs/ardour/session_state.cc:1544
msgid "Session: XML state has no sources section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione sources"
-#: libs/ardour/session_state.cc:1550
+#: libs/ardour/session_state.cc:1551
msgid "Session: XML state has no Regions section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Regions"
-#: libs/ardour/session_state.cc:1557
+#: libs/ardour/session_state.cc:1558
msgid "Session: XML state has no playlists section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione playlist"
-#: libs/ardour/session_state.cc:1576
+#: libs/ardour/session_state.cc:1577
msgid "Session: XML state has no diskstreams section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione diskstream"
-#: libs/ardour/session_state.cc:1583
+#: libs/ardour/session_state.cc:1584
msgid "Session: XML state has no connections section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione connections"
-#: libs/ardour/session_state.cc:1590
+#: libs/ardour/session_state.cc:1591
msgid "Session: XML state has no locations section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione locations"
-#: libs/ardour/session_state.cc:1623
+#: libs/ardour/session_state.cc:1624
msgid "Session: XML state has no edit groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione edit groups"
-#: libs/ardour/session_state.cc:1630
+#: libs/ardour/session_state.cc:1631
msgid "Session: XML state has no mix groups section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione mix groups"
-#: libs/ardour/session_state.cc:1637
+#: libs/ardour/session_state.cc:1638
msgid "Session: XML state has no Tempo Map section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione Tempo Map"
-#: libs/ardour/session_state.cc:1644
+#: libs/ardour/session_state.cc:1645
msgid "Session: XML state has no routes section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione routes"
-#: libs/ardour/session_state.cc:1651
+#: libs/ardour/session_state.cc:1652
#, fuzzy
msgid "Session: XML state has no click section"
msgstr "Sessione: il file di stato XML non ha alcuna sezione click"
-#: libs/ardour/session_state.cc:1696
+#: libs/ardour/session_state.cc:1697
msgid "Session: cannot create Route from XML description."
msgstr "Sessione: impossibile creare Route dalla descrizione XML"
-#: libs/ardour/session_state.cc:1734
+#: libs/ardour/session_state.cc:1735
msgid "Session: cannot create Region from XML description."
msgstr "Sessione: impossibile creare regione dalla descrizione XML"
-#: libs/ardour/session_state.cc:1762
+#: libs/ardour/session_state.cc:1764
#, fuzzy
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"Sessione: il nodo XML descrivente una Regione è incompleto (nessun source)"
-#: libs/ardour/session_state.cc:1770 libs/ardour/session_state.cc:1784
+#: libs/ardour/session_state.cc:1772 libs/ardour/session_state.cc:1792
#, fuzzy
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
@@ -1784,62 +1716,73 @@ msgstr ""
"Sessione: il nodo XML descrivente una Regione fa riferimento ad un source "
"con id sconosciuto =%1"
-#: libs/ardour/session_state.cc:1852
+#: libs/ardour/session_state.cc:1778 libs/ardour/session_state.cc:1798
+#, fuzzy
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id =%"
+"1"
+msgstr ""
+"Sessione: il nodo XML descrivente una Regione fa riferimento ad un source "
+"con id sconosciuto =%1"
+
+#: libs/ardour/session_state.cc:1868
msgid "Session: cannot create Source from XML description."
msgstr "Sessione: impossibile creare Source dalla descrizione XML"
-#: libs/ardour/session_state.cc:1883
-msgid "Found a sound file that cannot be used by Ardour. See the progammers."
+#: libs/ardour/session_state.cc:1889
+#, fuzzy
+msgid ""
+"Found a sound file that cannot be used by Ardour. Talk to the progammers."
msgstr "E' stato trovato un file audio che non può essere usato da Ardour."
-#: libs/ardour/session_state.cc:1908
+#: libs/ardour/session_state.cc:1913
msgid "Could not create mix templates directory \"%1\" (%2)"
msgstr "Impossibile creare la cartella per i modelli di mixaggio \"%1\" (%2)"
-#: libs/ardour/session_state.cc:1922
+#: libs/ardour/session_state.cc:1927
msgid "Template \"%1\" already exists - new version not created"
msgstr "Il modello \"%1\" esiste già - non è stata creata una nuova versione"
-#: libs/ardour/session_state.cc:1929
+#: libs/ardour/session_state.cc:1934
msgid "mix template not saved"
msgstr "modello di mixaggio non salvato"
-#: libs/ardour/session_state.cc:1989
+#: libs/ardour/session_state.cc:1994
msgid "cannot create session directory \"%1\"; ignored"
msgstr "impossibile creare la cartella per la sessione %1; ignorato"
-#: libs/ardour/session_state.cc:2002
+#: libs/ardour/session_state.cc:2007
msgid "cannot create sounds directory \"%1\"; ignored"
msgstr "impossibile creare la cartella sounds \"%1\"; ignorato"
-#: libs/ardour/session_state.cc:2013
+#: libs/ardour/session_state.cc:2018
#, fuzzy
msgid "cannot create dead sounds directory \"%1\"; ignored"
msgstr "impossibile creare la cartella sounds \"%1\"; ignorato"
-#: libs/ardour/session_state.cc:2024
+#: libs/ardour/session_state.cc:2029
#, fuzzy
msgid "cannot create peak file directory \"%1\"; ignored"
msgstr "impossibile creare la cartella per la sessione %1; ignorato"
-#: libs/ardour/session_state.cc:2163 libs/ardour/session_state.cc:2184
+#: libs/ardour/session_state.cc:2168 libs/ardour/session_state.cc:2189
msgid "Session: cannot create Playlist from XML description."
msgstr "Sessione: impossibile creare Playlist dalla descrizione XML"
-#: libs/ardour/session_state.cc:2223
+#: libs/ardour/session_state.cc:2228
msgid "Session: cannot create Named Selection from XML description."
msgstr "Sessione: impossibile creare Named Selection dalla descizione XML"
-#: libs/ardour/session_state.cc:2355
+#: libs/ardour/session_state.cc:2360
msgid "Unknown node \"%1\" found in Connections list from state file"
msgstr "Nodo sconosciuto \"%1\" trovato in Connections list dal file di stato"
-#: libs/ardour/session_state.cc:3195
+#: libs/ardour/session_state.cc:3197
#, fuzzy
msgid "cannot remove dead sound file %1 (%2)"
msgstr "impossibile accedere al file audio per il click %1 (%2)"
-#: libs/ardour/session_time.cc:736
+#: libs/ardour/session_time.cc:375
msgid "Unknown JACK transport state %1 in sync callback"
msgstr ""
@@ -1848,43 +1791,43 @@ msgid "tempoize: error creating name for new audio file based on %1"
msgstr ""
"tempoize: errore nel creare il nome per il nuovo file audio basato su %1"
-#: libs/ardour/session_timefx.cc:85
+#: libs/ardour/session_timefx.cc:88
msgid "tempoize: error creating new audio file %1 (%2)"
msgstr "tempoize: errore nel creare un nuovo file audio %1 (%2)"
-#: libs/ardour/session_timefx.cc:111
+#: libs/ardour/session_timefx.cc:114
msgid "tempoize: error reading data from %1"
msgstr "tempoize: errore nel leggere dati da %1"
-#: libs/ardour/session_timefx.cc:124 libs/ardour/session_timefx.cc:136
+#: libs/ardour/session_timefx.cc:127 libs/ardour/session_timefx.cc:139
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: libs/ardour/session_timefx.cc:142
+#: libs/ardour/session_timefx.cc:145
msgid "timefx code failure. please notify ardour-developers."
msgstr ""
-#: libs/ardour/session_transport.cc:116
+#: libs/ardour/session_transport.cc:117
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: libs/ardour/session_transport.cc:478
+#: libs/ardour/session_transport.cc:479
msgid ""
"Seamless looping cannot be supported while Ardour is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: libs/ardour/session_transport.cc:754
+#: libs/ardour/session_transport.cc:755
msgid ""
"Global varispeed cannot be supported while Ardour is connected to JACK "
"transport control"
msgstr ""
-#: libs/ardour/session_transport.cc:954
+#: libs/ardour/session_transport.cc:955
msgid "please stop the transport before adjusting slave settings"
msgstr ""
-#: libs/ardour/session_transport.cc:990
+#: libs/ardour/session_transport.cc:991
msgid "No MTC port defined: MTC slaving is impossible."
msgstr ""
@@ -1972,11 +1915,22 @@ msgstr ""
msgid "Big-endian (Mac)"
msgstr ""
-#: libs/ardour/sndfilesource.cc:75
-msgid "SndFileSource: cannot open file \"%1\" (%2)"
+#: libs/ardour/sndfilesource.cc:146
+msgid "FileSource: cannot get host information for BWF header (%1)"
+msgstr "FileSource: impossibile ottenere info sull'host dall'header BWF (%1)"
+
+#: libs/ardour/sndfilesource.cc:168
+msgid ""
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
+msgstr ""
+
+#: libs/ardour/sndfilesource.cc:224
+#, fuzzy
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr "SndFileSource: impossibile accedere al file \"%1\" (%2)"
-#: libs/ardour/sndfilesource.cc:80
+#: libs/ardour/sndfilesource.cc:230
msgid ""
"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
@@ -1984,205 +1938,169 @@ msgstr ""
"SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero "
"di canale"
-#: libs/ardour/sndfilesource.cc:122
+#: libs/ardour/sndfilesource.cc:307
msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: libs/ardour/source.cc:161
-msgid "poll on peak request pipe failed (%1)"
-msgstr ""
-
-#: libs/ardour/source.cc:168
-msgid "Error on peak thread request pipe"
-msgstr ""
-
-#: libs/ardour/source.cc:201
+#: libs/ardour/sndfilesource.cc:358
#, fuzzy
-msgid "Error reading from peak request pipe"
-msgstr "Errore nel leggere dalla porta MIDI %1"
-
-#: libs/ardour/source.cc:238 libs/ardour/source.cc:243
-msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
-msgstr ""
-
-#: libs/ardour/source.cc:248
-msgid "Source: could not create peak thread"
-msgstr ""
-
-#: libs/ardour/source.cc:326
-#, fuzzy
-msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
-msgstr "impossibile eliminare il peakfile %1 per %2 (%3)"
-
-#: libs/ardour/source.cc:357
-msgid "Source: cannot stat peakfile \"%1\""
-msgstr ""
-
-#: libs/ardour/source.cc:444
-msgid "cannot read sample data for unscaled peak computation"
-msgstr ""
-
-#: libs/ardour/source.cc:465 libs/ardour/source.cc:536
-#: libs/ardour/source.cc:780 libs/ardour/source.cc:881
-msgid "Source: cannot open peakpath \"%1\" (%2)"
-msgstr ""
-
-#: libs/ardour/source.cc:637
-msgid "Source[%1]: peak read - cannot read %2 samples at offset %3"
-msgstr ""
+msgid "programming error: %1 %2"
+msgstr "errore di programmazione: %1"
-#: libs/ardour/source.cc:789
-msgid "%1: could not write read raw data for peak computation (%2)"
+#: libs/ardour/sndfilesource.cc:458
+msgid ""
+"cannot set broadcast info for audio file %1; Dropping broadcast info for "
+"this file"
msgstr ""
-#: libs/ardour/source.cc:814
-msgid "%1: could not write peak file data (%2)"
+#: libs/ardour/sndfilesource.cc:500
+msgid "%1: cannot seek to %2"
msgstr ""
-#: libs/ardour/state_manager.cc:46
+#: libs/ardour/state_manager.cc:47
#, fuzzy
msgid "cleared history"
msgstr "pulito"
-#: libs/ardour/state_manager.cc:59
+#: libs/ardour/state_manager.cc:60
msgid ""
"programming error: illegal state ID (%1) passed to StateManager::set_state() "
"(range = 0-%2)"
msgstr ""
-#: libs/ardour/stateful.cc:100
+#: libs/ardour/stateful.cc:102
#, fuzzy
msgid "Error: could not write %1"
msgstr "Esportazione: impossibile scrivere dati sul file di output (%1)"
-#: libs/ardour/stateful.cc:114
+#: libs/ardour/stateful.cc:116
msgid "Could not understand XML file %1"
msgstr ""
-#: libs/ardour/tempo.cc:66
+#: libs/ardour/tempo.cc:67
msgid "TempoSection XML node has no \"start\" property"
msgstr ""
-#: libs/ardour/tempo.cc:74
+#: libs/ardour/tempo.cc:75
msgid "TempoSection XML node has an illegal \"start\" value"
msgstr ""
-#: libs/ardour/tempo.cc:81
+#: libs/ardour/tempo.cc:82
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: libs/ardour/tempo.cc:86
+#: libs/ardour/tempo.cc:87
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: libs/ardour/tempo.cc:91
+#: libs/ardour/tempo.cc:92
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: libs/ardour/tempo.cc:130
+#: libs/ardour/tempo.cc:131
msgid "MeterSection XML node has no \"start\" property"
msgstr ""
-#: libs/ardour/tempo.cc:138
+#: libs/ardour/tempo.cc:139
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: libs/ardour/tempo.cc:145
+#: libs/ardour/tempo.cc:146
msgid "MeterSection XML node has no \"beats-per-bar\" property"
msgstr ""
-#: libs/ardour/tempo.cc:150
+#: libs/ardour/tempo.cc:151
msgid "MeterSection XML node has an illegal \"beats-per-bar\" value"
msgstr ""
-#: libs/ardour/tempo.cc:155
+#: libs/ardour/tempo.cc:156
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: libs/ardour/tempo.cc:160
+#: libs/ardour/tempo.cc:161
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: libs/ardour/tempo.cc:165
+#: libs/ardour/tempo.cc:166
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: libs/ardour/tempo.cc:258
+#: libs/ardour/tempo.cc:259
msgid "move metric"
msgstr ""
-#: libs/ardour/tempo.cc:329
+#: libs/ardour/tempo.cc:330
msgid "metric removed"
msgstr ""
-#: libs/ardour/tempo.cc:372
+#: libs/ardour/tempo.cc:373
#, fuzzy
msgid "add tempo"
msgstr "aggiungi regione"
-#: libs/ardour/tempo.cc:401
+#: libs/ardour/tempo.cc:402
#, fuzzy
msgid "replace tempo"
msgstr "sostituisci la regione"
-#: libs/ardour/tempo.cc:434
+#: libs/ardour/tempo.cc:435
msgid "add meter"
msgstr ""
-#: libs/ardour/tempo.cc:462
+#: libs/ardour/tempo.cc:463
#, fuzzy
msgid "replaced meter"
msgstr "sostituisci la regione"
-#: libs/ardour/tempo.cc:482 libs/ardour/tempo.cc:498
+#: libs/ardour/tempo.cc:483 libs/ardour/tempo.cc:499
msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: libs/ardour/tempo.cc:537
+#: libs/ardour/tempo.cc:538
msgid "programming error: unhandled MetricSection type"
msgstr ""
-#: libs/ardour/tempo.cc:1225 libs/ardour/tempo.cc:1237
+#: libs/ardour/tempo.cc:1226 libs/ardour/tempo.cc:1238
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: libs/ardour/tempo.cc:1261
+#: libs/ardour/tempo.cc:1262
msgid "load XML data"
msgstr ""
-#: libs/ardour/utils.cc:242
+#: libs/ardour/utils.cc:246
#, fuzzy
msgid "illegal or badly-formed string used for path (%1)"
msgstr "il percorso indicato per il RAID è non valido o malformato"
-#: libs/ardour/utils.cc:247
+#: libs/ardour/utils.cc:251
#, fuzzy
msgid "path (%1) is ambiguous"
msgstr "il percorso indicato per la ricerca RAID è ambiguo"
-#: libs/ardour/vst_plugin.cc:186
+#: libs/ardour/vst_plugin.cc:187
#, fuzzy
msgid "cannot create VST chunk directory: %1"
msgstr "impossibile creare la cartella sounds \"%1\"; ignorato"
-#: libs/ardour/vst_plugin.cc:194
+#: libs/ardour/vst_plugin.cc:195
#, fuzzy
msgid "cannot check VST chunk directory: %1"
msgstr "impossibile determinare la cartella di lavoro corrente (%1)"
-#: libs/ardour/vst_plugin.cc:201
+#: libs/ardour/vst_plugin.cc:202
msgid "%1 exists but is not a directory"
msgstr ""
-#: libs/ardour/vst_plugin.cc:239
+#: libs/ardour/vst_plugin.cc:240
msgid "Bad node sent to VSTPlugin::set_state"
msgstr ""
-#: libs/ardour/vst_plugin.cc:342 libs/ardour/vst_plugin.cc:353
+#: libs/ardour/vst_plugin.cc:343 libs/ardour/vst_plugin.cc:354
msgid "no support for presets using chunks at this time"
msgstr ""
-#: libs/ardour/coreaudio_source.cc:93
+#: libs/ardour/coreaudio_source.cc:99
#, fuzzy
msgid ""
"CoreAudioSource: file only contains %1 channels; %2 is invalid as a channel "
@@ -2191,17 +2109,116 @@ msgstr ""
"SndFileSource: il file contiene solo %1 canali; %2 non è valido come numero "
"di canale"
-#: libs/ardour/coreaudio_source.cc:157
+#: libs/ardour/coreaudio_source.cc:164
msgid "CoreAudioSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
+#~ msgid "FileSource: \"%1\" not found when searching %2 using %3"
+#~ msgstr "FileSource: \"%1\" non trovato nel cercare %2 utilizzando %3"
+
+#~ msgid "FileSource: could not open \"%1\": (%2)"
+#~ msgstr "FileSource: impossibile aprire \"%1\": (%2)"
+
+#~ msgid "FileSource: cannot write header in %1"
+#~ msgstr "FileSource: impossibile scrivere header in %1"
+
+#~ msgid "FileSource: cannot locate chunks in %1"
+#~ msgstr "FileSource: impossibile trovare spezzoni in %1"
+
+#~ msgid "FileSource: cannot read header in %1"
+#~ msgstr "FileSource: impossibile leggere header in %1"
+
+#~ msgid "FileSource: cannot check header in %1"
+#~ msgstr "FileSource: impossibile controllare header in %1"
+
#, fuzzy
-#~ msgid "cannot create feedback request pipe (%1)"
-#~ msgstr "Errore nel leggere dalla porta MIDI %1"
+#~ msgid "FileSource: cannot initialize peakfile for %1 as %2"
+#~ msgstr "FileSource: impossibile avviare il peakfile per %1"
+
+#~ msgid "FileSource: cannot seek to end of file"
+#~ msgstr "FileSource: impossibile cercare fino alla fine del file"
+
+#~ msgid "FileSource: cannot read RIFF/WAVE chunk from file"
+#~ msgstr "FileSource: impossibile accedere allo spezzone RIFF/WAVE dal file"
+
+#~ msgid "FileSource %1: not a RIFF/WAVE file"
+#~ msgstr "FileSource %1: il file non un file RIFF/WAVE"
+
+#~ msgid "FileSource: can't read a chunk"
+#~ msgstr "FileSource: impossibile accedere ad uno spezzone"
+
+#~ msgid "FileSource: cannot get user information for BWF header (%1)"
+#~ msgstr "FileSource: impossibile otterene info utente dall'header BWF (%1)"
+
+#~ msgid "FileSource[%1]: cannot update data size: %2"
+#~ msgstr "FileSource[%1]: impossibile aggiornare la dimensione dei dati: %2"
+
+#~ msgid "FileSource: can't find RIFF chunk info"
+#~ msgstr "FileSource: impossibile trovare info sullo spezzone RIFF"
#, fuzzy
-#~ msgid "Session: could not create feedback thread"
-#~ msgstr "Sessione: impossibile creare un nuovo route"
+#~ msgid "FileSource: can't find RIFX chunk info"
+#~ msgstr "FileSource: impossibile trovare info sullo spezzone RIFF"
+
+#~ msgid "FileSource: can't read RIFF chunk"
+#~ msgstr "FileSource: impossibile accedere allo spezzone RIFF"
+
+#~ msgid "FileSource: can't find format chunk info"
+#~ msgstr "FileSource: impossibile trovare info sul formato dello spezzone"
+
+#~ msgid "FileSource: can't read format chunk"
+#~ msgstr "FileSource: impossibile leggere il formato dello spezzone"
+
+#~ msgid "FileSource: can't find data chunk info"
+#~ msgstr "FileSource: impossibile trovare info sui dati dello spezzone"
+
+#~ msgid "FileSource: can't read data chunk"
+#~ msgstr "FileSource: impossibile leggere dati dello spezzone"
+
+#~ msgid ""
+#~ "FileSource: cannot read Broadcast Wave data from existing audio file \"%1"
+#~ "\" (%2)"
+#~ msgstr ""
+#~ "FileSource: impossibile leggere dati Broadcast Wave dal file audio "
+#~ "esistente \"%1\" (%2) "
+
+#~ msgid ""
+#~ "FileSource: cannot read Broadcast Wave coding history from audio file \"%1"
+#~ "\" (%2)"
+#~ msgstr ""
+#~ "FileSource: impossibile leggere lo storico del Broadcast Wave dal file "
+#~ "audio \"%1\" (%2)"
+
+#, fuzzy
+#~ msgid ""
+#~ "FileSource \"%1\" does not use valid sample format.\n"
+#~ "This is probably a programming error."
+#~ msgstr ""
+#~ "FileSource \"%1\" non usa il formato floating point.\n"
+#~ "Questo probabilmente un errore di programmazione."
+
+#~ msgid "FileSource \"%1\" has no \"data\" chunk"
+#~ msgstr "FileSource \"%1\" non ha uno spezzone di \"dati\""
+
+#~ msgid ""
+#~ "%1: data length in header (%2) differs from implicit size in file (%3)"
+#~ msgstr ""
+#~ "%1: la lunghezza dei dati nell'header (%2) diversa dalla dimensione "
+#~ "implicita nel file (%3)"
+
+#~ msgid "\"%1\" has a sample rate of %2 instead of %3 as used by this session"
+#~ msgstr ""
+#~ "\"%1\" ha una sample rate di %2 anzicch di %3 come il resto della sessione"
+
+#~ msgid "FileSource: cannot write WAVE chunk: %1"
+#~ msgstr "FileSource: impossibile scrivere lo spezzone WAVE: %1"
+
+#~ msgid "FileSource: cannot write format chunk: %1"
+#~ msgstr "FileSource: impossibile scrivere il formato dello spezzone: %1"
+
+#, fuzzy
+#~ msgid "cannot create feedback request pipe (%1)"
+#~ msgstr "Errore nel leggere dalla porta MIDI %1"
#, fuzzy
#~ msgid "Error on feedback thread request pipe"
@@ -2217,7 +2234,3 @@ msgstr ""
#, fuzzy
#~ msgid "Could not find a template called %1 in %2"
#~ msgstr "Impossibile aprire il modello di mixaggio %1 per leggere"
-
-#, fuzzy
-#~ msgid "Source: cannot stat peakfile \"%1\" or \"%2\""
-#~ msgstr "FileSource: impossibile avviare il peakfile per %1"
diff --git a/libs/ardour/po/ru_RU.po b/libs/ardour/po/ru_RU.po
index e21d70b371..922d304e2d 100644
--- a/libs/ardour/po/ru_RU.po
+++ b/libs/ardour/po/ru_RU.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: libardour 0.716.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2006-04-25 17:46-0400\n"
+"POT-Creation-Date: 2006-06-21 15:09-0400\n"
"PO-Revision-Date: 2004-03-31 00:55+0300\n"
"Last-Translator: Igor Blinov pitstop@nm.ru\n"
"Language-Team: Russian\n"
@@ -14,286 +14,453 @@ msgstr ""
"Content-Type: text/plain; charset=koi8-r\n"
"Content-Transfer-Encoding: 8bit\n"
-#: libs/ardour/audio_library.cc:91
-msgid "channels"
+#: libs/ardour/audio_diskstream.cc:337
+msgid "AudioDiskstream: Session doesn't know about a Playlist called \"%1\""
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:342
+msgid "AudioDiskstream: Playlist \"%1\" isn't an audio playlist"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:433
+msgid "AudioDiskstream %1: there is no existing playlist to make a copy of!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1114 libs/ardour/audio_diskstream.cc:1125
+msgid ""
+"AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1254
+msgid "AudioDiskstream %1: cannot read %2 from playlist at frame %3"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1621 libs/ardour/audio_diskstream.cc:1638
+msgid "AudioDiskstream %1: cannot write to disk"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1698
+msgid "AudioDiskstream \"%1\": cannot flush captured data to disk!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1795
+msgid "%1: could not create region for complete audio file"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1818
+msgid "AudioDiskstream: could not create region for captured audio!"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:1873
+#, fuzzy
+msgid "programmer error: %1"
+msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
+
+#: libs/ardour/audio_diskstream.cc:2145
+msgid "AudioDiskstream: channel %1 out of range"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2170
+msgid "%1:%2 new capture file not initialized correctly"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2403
+msgid "Location \"%1\" not valid for track loop (start >= end)"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2484
+msgid "%1: cannot restore pending capture source file %2"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2506
+msgid "%1: incorrect number of pending sources listed - ignoring them all"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2522
+msgid "%1: cannot create whole-file region from pending capture sources"
+msgstr ""
+
+#: libs/ardour/audio_diskstream.cc:2534
+msgid "%1: cannot create region from pending capture sources"
msgstr ""
#: libs/ardour/audio_library.cc:92
+msgid "channels"
+msgstr ""
+
+#: libs/ardour/audio_library.cc:93
#, fuzzy
msgid "samplerate"
msgstr "ÒÁÚÄÅÌÉÔØ"
-#: libs/ardour/audio_library.cc:93
+#: libs/ardour/audio_library.cc:94
msgid "resolution"
msgstr ""
-#: libs/ardour/audio_library.cc:94
+#: libs/ardour/audio_library.cc:95
msgid "format"
msgstr ""
-#: libs/ardour/audio_library.cc:101
+#: libs/ardour/audio_library.cc:102
msgid "Could not open %1. Audio Library not saved"
msgstr ""
-#: libs/ardour/audio_playlist.cc:52 libs/ardour/audio_playlist.cc:62
-#: libs/ardour/audio_playlist.cc:73 libs/ardour/audio_playlist.cc:120
+#: libs/ardour/audio_playlist.cc:53 libs/ardour/audio_playlist.cc:63
+#: libs/ardour/audio_playlist.cc:74 libs/ardour/audio_playlist.cc:121
#: libs/ardour/insert.cc:76 libs/ardour/insert.cc:95 libs/ardour/insert.cc:120
-#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:38
-#: libs/ardour/send.cc:52 libs/ardour/send.cc:61
-#: libs/ardour/session_state.cc:1620 libs/ardour/session_state.cc:1666
+#: libs/ardour/insert.cc:838 libs/ardour/insert.cc:846 libs/ardour/send.cc:39
+#: libs/ardour/send.cc:53 libs/ardour/send.cc:62
+#: libs/ardour/session_state.cc:1621 libs/ardour/session_state.cc:1667
msgid "initial state"
msgstr ""
-#: libs/ardour/audio_playlist.cc:274 libs/ardour/audio_playlist.cc:768
+#: libs/ardour/audio_playlist.cc:275 libs/ardour/audio_playlist.cc:769
msgid ""
"programming error: non-audio Region passed to remove_overlap in audio "
"playlist"
msgstr ""
-#: libs/ardour/audio_playlist.cc:401
+#: libs/ardour/audio_playlist.cc:402
msgid ""
"programming error: non-audio Region tested for overlap in audio playlist"
msgstr ""
-#: libs/ardour/audio_playlist.cc:877
+#: libs/ardour/audio_playlist.cc:878
msgid "xfade change"
msgstr ""
-#: libs/ardour/audio_playlist.cc:926
+#: libs/ardour/audio_playlist.cc:933
msgid "region modified"
msgstr ""
-#: libs/ardour/audio_track.cc:121 libs/ardour/io.cc:1703
-#: libs/ardour/io.cc:1813
+#: libs/ardour/audio_track.cc:133 libs/ardour/io.cc:1716
+#: libs/ardour/io.cc:1826
msgid "Unknown connection \"%1\" listed for input of %2"
msgstr ""
-#: libs/ardour/audio_track.cc:123 libs/ardour/io.cc:1705
-#: libs/ardour/io.cc:1815
+#: libs/ardour/audio_track.cc:135 libs/ardour/io.cc:1718
+#: libs/ardour/io.cc:1828
msgid "in 1"
msgstr ""
-#: libs/ardour/audio_track.cc:124 libs/ardour/io.cc:1706
-#: libs/ardour/io.cc:1816
+#: libs/ardour/audio_track.cc:136 libs/ardour/io.cc:1719
+#: libs/ardour/io.cc:1829
msgid "No input connections available as a replacement"
msgstr ""
-#: libs/ardour/audio_track.cc:128 libs/ardour/io.cc:1710
-#: libs/ardour/io.cc:1820
+#: libs/ardour/audio_track.cc:140 libs/ardour/io.cc:1723
+#: libs/ardour/io.cc:1833
msgid "Connection %1 was not available - \"in 1\" used instead"
msgstr ""
-#: libs/ardour/audio_track.cc:137 libs/ardour/io.cc:1829
+#: libs/ardour/audio_track.cc:149 libs/ardour/io.cc:1842
msgid "improper input channel list in XML node (%1)"
msgstr ""
-#: libs/ardour/audio_track.cc:182 libs/ardour/audio_track.cc:195
+#: libs/ardour/audio_track.cc:194 libs/ardour/audio_track.cc:207
msgid "AudioTrack: diskstream \"%1\" not known by session"
msgstr ""
-#: libs/ardour/audio_track.cc:293
+#: libs/ardour/audio_track.cc:305
msgid ""
"MIDI rec_enable control specification for %1 is incomplete, so it has been "
"ignored"
msgstr ""
-#: libs/ardour/audio_track.cc:305
+#: libs/ardour/audio_track.cc:317
msgid "programming error: AudioTrack given state without diskstream!"
msgstr ""
-#: libs/ardour/audioengine.cc:147
+#: libs/ardour/audioengine.cc:150
msgid "cannot activate JACK client"
msgstr "ÎÅ ÕÄÁÌÏÓØ ÁËÔÉ×ÉÒÏ×ÁÔØ ËÌÉÅÎÔÁ JACK ÓÅÒ×ÅÒÁ"
-#: libs/ardour/audioengine.cc:432
+#: libs/ardour/audioengine.cc:401
msgid "register audio input port called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:463
+#: libs/ardour/audioengine.cc:432
msgid "register audio output port called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:524
+#: libs/ardour/audioengine.cc:493
msgid "connect called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:540
+#: libs/ardour/audioengine.cc:509
msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
msgstr ""
-#: libs/ardour/audioengine.cc:553 libs/ardour/audioengine.cc:582
+#: libs/ardour/audioengine.cc:522 libs/ardour/audioengine.cc:551
msgid "disconnect called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:640
+#: libs/ardour/audioengine.cc:609
msgid "get_port_by_name() called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:673
+#: libs/ardour/audioengine.cc:642
msgid "get_ports called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:748
+#: libs/ardour/audioengine.cc:717
msgid "get_nth_physical called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:776
+#: libs/ardour/audioengine.cc:745
msgid "get_port_total_latency() called with no JACK client connection"
msgstr ""
-#: libs/ardour/audioengine.cc:782
+#: libs/ardour/audioengine.cc:751
msgid "get_port_total_latency() called before engine was started"
msgstr ""
-#: libs/ardour/audioengine.cc:906
+#: libs/ardour/audioengine.cc:875
msgid "Unable to connect to JACK server"
msgstr ""
-#: libs/ardour/audioengine.cc:909
+#: libs/ardour/audioengine.cc:878
msgid "Could not connect to JACK server as \"%1\""
msgstr ""
-#: libs/ardour/audioengine.cc:914
+#: libs/ardour/audioengine.cc:883
msgid "JACK server started"
msgstr ""
-#: libs/ardour/audioengine.cc:948
+#: libs/ardour/audioengine.cc:917
msgid "cannot shutdown connection to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:973
+#: libs/ardour/audioengine.cc:942
msgid "failed to connect to JACK"
msgstr ""
-#: libs/ardour/audioengine.cc:989
+#: libs/ardour/audioengine.cc:958
msgid "could not reregister %1"
msgstr ""
-#: libs/ardour/audioengine.cc:1046
+#: libs/ardour/audioengine.cc:1015
msgid "could not reconnect %1 and %2 (err = %3)"
msgstr ""
-#: libs/ardour/audiofilter.cc:44
+#: libs/ardour/audiofilesource.cc:445 libs/ardour/session_state.cc:3095
+msgid ""
+"there are already 1000 files with names like %1; versioning discontinued"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:459 libs/ardour/session_state.cc:3109
+msgid "cannot rename audio file source from %1 to %2 (%3)"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:466 libs/ardour/session_state.cc:3124
+msgid "cannot remove peakfile %1 for %2 (%3)"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:510
+msgid "FileSource: search path not set"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:534
+msgid ""
+"FileSource: \"%1\" is ambigous when searching %2\n"
+"\t"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:540
+msgid "Filesource: cannot find required file (%1): while searching %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:563
+msgid "Filesource: cannot find required file (%1): %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:568
+msgid "Filesource: cannot check for existing file (%1): %2"
+msgstr ""
+
+#: libs/ardour/audiofilesource.cc:640 libs/ardour/insert.cc:525
+#: libs/ardour/sndfilesource.cc:112
+#, fuzzy
+msgid "programming error: %1"
+msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
+
+#: libs/ardour/audiofilesource.cc:645
+msgid "cannot rename audio file for %1 to %2"
+msgstr ""
+
+#: libs/ardour/audiofilter.cc:45
msgid "audiofilter: error creating name for new audio file based on %1"
msgstr ""
-#: libs/ardour/audiofilter.cc:54
+#: libs/ardour/audiofilter.cc:58
msgid "audiofilter: error creating new audio file %1 (%2)"
msgstr ""
-#: libs/ardour/audioregion.cc:855 libs/ardour/audioregion.cc:917
+#: libs/ardour/audioregion.cc:857 libs/ardour/audioregion.cc:919
msgid "fade in change"
msgstr ""
-#: libs/ardour/audioregion.cc:1341
+#: libs/ardour/audioregion.cc:1349
#, c-format
msgid "normalized to %.2fdB"
msgstr ""
-#: libs/ardour/audioregion.cc:1359
+#: libs/ardour/audioregion.cc:1367
msgid "envelope change"
msgstr ""
-#: libs/ardour/automation_event.cc:64 libs/ardour/location.cc:344
-#: libs/ardour/tempo.cc:225
+#: libs/ardour/audiosource.cc:143
+msgid "poll on peak request pipe failed (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:150
+msgid "Error on peak thread request pipe"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:183
+msgid "Error reading from peak request pipe"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:215 libs/ardour/session_butler.cc:80
+#: libs/ardour/session_midi.cc:1183
+msgid "Cannot create transport request signal pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:220 libs/ardour/audiosource.cc:225
+msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:230
+msgid "AudioSource: could not create peak thread"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:308
+msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:350
+#, fuzzy
+msgid "AudioSource: cannot stat peakfile \"%1\""
+msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÏÌØÚÏ×ÁÔÅÌÑ \"%1\""
+
+#: libs/ardour/audiosource.cc:451
+msgid "cannot read sample data for unscaled peak computation"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:472 libs/ardour/audiosource.cc:543
+#: libs/ardour/audiosource.cc:787 libs/ardour/audiosource.cc:878
+#, fuzzy
+msgid "AudioSource: cannot open peakpath \"%1\" (%2)"
+msgstr "LADSPA: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÍÏÄÕÌØ \"%1\" (%2)"
+
+#: libs/ardour/audiosource.cc:644
+msgid "AudioSource[%1]: peak read - cannot read %2 samples at offset %3"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:798
+msgid "%1: could not write read raw data for peak computation (%2)"
+msgstr ""
+
+#: libs/ardour/audiosource.cc:823
+msgid "%1: could not write peak file data (%2)"
+msgstr ""
+
+#: libs/ardour/automation_event.cc:65 libs/ardour/location.cc:345
+#: libs/ardour/tempo.cc:226
msgid "initial"
msgstr ""
-#: libs/ardour/automation_event.cc:231
+#: libs/ardour/automation_event.cc:232
msgid "cleared"
msgstr ""
-#: libs/ardour/automation_event.cc:403
+#: libs/ardour/automation_event.cc:404
msgid "added event"
msgstr ""
-#: libs/ardour/automation_event.cc:420
+#: libs/ardour/automation_event.cc:421
#, fuzzy
msgid "removed event"
msgstr "ÕÄÁÌÉÔØ ÏÂÌÁÓÔØ"
-#: libs/ardour/automation_event.cc:435
+#: libs/ardour/automation_event.cc:436
msgid "removed multiple events"
msgstr ""
-#: libs/ardour/automation_event.cc:461
+#: libs/ardour/automation_event.cc:467 libs/ardour/automation_event.cc:498
#, fuzzy
msgid "removed range"
msgstr "ÕÄÁÌÉÔØ ÏÂÌÁÓÔØ"
-#: libs/ardour/automation_event.cc:491
+#: libs/ardour/automation_event.cc:528
msgid "event range adjusted"
msgstr ""
-#: libs/ardour/automation_event.cc:513
+#: libs/ardour/automation_event.cc:550
msgid "event adjusted"
msgstr ""
-#: libs/ardour/automation_event.cc:628 libs/ardour/automation_event.cc:733
-#: libs/ardour/panner.cc:1040
+#: libs/ardour/automation_event.cc:665 libs/ardour/automation_event.cc:770
+#: libs/ardour/panner.cc:1041
#, fuzzy
msgid "programming error:"
msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
-#: libs/ardour/automation_event.cc:1042
+#: libs/ardour/automation_event.cc:1079
msgid "cut/copy/clear"
msgstr ""
-#: libs/ardour/automation_event.cc:1075
+#: libs/ardour/automation_event.cc:1112
msgid "copy"
msgstr ""
-#: libs/ardour/automation_event.cc:1143 libs/ardour/playlist.cc:939
+#: libs/ardour/automation_event.cc:1180 libs/ardour/playlist.cc:939
msgid "paste"
msgstr "×ÓÔÁ×ÉÔØ"
-#: libs/ardour/automation_event.cc:1198
+#: libs/ardour/automation_event.cc:1235
msgid ""
"automation list: no x-coordinate stored for control point (point ignored)"
msgstr ""
-#: libs/ardour/automation_event.cc:1204
+#: libs/ardour/automation_event.cc:1241
msgid ""
"automation list: no y-coordinate stored for control point (point ignored)"
msgstr ""
-#: libs/ardour/basic_ui.cc:68
-msgid "unnamed"
-msgstr ""
-
-#: libs/ardour/configuration.cc:79
+#: libs/ardour/configuration.cc:80
#, fuzzy
msgid "loading system configuration file %1"
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÒÏÇÒÁÍÍÙ \"%1\""
-#: libs/ardour/configuration.cc:82
+#: libs/ardour/configuration.cc:83
msgid "Ardour: cannot read system configuration file \"%1\""
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÒÏÇÒÁÍÍÙ \"%1\""
-#: libs/ardour/configuration.cc:87
+#: libs/ardour/configuration.cc:88
msgid "Ardour: system configuration file \"%1\" not loaded successfully."
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÒÏÇÒÁÍÍÙ \"%1\"."
-#: libs/ardour/configuration.cc:104
+#: libs/ardour/configuration.cc:105
#, fuzzy
msgid "loading user configuration file %1"
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÏÌØÚÏ×ÁÔÅÌÑ \"%1\""
-#: libs/ardour/configuration.cc:107
+#: libs/ardour/configuration.cc:108
msgid "Ardour: cannot read configuration file \"%1\""
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÏÌØÚÏ×ÁÔÅÌÑ \"%1\""
-#: libs/ardour/configuration.cc:112
+#: libs/ardour/configuration.cc:113
#, fuzzy
msgid "Ardour: user configuration file \"%1\" not loaded successfully."
msgstr "Ardour: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÐÏÌØÚÏ×ÁÔÅÌÑ \"%1\"."
-#: libs/ardour/configuration.cc:136
+#: libs/ardour/configuration.cc:137
#, fuzzy
msgid "Config file %1 not saved"
msgstr "æÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ ÎÅ ÓÏÈÒÁΣÎ"
-#: libs/ardour/configuration.cc:209
+#: libs/ardour/configuration.cc:210
msgid "ill-formed MIDI port specification in ardour rcfile (ignored)"
msgstr ""
@@ -305,28 +472,40 @@ msgstr ""
msgid "Node for Connection has no \"connections\" property"
msgstr ""
-#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1889
+#: libs/ardour/connection.cc:227 libs/ardour/io.cc:1902
msgid "IO: badly formed string in XML node for inputs \"%1\""
msgstr ""
-#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1894
+#: libs/ardour/connection.cc:232 libs/ardour/io.cc:1907
msgid "bad input string in XML node \"%1\""
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:79
+#: libs/ardour/control_protocol_manager.cc:80
msgid "control protocol name \"%1\" has no descriptor"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:84
+#: libs/ardour/control_protocol_manager.cc:85
msgid "control protocol name \"%1\" could not be initialized"
msgstr ""
-#: libs/ardour/control_protocol_manager.cc:180
+#: libs/ardour/control_protocol_manager.cc:141
+msgid "Instantiating mandatory control protocol %1"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:175
+msgid "Control protocol %1 not usable"
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:187
+msgid "Control surface protocol discovered: \"%1\""
+msgstr ""
+
+#: libs/ardour/control_protocol_manager.cc:205
#, fuzzy
msgid "ControlProtocolManager: cannot load module \"%1\" (%2)"
msgstr "LADSPA: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÍÏÄÕÌØ \"%1\" (%2)"
-#: libs/ardour/control_protocol_manager.cc:188
+#: libs/ardour/control_protocol_manager.cc:213
msgid "ControlProtocolManager: module \"%1\" has no descriptor function."
msgstr ""
@@ -354,343 +533,100 @@ msgstr ""
msgid "old-style crossfade information - no position information"
msgstr ""
-#: libs/ardour/curve.cc:112 libs/ardour/insert.cc:454
-#: libs/ardour/session.cc:2452 libs/ardour/session.cc:2504
+#: libs/ardour/curve.cc:112 libs/ardour/globals.cc:340
+#: libs/ardour/insert.cc:454 libs/ardour/session.cc:2466
+#: libs/ardour/session.cc:2518
msgid "programming error: "
msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
-#: libs/ardour/cycle_timer.cc:35
+#: libs/ardour/cycle_timer.cc:37
msgid "CycleTimer::get_mhz(): can't open /proc/cpuinfo"
msgstr ""
-#: libs/ardour/cycle_timer.cc:47
+#: libs/ardour/cycle_timer.cc:49
msgid "CycleTimer::get_mhz(): cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: libs/ardour/cycle_timer.cc:70
+#: libs/ardour/cycle_timer.cc:72
msgid "cannot locate cpu MHz in /proc/cpuinfo"
msgstr ""
-#: libs/ardour/destructive_filesource.cc:197
+#: libs/ardour/destructive_filesource.cc:188
msgid "DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"
msgstr ""
-#: libs/ardour/destructive_filesource.cc:210
-#: libs/ardour/destructive_filesource.cc:252
-#: libs/ardour/destructive_filesource.cc:259
+#: libs/ardour/destructive_filesource.cc:201
+#: libs/ardour/destructive_filesource.cc:243
+#: libs/ardour/destructive_filesource.cc:250
msgid "DestructiveFileSource: \"%1\" bad write (%2)"
msgstr ""
-#: libs/ardour/diskstream.cc:337
-msgid "DiskStream: Session doesn't know about a Playlist called \"%1\""
-msgstr ""
-
-#: libs/ardour/diskstream.cc:342
-msgid "DiskStream: Playlist \"%1\" isn't an audio playlist"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:433
-msgid "DiskStream %1: there is no existing playlist to make a copy of!"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1113 libs/ardour/diskstream.cc:1124
-msgid "DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1256
-msgid "DiskStream %1: cannot read %2 from playlist at frame %3"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1623 libs/ardour/diskstream.cc:1640
-msgid "DiskStream %1: cannot write to disk"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1700
-msgid "DiskStream \"%1\": cannot flush captured data to disk!"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1797
-msgid "%1: could not create region for complete audio file"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1820
-msgid "DiskStream: could not create region for captured audio!"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:1875
-#, fuzzy
-msgid "programmer error: %1"
-msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
-
-#: libs/ardour/diskstream.cc:2155
-msgid "DiskStream: channel %1 out of range"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2180
-msgid "%1:%2 new capture file not initialized correctly"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2413
-msgid "Location \"%1\" not valid for track loop (start >= end)"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2491
-msgid "%1: cannot restore pending capture source file %2"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2513
-msgid "%1: incorrect number of pending sources listed - ignoring them all"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2529
-msgid "%1: cannot create whole-file region from pending capture sources"
-msgstr ""
-
-#: libs/ardour/diskstream.cc:2541
-msgid "%1: cannot create region from pending capture sources"
-msgstr ""
-
-#: libs/ardour/filesource.cc:175
-msgid "FileSource: search path not set"
-msgstr ""
-
-#: libs/ardour/filesource.cc:190
-msgid "FileSource: \"%1\" not found when searching %2 using %3"
-msgstr ""
-
-#: libs/ardour/filesource.cc:196
-msgid ""
-"FileSource: \"%1\" is ambigous when searching %2\n"
-"\t"
-msgstr ""
-
-#: libs/ardour/filesource.cc:231
-msgid "Filesource: cannot find required file (%1): %2"
-msgstr ""
-
-#: libs/ardour/filesource.cc:239
-msgid "Filesource: cannot check for existing file (%1): %2"
-msgstr ""
-
-#: libs/ardour/filesource.cc:245 libs/ardour/filesource.cc:1127
-#: libs/ardour/filesource.cc:1210
-msgid "FileSource: could not open \"%1\": (%2)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:278
-msgid "FileSource: cannot write header in %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:293
-msgid "FileSource: cannot locate chunks in %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:298
-msgid "FileSource: cannot read header in %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:303
-msgid "FileSource: cannot check header in %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:311
-msgid "FileSource: cannot initialize peakfile for %1 as %2"
-msgstr ""
-
-#: libs/ardour/filesource.cc:359 libs/ardour/insert.cc:525
-#, fuzzy
-msgid "programming error: %1"
-msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
-
-#: libs/ardour/filesource.cc:364
-msgid "cannot rename audio file for %1 to %2"
-msgstr ""
-
-#: libs/ardour/filesource.cc:390
-msgid "FileSource: cannot seek to end of file"
-msgstr ""
-
-#: libs/ardour/filesource.cc:395
-msgid "FileSource: cannot read RIFF/WAVE chunk from file"
-msgstr ""
-
-#: libs/ardour/filesource.cc:407
-msgid "FileSource %1: not a RIFF/WAVE file"
-msgstr ""
-
-#: libs/ardour/filesource.cc:434
-msgid "FileSource: can't read a chunk"
-msgstr ""
-
-#: libs/ardour/filesource.cc:451
-msgid "filesource: correcting mis-written RIFF file to become a RIFX: "
-msgstr ""
-
-#: libs/ardour/filesource.cc:567
-msgid "FileSource: cannot get user information for BWF header (%1)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:571
-msgid "FileSource: cannot get host information for BWF header (%1)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:716
-msgid "FileSource[%1]: cannot update data size: %2"
-msgstr ""
-
-#: libs/ardour/filesource.cc:733
-msgid "FileSource: can't find RIFF chunk info"
-msgstr ""
-
-#: libs/ardour/filesource.cc:737
-msgid "FileSource: can't find RIFX chunk info"
-msgstr ""
-
-#: libs/ardour/filesource.cc:758
-msgid "FileSource: can't read RIFF chunk"
-msgstr ""
-
-#: libs/ardour/filesource.cc:768
-msgid "FileSource: can't find format chunk info"
-msgstr ""
-
-#: libs/ardour/filesource.cc:773
-msgid "FileSource: can't read format chunk"
-msgstr ""
-
-#: libs/ardour/filesource.cc:782
-msgid "FileSource: can't find data chunk info"
-msgstr ""
-
-#: libs/ardour/filesource.cc:787
-msgid "FileSource: can't read data chunk"
-msgstr ""
-
-#: libs/ardour/filesource.cc:804
-msgid ""
-"FileSource: cannot read Broadcast Wave data from existing audio file \"%1"
-"\" (%2)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:820
-msgid ""
-"FileSource: cannot read Broadcast Wave coding history from audio file \"%1"
-"\" (%2)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:862
-msgid ""
-"FileSource \"%1\" does not use valid sample format.\n"
-"This is probably a programming error."
-msgstr ""
-
-#: libs/ardour/filesource.cc:901
-msgid "FileSource \"%1\" has no \"data\" chunk"
-msgstr ""
-
-#: libs/ardour/filesource.cc:906
-msgid "%1: data length in header (%2) differs from implicit size in file (%3)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:911
-msgid "\"%1\" has a sample rate of %2 instead of %3 as used by this session"
-msgstr ""
-
-#: libs/ardour/filesource.cc:934
-msgid "FileSource: cannot write WAVE chunk: %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:978
-msgid "FileSource: cannot write format chunk: %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:990
-msgid "FileSource: cannot data chunk: %1"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1103 libs/ardour/filesource.cc:1188
-msgid "FileSource: \"%1\" bad write (%2)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1335 libs/ardour/session_state.cc:3093
-msgid ""
-"there are already 1000 files with names like %1; versioning discontinued"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1349 libs/ardour/session_state.cc:3107
-msgid "cannot rename audio file source from %1 to %2 (%3)"
-msgstr ""
-
-#: libs/ardour/filesource.cc:1356 libs/ardour/session_state.cc:3122
-msgid "cannot remove peakfile %1 for %2 (%3)"
-msgstr ""
-
-#: libs/ardour/globals.cc:82
+#: libs/ardour/globals.cc:109
msgid "no MIDI ports specified: no MMC or MTC control possible"
msgstr ""
-#: libs/ardour/globals.cc:97
+#: libs/ardour/globals.cc:124
msgid "MIDI port specifications for \"%1\" are not understandable."
msgstr ""
-#: libs/ardour/globals.cc:110 libs/ardour/globals.cc:114
-#: libs/ardour/globals.cc:118
+#: libs/ardour/globals.cc:137 libs/ardour/globals.cc:141
+#: libs/ardour/globals.cc:145
msgid "default"
msgstr ""
-#: libs/ardour/globals.cc:146
+#: libs/ardour/globals.cc:173
msgid "No MMC control (MIDI port \"%1\" not available)"
msgstr ""
-#: libs/ardour/globals.cc:152
+#: libs/ardour/globals.cc:179
msgid "No MTC support (MIDI port \"%1\" not available)"
msgstr ""
-#: libs/ardour/globals.cc:157
+#: libs/ardour/globals.cc:184
msgid "No MIDI parameter support (MIDI port \"%1\" not available)"
msgstr ""
-#: libs/ardour/import.cc:71
+#: libs/ardour/import.cc:75
msgid "Import: cannot open input sound file \"%1\""
msgstr ""
-#: libs/ardour/import.cc:76
+#: libs/ardour/import.cc:80
msgid "resampling audio"
msgstr ""
-#: libs/ardour/import.cc:80
+#: libs/ardour/import.cc:84
msgid "Import: cannot open converted sound file \"%1\""
msgstr ""
-#: libs/ardour/import.cc:85
+#: libs/ardour/import.cc:89
msgid "Import: error while resampling sound file \"%1\""
msgstr ""
-#: libs/ardour/import.cc:141
+#: libs/ardour/import.cc:148
msgid "Session::import_audiofile: cannot open new file source for channel %1"
msgstr ""
-#: libs/ardour/import.cc:160
+#: libs/ardour/import.cc:167
msgid "converting audio"
msgstr ""
-#: libs/ardour/import.cc:192
+#: libs/ardour/import.cc:199
msgid "building region"
msgstr ""
-#: libs/ardour/import.cc:194
+#: libs/ardour/import.cc:201
msgid "building regions"
msgstr ""
-#: libs/ardour/import.cc:318
+#: libs/ardour/import.cc:325
msgid "Import: could not open temp file: %1"
msgstr ""
-#: libs/ardour/import.cc:327
+#: libs/ardour/import.cc:334
msgid "Import: src_new() failed : %1"
msgstr ""
-#: libs/ardour/import.cc:355
+#: libs/ardour/import.cc:362
msgid "Import: %1"
msgstr "éÍÐÏÒÔ: %1"
@@ -744,278 +680,278 @@ msgstr ""
msgid "non-port insert XML used for port plugin insert"
msgstr ""
-#: libs/ardour/io.cc:585
+#: libs/ardour/io.cc:598
msgid "IO: cannot disconnect input port %1 from %2"
msgstr ""
-#: libs/ardour/io.cc:653
+#: libs/ardour/io.cc:666
msgid "IO: cannot disconnect output port %1 from %2"
msgstr ""
-#: libs/ardour/io.cc:794 libs/ardour/io.cc:1138 libs/ardour/io.cc:1264
+#: libs/ardour/io.cc:807 libs/ardour/io.cc:1151 libs/ardour/io.cc:1277
#, c-format
msgid "%s/out"
msgstr ""
-#: libs/ardour/io.cc:796 libs/ardour/io.cc:1140 libs/ardour/io.cc:1266
-#: libs/ardour/io.cc:2826
+#: libs/ardour/io.cc:809 libs/ardour/io.cc:1153 libs/ardour/io.cc:1279
+#: libs/ardour/io.cc:2849
#, c-format
msgid "%s/out %u"
msgstr ""
-#: libs/ardour/io.cc:800 libs/ardour/io.cc:1145 libs/ardour/io.cc:1270
+#: libs/ardour/io.cc:813 libs/ardour/io.cc:1158 libs/ardour/io.cc:1283
msgid "IO: cannot register output port %1"
msgstr ""
-#: libs/ardour/io.cc:895 libs/ardour/io.cc:998 libs/ardour/io.cc:1104
+#: libs/ardour/io.cc:908 libs/ardour/io.cc:1011 libs/ardour/io.cc:1117
#, c-format
msgid "%s/in"
msgstr ""
-#: libs/ardour/io.cc:897 libs/ardour/io.cc:1001 libs/ardour/io.cc:1107
-#: libs/ardour/io.cc:2796
+#: libs/ardour/io.cc:910 libs/ardour/io.cc:1014 libs/ardour/io.cc:1120
+#: libs/ardour/io.cc:2819
#, c-format
msgid "%s/in %u"
msgstr ""
-#: libs/ardour/io.cc:901 libs/ardour/io.cc:1007 libs/ardour/io.cc:1112
+#: libs/ardour/io.cc:914 libs/ardour/io.cc:1020 libs/ardour/io.cc:1125
msgid "IO: cannot register input port %1"
msgstr ""
-#: libs/ardour/io.cc:1528
+#: libs/ardour/io.cc:1541
msgid "IO::connecting_became_legal() called without a pending state node"
msgstr ""
-#: libs/ardour/io.cc:1551
+#: libs/ardour/io.cc:1564
msgid "IO::ports_became_legal() called without a pending state node"
msgstr ""
-#: libs/ardour/io.cc:1581
+#: libs/ardour/io.cc:1594
msgid "incorrect XML node \"%1\" passed to IO object"
msgstr ""
-#: libs/ardour/io.cc:1636
+#: libs/ardour/io.cc:1649
msgid ""
"MIDI gain control specification for %1 is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/io.cc:1726 libs/ardour/io.cc:1838
+#: libs/ardour/io.cc:1739 libs/ardour/io.cc:1851
msgid "Unknown connection \"%1\" listed for output of %2"
msgstr ""
-#: libs/ardour/io.cc:1728 libs/ardour/io.cc:1840
+#: libs/ardour/io.cc:1741 libs/ardour/io.cc:1853
msgid "out 1"
msgstr ""
-#: libs/ardour/io.cc:1729 libs/ardour/io.cc:1841
+#: libs/ardour/io.cc:1742 libs/ardour/io.cc:1854
msgid "No output connections available as a replacement"
msgstr ""
-#: libs/ardour/io.cc:1733 libs/ardour/io.cc:1845
+#: libs/ardour/io.cc:1746 libs/ardour/io.cc:1858
msgid "Connection %1 was not available - \"out 1\" used instead"
msgstr ""
-#: libs/ardour/io.cc:1747
+#: libs/ardour/io.cc:1760
msgid "%1: cannot create I/O ports"
msgstr ""
-#: libs/ardour/io.cc:1854
+#: libs/ardour/io.cc:1867
msgid "improper output channel list in XML node (%1)"
msgstr ""
-#: libs/ardour/io.cc:1939
+#: libs/ardour/io.cc:1952
msgid "IO: badly formed string in XML node for outputs \"%1\""
msgstr ""
-#: libs/ardour/io.cc:1944
+#: libs/ardour/io.cc:1957
msgid "IO: bad output string in XML node \"%1\""
msgstr ""
-#: libs/ardour/io.cc:2502
+#: libs/ardour/io.cc:2525
msgid "%1: could not open automation event file \"%2\""
msgstr ""
-#: libs/ardour/io.cc:2541
+#: libs/ardour/io.cc:2564
msgid "%1: cannot open automation event file \"%2\""
msgstr ""
-#: libs/ardour/io.cc:2556
+#: libs/ardour/io.cc:2579
msgid "badly formed version number in automation event file \"%1\""
msgstr ""
-#: libs/ardour/io.cc:2560
+#: libs/ardour/io.cc:2583
msgid "no version information in automation event file \"%1\""
msgstr ""
-#: libs/ardour/io.cc:2565
+#: libs/ardour/io.cc:2588
msgid "mismatched automation event file version (%1)"
msgstr ""
-#: libs/ardour/io.cc:2573
+#: libs/ardour/io.cc:2596
msgid "badly formatted automation event record at line %1 of %2 (ignored)"
msgstr ""
-#: libs/ardour/io.cc:2593
+#: libs/ardour/io.cc:2616
msgid "dubious automation event found (and ignored)"
msgstr ""
-#: libs/ardour/io.cc:2597 libs/ardour/panner.cc:437
+#: libs/ardour/io.cc:2620 libs/ardour/panner.cc:438
#: libs/ardour/redirect.cc:148
msgid "loaded from disk"
msgstr ""
-#: libs/ardour/io.cc:2768
+#: libs/ardour/io.cc:2791
msgid "automation write/touch"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:86
+#: libs/ardour/ladspa_plugin.cc:87
msgid "LADSPA: module has no descriptor function."
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:91
+#: libs/ardour/ladspa_plugin.cc:92
msgid "LADSPA: plugin has gone away since discovery!"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:98
+#: libs/ardour/ladspa_plugin.cc:99
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:328
+#: libs/ardour/ladspa_plugin.cc:329
msgid ""
"illegal parameter number used with plugin \"%1\". This mayindicate a change "
"in the plugin design, and presets may beinvalid"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:429
+#: libs/ardour/ladspa_plugin.cc:430
msgid "Bad node sent to LadspaPlugin::set_state"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:442
+#: libs/ardour/ladspa_plugin.cc:443
msgid "LADSPA: no ladspa port number"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:448
+#: libs/ardour/ladspa_plugin.cc:449
msgid "LADSPA: no ladspa port data"
msgstr ""
-#: libs/ardour/ladspa_plugin.cc:497
+#: libs/ardour/ladspa_plugin.cc:498
msgid ""
"LADSPA LadspaPlugin MIDI control specification for port %1 is incomplete, so "
"it has been ignored"
msgstr ""
-#: libs/ardour/location.cc:268
+#: libs/ardour/location.cc:269
msgid "incorrect XML node passed to Location::set_state"
msgstr ""
-#: libs/ardour/location.cc:275
+#: libs/ardour/location.cc:276
msgid "XML node for Location has no name information"
msgstr ""
-#: libs/ardour/location.cc:282
+#: libs/ardour/location.cc:283
msgid "XML node for Location has no start information"
msgstr ""
-#: libs/ardour/location.cc:293
+#: libs/ardour/location.cc:294
msgid "XML node for Location has no end information"
msgstr ""
-#: libs/ardour/location.cc:302
+#: libs/ardour/location.cc:303
msgid "XML node for Location has no flags information"
msgstr ""
-#: libs/ardour/location.cc:390
+#: libs/ardour/location.cc:391
msgid "Locations: attempt to use unknown location as selected location"
msgstr ""
-#: libs/ardour/location.cc:417 libs/ardour/playlist.cc:1187
+#: libs/ardour/location.cc:418 libs/ardour/playlist.cc:1187
msgid "clear"
msgstr ""
-#: libs/ardour/location.cc:442
+#: libs/ardour/location.cc:443
msgid "clear markers"
msgstr ""
-#: libs/ardour/location.cc:470
+#: libs/ardour/location.cc:471
msgid "clear ranges"
msgstr ""
-#: libs/ardour/location.cc:488
+#: libs/ardour/location.cc:489
msgid "add"
msgstr "ÄÏÂÁ×ÉÔØ"
-#: libs/ardour/location.cc:526
+#: libs/ardour/location.cc:527
msgid "remove"
msgstr "ÕÄÁÌÉÔØ"
-#: libs/ardour/location.cc:566
+#: libs/ardour/location.cc:567
msgid "incorrect XML mode passed to Locations::set_state"
msgstr ""
-#: libs/ardour/mtc_slave.cc:195
+#: libs/ardour/mtc_slave.cc:196
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr ""
-#: libs/ardour/named_selection.cc:76
+#: libs/ardour/named_selection.cc:77
msgid "Chunk %1 uses an unknown playlist \"%2\""
msgstr ""
-#: libs/ardour/named_selection.cc:79
+#: libs/ardour/named_selection.cc:80
msgid "Chunk %1 contains misformed playlist information"
msgstr ""
-#: libs/ardour/panner.cc:255
+#: libs/ardour/panner.cc:256
msgid "MIDI pan control specification is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/panner.cc:360
+#: libs/ardour/panner.cc:361
msgid "automation write pass"
msgstr ""
-#: libs/ardour/panner.cc:400
+#: libs/ardour/panner.cc:401
#, c-format
msgid "error writing pan automation file (%s)"
msgstr ""
-#: libs/ardour/panner.cc:428
+#: libs/ardour/panner.cc:429
msgid ""
"badly formatted pan automation event record at line %1 of %2 (ignored) [%3]"
msgstr ""
-#: libs/ardour/panner.cc:943
+#: libs/ardour/panner.cc:944
msgid "badly-formed positional data for Multi2dPanner - ignored"
msgstr ""
-#: libs/ardour/panner.cc:1236
+#: libs/ardour/panner.cc:1237
msgid "cannot open pan automation file \"%1\" for saving (%s)"
msgstr ""
-#: libs/ardour/panner.cc:1272
+#: libs/ardour/panner.cc:1273
msgid "cannot open pan automation file %1 (%2)"
msgstr ""
-#: libs/ardour/panner.cc:1285
+#: libs/ardour/panner.cc:1286
msgid "badly formed version number in pan automation event file \"%1\""
msgstr ""
-#: libs/ardour/panner.cc:1289
+#: libs/ardour/panner.cc:1290
msgid ""
"no version information in pan automation event file \"%1\" (first line = %2)"
msgstr ""
-#: libs/ardour/panner.cc:1295
+#: libs/ardour/panner.cc:1296
msgid "mismatched pan automation event file version (%1)"
msgstr ""
-#: libs/ardour/panner.cc:1309
+#: libs/ardour/panner.cc:1310
msgid "too many panner states found in pan automation file %1"
msgstr ""
-#: libs/ardour/panner.cc:1450
+#: libs/ardour/panner.cc:1451
msgid "Unknown panner plugin \"%1\" found in pan state - ignored"
msgstr ""
-#: libs/ardour/panner.cc:1456
+#: libs/ardour/panner.cc:1457
msgid "panner plugin node has no type information!"
msgstr ""
@@ -1067,62 +1003,62 @@ msgstr ""
msgid "nudged"
msgstr ""
-#: libs/ardour/playlist_factory.cc:26 libs/ardour/playlist_factory.cc:41
+#: libs/ardour/playlist_factory.cc:49 libs/ardour/playlist_factory.cc:64
msgid ""
"programming error: Playlist::createRegion called with unknown Region type"
msgstr ""
-#: libs/ardour/playlist_factory.cc:63
+#: libs/ardour/playlist_factory.cc:86
msgid ""
"programming error: Playlist::copyPlaylist called with unknown Playlist type"
msgstr ""
-#: libs/ardour/plugin.cc:327
+#: libs/ardour/plugin.cc:328
msgid "Could not locate HOME. Preset not saved."
msgstr ""
-#: libs/ardour/plugin.cc:337 libs/ardour/plugin.cc:343
+#: libs/ardour/plugin.cc:338 libs/ardour/plugin.cc:344
msgid "Could not create %1. Preset not saved. (%2)"
msgstr ""
-#: libs/ardour/plugin.cc:348
+#: libs/ardour/plugin.cc:349
msgid "Error saving presets file %1."
msgstr ""
-#: libs/ardour/plugin_manager.cc:193
+#: libs/ardour/plugin_manager.cc:194
msgid "Could not parse rdf file: %1"
msgstr ""
-#: libs/ardour/plugin_manager.cc:234
+#: libs/ardour/plugin_manager.cc:235
msgid "LADSPA: cannot load module \"%1\" (%2)"
msgstr "LADSPA: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÍÏÄÕÌØ \"%1\" (%2)"
-#: libs/ardour/plugin_manager.cc:241
+#: libs/ardour/plugin_manager.cc:242
msgid "LADSPA: module \"%1\" has no descriptor function."
msgstr ""
-#: libs/ardour/plugin_manager.cc:296
+#: libs/ardour/plugin_manager.cc:297
#, fuzzy
msgid "VST: cannot load module from \"%1\""
msgstr "LADSPA: ÎÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÍÏÄÕÌØ \"%1\" (%2)"
-#: libs/ardour/plugin_manager.cc:301
+#: libs/ardour/plugin_manager.cc:302
msgid "You asked ardour to not use any VST plugins"
msgstr ""
-#: libs/ardour/plugin_manager.cc:304
+#: libs/ardour/plugin_manager.cc:305
msgid "This version of ardour has no support for VST plugins"
msgstr ""
-#: libs/ardour/plugin_manager.cc:311
+#: libs/ardour/plugin_manager.cc:312
msgid "LADSPA: cannot load module from \"%1\""
msgstr ""
-#: libs/ardour/plugin_manager.cc:373 libs/ardour/plugin_manager.cc:385
+#: libs/ardour/plugin_manager.cc:374 libs/ardour/plugin_manager.cc:386
msgid "Unknown"
msgstr ""
-#: libs/ardour/plugin_manager.cc:463
+#: libs/ardour/plugin_manager.cc:464
msgid ""
"VST plugin %1 does not support processReplacing, and so cannot be used in "
"ardour at this time"
@@ -1136,11 +1072,11 @@ msgstr ""
msgid "programming error: unknown Redirect type in Redirect::Clone!\n"
msgstr ""
-#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:199
+#: libs/ardour/redirect.cc:102 libs/ardour/utils.cc:203
msgid "pre"
msgstr "ÐÒÅ"
-#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:202
+#: libs/ardour/redirect.cc:104 libs/ardour/utils.cc:206
msgid "post"
msgstr "ÐÏÓÔ"
@@ -1192,259 +1128,254 @@ msgstr ""
msgid "active_changed"
msgstr ""
-#: libs/ardour/region.cc:884
+#: libs/ardour/region.cc:885
msgid "Session: XMLNode describing a Region is incomplete (no id)"
msgstr ""
-#: libs/ardour/region.cc:891
+#: libs/ardour/region.cc:892
msgid "Session: XMLNode describing a Region is incomplete (no name)"
msgstr ""
-#: libs/ardour/route.cc:79 libs/ardour/session.cc:1541
-#: libs/ardour/session.cc:1547 libs/ardour/session.cc:3064
+#: libs/ardour/route.cc:79 libs/ardour/session.cc:1554
+#: libs/ardour/session.cc:1560 libs/ardour/session.cc:3093
msgid "signal"
msgstr ""
-#: libs/ardour/route.cc:1433
+#: libs/ardour/route.cc:1430
msgid "Could not get state of route. Problem with save_automation"
msgstr ""
-#: libs/ardour/route.cc:1485
+#: libs/ardour/route.cc:1482
msgid "Send construction failed"
msgstr ""
-#: libs/ardour/route.cc:1507
+#: libs/ardour/route.cc:1504
msgid "unknown Insert type \"%1\"; ignored"
msgstr ""
-#: libs/ardour/route.cc:1513
+#: libs/ardour/route.cc:1510
msgid "Insert XML node has no type property"
msgstr ""
-#: libs/ardour/route.cc:1518
+#: libs/ardour/route.cc:1515
msgid "insert could not be created. Ignored."
msgstr ""
-#: libs/ardour/route.cc:1536
+#: libs/ardour/route.cc:1533
msgid "Bad node sent to Route::set_state() [%1]"
msgstr ""
-#: libs/ardour/route.cc:1595
+#: libs/ardour/route.cc:1592
msgid "Route %1: unknown edit group \"%2 in saved state (ignored)"
msgstr ""
-#: libs/ardour/route.cc:1611 libs/ardour/route.cc:1615
+#: libs/ardour/route.cc:1608 libs/ardour/route.cc:1612
msgid "badly formed order key string in state file! [%1] ... ignored."
msgstr ""
-#: libs/ardour/route.cc:1696 libs/ardour/route.cc:1823
+#: libs/ardour/route.cc:1693 libs/ardour/route.cc:1820
msgid "[control]"
msgstr ""
-#: libs/ardour/route.cc:1716
+#: libs/ardour/route.cc:1713
msgid "Route %1: unknown mix group \"%2 in saved state (ignored)"
msgstr ""
-#: libs/ardour/route.cc:1745 libs/ardour/route.cc:1753
+#: libs/ardour/route.cc:1742 libs/ardour/route.cc:1750
msgid ""
"MIDI mute control specification for %1 is incomplete, so it has been ignored"
msgstr ""
-#: libs/ardour/send.cc:98
+#: libs/ardour/send.cc:99
msgid "XML node describing a send is missing a Redirect node"
msgstr ""
-#: libs/ardour/session.cc:99
+#: libs/ardour/session.cc:103
msgid "Could not resolve path: %1 (%2)"
msgstr ""
-#: libs/ardour/session.cc:111
+#: libs/ardour/session.cc:115
msgid "cannot check session path %1 (%2)"
msgstr ""
-#: libs/ardour/session.cc:141
+#: libs/ardour/session.cc:145
msgid "cannot check statefile %1 (%2)"
msgstr ""
-#: libs/ardour/session.cc:177
+#: libs/ardour/session.cc:181
msgid "%1 is not an Ardour snapshot file"
msgstr ""
-#: libs/ardour/session.cc:194
+#: libs/ardour/session.cc:198
msgid "cannot determine current working directory (%1)"
msgstr ""
-#: libs/ardour/session.cc:211
+#: libs/ardour/session.cc:215
msgid "unknown file type for session %1"
msgstr ""
-#: libs/ardour/session.cc:316
+#: libs/ardour/session.cc:320
msgid "monitor"
msgstr "ÍÏÎÉÔÏÒ"
-#: libs/ardour/session.cc:323
+#: libs/ardour/session.cc:327
msgid "master"
msgstr "ÍÁÓÔÅÒ"
-#: libs/ardour/session.cc:607
+#: libs/ardour/session.cc:611
msgid "could not setup Click I/O"
msgstr ""
-#: libs/ardour/session.cc:628
+#: libs/ardour/session.cc:632
msgid "cannot setup Click I/O"
msgstr ""
-#: libs/ardour/session.cc:650
+#: libs/ardour/session.cc:654
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
-#: libs/ardour/session.cc:662
+#: libs/ardour/session.cc:666
#, c-format
msgid "out %<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:674
+#: libs/ardour/session.cc:678
#, c-format
msgid "in %<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:688
+#: libs/ardour/session.cc:692
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:702
+#: libs/ardour/session.cc:706
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr ""
-#: libs/ardour/session.cc:735
+#: libs/ardour/session.cc:739
msgid "cannot setup master inputs"
msgstr ""
-#: libs/ardour/session.cc:743
+#: libs/ardour/session.cc:747
msgid "cannot setup master outputs"
msgstr ""
-#: libs/ardour/session.cc:754
+#: libs/ardour/session.cc:758
#, fuzzy
msgid "Master Out"
msgstr "ÍÁÓÔÅÒ"
-#: libs/ardour/session.cc:820
+#: libs/ardour/session.cc:830
msgid "cannot setup control inputs"
msgstr ""
-#: libs/ardour/session.cc:828
+#: libs/ardour/session.cc:838
msgid "cannot set up master outputs"
msgstr ""
-#: libs/ardour/session.cc:1100
+#: libs/ardour/session.cc:1110
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
-#: libs/ardour/session.cc:1179
+#: libs/ardour/session.cc:1189
msgid "Session: you can't use a mark for auto loop"
msgstr ""
-#: libs/ardour/session.cc:1559
+#: libs/ardour/session.cc:1572
msgid "feedback loop setup between %1 and %2"
msgstr ""
-#: libs/ardour/session.cc:1711 libs/ardour/session.cc:1808
+#: libs/ardour/session.cc:1724 libs/ardour/session.cc:1821
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr ""
-#: libs/ardour/session.cc:1767
+#: libs/ardour/session.cc:1780
msgid "Session: could not create new audio track."
msgstr ""
-#: libs/ardour/session.cc:1857
+#: libs/ardour/session.cc:1870
msgid "Session: could not create new route."
msgstr ""
-#: libs/ardour/session.cc:2340
+#: libs/ardour/session.cc:2354
msgid "cannot create new name for region \"%1\""
msgstr ""
-#: libs/ardour/session.cc:2404
+#: libs/ardour/session.cc:2418
msgid "too many regions with names like %1"
msgstr ""
-#: libs/ardour/session.cc:2860
+#: libs/ardour/session.cc:2883
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr ""
-#: libs/ardour/session.cc:3229
+#: libs/ardour/session.cc:3258
msgid "programming error: unknown type of Insert created!"
msgstr ""
-#: libs/ardour/session.cc:3235
+#: libs/ardour/session.cc:3264
msgid "programming error: unknown type of Redirect created!"
msgstr ""
-#: libs/ardour/session.cc:3258
+#: libs/ardour/session.cc:3287
msgid "programming error: unknown type of Insert deleted!"
msgstr ""
-#: libs/ardour/session.cc:3264
+#: libs/ardour/session.cc:3293
msgid "programming error: unknown type of Redirect deleted!"
msgstr ""
-#: libs/ardour/session.cc:3605
+#: libs/ardour/session.cc:3636
msgid "too many bounced versions of playlist \"%1\""
msgstr ""
-#: libs/ardour/session.cc:3614
+#: libs/ardour/session.cc:3649
msgid "cannot create new audio file \"%1\" for %2"
msgstr ""
-#: libs/ardour/session_butler.cc:81 libs/ardour/session_midi.cc:1183
-#: libs/ardour/source.cc:233
-msgid "Cannot create transport request signal pipe (%1)"
-msgstr ""
-
-#: libs/ardour/session_butler.cc:86 libs/ardour/session_butler.cc:91
+#: libs/ardour/session_butler.cc:85 libs/ardour/session_butler.cc:90
msgid "UI: cannot set O_NONBLOCK on butler request pipe (%1)"
msgstr ""
-#: libs/ardour/session_butler.cc:96
+#: libs/ardour/session_butler.cc:95
msgid "Session: could not create butler thread"
msgstr ""
-#: libs/ardour/session_butler.cc:190
+#: libs/ardour/session_butler.cc:189
msgid "poll on butler request pipe failed (%1)"
msgstr ""
-#: libs/ardour/session_butler.cc:197
+#: libs/ardour/session_butler.cc:196
msgid "Error on butler thread request pipe"
msgstr ""
-#: libs/ardour/session_butler.cc:239
+#: libs/ardour/session_butler.cc:238
msgid "Error reading from butler request pipe"
msgstr ""
-#: libs/ardour/session_butler.cc:276
+#: libs/ardour/session_butler.cc:275
msgid "Butler read ahead failure on dstream %1"
msgstr ""
-#: libs/ardour/session_butler.cc:320
+#: libs/ardour/session_butler.cc:319
msgid "Butler write-behind failure on dstream %1"
msgstr ""
-#: libs/ardour/session_click.cc:157
+#: libs/ardour/session_click.cc:158
msgid "cannot open click soundfile %1 (%2)"
msgstr ""
-#: libs/ardour/session_click.cc:166
+#: libs/ardour/session_click.cc:167
msgid "cannot read data from click soundfile"
msgstr ""
-#: libs/ardour/session_click.cc:191
+#: libs/ardour/session_click.cc:192
msgid "cannot open click emphasis soundfile %1 (%2)"
msgstr ""
-#: libs/ardour/session_click.cc:199
+#: libs/ardour/session_click.cc:200
msgid "cannot read data from click emphasis soundfile"
msgstr ""
@@ -1544,7 +1475,7 @@ msgstr ""
msgid "Error reading from transport request pipe"
msgstr ""
-#: libs/ardour/session_process.cc:105
+#: libs/ardour/session_process.cc:104
msgid "Session: error in no roll for %1"
msgstr ""
@@ -1561,192 +1492,199 @@ msgstr ""
msgid "start"
msgstr "ÒÁÚÄÅÌÉÔØ"
-#: libs/ardour/session_state.cc:501
+#: libs/ardour/session_state.cc:502
msgid "Session: cannot create session dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:512
+#: libs/ardour/session_state.cc:513
msgid "Session: cannot create session peakfile dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:521
+#: libs/ardour/session_state.cc:522
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:530
+#: libs/ardour/session_state.cc:531
msgid "Session: cannot create session tape dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:539
+#: libs/ardour/session_state.cc:540
msgid "Session: cannot create session dead sounds dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:548
+#: libs/ardour/session_state.cc:549
msgid "Session: cannot create session automation dir \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:579
+#: libs/ardour/session_state.cc:580
msgid "Could not open %1 for writing mix template"
msgstr ""
-#: libs/ardour/session_state.cc:585
+#: libs/ardour/session_state.cc:586
msgid "Could not open mix template %1 for reading"
msgstr ""
-#: libs/ardour/session_state.cc:592
+#: libs/ardour/session_state.cc:593
msgid "Session already exists. Not overwriting"
msgstr ""
-#: libs/ardour/session_state.cc:635
+#: libs/ardour/session_state.cc:636
msgid "Session: could not load diskstream via XML state"
msgstr ""
-#: libs/ardour/session_state.cc:684
+#: libs/ardour/session_state.cc:685
msgid "could not backup old state file, current state not saved."
msgstr ""
-#: libs/ardour/session_state.cc:697
+#: libs/ardour/session_state.cc:698
msgid "state could not be saved to %1"
msgstr ""
-#: libs/ardour/session_state.cc:704
+#: libs/ardour/session_state.cc:705
msgid "could not remove corrupt state file %1"
msgstr ""
-#: libs/ardour/session_state.cc:708
+#: libs/ardour/session_state.cc:709
msgid "could not restore state file from backup %1"
msgstr ""
-#: libs/ardour/session_state.cc:777
+#: libs/ardour/session_state.cc:778
msgid "%1: session state information file \"%2\" doesn't exist!"
msgstr ""
-#: libs/ardour/session_state.cc:788
+#: libs/ardour/session_state.cc:789
msgid "Could not understand ardour file %1"
msgstr ""
-#: libs/ardour/session_state.cc:1492
+#: libs/ardour/session_state.cc:1493
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
-#: libs/ardour/session_state.cc:1538
+#: libs/ardour/session_state.cc:1539
msgid "Session: XML state has no options section"
msgstr ""
-#: libs/ardour/session_state.cc:1543
+#: libs/ardour/session_state.cc:1544
msgid "Session: XML state has no sources section"
msgstr ""
-#: libs/ardour/session_state.cc:1550
+#: libs/ardour/session_state.cc:1551
msgid "Session: XML state has no Regions section"
msgstr ""
-#: libs/ardour/session_state.cc:1557
+#: libs/ardour/session_state.cc:1558
msgid "Session: XML state has no playlists section"
msgstr ""
-#: libs/ardour/session_state.cc:1576
+#: libs/ardour/session_state.cc:1577
msgid "Session: XML state has no diskstreams section"
msgstr ""
-#: libs/ardour/session_state.cc:1583
+#: libs/ardour/session_state.cc:1584
msgid "Session: XML state has no connections section"
msgstr ""
-#: libs/ardour/session_state.cc:1590
+#: libs/ardour/session_state.cc:1591
msgid "Session: XML state has no locations section"
msgstr ""
-#: libs/ardour/session_state.cc:1623
+#: libs/ardour/session_state.cc:1624
msgid "Session: XML state has no edit groups section"
msgstr ""
-#: libs/ardour/session_state.cc:1630
+#: libs/ardour/session_state.cc:1631
msgid "Session: XML state has no mix groups section"
msgstr ""
-#: libs/ardour/session_state.cc:1637
+#: libs/ardour/session_state.cc:1638
msgid "Session: XML state has no Tempo Map section"
msgstr ""
-#: libs/ardour/session_state.cc:1644
+#: libs/ardour/session_state.cc:1645
msgid "Session: XML state has no routes section"
msgstr ""
-#: libs/ardour/session_state.cc:1651
+#: libs/ardour/session_state.cc:1652
msgid "Session: XML state has no click section"
msgstr ""
-#: libs/ardour/session_state.cc:1696
+#: libs/ardour/session_state.cc:1697
msgid "Session: cannot create Route from XML description."
msgstr ""
-#: libs/ardour/session_state.cc:1734
+#: libs/ardour/session_state.cc:1735
msgid "Session: cannot create Region from XML description."
msgstr ""
-#: libs/ardour/session_state.cc:1762
+#: libs/ardour/session_state.cc:1764
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
-#: libs/ardour/session_state.cc:1770 libs/ardour/session_state.cc:1784
+#: libs/ardour/session_state.cc:1772 libs/ardour/session_state.cc:1792
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
-#: libs/ardour/session_state.cc:1852
+#: libs/ardour/session_state.cc:1778 libs/ardour/session_state.cc:1798
+msgid ""
+"Session: XMLNode describing a AudioRegion references a non-audio source id =%"
+"1"
+msgstr ""
+
+#: libs/ardour/session_state.cc:1868
msgid "Session: cannot create Source from XML description."
msgstr ""
-#: libs/ardour/session_state.cc:1883
-msgid "Found a sound file that cannot be used by Ardour. See the progammers."
+#: libs/ardour/session_state.cc:1889
+msgid ""
+"Found a sound file that cannot be used by Ardour. Talk to the progammers."
msgstr ""
-#: libs/ardour/session_state.cc:1908
+#: libs/ardour/session_state.cc:1913
msgid "Could not create mix templates directory \"%1\" (%2)"
msgstr ""
-#: libs/ardour/session_state.cc:1922
+#: libs/ardour/session_state.cc:1927
msgid "Template \"%1\" already exists - new version not created"
msgstr ""
-#: libs/ardour/session_state.cc:1929
+#: libs/ardour/session_state.cc:1934
msgid "mix template not saved"
msgstr ""
-#: libs/ardour/session_state.cc:1989
+#: libs/ardour/session_state.cc:1994
msgid "cannot create session directory \"%1\"; ignored"
msgstr ""
-#: libs/ardour/session_state.cc:2002
+#: libs/ardour/session_state.cc:2007
msgid "cannot create sounds directory \"%1\"; ignored"
msgstr ""
-#: libs/ardour/session_state.cc:2013
+#: libs/ardour/session_state.cc:2018
msgid "cannot create dead sounds directory \"%1\"; ignored"
msgstr ""
-#: libs/ardour/session_state.cc:2024
+#: libs/ardour/session_state.cc:2029
msgid "cannot create peak file directory \"%1\"; ignored"
msgstr ""
-#: libs/ardour/session_state.cc:2163 libs/ardour/session_state.cc:2184
+#: libs/ardour/session_state.cc:2168 libs/ardour/session_state.cc:2189
msgid "Session: cannot create Playlist from XML description."
msgstr ""
-#: libs/ardour/session_state.cc:2223
+#: libs/ardour/session_state.cc:2228
msgid "Session: cannot create Named Selection from XML description."
msgstr ""
-#: libs/ardour/session_state.cc:2355
+#: libs/ardour/session_state.cc:2360
msgid "Unknown node \"%1\" found in Connections list from state file"
msgstr ""
-#: libs/ardour/session_state.cc:3195
+#: libs/ardour/session_state.cc:3197
msgid "cannot remove dead sound file %1 (%2)"
msgstr ""
-#: libs/ardour/session_time.cc:736
+#: libs/ardour/session_time.cc:375
msgid "Unknown JACK transport state %1 in sync callback"
msgstr ""
@@ -1754,43 +1692,43 @@ msgstr ""
msgid "tempoize: error creating name for new audio file based on %1"
msgstr ""
-#: libs/ardour/session_timefx.cc:85
+#: libs/ardour/session_timefx.cc:88
msgid "tempoize: error creating new audio file %1 (%2)"
msgstr ""
-#: libs/ardour/session_timefx.cc:111
+#: libs/ardour/session_timefx.cc:114
msgid "tempoize: error reading data from %1"
msgstr ""
-#: libs/ardour/session_timefx.cc:124 libs/ardour/session_timefx.cc:136
+#: libs/ardour/session_timefx.cc:127 libs/ardour/session_timefx.cc:139
msgid "error writing tempo-adjusted data to %1"
msgstr ""
-#: libs/ardour/session_timefx.cc:142
+#: libs/ardour/session_timefx.cc:145
msgid "timefx code failure. please notify ardour-developers."
msgstr ""
-#: libs/ardour/session_transport.cc:116
+#: libs/ardour/session_transport.cc:117
msgid "Cannot loop - no loop range defined"
msgstr ""
-#: libs/ardour/session_transport.cc:478
+#: libs/ardour/session_transport.cc:479
msgid ""
"Seamless looping cannot be supported while Ardour is using JACK transport.\n"
"Recommend changing the configured options"
msgstr ""
-#: libs/ardour/session_transport.cc:754
+#: libs/ardour/session_transport.cc:755
msgid ""
"Global varispeed cannot be supported while Ardour is connected to JACK "
"transport control"
msgstr ""
-#: libs/ardour/session_transport.cc:954
+#: libs/ardour/session_transport.cc:955
msgid "please stop the transport before adjusting slave settings"
msgstr ""
-#: libs/ardour/session_transport.cc:990
+#: libs/ardour/session_transport.cc:991
msgid "No MTC port defined: MTC slaving is impossible."
msgstr ""
@@ -1878,209 +1816,185 @@ msgstr ""
msgid "Big-endian (Mac)"
msgstr ""
-#: libs/ardour/sndfilesource.cc:75
-msgid "SndFileSource: cannot open file \"%1\" (%2)"
+#: libs/ardour/sndfilesource.cc:146
+msgid "FileSource: cannot get host information for BWF header (%1)"
msgstr ""
-#: libs/ardour/sndfilesource.cc:80
+#: libs/ardour/sndfilesource.cc:168
msgid ""
-"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
-"number"
-msgstr ""
-
-#: libs/ardour/sndfilesource.cc:122
-msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
-msgstr ""
-
-#: libs/ardour/source.cc:161
-msgid "poll on peak request pipe failed (%1)"
-msgstr ""
-
-#: libs/ardour/source.cc:168
-msgid "Error on peak thread request pipe"
-msgstr ""
-
-#: libs/ardour/source.cc:201
-msgid "Error reading from peak request pipe"
-msgstr ""
-
-#: libs/ardour/source.cc:238 libs/ardour/source.cc:243
-msgid "UI: cannot set O_NONBLOCK on peak request pipe (%1)"
-msgstr ""
-
-#: libs/ardour/source.cc:248
-msgid "Source: could not create peak thread"
+"cannot set broadcast info for audio file %1 (%2); dropping broadcast info "
+"for this file"
msgstr ""
-#: libs/ardour/source.cc:326
-msgid "cannot rename peakfile for %1 from %2 to %3 (%4)"
+#: libs/ardour/sndfilesource.cc:224
+msgid "SndFileSource: cannot open file \"%1\" for %2 (%3)"
msgstr ""
-#: libs/ardour/source.cc:357
-msgid "Source: cannot stat peakfile \"%1\""
-msgstr ""
-
-#: libs/ardour/source.cc:444
-msgid "cannot read sample data for unscaled peak computation"
+#: libs/ardour/sndfilesource.cc:230
+msgid ""
+"SndFileSource: file only contains %1 channels; %2 is invalid as a channel "
+"number"
msgstr ""
-#: libs/ardour/source.cc:465 libs/ardour/source.cc:536
-#: libs/ardour/source.cc:780 libs/ardour/source.cc:881
-msgid "Source: cannot open peakpath \"%1\" (%2)"
+#: libs/ardour/sndfilesource.cc:307
+msgid "SndFileSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
-#: libs/ardour/source.cc:637
-msgid "Source[%1]: peak read - cannot read %2 samples at offset %3"
-msgstr ""
+#: libs/ardour/sndfilesource.cc:358
+#, fuzzy
+msgid "programming error: %1 %2"
+msgstr "ÏÛÉÂËÁ ÐÒÏÇÒÁÍÍÙ: "
-#: libs/ardour/source.cc:789
-msgid "%1: could not write read raw data for peak computation (%2)"
+#: libs/ardour/sndfilesource.cc:458
+msgid ""
+"cannot set broadcast info for audio file %1; Dropping broadcast info for "
+"this file"
msgstr ""
-#: libs/ardour/source.cc:814
-msgid "%1: could not write peak file data (%2)"
+#: libs/ardour/sndfilesource.cc:500
+msgid "%1: cannot seek to %2"
msgstr ""
-#: libs/ardour/state_manager.cc:46
+#: libs/ardour/state_manager.cc:47
msgid "cleared history"
msgstr ""
-#: libs/ardour/state_manager.cc:59
+#: libs/ardour/state_manager.cc:60
msgid ""
"programming error: illegal state ID (%1) passed to StateManager::set_state() "
"(range = 0-%2)"
msgstr ""
-#: libs/ardour/stateful.cc:100
+#: libs/ardour/stateful.cc:102
msgid "Error: could not write %1"
msgstr ""
-#: libs/ardour/stateful.cc:114
+#: libs/ardour/stateful.cc:116
msgid "Could not understand XML file %1"
msgstr ""
-#: libs/ardour/tempo.cc:66
+#: libs/ardour/tempo.cc:67
msgid "TempoSection XML node has no \"start\" property"
msgstr ""
-#: libs/ardour/tempo.cc:74
+#: libs/ardour/tempo.cc:75
msgid "TempoSection XML node has an illegal \"start\" value"
msgstr ""
-#: libs/ardour/tempo.cc:81
+#: libs/ardour/tempo.cc:82
msgid "TempoSection XML node has no \"beats-per-minute\" property"
msgstr ""
-#: libs/ardour/tempo.cc:86
+#: libs/ardour/tempo.cc:87
msgid "TempoSection XML node has an illegal \"beats_per_minute\" value"
msgstr ""
-#: libs/ardour/tempo.cc:91
+#: libs/ardour/tempo.cc:92
msgid "TempoSection XML node has no \"movable\" property"
msgstr ""
-#: libs/ardour/tempo.cc:130
+#: libs/ardour/tempo.cc:131
msgid "MeterSection XML node has no \"start\" property"
msgstr ""
-#: libs/ardour/tempo.cc:138
+#: libs/ardour/tempo.cc:139
msgid "MeterSection XML node has an illegal \"start\" value"
msgstr ""
-#: libs/ardour/tempo.cc:145
+#: libs/ardour/tempo.cc:146
msgid "MeterSection XML node has no \"beats-per-bar\" property"
msgstr ""
-#: libs/ardour/tempo.cc:150
+#: libs/ardour/tempo.cc:151
msgid "MeterSection XML node has an illegal \"beats-per-bar\" value"
msgstr ""
-#: libs/ardour/tempo.cc:155
+#: libs/ardour/tempo.cc:156
msgid "MeterSection XML node has no \"note-type\" property"
msgstr ""
-#: libs/ardour/tempo.cc:160
+#: libs/ardour/tempo.cc:161
msgid "MeterSection XML node has an illegal \"note-type\" value"
msgstr ""
-#: libs/ardour/tempo.cc:165
+#: libs/ardour/tempo.cc:166
msgid "MeterSection XML node has no \"movable\" property"
msgstr ""
-#: libs/ardour/tempo.cc:258
+#: libs/ardour/tempo.cc:259
msgid "move metric"
msgstr ""
-#: libs/ardour/tempo.cc:329
+#: libs/ardour/tempo.cc:330
msgid "metric removed"
msgstr ""
-#: libs/ardour/tempo.cc:372
+#: libs/ardour/tempo.cc:373
msgid "add tempo"
msgstr ""
-#: libs/ardour/tempo.cc:401
+#: libs/ardour/tempo.cc:402
msgid "replace tempo"
msgstr ""
-#: libs/ardour/tempo.cc:434
+#: libs/ardour/tempo.cc:435
msgid "add meter"
msgstr ""
-#: libs/ardour/tempo.cc:462
+#: libs/ardour/tempo.cc:463
msgid "replaced meter"
msgstr ""
-#: libs/ardour/tempo.cc:482 libs/ardour/tempo.cc:498
+#: libs/ardour/tempo.cc:483 libs/ardour/tempo.cc:499
msgid "programming error: no tempo section in tempo map!"
msgstr ""
-#: libs/ardour/tempo.cc:537
+#: libs/ardour/tempo.cc:538
msgid "programming error: unhandled MetricSection type"
msgstr ""
-#: libs/ardour/tempo.cc:1225 libs/ardour/tempo.cc:1237
+#: libs/ardour/tempo.cc:1226 libs/ardour/tempo.cc:1238
msgid "Tempo map: could not set new state, restoring old one."
msgstr ""
-#: libs/ardour/tempo.cc:1261
+#: libs/ardour/tempo.cc:1262
msgid "load XML data"
msgstr ""
-#: libs/ardour/utils.cc:242
+#: libs/ardour/utils.cc:246
msgid "illegal or badly-formed string used for path (%1)"
msgstr ""
-#: libs/ardour/utils.cc:247
+#: libs/ardour/utils.cc:251
msgid "path (%1) is ambiguous"
msgstr ""
-#: libs/ardour/vst_plugin.cc:186
+#: libs/ardour/vst_plugin.cc:187
msgid "cannot create VST chunk directory: %1"
msgstr ""
-#: libs/ardour/vst_plugin.cc:194
+#: libs/ardour/vst_plugin.cc:195
msgid "cannot check VST chunk directory: %1"
msgstr ""
-#: libs/ardour/vst_plugin.cc:201
+#: libs/ardour/vst_plugin.cc:202
msgid "%1 exists but is not a directory"
msgstr ""
-#: libs/ardour/vst_plugin.cc:239
+#: libs/ardour/vst_plugin.cc:240
msgid "Bad node sent to VSTPlugin::set_state"
msgstr ""
-#: libs/ardour/vst_plugin.cc:342 libs/ardour/vst_plugin.cc:353
+#: libs/ardour/vst_plugin.cc:343 libs/ardour/vst_plugin.cc:354
msgid "no support for presets using chunks at this time"
msgstr ""
-#: libs/ardour/coreaudio_source.cc:93
+#: libs/ardour/coreaudio_source.cc:99
msgid ""
"CoreAudioSource: file only contains %1 channels; %2 is invalid as a channel "
"number"
msgstr ""
-#: libs/ardour/coreaudio_source.cc:157
+#: libs/ardour/coreaudio_source.cc:164
msgid "CoreAudioSource: could not seek to frame %1 within %2 (%3)"
msgstr ""
diff --git a/libs/ardour/recent_sessions.cc b/libs/ardour/recent_sessions.cc
index efbdb807f7..954162dd18 100644
--- a/libs/ardour/recent_sessions.cc
+++ b/libs/ardour/recent_sessions.cc
@@ -27,9 +27,9 @@
#include <ardour/utils.h>
#include "i18n.h"
-
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
int
ARDOUR::read_recent_sessions (RecentSessions& rs)
diff --git a/libs/ardour/redirect.cc b/libs/ardour/redirect.cc
index 746d2790e2..33fec5088f 100644
--- a/libs/ardour/redirect.cc
+++ b/libs/ardour/redirect.cc
@@ -39,7 +39,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
const string Redirect::state_node_name = "Redirect";
sigc::signal<void,Redirect*> Redirect::RedirectCreated;
diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc
index 08df23146b..8c27a3bebc 100644
--- a/libs/ardour/region.cc
+++ b/libs/ardour/region.cc
@@ -37,6 +37,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
Change Region::FadeChanged = ARDOUR::new_change ();
Change Region::SyncOffsetChanged = ARDOUR::new_change ();
diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc
index 335dacad6e..13dd531bac 100644
--- a/libs/ardour/reverse.cc
+++ b/libs/ardour/reverse.cc
@@ -24,7 +24,7 @@
#include <ardour/types.h>
#include <ardour/reverse.h>
-#include <ardour/filesource.h>
+#include <ardour/audiofilesource.h>
#include <ardour/session.h>
#include <ardour/audioregion.h>
diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc
index 93fbb85e49..3f51b2f140 100644
--- a/libs/ardour/route.cc
+++ b/libs/ardour/route.cc
@@ -44,7 +44,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
uint32_t Route::order_key_cnt = 0;
@@ -2002,7 +2002,7 @@ Route::set_active (bool yn)
}
void
-Route::transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
+Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
{
jack_nframes_t now = _session.transport_frame();
diff --git a/libs/ardour/route_group.cc b/libs/ardour/route_group.cc
index ae807e66e1..5730623742 100644
--- a/libs/ardour/route_group.cc
+++ b/libs/ardour/route_group.cc
@@ -29,7 +29,7 @@
#include <ardour/route_group.h>
#include <ardour/audio_track.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/configuration.h>
using namespace ARDOUR;
diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc
index 50fdd4a96a..2b72fb9bdb 100644
--- a/libs/ardour/send.cc
+++ b/libs/ardour/send.cc
@@ -29,6 +29,7 @@
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
Send::Send (Session& s, Placement p)
: Redirect (s, s.next_send_name(), p)
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index d729b5d7f7..864e6178d2 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -32,7 +32,8 @@
#include <sigc++/bind.h>
#include <sigc++/retype.h>
-#include <glibmm.h>
+#include <glibmm/thread.h>
+#include <glibmm/miscutils.h>
#include <pbd/error.h>
#include <glibmm/thread.h>
@@ -43,14 +44,12 @@
#include <ardour/audioengine.h>
#include <ardour/configuration.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/utils.h>
#include <ardour/audioplaylist.h>
#include <ardour/audioregion.h>
-#include <ardour/source.h>
-#include <ardour/filesource.h>
+#include <ardour/audiofilesource.h>
#include <ardour/destructive_filesource.h>
-#include <ardour/sndfilesource.h>
#include <ardour/auditioner.h>
#include <ardour/recent_sessions.h>
#include <ardour/redirect.h>
@@ -74,7 +73,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
const char* Session::_template_suffix = X_(".template");
const char* Session::_statefile_suffix = X_(".ardour");
@@ -90,6 +89,7 @@ Session::mix_buffers_with_gain_t Session::mix_buffers_with_gain = 0;
Session::mix_buffers_no_gain_t Session::mix_buffers_no_gain = 0;
sigc::signal<int> Session::AskAboutPendingState;
+sigc::signal<void> Session::SMPTEOffsetChanged;
int
Session::find_session (string str, string& path, string& snapshot, bool& isnew)
@@ -455,10 +455,10 @@ Session::~Session ()
}
#ifdef TRACK_DESTRUCTION
- cerr << "delete diskstreams\n";
+ cerr << "delete audio_diskstreams\n";
#endif /* TRACK_DESTRUCTION */
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ) {
- DiskStreamList::iterator tmp;
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ) {
+ AudioDiskstreamList::iterator tmp;
tmp = i;
++tmp;
@@ -469,10 +469,10 @@ Session::~Session ()
}
#ifdef TRACK_DESTRUCTION
- cerr << "delete sources\n";
+ cerr << "delete audio sources\n";
#endif /* TRACK_DESTRUCTION */
- for (SourceList::iterator i = sources.begin(); i != sources.end(); ) {
- SourceList::iterator tmp;
+ for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ) {
+ AudioSourceList::iterator tmp;
tmp = i;
++tmp;
@@ -881,7 +881,7 @@ Session::playlist_length_changed (Playlist* pl)
}
void
-Session::diskstream_playlist_changed (DiskStream* dstream)
+Session::diskstream_playlist_changed (AudioDiskstream* dstream)
{
Playlist *playlist;
@@ -961,7 +961,7 @@ Session::set_auto_input (bool yn)
The rarity and short potential lock duration makes this "OK"
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (!auto_input);
@@ -979,7 +979,7 @@ Session::reset_input_monitor_state ()
{
if (transport_rolling()) {
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (Config->get_use_hardware_monitoring() && !auto_input);
@@ -987,7 +987,7 @@ Session::reset_input_monitor_state ()
}
} else {
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (Config->get_use_hardware_monitoring());
@@ -1068,7 +1068,7 @@ Session::auto_loop_changed (Location* location)
}
else if (seamless_loop && !loop_changing) {
- // schedule a locate-roll to refill the diskstreams at the
+ // schedule a locate-roll to refill the audio_diskstreams at the
// previous loop end
loop_changing = true;
@@ -1265,7 +1265,7 @@ Session::enable_record ()
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
(*i)->monitor_input (true);
}
@@ -1300,7 +1300,7 @@ Session::disable_record (bool rt_context, bool force)
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
(*i)->monitor_input (false);
}
@@ -1327,7 +1327,7 @@ Session::step_back_from_record ()
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (false);
@@ -1432,6 +1432,9 @@ Session::set_frame_rate (jack_nframes_t frames_per_second)
Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25));
+ // XXX we need some equivalent to this, somehow
+ // DestructiveFileSource::setup_standard_crossfades (frames_per_second);
+
set_dirty();
/* XXX need to reset/reinstantiate all LADSPA plugins */
@@ -1493,7 +1496,7 @@ Session::set_block_size (jack_nframes_t nframes)
(*i)->set_block_size (nframes);
}
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->set_block_size (nframes);
}
@@ -1900,14 +1903,14 @@ Session::add_route (Route* route)
}
void
-Session::add_diskstream (DiskStream* dstream)
+Session::add_diskstream (AudioDiskstream* dstream)
{
/* need to do this in case we're rolling at the time, to prevent false underruns */
dstream->do_refill(0, 0, 0);
{
Glib::RWLock::WriterLock lm (diskstream_lock);
- diskstreams.push_back (dstream);
+ audio_diskstreams.push_back (dstream);
}
/* take a reference to the diskstream, preventing it from
@@ -1927,7 +1930,7 @@ Session::add_diskstream (DiskStream* dstream)
set_dirty();
save_state (_current_snapshot_name);
- DiskStreamAdded (dstream); /* EMIT SIGNAL */
+ AudioDiskstreamAdded (dstream); /* EMIT SIGNAL */
}
void
@@ -1961,18 +1964,24 @@ Session::remove_route (Route& route)
update_route_solo_state ();
}
- {
- Glib::RWLock::WriterLock lm (diskstream_lock);
-
- AudioTrack* at;
+ AudioTrack* at;
+ AudioDiskstream* ds = 0;
+
+ if ((at = dynamic_cast<AudioTrack*>(&route)) != 0) {
+ ds = &at->disk_stream();
+ }
+
+ if (ds) {
- if ((at = dynamic_cast<AudioTrack*>(&route)) != 0) {
- diskstreams.remove (&at->disk_stream());
- at->disk_stream().unref ();
+ {
+ Glib::RWLock::WriterLock lm (diskstream_lock);
+ audio_diskstreams.remove (ds);
}
- find_current_end ();
+ ds->unref ();
}
+
+ find_current_end ();
update_latency_compensation (false, false);
set_dirty();
@@ -2255,7 +2264,7 @@ Session::get_maximum_extent () const
ensure atomicity.
*/
- for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::const_iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
Playlist* pl = (*i)->playlist();
if ((me = pl->get_maximum_extent()) > max) {
max = me;
@@ -2265,12 +2274,12 @@ Session::get_maximum_extent () const
return max;
}
-DiskStream *
+AudioDiskstream *
Session::diskstream_by_name (string name)
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->name() == name) {
return* i;
}
@@ -2279,12 +2288,12 @@ Session::diskstream_by_name (string name)
return 0;
}
-DiskStream *
+AudioDiskstream *
Session::diskstream_by_id (id_t id)
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->id() == id) {
return *i;
}
@@ -2583,7 +2592,10 @@ Session::destroy_region (Region* region)
for (vector<Source*>::iterator i = srcs.begin(); i != srcs.end(); ++i) {
if ((*i)->use_cnt() == 0) {
- (*i)->mark_for_remove ();
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*i);
+ if (afs) {
+ (afs)->mark_for_remove ();
+ }
delete *i;
}
}
@@ -2607,7 +2619,7 @@ Session::remove_last_capture ()
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
list<Region*>& l = (*i)->last_capture_regions();
if (!l.empty()) {
@@ -2630,15 +2642,15 @@ Session::remove_region_from_region_list (Region& r)
/* Source Management */
void
-Session::add_source (Source* source)
+Session::add_audio_source (AudioSource* source)
{
- pair<SourceList::key_type, SourceList::mapped_type> entry;
+ pair<AudioSourceList::key_type, AudioSourceList::mapped_type> entry;
{
- Glib::Mutex::Lock lm (source_lock);
+ Glib::Mutex::Lock lm (audio_source_lock);
entry.first = source->id();
entry.second = source;
- sources.insert (entry);
+ audio_sources.insert (entry);
}
source->GoingAway.connect (mem_fun (this, &Session::remove_source));
@@ -2650,13 +2662,13 @@ Session::add_source (Source* source)
void
Session::remove_source (Source* source)
{
- SourceList::iterator i;
+ AudioSourceList::iterator i;
{
- Glib::Mutex::Lock lm (source_lock);
+ Glib::Mutex::Lock lm (audio_source_lock);
- if ((i = sources.find (source->id())) != sources.end()) {
- sources.erase (i);
+ if ((i = audio_sources.find (source->id())) != audio_sources.end()) {
+ audio_sources.erase (i);
}
}
@@ -2675,15 +2687,21 @@ Session::remove_source (Source* source)
Source *
Session::get_source (ARDOUR::id_t id)
{
- Glib::Mutex::Lock lm (source_lock);
- SourceList::iterator i;
+ Glib::Mutex::Lock lm (audio_source_lock);
+ AudioSourceList::iterator i;
Source* source = 0;
- if ((i = sources.find (id)) != sources.end()) {
+ if ((i = audio_sources.find (id)) != audio_sources.end()) {
source = (*i).second;
}
- return source;
+ if (source) {
+ return source;
+ }
+
+ /* XXX search MIDI or other searches here */
+
+ return 0;
}
string
@@ -2890,17 +2908,23 @@ Session::audio_path_from_name (string name, uint32_t nchan, uint32_t chan, bool
return spath;
}
-FileSource *
-Session::create_file_source (DiskStream& ds, int32_t chan, bool destructive)
+AudioFileSource *
+Session::create_audio_source_for_session (AudioDiskstream& ds, uint32_t chan, bool destructive)
{
string spath = audio_path_from_name (ds.name(), ds.n_channels(), chan, destructive);
/* this might throw failed_constructor(), which is OK */
-
+
if (destructive) {
- return new DestructiveFileSource (spath, frame_rate(), false, Config->get_native_file_data_format());
+ return new DestructiveFileSource (spath,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate());
} else {
- return new FileSource (spath, frame_rate(), false, Config->get_native_file_data_format());
+ return new SndFileSource (spath,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate());
}
}
@@ -3082,7 +3106,7 @@ Session::remove_empty_sounds ()
for (vector<string *>::iterator i = possible_audiofiles->begin(); i != possible_audiofiles->end(); ++i) {
- if (FileSource::is_empty (*(*i))) {
+ if (AudioFileSource::is_empty (*(*i))) {
unlink ((*i)->c_str());
@@ -3140,12 +3164,12 @@ Session::set_all_mute (bool yn)
}
uint32_t
-Session::n_diskstreams () const
+Session::n_audio_diskstreams () const
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
uint32_t n = 0;
- for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::const_iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
n++;
}
@@ -3154,10 +3178,10 @@ Session::n_diskstreams () const
}
void
-Session::foreach_diskstream (void (DiskStream::*func)(void))
+Session::foreach_audio_diskstream (void (AudioDiskstream::*func)(void))
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
((*i)->*func)();
}
@@ -3184,7 +3208,7 @@ Session::graph_reordered ()
reflect any changes in latencies within the graph.
*/
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->set_capture_offset ();
}
}
@@ -3467,7 +3491,7 @@ Session::reset_native_file_format ()
//RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
Glib::RWLock::ReaderLock lm2 (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->reset_write_sources (false);
}
}
@@ -3487,7 +3511,7 @@ Session::route_name_unique (string n) const
}
int
-Session::remove_file_source (FileSource& fs)
+Session::cleanup_audio_file_source (AudioFileSource& fs)
{
return fs.move_to_trash (dead_sound_dir_name);
}
@@ -3562,12 +3586,12 @@ Session::freeze (InterThreadInfo& itt)
}
int
-Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_t len, bool overwrite, vector<Source*>& srcs,
- InterThreadInfo& itt)
+Session::write_one_audio_track (AudioTrack& track, jack_nframes_t start, jack_nframes_t len,
+ bool overwrite, vector<AudioSource*>& srcs, InterThreadInfo& itt)
{
int ret = -1;
Playlist* playlist;
- FileSource* fsource;
+ AudioFileSource* fsource;
uint32_t x;
char buf[PATH_MAX+1];
string dir;
@@ -3577,7 +3601,9 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
jack_nframes_t to_do;
vector<Sample*> buffers;
char * workbuf = 0;
- const jack_nframes_t chunk_size = (256 * 1024)/4;
+
+ // any bigger than this seems to cause stack overflows in called functions
+ const jack_nframes_t chunk_size = (128 * 1024)/4;
g_atomic_int_set (&processing_prohibited, 1);
@@ -3612,7 +3638,11 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
}
try {
- fsource = new FileSource (buf, frame_rate(), false, Config->get_native_file_data_format());
+ fsource = new SndFileSource (buf,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate());
+
}
catch (failed_constructor& err) {
@@ -3651,9 +3681,13 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
}
uint32_t n = 0;
- for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
- if ((*src)->write (buffers[n], this_chunk, workbuf) != this_chunk) {
- goto out;
+ for (vector<AudioSource*>::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*src);
+
+ if (afs) {
+ if (afs->write (buffers[n], this_chunk, workbuf) != this_chunk) {
+ goto out;
+ }
}
}
@@ -3671,14 +3705,20 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
time (&now);
xnow = localtime (&now);
- for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
- dynamic_cast<FileSource*>((*src))->update_header (position, *xnow, now);
+ for (vector<AudioSource*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*src);
+ if (afs) {
+ afs->update_header (position, *xnow, now);
+ }
}
/* build peakfile for new source */
- for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
- dynamic_cast<FileSource*>(*src)->build_peaks ();
+ for (vector<AudioSource*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*src);
+ if (afs) {
+ afs->build_peaks ();
+ }
}
ret = 0;
@@ -3686,8 +3726,11 @@ Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_
out:
if (ret) {
- for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
- dynamic_cast<FileSource*>(*src)->mark_for_remove ();
+ for (vector<AudioSource*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*src);
+ if (afs) {
+ afs->mark_for_remove ();
+ }
delete *src;
}
}
diff --git a/libs/ardour/session_butler.cc b/libs/ardour/session_butler.cc
index ebe0d64548..4613bfccf9 100644
--- a/libs/ardour/session_butler.cc
+++ b/libs/ardour/session_butler.cc
@@ -34,7 +34,7 @@
#include <ardour/configuration.h>
#include <ardour/audioengine.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/crossfade.h>
#include <ardour/timestamps.h>
@@ -42,7 +42,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
static float _read_data_rate;
static float _write_data_rate;
@@ -168,10 +168,10 @@ Session::butler_thread_work ()
struct timeval begin, end;
struct pollfd pfd[1];
bool disk_work_outstanding = false;
- DiskStreamList::iterator i;
+ AudioDiskstreamList::iterator i;
- butler_mixdown_buffer = new Sample[DiskStream::disk_io_frames()];
- butler_gain_buffer = new gain_t[DiskStream::disk_io_frames()];
+ butler_mixdown_buffer = new Sample[AudioDiskstream::disk_io_frames()];
+ butler_gain_buffer = new gain_t[AudioDiskstream::disk_io_frames()];
// this buffer is used for temp conversion purposes in filesources
char * conv_buffer = conversion_buffer(ButlerContext);
@@ -241,7 +241,7 @@ Session::butler_thread_work ()
}
}
- for (i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
// cerr << "BEFORE " << (*i)->name() << ": pb = " << (*i)->playback_buffer_load() << " cp = " << (*i)->capture_buffer_load() << endl;
}
@@ -257,7 +257,7 @@ Session::butler_thread_work ()
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) {
+ for (i = audio_diskstreams.begin(); !transport_work_requested() && butler_should_run && i != audio_diskstreams.end(); ++i) {
// cerr << "rah fondr " << (*i)->io()->name () << endl;
@@ -278,7 +278,7 @@ Session::butler_thread_work ()
}
- if (i != diskstreams.end()) {
+ if (i != audio_diskstreams.end()) {
/* we didn't get to all the streams */
disk_work_outstanding = true;
}
@@ -300,7 +300,7 @@ Session::butler_thread_work ()
compute_io = true;
gettimeofday (&begin, 0);
- for (i = diskstreams.begin(); !transport_work_requested() && butler_should_run && i != diskstreams.end(); ++i) {
+ for (i = audio_diskstreams.begin(); !transport_work_requested() && butler_should_run && i != audio_diskstreams.end(); ++i) {
// cerr << "write behind for " << (*i)->name () << endl;
@@ -330,7 +330,7 @@ Session::butler_thread_work ()
request_stop ();
}
- if (i != diskstreams.end()) {
+ if (i != audio_diskstreams.end()) {
/* we didn't get to all the streams */
disk_work_outstanding = true;
}
@@ -357,7 +357,7 @@ Session::butler_thread_work ()
Glib::Mutex::Lock lm (butler_request_lock);
if (butler_should_run && (disk_work_outstanding || transport_work_requested())) {
-// for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+// for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
// cerr << "AFTER " << (*i)->name() << ": pb = " << (*i)->playback_buffer_load() << " cp = " << (*i)->capture_buffer_load() << endl;
// }
@@ -375,7 +375,7 @@ Session::butler_thread_work ()
void
-Session::request_overwrite_buffer (DiskStream* stream)
+Session::request_overwrite_buffer (AudioDiskstream* stream)
{
Event *ev = new Event (Event::Overwrite, Event::Add, Event::Immediate, 0, 0, 0.0);
ev->set_ptr (stream);
@@ -383,7 +383,7 @@ Session::request_overwrite_buffer (DiskStream* stream)
}
void
-Session::overwrite_some_buffers (DiskStream* ds)
+Session::overwrite_some_buffers (AudioDiskstream* ds)
{
/* executed by the audio thread */
@@ -398,7 +398,7 @@ Session::overwrite_some_buffers (DiskStream* ds)
} else {
Glib::RWLock::ReaderLock dm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->set_pending_overwrite (true);
}
}
diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc
index 4503287da1..1d14fd4a80 100644
--- a/libs/ardour/session_click.cc
+++ b/libs/ardour/session_click.cc
@@ -32,6 +32,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
Pool Session::Click::pool ("click", sizeof (Click), 128);
diff --git a/libs/ardour/session_control.cc b/libs/ardour/session_control.cc
index 8e0a3e99a1..afecc146b7 100644
--- a/libs/ardour/session_control.cc
+++ b/libs/ardour/session_control.cc
@@ -1,8 +1,8 @@
#include <ardour/session.h>
-#include <ardour/control_protocol.h>
-#include <ardour/generic_midi_control_protocol.h>
-#include <ardour/tranzport_control_protocol.h>
+#include <control_protocol/control_protocol.h>
+#include <generic_midi/generic_midi_control_protocol.h>
+#include <transport/tranzport_control_protocol.h>
using namespace ARDOUR;
diff --git a/libs/ardour/session_events.cc b/libs/ardour/session_events.cc
index d48bbe3053..e918e0383f 100644
--- a/libs/ardour/session_events.cc
+++ b/libs/ardour/session_events.cc
@@ -28,12 +28,12 @@
#include <ardour/ardour.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include "i18n.h"
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
MultiAllocSingleReleasePool Session::Event::pool ("event", sizeof (Session::Event), 512);
@@ -389,11 +389,11 @@ Session::process_event (Event* ev)
break;
case Event::Overwrite:
- overwrite_some_buffers (static_cast<DiskStream*>(ev->ptr));
+ overwrite_some_buffers (static_cast<AudioDiskstream*>(ev->ptr));
break;
case Event::SetDiskstreamSpeed:
- set_diskstream_speed (static_cast<DiskStream*> (ev->ptr), ev->speed);
+ set_diskstream_speed (static_cast<AudioDiskstream*> (ev->ptr), ev->speed);
break;
case Event::SetSlaveSource:
diff --git a/libs/ardour/session_export.cc b/libs/ardour/session_export.cc
index 183b6df237..ddced9cc5f 100644
--- a/libs/ardour/session_export.cc
+++ b/libs/ardour/session_export.cc
@@ -47,14 +47,14 @@
#include <ardour/sndfile_helpers.h>
#include <ardour/port.h>
#include <ardour/audioengine.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/panner.h>
#include "i18n.h"
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
static int
convert_spec_to_info (AudioExportSpecification& spec, SF_INFO& sfinfo)
@@ -495,7 +495,7 @@ Session::prepare_to_export (AudioExportSpecification& spec)
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)-> seek (spec.start_frame, true)) {
error << string_compose (_("%1: cannot seek to %2 for export"),
(*i)->name(), spec.start_frame)
diff --git a/libs/ardour/session_feedback.cc b/libs/ardour/session_feedback.cc
index ea8580b3c2..1fd8389e11 100644
--- a/libs/ardour/session_feedback.cc
+++ b/libs/ardour/session_feedback.cc
@@ -31,15 +31,14 @@
#include <glibmm/thread.h>
-#include <pbd/error.h>
#include <pbd/pthread_utils.h>
#include <ardour/configuration.h>
#include <ardour/audioengine.h>
#include <ardour/session.h>
#include <ardour/audio_track.h>
-#include <ardour/diskstream.h>
-#include <ardour/control_protocol.h>
+#include <ardour/audio_diskstream.h>
+#include <control_protocol/control_protocol.h>
#include "i18n.h"
diff --git a/libs/ardour/session_midi.cc b/libs/ardour/session_midi.cc
index d8382c69a4..60bd95464f 100644
--- a/libs/ardour/session_midi.cc
+++ b/libs/ardour/session_midi.cc
@@ -37,7 +37,7 @@
#include <ardour/audioengine.h>
#include <ardour/session.h>
#include <ardour/audio_track.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/slave.h>
#include <ardour/cycles.h>
@@ -45,7 +45,7 @@
using namespace std;
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
using namespace MIDI;
MachineControl::CommandSignature MMC_CommandSignature;
@@ -724,7 +724,7 @@ Session::mmc_locate (MIDI::MachineControl &mmc, const MIDI::byte* mmc_tc)
}
jack_nframes_t target_frame;
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
smpte.hours = mmc_tc[0] & 0xf;
smpte.minutes = mmc_tc[1];
@@ -858,7 +858,7 @@ Session::send_full_time_code ()
{
MIDI::byte msg[10];
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
if (_mtc_port == 0 || !send_mtc) {
return 0;
@@ -884,7 +884,7 @@ Session::send_full_time_code ()
outbound_mtc_smpte_frame = _transport_frame;
if (((mtc_smpte_bits >> 5) != MIDI::MTC_25_FPS) && (transmitting_smpte_time.frames % 2)) {
// start MTC quarter frame transmission on an even frame
- smpte_increment( transmitting_smpte_time );
+ SMPTE::increment( transmitting_smpte_time );
outbound_mtc_smpte_frame += (jack_nframes_t) _frames_per_smpte_frame;
}
}
@@ -985,8 +985,8 @@ Session::send_midi_time_code ()
// Wrap quarter frame counter
next_quarter_frame_to_send = 0;
// Increment smpte time twice
- smpte_increment( transmitting_smpte_time );
- smpte_increment( transmitting_smpte_time );
+ SMPTE::increment( transmitting_smpte_time );
+ SMPTE::increment( transmitting_smpte_time );
// Re-calculate timing of first quarter frame
smpte_to_sample( transmitting_smpte_time, outbound_mtc_smpte_frame, true /* use_offset */, false );
// Compensate for audio latency
@@ -1024,7 +1024,7 @@ Session::deliver_mmc (MIDI::MachineControl::Command cmd, jack_nframes_t where)
{
using namespace MIDI;
int nbytes = 4;
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
if (_mmc_port == 0 || !send_mmc) {
return;
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 2f098a384f..ad4e9a64bb 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -30,7 +30,7 @@
#include <ardour/ardour.h>
#include <ardour/session.h>
#include <ardour/timestamps.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/audioengine.h>
#include <ardour/slave.h>
#include <ardour/auditioner.h>
@@ -40,7 +40,7 @@
#include "i18n.h"
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
using namespace std;
void
@@ -64,7 +64,7 @@ Session::process (jack_nframes_t nframes)
void
Session::prepare_diskstreams ()
{
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->prepare ();
}
}
@@ -136,12 +136,12 @@ Session::process_routes (jack_nframes_t nframes, jack_nframes_t offset)
if ((ret = (*i)->roll (nframes, _transport_frame, _transport_frame + nframes, offset, declick, record_active, rec_monitors)) < 0) {
- /* we have to do this here. Route::roll() for an AudioTrack will have called DiskStream::process(),
- and the DS will expect DiskStream::commit() to be called. but we're aborting from that
+ /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
+ and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
call path, so make sure we release any outstanding locks here before we return failure.
*/
- for (DiskStreamList::iterator ids = diskstreams.begin(); ids != diskstreams.end(); ++ids) {
+ for (AudioDiskstreamList::iterator ids = audio_diskstreams.begin(); ids != audio_diskstreams.end(); ++ids) {
(*ids)->recover ();
}
@@ -175,12 +175,12 @@ Session::silent_process_routes (jack_nframes_t nframes, jack_nframes_t offset)
if ((ret = (*i)->silent_roll (nframes, _transport_frame, _transport_frame + nframes, offset, record_active, rec_monitors)) < 0) {
- /* we have to do this here. Route::roll() for an AudioTrack will have called DiskStream::process(),
- and the DS will expect DiskStream::commit() to be called. but we're aborting from that
+ /* we have to do this here. Route::roll() for an AudioTrack will have called AudioDiskstream::process(),
+ and the DS will expect AudioDiskstream::commit() to be called. but we're aborting from that
call path, so make sure we release any outstanding locks here before we return failure.
*/
- for (DiskStreamList::iterator ids = diskstreams.begin(); ids != diskstreams.end(); ++ids) {
+ for (AudioDiskstreamList::iterator ids = audio_diskstreams.begin(); ids != audio_diskstreams.end(); ++ids) {
(*ids)->recover ();
}
@@ -199,7 +199,7 @@ Session::commit_diskstreams (jack_nframes_t nframes, bool &needs_butler)
float pworst = 1.0f;
float cworst = 1.0f;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->hidden()) {
continue;
@@ -566,7 +566,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
bool ok = true;
jack_nframes_t frame_delta = slave_transport_frame - _transport_frame;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->can_internal_playback_seek (frame_delta)) {
ok = false;
break;
@@ -574,7 +574,7 @@ Session::follow_slave (jack_nframes_t nframes, jack_nframes_t offset)
}
if (ok) {
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->internal_playback_seek (frame_delta);
}
_transport_frame += frame_delta;
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 5ef717de8a..92a21ea794 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -58,13 +58,11 @@
#include <ardour/audioengine.h>
#include <ardour/configuration.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/utils.h>
#include <ardour/audioplaylist.h>
-#include <ardour/source.h>
-#include <ardour/filesource.h>
+#include <ardour/audiofilesource.h>
#include <ardour/destructive_filesource.h>
-#include <ardour/sndfilesource.h>
#include <ardour/sndfile_helpers.h>
#include <ardour/auditioner.h>
#include <ardour/export.h>
@@ -89,6 +87,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
void
Session::first_stage_init (string fullpath, string snapshot_name)
@@ -196,12 +195,13 @@ Session::first_stage_init (string fullpath, string snapshot_name)
destructive_index = 0;
/* allocate conversion buffers */
- _conversion_buffers[ButlerContext] = new char[DiskStream::disk_io_frames() * 4];
- _conversion_buffers[TransportContext] = new char[DiskStream::disk_io_frames() * 4];
+ _conversion_buffers[ButlerContext] = new char[AudioDiskstream::disk_io_frames() * 4];
+ _conversion_buffers[TransportContext] = new char[AudioDiskstream::disk_io_frames() * 4];
/* default short fade = 15ms */
Crossfade::set_short_xfade_length ((jack_nframes_t) floor ((15.0 * frame_rate()) / 1000.0));
+ DestructiveFileSource::setup_standard_crossfades (frame_rate());
last_mmc_step.tv_sec = 0;
last_mmc_step.tv_usec = 0;
@@ -267,10 +267,10 @@ Session::first_stage_init (string fullpath, string snapshot_name)
/* These are all static "per-class" signals */
Region::CheckNewRegion.connect (mem_fun (*this, &Session::add_region));
- Source::SourceCreated.connect (mem_fun (*this, &Session::add_source));
+ AudioSource::AudioSourceCreated.connect (mem_fun (*this, &Session::add_audio_source));
Playlist::PlaylistCreated.connect (mem_fun (*this, &Session::add_playlist));
Redirect::RedirectCreated.connect (mem_fun (*this, &Session::add_redirect));
- DiskStream::DiskStreamCreated.connect (mem_fun (*this, &Session::add_diskstream));
+ AudioDiskstream::AudioDiskstreamCreated.connect (mem_fun (*this, &Session::add_diskstream));
NamedSelection::NamedSelectionCreated.connect (mem_fun (*this, &Session::add_named_selection));
IO::MoreOutputs.connect (mem_fun (*this, &Session::ensure_passthru_buffers));
@@ -285,7 +285,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
int
Session::second_stage_init (bool new_session)
{
- ExternalSource::set_peak_dir (peak_dir());
+ AudioFileSource::set_peak_dir (peak_dir());
if (!new_session) {
if (load_state (_current_snapshot_name)) {
@@ -425,7 +425,7 @@ Session::setup_raid_path (string path)
}
fspath += tape_dir_name;
- FileSource::set_search_path (fspath);
+ AudioFileSource::set_search_path (fspath);
return;
}
@@ -481,9 +481,9 @@ Session::setup_raid_path (string path)
session_dirs.push_back (sp);
}
- /* set the FileSource search path */
+ /* set the AudioFileSource search path */
- FileSource::set_search_path (fspath);
+ AudioFileSource::set_search_path (fspath);
/* reset the round-robin soundfile path thingie */
@@ -625,11 +625,11 @@ Session::load_diskstreams (const XMLNode& node)
for (citer = clist.begin(); citer != clist.end(); ++citer) {
- DiskStream* dstream;
+ AudioDiskstream* dstream;
try {
- dstream = new DiskStream (*this, **citer);
- /* added automatically by DiskStreamCreated handler */
+ dstream = new AudioDiskstream (*this, **citer);
+ /* added automatically by AudioDiskstreamCreated handler */
}
catch (failed_constructor& err) {
@@ -1335,15 +1335,15 @@ Session::state(bool full_state)
child = node->add_child ("Sources");
if (full_state) {
- Glib::Mutex::Lock sl (source_lock);
+ Glib::Mutex::Lock sl (audio_source_lock);
- for (SourceList::iterator siter = sources.begin(); siter != sources.end(); ++siter) {
+ for (AudioSourceList::iterator siter = audio_sources.begin(); siter != audio_sources.end(); ++siter) {
- /* Don't save information about FileSources that are empty */
+ /* Don't save information about AudioFileSources that are empty */
- FileSource* fs;
+ AudioFileSource* fs;
- if ((fs = dynamic_cast<FileSource*> ((*siter).second)) != 0) {
+ if ((fs = dynamic_cast<AudioFileSource*> ((*siter).second)) != 0) {
DestructiveFileSource* dfs = dynamic_cast<DestructiveFileSource*> (fs);
/* destructive file sources are OK if they are empty, because
@@ -1380,7 +1380,7 @@ Session::state(bool full_state)
{
Glib::RWLock::ReaderLock dl (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
child->add_child_nocopy ((*i)->get_state());
}
@@ -1511,7 +1511,7 @@ Session::set_state (const XMLNode& node)
Options
Sources
AudioRegions
- DiskStreams
+ AudioDiskstreams
Connections
Locations
Routes
@@ -1745,6 +1745,7 @@ Session::XMLRegionFactory (const XMLNode& node, bool full)
const XMLProperty* prop;
id_t s_id;
Source* source;
+ AudioSource* as;
AudioRegion::SourceList sources;
uint32_t nchans = 1;
char buf[128];
@@ -1772,7 +1773,13 @@ Session::XMLRegionFactory (const XMLNode& node, bool full)
return 0;
}
- sources.push_back(source);
+ as = dynamic_cast<AudioSource*>(source);
+ if (!as) {
+ error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
+ return 0;
+ }
+
+ sources.push_back (as);
/* pickup other channels */
@@ -1785,7 +1792,13 @@ Session::XMLRegionFactory (const XMLNode& node, bool full)
error << string_compose(_("Session: XMLNode describing a AudioRegion references an unknown source id =%1"), s_id) << endmsg;
return 0;
}
- sources.push_back(source);
+
+ as = dynamic_cast<AudioSource*>(source);
+ if (!as) {
+ error << string_compose(_("Session: XMLNode describing a AudioRegion references a non-audio source id =%1"), s_id) << endmsg;
+ return 0;
+ }
+ sources.push_back (as);
}
}
@@ -1804,12 +1817,14 @@ Session::get_sources_as_xml ()
{
XMLNode* node = new XMLNode (X_("Sources"));
- Glib::Mutex::Lock lm (source_lock);
+ Glib::Mutex::Lock lm (audio_source_lock);
- for (SourceList::iterator i = sources.begin(); i != sources.end(); ++i) {
+ for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
node->add_child_nocopy ((*i).second->get_state());
}
+ /* XXX get MIDI and other sources here */
+
return *node;
}
@@ -1867,23 +1882,12 @@ Session::XMLSourceFactory (const XMLNode& node)
}
try {
- if (node.property (X_("destructive")) != 0) {
- src = new DestructiveFileSource (node, frame_rate());
- } else {
- src = new FileSource (node, frame_rate());
- }
+ src = AudioFileSource::create (node);
}
catch (failed_constructor& err) {
-
- try {
- src = ExternalSource::create (node);
- }
-
- catch (failed_constructor& err) {
- error << _("Found a sound file that cannot be used by Ardour. See the progammers.") << endmsg;
- return 0;
- }
+ error << _("Found a sound file that cannot be used by Ardour. Talk to the progammers.") << endmsg;
+ return 0;
}
return src;
@@ -2930,9 +2934,9 @@ Session::cleanup_sources (Session::cleanup_report& rep)
rep.paths.clear ();
rep.space = 0;
- for (SourceList::iterator i = sources.begin(); i != sources.end(); ) {
+ for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ) {
- SourceList::iterator tmp;
+ AudioSourceList::iterator tmp;
tmp = i;
++tmp;
@@ -2949,7 +2953,7 @@ Session::cleanup_sources (Session::cleanup_report& rep)
adding it to the list of all sources below
*/
- sources.erase (i);
+ audio_sources.erase (i);
}
i = tmp;
@@ -3013,20 +3017,17 @@ Session::cleanup_sources (Session::cleanup_report& rep)
state file on disk still references sources we may have already
dropped.
*/
-
+
find_all_sources_across_snapshots (all_sources, true);
- /* add our current source list
+ /* add our current source list
*/
-
- for (SourceList::iterator i = sources.begin(); i != sources.end(); ++i) {
- FileSource* fs;
- ExternalSource* sfs;
+
+ for (AudioSourceList::iterator i = audio_sources.begin(); i != audio_sources.end(); ++i) {
+ AudioFileSource* fs;
- if ((fs = dynamic_cast<FileSource*> ((*i).second)) != 0) {
+ if ((fs = dynamic_cast<AudioFileSource*> ((*i).second)) != 0) {
all_sources.insert (fs->path());
- } else if ((sfs = dynamic_cast<ExternalSource*> ((*i).second)) != 0) {
- all_sources.insert (sfs->path());
}
}
diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc
index e3badc5b11..07b702618e 100644
--- a/libs/ardour/session_time.cc
+++ b/libs/ardour/session_time.cc
@@ -32,11 +32,12 @@
#include <ardour/audioengine.h>
#include <ardour/session.h>
#include <ardour/tempo.h>
+#include <ardour/audiofilesource.h>
#include "i18n.h"
using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
/* BBT TIME*/
@@ -91,6 +92,9 @@ Session::set_smpte_offset (jack_nframes_t off)
{
_smpte_offset = off;
last_smpte_valid = false;
+
+ AudioFileSource::set_header_position_offset (_smpte_offset, _smpte_offset_negative);
+
SMPTEOffsetChanged (); /* EMIT SIGNAL */
}
@@ -99,380 +103,15 @@ Session::set_smpte_offset_negative (bool neg)
{
_smpte_offset_negative = neg;
last_smpte_valid = false;
- SMPTEOffsetChanged (); /* EMIT SIGNAL */
-}
-
-#define SMPTE_IS_AROUND_ZERO( sm ) (!(sm).frames && !(sm).seconds && !(sm).minutes && !(sm).hours)
-#define SMPTE_IS_ZERO( sm ) (!(sm).frames && !(sm).seconds && !(sm).minutes && !(sm).hours && !(sm.subframes))
-
-// Increment by exactly one frame (keep subframes value)
-// Return true if seconds wrap
-smpte_wrap_t
-Session::smpte_increment( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- if (smpte.negative) {
- if (SMPTE_IS_AROUND_ZERO(smpte) && smpte.subframes) {
- // We have a zero transition involving only subframes
- smpte.subframes = 80 - smpte.subframes;
- smpte.negative = false;
- return smpte_wrap_seconds;
- }
-
- smpte.negative = false;
- wrap = smpte_decrement( smpte );
- if (!SMPTE_IS_ZERO( smpte )) {
- smpte.negative = true;
- }
- return wrap;
- }
-
- switch (mtc_smpte_bits >> 5) {
- case MIDI::MTC_24_FPS:
- if (smpte.frames == 23) {
- smpte.frames = 0;
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_25_FPS:
- if (smpte.frames == 24) {
- smpte.frames = 0;
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_30_FPS_DROP:
- if (smpte.frames == 29) {
- if ( ((smpte.minutes + 1) % 10) && (smpte.seconds == 59) ) {
- smpte.frames = 2;
- }
- else {
- smpte.frames = 0;
- }
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_30_FPS:
- if (smpte.frames == 29) {
- smpte.frames = 0;
- wrap = smpte_wrap_seconds;
- }
- break;
- }
-
- if (wrap == smpte_wrap_seconds) {
- if (smpte.seconds == 59) {
- smpte.seconds = 0;
- wrap = smpte_wrap_minutes;
- if (smpte.minutes == 59) {
- smpte.minutes = 0;
- wrap = smpte_wrap_hours;
- smpte.hours++;
- } else {
- smpte.minutes++;
- }
- } else {
- smpte.seconds++;
- }
- } else {
- smpte.frames++;
- }
-
- return wrap;
-}
-
-// Decrement by exactly one frame (keep subframes value)
-smpte_wrap_t
-Session::smpte_decrement( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
-
- if (smpte.negative || SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- wrap = smpte_increment( smpte );
- smpte.negative = true;
- return wrap;
- } else if (SMPTE_IS_AROUND_ZERO(smpte) && smpte.subframes) {
- // We have a zero transition involving only subframes
- smpte.subframes = 80 - smpte.subframes;
- smpte.negative = true;
- return smpte_wrap_seconds;
- }
-
- switch (mtc_smpte_bits >> 5) {
- case MIDI::MTC_24_FPS:
- if (smpte.frames == 0) {
- smpte.frames = 23;
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_25_FPS:
- if (smpte.frames == 0) {
- smpte.frames = 24;
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_30_FPS_DROP:
- if ((smpte.minutes % 10) && (smpte.seconds == 0)) {
- if (smpte.frames <= 2) {
- smpte.frames = 29;
- wrap = smpte_wrap_seconds;
- }
- } else if (smpte.frames == 0) {
- smpte.frames = 29;
- wrap = smpte_wrap_seconds;
- }
- break;
- case MIDI::MTC_30_FPS:
- if (smpte.frames == 0) {
- smpte.frames = 29;
- wrap = smpte_wrap_seconds;
- }
- break;
- }
-
- if (wrap == smpte_wrap_seconds) {
- if (smpte.seconds == 0) {
- smpte.seconds = 59;
- wrap = smpte_wrap_minutes;
- if (smpte.minutes == 0) {
- smpte.minutes = 59;
- wrap = smpte_wrap_hours;
- smpte.hours--;
- }
- else {
- smpte.minutes--;
- }
- } else {
- smpte.seconds--;
- }
- } else {
- smpte.frames--;
- }
-
- if (SMPTE_IS_ZERO( smpte )) {
- smpte.negative = false;
- }
-
- return wrap;
-}
-
-// Go to lowest absolute subframe value in this frame (set to 0 :-)
-void
-Session::smpte_frames_floor( SMPTE_Time& smpte ) const
-{
- smpte.subframes = 0;
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
-}
-
-// Increment by one subframe
-smpte_wrap_t
-Session::smpte_increment_subframes( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- if (smpte.negative) {
- smpte.negative = false;
- wrap = smpte_decrement_subframes( smpte );
- if (!SMPTE_IS_ZERO(smpte)) {
- smpte.negative = true;
- }
- return wrap;
- }
-
- smpte.subframes++;
- if (smpte.subframes >= 80) {
- smpte.subframes = 0;
- smpte_increment( smpte );
- return smpte_wrap_frames;
- }
- return smpte_wrap_none;
-}
-
-
-// Decrement by one subframe
-smpte_wrap_t
-Session::smpte_decrement_subframes( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- if (smpte.negative) {
- smpte.negative = false;
- wrap = smpte_increment_subframes( smpte );
- smpte.negative = true;
- return wrap;
- }
-
- if (smpte.subframes <= 0) {
- smpte.subframes = 0;
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = true;
- smpte.subframes = 1;
- return smpte_wrap_frames;
- } else {
- smpte_decrement( smpte );
- smpte.subframes = 79;
- return smpte_wrap_frames;
- }
- } else {
- smpte.subframes--;
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
- return smpte_wrap_none;
- }
-}
-
-
-// Go to next whole second (frames == 0 or frames == 2)
-smpte_wrap_t
-Session::smpte_increment_seconds( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- // Clear subframes
- smpte_frames_floor( smpte );
-
- if (smpte.negative) {
- // Wrap second if on second boundary
- wrap = smpte_increment(smpte);
- // Go to lowest absolute frame value
- smpte_seconds_floor( smpte );
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
- } else {
- // Go to highest possible frame in this second
- switch (mtc_smpte_bits >> 5) {
- case MIDI::MTC_24_FPS:
- smpte.frames = 23;
- break;
- case MIDI::MTC_25_FPS:
- smpte.frames = 24;
- break;
- case MIDI::MTC_30_FPS_DROP:
- case MIDI::MTC_30_FPS:
- smpte.frames = 29;
- break;
- }
-
- // Increment by one frame
- wrap = smpte_increment( smpte );
- }
-
- return wrap;
-}
-
-// Go to lowest (absolute) frame value in this second
-// Doesn't care about positive/negative
-void
-Session::smpte_seconds_floor( SMPTE_Time& smpte ) const
-{
- // Clear subframes
- smpte_frames_floor( smpte );
-
- // Go to lowest possible frame in this second
- switch (mtc_smpte_bits >> 5) {
- case MIDI::MTC_24_FPS:
- case MIDI::MTC_25_FPS:
- case MIDI::MTC_30_FPS:
- smpte.frames = 0;
- break;
- case MIDI::MTC_30_FPS_DROP:
- if ((smpte.minutes % 10) && (smpte.seconds == 0)) {
- smpte.frames = 2;
- } else {
- smpte.frames = 0;
- }
- break;
- }
-
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
-}
-
-
-// Go to next whole minute (seconds == 0, frames == 0 or frames == 2)
-smpte_wrap_t
-Session::smpte_increment_minutes( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- // Clear subframes
- smpte_frames_floor( smpte );
-
- if (smpte.negative) {
- // Wrap if on minute boundary
- wrap = smpte_increment_seconds( smpte );
- // Go to lowest possible value in this minute
- smpte_minutes_floor( smpte );
- } else {
- // Go to highest possible second
- smpte.seconds = 59;
- // Wrap minute by incrementing second
- wrap = smpte_increment_seconds( smpte );
- }
-
- return wrap;
-}
-
-// Go to lowest absolute value in this minute
-void
-Session::smpte_minutes_floor( SMPTE_Time& smpte ) const
-{
- // Go to lowest possible second
- smpte.seconds = 0;
- // Go to lowest possible frame
- smpte_seconds_floor( smpte );
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
-}
+ AudioFileSource::set_header_position_offset (_smpte_offset, _smpte_offset_negative);
-// Go to next whole hour (minute = 0, second = 0, frame = 0)
-smpte_wrap_t
-Session::smpte_increment_hours( SMPTE_Time& smpte ) const
-{
- smpte_wrap_t wrap = smpte_wrap_none;
-
- // Clear subframes
- smpte_frames_floor(smpte);
-
- if (smpte.negative) {
- // Wrap if on hour boundary
- wrap = smpte_increment_minutes( smpte );
- // Go to lowest possible value in this hour
- smpte_hours_floor( smpte );
- } else {
- smpte.minutes = 59;
- wrap = smpte_increment_minutes( smpte );
- }
-
- return wrap;
-}
-
-// Go to lowest absolute value in this hour
-void
-Session::smpte_hours_floor( SMPTE_Time& smpte ) const
-{
- smpte.minutes = 0;
- smpte.seconds = 0;
- smpte.frames = 0;
- smpte.subframes = 0;
-
- if (SMPTE_IS_ZERO(smpte)) {
- smpte.negative = false;
- }
+ SMPTEOffsetChanged (); /* EMIT SIGNAL */
}
void
-Session::smpte_to_sample( SMPTE_Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const
+Session::smpte_to_sample( SMPTE::Time& smpte, jack_nframes_t& sample, bool use_offset, bool use_subframes ) const
{
if (smpte_drop_frames) {
// The drop frame format was created to better approximate the 30000/1001 = 29.97002997002997....
@@ -555,10 +194,10 @@ Session::smpte_to_sample( SMPTE_Time& smpte, jack_nframes_t& sample, bool use_of
void
-Session::sample_to_smpte( jack_nframes_t sample, SMPTE_Time& smpte, bool use_offset, bool use_subframes ) const
+Session::sample_to_smpte( jack_nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const
{
jack_nframes_t offset_sample;
-
+
if (!use_offset) {
offset_sample = sample;
smpte.negative = false;
@@ -649,7 +288,7 @@ Session::sample_to_smpte( jack_nframes_t sample, SMPTE_Time& smpte, bool use_off
}
void
-Session::smpte_time (jack_nframes_t when, SMPTE_Time& smpte)
+Session::smpte_time (jack_nframes_t when, SMPTE::Time& smpte)
{
if (last_smpte_valid && when == last_smpte_when) {
smpte = last_smpte;
@@ -664,7 +303,7 @@ Session::smpte_time (jack_nframes_t when, SMPTE_Time& smpte)
}
void
-Session::smpte_time_subframes (jack_nframes_t when, SMPTE_Time& smpte)
+Session::smpte_time_subframes (jack_nframes_t when, SMPTE::Time& smpte)
{
if (last_smpte_valid && when == last_smpte_when) {
smpte = last_smpte;
@@ -679,7 +318,7 @@ Session::smpte_time_subframes (jack_nframes_t when, SMPTE_Time& smpte)
}
void
-Session::smpte_duration (jack_nframes_t when, SMPTE_Time& smpte) const
+Session::smpte_duration (jack_nframes_t when, SMPTE::Time& smpte) const
{
sample_to_smpte( when, smpte, false /* use_offset */, true /* use_subframes */ );
}
@@ -687,14 +326,14 @@ Session::smpte_duration (jack_nframes_t when, SMPTE_Time& smpte) const
void
Session::smpte_duration_string (char* buf, jack_nframes_t when) const
{
- SMPTE_Time smpte;
+ SMPTE::Time smpte;
smpte_duration (when, smpte);
- snprintf (buf, sizeof (buf), "%02ld:%02ld:%02ld:%02ld", smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
+ snprintf (buf, sizeof (buf), "%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32 ":%02" PRIu32, smpte.hours, smpte.minutes, smpte.seconds, smpte.frames);
}
void
-Session::smpte_time (SMPTE_Time &t)
+Session::smpte_time (SMPTE::Time &t)
{
smpte_time (_transport_frame, t);
diff --git a/libs/ardour/session_timefx.cc b/libs/ardour/session_timefx.cc
index 6351aa9825..7eec1e578b 100644
--- a/libs/ardour/session_timefx.cc
+++ b/libs/ardour/session_timefx.cc
@@ -27,13 +27,13 @@
#include <ardour/session.h>
#include <ardour/audioregion.h>
-#include <ardour/filesource.h>
#include <ardour/sndfilesource.h>
#include "i18n.h"
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
using namespace soundtouch;
AudioRegion*
@@ -80,7 +80,10 @@ Session::tempoize_region (TimeStretchRequest& tsr)
}
try {
- sources.push_back(new FileSource (path, frame_rate(), false, Config->get_native_file_data_format()));
+ sources.push_back (new SndFileSource (path,
+ Config->get_native_file_data_format(),
+ Config->get_native_file_header_format(),
+ frame_rate()));
} catch (failed_constructor& err) {
error << string_compose (_("tempoize: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;
goto out;
@@ -150,13 +153,16 @@ Session::tempoize_region (TimeStretchRequest& tsr)
xnow = localtime (&now);
for (it = sources.begin(); it != sources.end(); ++it) {
- dynamic_cast<FileSource*>(*it)->update_header (tsr.region->position(), *xnow, now);
+ AudioFileSource* afs = dynamic_cast<AudioFileSource*>(*it);
+ if (afs) {
+ afs->update_header (tsr.region->position(), *xnow, now);
+ }
}
region_name = tsr.region->name() + X_(".t");
r = new AudioRegion (sources, 0, sources.front()->length(), region_name,
- 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
+ 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile));
out:
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index db15b64c32..376dee11a2 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -36,7 +36,7 @@
#include <ardour/ardour.h>
#include <ardour/audioengine.h>
#include <ardour/session.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/auditioner.h>
#include <ardour/slave.h>
#include <ardour/location.h>
@@ -46,6 +46,7 @@
using namespace std;
using namespace ARDOUR;
using namespace sigc;
+using namespace PBD;
void
Session::request_input_change_handling ()
@@ -78,7 +79,7 @@ Session::request_transport_speed (float speed)
}
void
-Session::request_diskstream_speed (DiskStream& ds, float speed)
+Session::request_diskstream_speed (AudioDiskstream& ds, float speed)
{
Event* ev = new Event (Event::SetDiskstreamSpeed, Event::Add, Event::Immediate, 0, speed);
ev->set_ptr (&ds);
@@ -200,7 +201,7 @@ Session::butler_transport_work ()
}
if (post_transport_work & PostTransportInputChange) {
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->non_realtime_input_change ();
}
}
@@ -216,7 +217,7 @@ Session::butler_transport_work ()
cumulative_rf_motion = 0;
reset_rf_scale (0);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) {
(*i)->seek ((jack_nframes_t) (_transport_frame * (double) (*i)->speed()));
@@ -248,7 +249,7 @@ Session::non_realtime_set_speed ()
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->non_realtime_set_speed ();
}
}
@@ -258,7 +259,7 @@ Session::non_realtime_overwrite ()
{
Glib::RWLock::ReaderLock lm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->pending_overwrite) {
(*i)->overwrite_existing_buffers ();
}
@@ -274,7 +275,7 @@ Session::non_realtime_stop (bool abort)
did_record = false;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->get_captured_frames () != 0) {
did_record = true;
break;
@@ -327,7 +328,7 @@ Session::non_realtime_stop (bool abort)
_have_captured = true;
}
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->transport_stopped (*now, xnow, abort);
}
@@ -364,7 +365,7 @@ Session::non_realtime_stop (bool abort)
}
#endif
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
if ((*i)->speed() != 1.0f || (*i)->speed() != -1.0f) {
(*i)->seek ((jack_nframes_t) (_transport_frame * (double) (*i)->speed()));
@@ -491,7 +492,7 @@ Session::set_auto_loop (bool yn)
if (seamless_loop) {
// set all diskstreams to use internal looping
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
(*i)->set_loop (loc);
}
@@ -499,7 +500,7 @@ Session::set_auto_loop (bool yn)
}
else {
// set all diskstreams to NOT use internal looping
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
(*i)->set_loop (0);
}
@@ -529,7 +530,7 @@ Session::set_auto_loop (bool yn)
clear_events (Event::AutoLoop);
// set all diskstreams to NOT use internal looping
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
(*i)->set_loop (0);
}
@@ -645,7 +646,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
The rarity and short potential lock duration makes this "OK"
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (!auto_input);
@@ -660,7 +661,7 @@ Session::locate (jack_nframes_t target_frame, bool with_roll, bool with_flush, b
The rarity and short potential lock duration makes this "OK"
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (true);
@@ -704,7 +705,7 @@ Session::set_transport_speed (float speed, bool abort)
The rarity and short potential lock duration makes this "OK"
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->record_enabled ()) {
//cerr << "switching to input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (true);
@@ -730,7 +731,7 @@ Session::set_transport_speed (float speed, bool abort)
The rarity and short potential lock duration makes this "OK"
*/
Glib::RWLock::ReaderLock dsm (diskstream_lock);
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (auto_input && (*i)->record_enabled ()) {
//cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
(*i)->monitor_input (false);
@@ -781,7 +782,7 @@ Session::set_transport_speed (float speed, bool abort)
_last_transport_speed = _transport_speed;
_transport_speed = speed;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if ((*i)->realtime_set_speed ((*i)->speed(), true)) {
post_transport_work = PostTransportWork (post_transport_work | PostTransportSpeed);
}
@@ -871,7 +872,7 @@ Session::actually_start_transport ()
transport_sub_state |= PendingDeclickIn;
_transport_speed = 1.0;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->realtime_set_speed ((*i)->speed(), true);
}
@@ -1001,7 +1002,7 @@ Session::set_slave_source (SlaveSource src, jack_nframes_t frame)
_slave_type = src;
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
if (!(*i)->hidden()) {
if ((*i)->realtime_set_speed ((*i)->speed(), true)) {
non_rt_required = true;
@@ -1033,7 +1034,7 @@ Session::reverse_diskstream_buffers ()
}
void
-Session::set_diskstream_speed (DiskStream* stream, float speed)
+Session::set_diskstream_speed (AudioDiskstream* stream, float speed)
{
if (stream->realtime_set_speed (speed, false)) {
post_transport_work = PostTransportWork (post_transport_work | PostTransportSpeed);
@@ -1198,8 +1199,8 @@ Session::update_latency_compensation (bool with_stop, bool abort)
for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
if (with_stop) {
- (*i)->transport_stopped (abort, (post_transport_work & PostTransportLocate),
- (!(post_transport_work & PostTransportLocate) || pending_locate_flush));
+ (*i)->handle_transport_stopped (abort, (post_transport_work & PostTransportLocate),
+ (!(post_transport_work & PostTransportLocate) || pending_locate_flush));
}
jack_nframes_t old_latency = (*i)->signal_latency ();
@@ -1229,7 +1230,7 @@ Session::update_latency_compensation (bool with_stop, bool abort)
/* reflect any changes in latencies into capture offsets
*/
- for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
+ for (AudioDiskstreamList::iterator i = audio_diskstreams.begin(); i != audio_diskstreams.end(); ++i) {
(*i)->set_capture_offset ();
}
}
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index 87f7faf423..24a70f636b 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -18,47 +18,194 @@
$Id$
*/
+#include <cerrno>
+#include <climits>
+
+#include <pwd.h>
+#include <sys/utsname.h>
+
+#include <glibmm/miscutils.h>
+
#include <ardour/sndfilesource.h>
#include "i18n.h"
+using namespace std;
using namespace ARDOUR;
+using namespace PBD;
SndFileSource::SndFileSource (const XMLNode& node)
- : ExternalSource (node)
+ : AudioFileSource (node)
{
- init (_name, true);
- SourceCreated (this); /* EMIT SIGNAL */
+ init (_name);
+
+ if (open()) {
+ throw failed_constructor ();
+ }
+
+ if (_build_peakfiles) {
+ if (initialize_peakfile (false, _path)) {
+ sf_close (sf);
+ sf = 0;
+ throw failed_constructor ();
+ }
+ }
+
+ AudioSourceCreated (this); /* EMIT SIGNAL */
+}
+
+SndFileSource::SndFileSource (string idstr, Flag flags)
+ : AudioFileSource (idstr, Flag (flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy)))
+{
+ init (idstr);
+
+ if (open()) {
+ throw failed_constructor ();
+ }
+
+ if (_build_peakfiles) {
+ if (initialize_peakfile (false, _path)) {
+ sf_close (sf);
+ sf = 0;
+ throw failed_constructor ();
+ }
+ }
+
+
+ AudioSourceCreated (this); /* EMIT SIGNAL */
}
-SndFileSource::SndFileSource (const string& idstr, bool build_peak)
- : ExternalSource(idstr, build_peak)
+SndFileSource::SndFileSource (string idstr, SampleFormat sfmt, HeaderFormat hf, jack_nframes_t rate, Flag flags)
+ : AudioFileSource(idstr, flags, sfmt, hf)
{
- init (idstr, build_peak);
+ int fmt = 0;
+
+ init (idstr);
+
+ switch (hf) {
+ case CAF:
+ fmt = SF_FORMAT_CAF;
+ _flags = Flag (_flags & ~Broadcast);
+ break;
+
+ case AIFF:
+ fmt = SF_FORMAT_AIFF;
+ _flags = Flag (_flags & ~Broadcast);
+ break;
+
+ case BWF:
+ fmt = SF_FORMAT_WAV;
+ _flags = Flag (_flags | Broadcast);
+ break;
+
+ case WAVE:
+ fmt = SF_FORMAT_WAV;
+ _flags = Flag (_flags & ~Broadcast);
+ break;
+
+ case WAVE64:
+ fmt = SF_FORMAT_W64;
+ _flags = Flag (_flags & ~Broadcast);
+ break;
+
+ default:
+ fatal << string_compose (_("programming error: %1"), X_("unsupported audio header format requested")) << endmsg;
+ /*NOTREACHED*/
+ break;
+
+ }
+
+ switch (sfmt) {
+ case FormatFloat:
+ fmt |= SF_FORMAT_FLOAT;
+ break;
+
+ case FormatInt24:
+ fmt |= SF_FORMAT_PCM_24;
+ break;
+ }
+
+ _info.channels = 1;
+ _info.samplerate = rate;
+ _info.format = fmt;
+
+ if (open()) {
+ throw failed_constructor();
+ }
+
+ if (writable() && (_flags & Broadcast)) {
+
+ _broadcast_info = new SF_BROADCAST_INFO;
+ memset (_broadcast_info, 0, sizeof (*_broadcast_info));
+
+ snprintf (_broadcast_info->description, sizeof (_broadcast_info->description), "BWF %s", _name.c_str());
+
+ struct utsname utsinfo;
- if (build_peak) {
- SourceCreated (this); /* EMIT SIGNAL */
+ if (uname (&utsinfo)) {
+ error << string_compose(_("FileSource: cannot get host information for BWF header (%1)"), strerror(errno)) << endmsg;
+ return;
+ }
+
+ snprintf (_broadcast_info->originator, sizeof (_broadcast_info->originator), "ardour:%s:%s:%s:%s:%s)",
+ Glib::get_real_name().c_str(),
+ utsinfo.nodename,
+ utsinfo.sysname,
+ utsinfo.release,
+ utsinfo.version);
+
+ _broadcast_info->version = 1;
+
+ /* XXX do something about this field */
+
+ snprintf (_broadcast_info->umid, sizeof (_broadcast_info->umid), "%s", "fnord");
+
+ /* coding history is added by libsndfile */
+
+ if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (_broadcast_info)) != SF_TRUE) {
+ char errbuf[256];
+ sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+ error << string_compose (_("cannot set broadcast info for audio file %1 (%2); dropping broadcast info for this file"), _path, errbuf) << endmsg;
+ _flags = Flag (_flags & ~Broadcast);
+ delete _broadcast_info;
+ _broadcast_info = 0;
+ }
}
+
+ if (_build_peakfiles) {
+ if (initialize_peakfile (true, _path)) {
+ sf_close (sf);
+ sf = 0;
+ throw failed_constructor ();
+ }
+ }
+
+ /* since SndFileSource's constructed with this constructor can be writable, make sure we update if the header info changes */
+
+ if (writable()) {
+ HeaderPositionOffsetChanged.connect (mem_fun (*this, &AudioFileSource::handle_header_position_change));
+ }
+
+ AudioSourceCreated (this); /* EMIT SIGNAL */
}
void
-SndFileSource::init (const string& idstr, bool build_peak)
+SndFileSource::init (const string& idstr)
{
string::size_type pos;
string file;
- tmpbuf = 0;
- tmpbufsize = 0;
+ interleave_buf = 0;
+ interleave_bufsize = 0;
sf = 0;
-
- _name = idstr;
+ _broadcast_info = 0;
if ((pos = idstr.find_last_of (':')) == string::npos) {
channel = 0;
- file = idstr;
+ _name = Glib::path_get_basename (idstr);
} else {
channel = atoi (idstr.substr (pos+1).c_str());
- file = idstr.substr (0, pos);
+ _name = Glib::path_get_basename (idstr.substr (0, pos));
}
/* although libsndfile says we don't need to set this,
@@ -66,46 +213,56 @@ SndFileSource::init (const string& idstr, bool build_peak)
*/
memset (&_info, 0, sizeof(_info));
+}
- /* note that we temporarily truncated _id at the colon */
-
- if ((sf = sf_open (file.c_str(), SFM_READ, &_info)) == 0) {
+int
+SndFileSource::open ()
+{
+ if ((sf = sf_open (_path.c_str(), (writable() ? SFM_RDWR : SFM_READ), &_info)) == 0) {
char errbuf[256];
sf_error_str (0, errbuf, sizeof (errbuf) - 1);
- error << string_compose(_("SndFileSource: cannot open file \"%1\" (%2)"), file, errbuf) << endmsg;
- throw failed_constructor();
+ error << string_compose(_("SndFileSource: cannot open file \"%1\" for %2 (%3)"),
+ _path, (writable() ? "read+write" : "reading"), errbuf) << endmsg;
+ return -1;
}
if (channel >= _info.channels) {
error << string_compose(_("SndFileSource: file only contains %1 channels; %2 is invalid as a channel number"), _info.channels, channel) << endmsg;
sf_close (sf);
sf = 0;
- throw failed_constructor();
+ return -1;
}
_length = _info.frames;
- _path = file;
- if (build_peak) {
- if (initialize_peakfile (false, _path)) {
- sf_close (sf);
- sf = 0;
- throw failed_constructor ();
- }
+ if (writable()) {
+ sf_command (sf, SFC_SET_UPDATE_HEADER_AUTO, 0, SF_FALSE);
}
+
+ return 0;
}
-SndFileSource::~SndFileSource ()
+void
+SndFileSource::close ()
+{
+ if (sf) {
+ sf_close (sf);
+ sf = 0;
+ }
+}
+SndFileSource::~SndFileSource ()
{
GoingAway (this); /* EMIT SIGNAL */
- if (sf) {
- sf_close (sf);
+ close ();
+
+ if (interleave_buf) {
+ delete [] interleave_buf;
}
- if (tmpbuf) {
- delete [] tmpbuf;
+ if (_broadcast_info) {
+ delete [] _broadcast_info;
}
}
@@ -116,49 +273,73 @@ SndFileSource::sample_rate () const
}
jack_nframes_t
-SndFileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
+SndFileSource::read_unlocked (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char * workbuf) const
{
int32_t nread;
float *ptr;
uint32_t real_cnt;
+ jack_nframes_t file_cnt;
- if (sf_seek (sf, (off_t) start, SEEK_SET) < 0) {
- char errbuf[256];
- sf_error_str (0, errbuf, sizeof (errbuf) - 1);
- error << string_compose(_("SndFileSource: could not seek to frame %1 within %2 (%3)"), start, _name.substr (1), errbuf) << endmsg;
- return 0;
- }
+ if (start > _length) {
- if (_info.channels == 1) {
- jack_nframes_t ret = sf_read_float (sf, dst, cnt);
- _read_data_count = cnt * sizeof(float);
- return ret;
- }
+ /* read starts beyond end of data, just memset to zero */
+
+ file_cnt = 0;
- real_cnt = cnt * _info.channels;
+ } else if (start + cnt > _length) {
+
+ /* read ends beyond end of data, read some, memset the rest */
+
+ file_cnt = _length - start;
- {
- Glib::Mutex::Lock lm (_tmpbuf_lock);
+ } else {
- if (tmpbufsize < real_cnt) {
-
- if (tmpbuf) {
- delete [] tmpbuf;
- }
- tmpbufsize = real_cnt;
- tmpbuf = new float[tmpbufsize];
+ /* read is entirely within data */
+
+ file_cnt = cnt;
+ }
+
+ if (file_cnt) {
+
+ if (sf_seek (sf, (sf_count_t) start, SEEK_SET|SFM_READ) != (sf_count_t) start) {
+ char errbuf[256];
+ sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+ error << string_compose(_("SndFileSource: could not seek to frame %1 within %2 (%3)"), start, _name.substr (1), errbuf) << endmsg;
+ return 0;
}
- nread = sf_read_float (sf, tmpbuf, real_cnt);
- ptr = tmpbuf + channel;
- nread /= _info.channels;
-
- /* stride through the interleaved data */
+ if (_info.channels == 1) {
+ jack_nframes_t ret = sf_read_float (sf, dst, file_cnt);
+ _read_data_count = cnt * sizeof(float);
+ return ret;
+ }
+ }
+
+ if (file_cnt != cnt) {
+ jack_nframes_t delta = cnt - file_cnt;
+ memset (dst+file_cnt, 0, sizeof (Sample) * delta);
+ }
+
+ real_cnt = cnt * _info.channels;
+
+ if (interleave_bufsize < real_cnt) {
- for (int32_t n = 0; n < nread; ++n) {
- dst[n] = *ptr;
- ptr += _info.channels;
+ if (interleave_buf) {
+ delete [] interleave_buf;
}
+ interleave_bufsize = real_cnt;
+ interleave_buf = new float[interleave_bufsize];
+ }
+
+ nread = sf_read_float (sf, interleave_buf, real_cnt);
+ ptr = interleave_buf + channel;
+ nread /= _info.channels;
+
+ /* stride through the interleaved data */
+
+ for (int32_t n = 0; n < nread; ++n) {
+ dst[n] = *ptr;
+ ptr += _info.channels;
}
_read_data_count = cnt * sizeof(float);
@@ -166,3 +347,163 @@ SndFileSource::read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt, char
return nread;
}
+jack_nframes_t
+SndFileSource::write_unlocked (Sample *data, jack_nframes_t cnt, char * workbuf)
+{
+ if (!writable()) {
+ return 0;
+ }
+
+ if (_info.channels != 1) {
+ fatal << string_compose (_("programming error: %1 %2"), X_("SndFileSource::write called on non-mono file"), _path) << endmsg;
+ /*NOTREACHED*/
+ return 0;
+ }
+
+ jack_nframes_t oldlen;
+ int32_t frame_pos = _length;
+
+ if (write_float (data, frame_pos, cnt) != cnt) {
+ return 0;
+ }
+
+ oldlen = _length;
+ update_length (oldlen, cnt);
+
+ if (_build_peakfiles) {
+ PeakBuildRecord *pbr = 0;
+
+ if (pending_peak_builds.size()) {
+ pbr = pending_peak_builds.back();
+ }
+
+ if (pbr && pbr->frame + pbr->cnt == oldlen) {
+
+ /* the last PBR extended to the start of the current write,
+ so just extend it again.
+ */
+
+ pbr->cnt += cnt;
+ } else {
+ pending_peak_builds.push_back (new PeakBuildRecord (oldlen, cnt));
+ }
+
+ _peaks_built = false;
+ }
+
+
+ if (_build_peakfiles) {
+ queue_for_peaks (*this);
+ }
+
+ _write_data_count = cnt;
+
+ return cnt;
+}
+
+int
+SndFileSource::update_header (jack_nframes_t when, struct tm& now, time_t tnow)
+{
+ /* allow derived classes to override how this is done */
+
+ set_timeline_position (when);
+
+ if (_flags & Broadcast) {
+ /* this will flush the header implicitly */
+ return setup_broadcast_info (when, now, tnow);
+ } else {
+ return flush_header ();
+ }
+}
+
+int
+SndFileSource::flush_header ()
+{
+ return (sf_command (sf, SFC_UPDATE_HEADER_NOW, 0, 0) != SF_TRUE);
+}
+
+int
+SndFileSource::setup_broadcast_info (jack_nframes_t when, struct tm& now, time_t tnow)
+{
+ /* random code is 9 digits */
+
+ int random_code = random() % 999999999;
+
+ snprintf (_broadcast_info->originator_reference, sizeof (_broadcast_info->originator_reference), "%2s%3s%12s%02d%02d%02d%9d",
+ bwf_country_code,
+ bwf_organization_code,
+ bwf_serial_number,
+ now.tm_hour,
+ now.tm_min,
+ now.tm_sec,
+ random_code);
+
+ snprintf (_broadcast_info->origination_date, sizeof (_broadcast_info->origination_date), "%4d-%02d-%02d",
+ 1900 + now.tm_year,
+ now.tm_mon,
+ now.tm_mday);
+
+ snprintf (_broadcast_info->origination_time, sizeof (_broadcast_info->origination_time), "%02d-%02d-%02d",
+ now.tm_hour,
+ now.tm_min,
+ now.tm_sec);
+
+ /* now update header position taking header offset into account */
+
+ set_header_timeline_position ();
+
+ /* note that libsndfile flushes the header to disk when resetting the broadcast info */
+
+ if (sf_command (sf, SFC_SET_BROADCAST_INFO, _broadcast_info, sizeof (*_broadcast_info)) != SF_TRUE) {
+ error << string_compose (_("cannot set broadcast info for audio file %1; Dropping broadcast info for this file"), _path) << endmsg;
+ _flags = Flag (_flags & ~Broadcast);
+ delete _broadcast_info;
+ _broadcast_info = 0;
+ return -1;
+ }
+
+ return 0;
+}
+
+void
+SndFileSource::set_header_timeline_position ()
+{
+ uint64_t pos;
+
+ _broadcast_info->time_reference_high = 0;
+
+ if (header_position_negative) {
+
+ if (ULONG_LONG_MAX - header_position_offset < timeline_position) {
+ pos = ULONG_LONG_MAX; // impossible
+ } else {
+ pos = timeline_position + header_position_offset;
+ }
+
+ } else {
+
+ if (timeline_position < header_position_offset) {
+ pos = 0;
+ } else {
+ pos = timeline_position - header_position_offset;
+ }
+ }
+
+ _broadcast_info->time_reference_high = (pos >> 32);
+ _broadcast_info->time_reference_low = (pos & 0xffffffff);
+}
+
+jack_nframes_t
+SndFileSource::write_float (Sample* data, jack_nframes_t frame_pos, jack_nframes_t cnt)
+{
+ if (sf_seek (sf, frame_pos, SEEK_SET|SFM_WRITE) != frame_pos) {
+ error << string_compose (_("%1: cannot seek to %2"), _path, frame_pos) << endmsg;
+ return 0;
+ }
+
+ if (sf_writef_float (sf, data, cnt) != (ssize_t) cnt) {
+ return 0;
+ }
+
+ return cnt;
+}
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index 7d790a036d..0d32ea4a21 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -42,35 +42,18 @@ using std::max;
using namespace ARDOUR;
-sigc::signal<void,Source *> Source::SourceCreated;
-pthread_t Source::peak_thread;
-bool Source::have_peak_thread = false;
-vector<Source*> Source::pending_peak_sources;
-Glib::StaticMutex Source::pending_peak_sources_lock = GLIBMM_STATIC_MUTEX_INIT;
-int Source::peak_request_pipe[2];
-
-bool Source::_build_missing_peakfiles = false;
-bool Source::_build_peakfiles = false;
-
-Source::Source (bool announce)
+Source::Source (string name)
{
+ _name = name;
_id = ARDOUR::new_id();
_use_cnt = 0;
- _peaks_built = false;
- next_peak_clear_should_notify = true;
_timestamp = 0;
- _read_data_count = 0;
- _write_data_count = 0;
}
Source::Source (const XMLNode& node)
{
_use_cnt = 0;
- _peaks_built = false;
- next_peak_clear_should_notify = true;
_timestamp = 0;
- _read_data_count = 0;
- _write_data_count = 0;
if (set_state (node)) {
throw failed_constructor();
@@ -96,10 +79,6 @@ Source::get_state ()
node->add_property ("timestamp", buf);
}
- if (_captured_for.length()) {
- node->add_property ("captured-for", _captured_for);
- }
-
return *node;
}
@@ -124,735 +103,10 @@ Source::set_state (const XMLNode& node)
sscanf (prop->value().c_str(), "%ld", &_timestamp);
}
- if ((prop = node.property ("captured-for")) != 0) {
- _captured_for = prop->value();
- }
-
- return 0;
-}
-
-/***********************************************************************
- PEAK FILE STUFF
- ***********************************************************************/
-
-void*
-Source::peak_thread_work (void* arg)
-{
- PBD::ThreadCreated (pthread_self(), X_("Peak"));
- struct pollfd pfd[1];
-
- Glib::Mutex::Lock lm (pending_peak_sources_lock);
-
- while (true) {
-
- pfd[0].fd = peak_request_pipe[0];
- pfd[0].events = POLLIN|POLLERR|POLLHUP;
-
- pending_peak_sources_lock.unlock();
-
- if (poll (pfd, 1, -1) < 0) {
-
- if (errno == EINTR) {
- pending_peak_sources_lock.lock();
- continue;
- }
-
- error << string_compose (_("poll on peak request pipe failed (%1)"),
- strerror (errno))
- << endmsg;
- break;
- }
-
- if (pfd[0].revents & ~POLLIN) {
- error << _("Error on peak thread request pipe") << endmsg;
- break;
- }
-
- if (pfd[0].revents & POLLIN) {
-
- char req;
-
- /* empty the pipe of all current requests */
-
- while (1) {
- size_t nread = ::read (peak_request_pipe[0], &req, sizeof (req));
-
- if (nread == 1) {
- switch ((PeakRequest::Type) req) {
-
- case PeakRequest::Build:
- break;
-
- case PeakRequest::Quit:
- pthread_exit_pbd (0);
- /*NOTREACHED*/
- break;
-
- default:
- break;
- }
-
- } else if (nread == 0) {
- break;
- } else if (errno == EAGAIN) {
- break;
- } else {
- fatal << _("Error reading from peak request pipe") << endmsg;
- /*NOTREACHED*/
- }
- }
- }
-
- pending_peak_sources_lock.lock();
-
- while (!pending_peak_sources.empty()) {
-
- Source* s = pending_peak_sources.front();
- pending_peak_sources.erase (pending_peak_sources.begin());
-
- pending_peak_sources_lock.unlock();
- s->build_peaks();
- pending_peak_sources_lock.lock();
- }
- }
-
- pthread_exit_pbd (0);
- /*NOTREACHED*/
- return 0;
-}
-
-int
-Source::start_peak_thread ()
-{
- if (!_build_peakfiles) {
- return 0;
- }
-
- if (pipe (peak_request_pipe)) {
- error << string_compose(_("Cannot create transport request signal pipe (%1)"), strerror (errno)) << endmsg;
- return -1;
- }
-
- if (fcntl (peak_request_pipe[0], F_SETFL, O_NONBLOCK)) {
- error << string_compose(_("UI: cannot set O_NONBLOCK on peak request pipe (%1)"), strerror (errno)) << endmsg;
- return -1;
- }
-
- if (fcntl (peak_request_pipe[1], F_SETFL, O_NONBLOCK)) {
- error << string_compose(_("UI: cannot set O_NONBLOCK on peak request pipe (%1)"), strerror (errno)) << endmsg;
- return -1;
- }
-
- if (pthread_create_and_store ("peak file builder", &peak_thread, 0, peak_thread_work, 0)) {
- error << _("Source: could not create peak thread") << endmsg;
- return -1;
- }
-
- have_peak_thread = true;
return 0;
}
void
-Source::stop_peak_thread ()
-{
- if (!have_peak_thread) {
- return;
- }
-
- void* status;
-
- char c = (char) PeakRequest::Quit;
- ::write (peak_request_pipe[1], &c, 1);
- pthread_join (peak_thread, &status);
-}
-
-void
-Source::queue_for_peaks (Source& source)
-{
- if (have_peak_thread) {
-
- Glib::Mutex::Lock lm (pending_peak_sources_lock);
-
- source.next_peak_clear_should_notify = true;
-
- if (find (pending_peak_sources.begin(),
- pending_peak_sources.end(),
- &source) == pending_peak_sources.end()) {
- pending_peak_sources.push_back (&source);
- }
-
- char c = (char) PeakRequest::Build;
- ::write (peak_request_pipe[1], &c, 1);
- }
-}
-
-void Source::clear_queue_for_peaks ()
-{
- /* this is done to cancel a group of running peak builds */
- if (have_peak_thread) {
- Glib::Mutex::Lock lm (pending_peak_sources_lock);
- pending_peak_sources.clear ();
- }
-}
-
-
-bool
-Source::peaks_ready (sigc::slot<void> the_slot, sigc::connection& conn) const
-{
- bool ret;
- Glib::Mutex::Lock lm (_lock);
-
- /* check to see if the peak data is ready. if not
- connect the slot while still holding the lock.
- */
-
- if (!(ret = _peaks_built)) {
- conn = PeaksReady.connect (the_slot);
- }
-
- return ret;
-}
-
-int
-Source::rename_peakfile (string newpath)
-{
- /* caller must hold _lock */
-
- string oldpath = peakpath;
-
- if (access (oldpath.c_str(), F_OK) == 0) {
- if (rename (oldpath.c_str(), newpath.c_str()) != 0) {
- error << string_compose (_("cannot rename peakfile for %1 from %2 to %3 (%4)"), _name, oldpath, newpath, strerror (errno)) << endmsg;
- return -1;
- }
- }
-
- peakpath = newpath;
-
- return 0;
-}
-
-int
-Source::initialize_peakfile (bool newfile, string audio_path)
-{
- struct stat statbuf;
-
- peakpath = peak_path (audio_path);
-
- if (newfile) {
-
- if (!_build_peakfiles) {
- return 0;
- }
-
- _peaks_built = false;
-
- } else {
-
- if (stat (peakpath.c_str(), &statbuf)) {
- if (errno != ENOENT) {
- /* it exists in the peaks dir, but there is some kind of error */
-
- error << string_compose(_("Source: cannot stat peakfile \"%1\""), peakpath) << endmsg;
- return -1;
- }
-
- } else {
-
- /* we found it in the peaks dir */
- }
-
- if (statbuf.st_size == 0) {
- _peaks_built = false;
- } else {
- // Check if the audio file has changed since the peakfile was built.
- struct stat stat_file;
- int err = stat (audio_path.c_str(), &stat_file);
-
- if (!err && stat_file.st_mtime > statbuf.st_mtime){
- _peaks_built = false;
- } else {
- _peaks_built = true;
- }
- }
- }
-
- if (!newfile && !_peaks_built && _build_missing_peakfiles && _build_peakfiles) {
- build_peaks_from_scratch ();
- }
-
- return 0;
-}
-
-int
-Source::read_peaks (PeakData *peaks, jack_nframes_t npeaks, jack_nframes_t start, jack_nframes_t cnt, double samples_per_visual_peak) const
-{
- Glib::Mutex::Lock lm (_lock);
- double scale;
- double expected_peaks;
- PeakData::PeakDatum xmax;
- PeakData::PeakDatum xmin;
- int32_t to_read;
- uint32_t nread;
- jack_nframes_t zero_fill = 0;
- int ret = -1;
- PeakData* staging = 0;
- Sample* raw_staging = 0;
- char * workbuf = 0;
- int peakfile = -1;
-
- expected_peaks = (cnt / (double) frames_per_peak);
- scale = npeaks/expected_peaks;
-
-#if 0
- cerr << "======>RP: npeaks = " << npeaks
- << " start = " << start
- << " cnt = " << cnt
- << " len = " << _length
- << " samples_per_visual_peak =" << samples_per_visual_peak
- << " expected was " << expected_peaks << " ... scale = " << scale
- << " PD ptr = " << peaks
- <<endl;
-
-#endif
-
- /* fix for near-end-of-file conditions */
-
- if (cnt > _length - start) {
- // cerr << "too close to end @ " << _length << " given " << start << " + " << cnt << endl;
- cnt = _length - start;
- jack_nframes_t old = npeaks;
- npeaks = min ((jack_nframes_t) floor (cnt / samples_per_visual_peak), npeaks);
- zero_fill = old - npeaks;
- }
-
- // cerr << "actual npeaks = " << npeaks << " zf = " << zero_fill << endl;
-
- if (npeaks == cnt) {
-
- // cerr << "RAW DATA\n";
-
- /* no scaling at all, just get the sample data and duplicate it for
- both max and min peak values.
- */
-
- Sample* raw_staging = new Sample[cnt];
- workbuf = new char[cnt*4];
-
- if (read_unlocked (raw_staging, start, cnt, workbuf) != cnt) {
- error << _("cannot read sample data for unscaled peak computation") << endmsg;
- return -1;
- }
-
- for (jack_nframes_t i = 0; i < npeaks; ++i) {
- peaks[i].max = raw_staging[i];
- peaks[i].min = raw_staging[i];
- }
-
- delete [] raw_staging;
- delete [] workbuf;
- return 0;
- }
-
- if (scale == 1.0) {
-
- off_t first_peak_byte = (start / frames_per_peak) * sizeof (PeakData);
-
- /* open, read, close */
-
- if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
- error << string_compose(_("Source: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- return -1;
- }
-
- // cerr << "DIRECT PEAKS\n";
-
- nread = ::pread (peakfile, peaks, sizeof (PeakData)* npeaks, first_peak_byte);
- close (peakfile);
-
- if (nread != sizeof (PeakData) * npeaks) {
- cerr << "Source["
- << _name
- << "]: cannot read peaks from peakfile! (read only "
- << nread
- << " not "
- << npeaks
- << "at sample "
- << start
- << " = byte "
- << first_peak_byte
- << ')'
- << endl;
- return -1;
- }
-
- if (zero_fill) {
- memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
- }
-
- return 0;
- }
-
-
- jack_nframes_t tnp;
-
- if (scale < 1.0) {
-
- // cerr << "DOWNSAMPLE\n";
-
- /* the caller wants:
-
- - more frames-per-peak (lower resolution) than the peakfile, or to put it another way,
- - less peaks than the peakfile holds for the same range
-
- So, read a block into a staging area, and then downsample from there.
-
- to avoid confusion, I'll refer to the requested peaks as visual_peaks and the peakfile peaks as stored_peaks
- */
-
- const uint32_t chunksize = (uint32_t) min (expected_peaks, 4096.0);
-
- staging = new PeakData[chunksize];
-
- /* compute the rounded up frame position */
-
- jack_nframes_t current_frame = start;
- jack_nframes_t current_stored_peak = (jack_nframes_t) ceil (current_frame / (double) frames_per_peak);
- uint32_t next_visual_peak = (uint32_t) ceil (current_frame / samples_per_visual_peak);
- double next_visual_peak_frame = next_visual_peak * samples_per_visual_peak;
- uint32_t stored_peak_before_next_visual_peak = (jack_nframes_t) next_visual_peak_frame / frames_per_peak;
- uint32_t nvisual_peaks = 0;
- uint32_t stored_peaks_read = 0;
- uint32_t i = 0;
-
- /* handle the case where the initial visual peak is on a pixel boundary */
-
- current_stored_peak = min (current_stored_peak, stored_peak_before_next_visual_peak);
-
- /* open ... close during out: handling */
-
- if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
- error << string_compose(_("Source: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- return 0;
- }
-
- while (nvisual_peaks < npeaks) {
-
- if (i == stored_peaks_read) {
-
- uint32_t start_byte = current_stored_peak * sizeof(PeakData);
- tnp = min ((_length/frames_per_peak - current_stored_peak), (jack_nframes_t) expected_peaks);
- to_read = min (chunksize, tnp);
-
- off_t fend = lseek (peakfile, 0, SEEK_END);
-
- if ((nread = ::pread (peakfile, staging, sizeof (PeakData) * to_read, start_byte))
- != sizeof (PeakData) * to_read) {
- cerr << "Source["
- << _name
- << "]: cannot read peak data from peakfile ("
- << (nread / sizeof(PeakData))
- << " peaks instead of "
- << to_read
- << ") ("
- << strerror (errno)
- << ')'
- << " at start_byte = " << start_byte
- << " _length = " << _length << " versus len = " << fend
- << " expected maxpeaks = " << (_length - current_frame)/frames_per_peak
- << " npeaks was " << npeaks
- << endl;
- goto out;
- }
-
- i = 0;
- stored_peaks_read = nread / sizeof(PeakData);
- }
-
- xmax = -1.0;
- xmin = 1.0;
-
- while ((i < stored_peaks_read) && (current_stored_peak <= stored_peak_before_next_visual_peak)) {
-
- xmax = max (xmax, staging[i].max);
- xmin = min (xmin, staging[i].min);
- ++i;
- ++current_stored_peak;
- --expected_peaks;
- }
-
- peaks[nvisual_peaks].max = xmax;
- peaks[nvisual_peaks].min = xmin;
- ++nvisual_peaks;
- ++next_visual_peak;
-
- //next_visual_peak_frame = min ((next_visual_peak * samples_per_visual_peak), (next_visual_peak_frame+samples_per_visual_peak) );
- next_visual_peak_frame = min ((double) start+cnt, (next_visual_peak_frame+samples_per_visual_peak) );
- stored_peak_before_next_visual_peak = (uint32_t) next_visual_peak_frame / frames_per_peak;
- }
-
- if (zero_fill) {
- memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
- }
-
- ret = 0;
-
- } else {
-
- // cerr << "UPSAMPLE\n";
-
- /* the caller wants
-
- - less frames-per-peak (more resolution)
- - more peaks than stored in the Peakfile
-
- So, fetch data from the raw source, and generate peak
- data on the fly.
- */
-
- jack_nframes_t frames_read = 0;
- jack_nframes_t current_frame = start;
- jack_nframes_t i = 0;
- jack_nframes_t nvisual_peaks = 0;
- jack_nframes_t chunksize = (jack_nframes_t) min (cnt, (jack_nframes_t) 4096);
- raw_staging = new Sample[chunksize];
- workbuf = new char[chunksize *4];
-
- jack_nframes_t frame_pos = start;
- double pixel_pos = floor (frame_pos / samples_per_visual_peak);
- double next_pixel_pos = ceil (frame_pos / samples_per_visual_peak);
- double pixels_per_frame = 1.0 / samples_per_visual_peak;
-
- xmin = 1.0;
- xmax = -1.0;
-
- while (nvisual_peaks < npeaks) {
-
- if (i == frames_read) {
-
- to_read = min (chunksize, (_length - current_frame));
-
- if ((frames_read = read_unlocked (raw_staging, current_frame, to_read, workbuf)) < 0) {
- error << string_compose(_("Source[%1]: peak read - cannot read %2 samples at offset %3")
- , _name, to_read, current_frame)
- << endmsg;
- goto out;
- }
-
- i = 0;
- }
-
- xmax = max (xmax, raw_staging[i]);
- xmin = min (xmin, raw_staging[i]);
- ++i;
- ++current_frame;
- pixel_pos += pixels_per_frame;
-
- if (pixel_pos >= next_pixel_pos) {
-
- peaks[nvisual_peaks].max = xmax;
- peaks[nvisual_peaks].min = xmin;
- ++nvisual_peaks;
- xmin = 1.0;
- xmax = -1.0;
-
- next_pixel_pos = ceil (pixel_pos + 0.5);
- }
- }
-
- if (zero_fill) {
- memset (&peaks[npeaks], 0, sizeof (PeakData) * zero_fill);
- }
-
- ret = 0;
- }
-
- out:
- if (peakfile >= 0) {
- close (peakfile);
- }
-
- if (staging) {
- delete [] staging;
- }
-
- if (raw_staging) {
- delete [] raw_staging;
- }
-
- if (workbuf) {
- delete [] workbuf;
- }
-
- return ret;
-}
-
-#undef DEBUG_PEAK_BUILD
-
-int
-Source::build_peaks ()
-{
- vector<PeakBuildRecord*> built;
- int status = -1;
- bool pr_signal = false;
- list<PeakBuildRecord*> copy;
-
- {
- Glib::Mutex::Lock lm (_lock);
- copy = pending_peak_builds;
- pending_peak_builds.clear ();
- }
-
-#ifdef DEBUG_PEAK_BUILD
- cerr << "build peaks with " << copy.size() << " requests pending\n";
-#endif
-
- for (list<PeakBuildRecord *>::iterator i = copy.begin(); i != copy.end(); ++i) {
-
- if ((status = do_build_peak ((*i)->frame, (*i)->cnt)) != 0) {
- unlink (peakpath.c_str());
- break;
- }
- built.push_back (new PeakBuildRecord (*(*i)));
- delete *i;
- }
-
- {
- Glib::Mutex::Lock lm (_lock);
-
- if (status == 0) {
- _peaks_built = true;
-
- if (next_peak_clear_should_notify) {
- next_peak_clear_should_notify = false;
- pr_signal = true;
- }
- }
- }
-
- if (status == 0) {
- for (vector<PeakBuildRecord *>::iterator i = built.begin(); i != built.end(); ++i) {
- PeakRangeReady ((*i)->frame, (*i)->cnt); /* EMIT SIGNAL */
- delete *i;
- }
-
- if (pr_signal) {
- PeaksReady (); /* EMIT SIGNAL */
- }
- }
-
- return status;
-}
-
-int
-Source::do_build_peak (jack_nframes_t first_frame, jack_nframes_t cnt)
-{
- jack_nframes_t current_frame;
- Sample buf[frames_per_peak];
- Sample xmin, xmax;
- uint32_t peaki;
- PeakData* peakbuf;
- char * workbuf = 0;
- jack_nframes_t frames_read;
- jack_nframes_t frames_to_read;
- off_t first_peak_byte;
- int peakfile = -1;
- int ret = -1;
-
-#ifdef DEBUG_PEAK_BUILD
- cerr << pthread_self() << ": " << _name << ": building peaks for " << first_frame << " to " << first_frame + cnt - 1 << endl;
-#endif
-
- first_peak_byte = (first_frame / frames_per_peak) * sizeof (PeakData);
-
-#ifdef DEBUG_PEAK_BUILD
- cerr << "seeking to " << first_peak_byte << " before writing new peak data\n";
-#endif
-
- current_frame = first_frame;
- peakbuf = new PeakData[(cnt/frames_per_peak)+1];
- peaki = 0;
-
- workbuf = new char[max(frames_per_peak, cnt) * 4];
-
- if ((peakfile = ::open (peakpath.c_str(), O_RDWR|O_CREAT, 0664)) < 0) {
- error << string_compose(_("Source: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- return -1;
- }
-
- while (cnt) {
-
- frames_to_read = min (frames_per_peak, cnt);
-
- if ((frames_read = read_unlocked (buf, current_frame, frames_to_read, workbuf)) != frames_to_read) {
- error << string_compose(_("%1: could not write read raw data for peak computation (%2)"), _name, strerror (errno)) << endmsg;
- goto out;
- }
-
- xmin = buf[0];
- xmax = buf[0];
-
- for (jack_nframes_t n = 1; n < frames_read; ++n) {
- xmax = max (xmax, buf[n]);
- xmin = min (xmin, buf[n]);
-
-// if (current_frame < frames_read) {
-// cerr << "sample = " << buf[n] << " max = " << xmax << " min = " << xmin << " max of 2 = " << max (xmax, buf[n]) << endl;
-// }
- }
-
- peakbuf[peaki].max = xmax;
- peakbuf[peaki].min = xmin;
- peaki++;
-
- current_frame += frames_read;
- cnt -= frames_read;
- }
-
- if (::pwrite (peakfile, peakbuf, sizeof (PeakData) * peaki, first_peak_byte) != (ssize_t) (sizeof (PeakData) * peaki)) {
- error << string_compose(_("%1: could not write peak file data (%2)"), _name, strerror (errno)) << endmsg;
- goto out;
- }
-
- ret = 0;
-
- out:
- delete [] peakbuf;
- if (peakfile >= 0) {
- close (peakfile);
- }
- if (workbuf)
- delete [] workbuf;
- return ret;
-}
-
-void
-Source::build_peaks_from_scratch ()
-{
- Glib::Mutex::Lock lp (_lock);
-
- next_peak_clear_should_notify = true;
- pending_peak_builds.push_back (new PeakBuildRecord (0, _length));
- queue_for_peaks (*this);
-}
-
-bool
-Source::file_changed (string path)
-{
- struct stat stat_file;
- struct stat stat_peak;
-
- int e1 = stat (path.c_str(), &stat_file);
- int e2 = stat (peak_path(path).c_str(), &stat_peak);
-
- if (!e1 && !e2 && stat_file.st_mtime > stat_peak.st_mtime){
- return true;
- } else {
- return false;
- }
-}
-
-void
Source::use ()
{
_use_cnt++;
@@ -864,30 +118,3 @@ Source::release ()
if (_use_cnt) --_use_cnt;
}
-jack_nframes_t
-Source::available_peaks (double zoom_factor) const
-{
- int peakfile;
- off_t end;
-
- if (zoom_factor < frames_per_peak) {
- return length(); // peak data will come from the audio file
- }
-
- /* peak data comes from peakfile */
-
- if ((peakfile = ::open (peakpath.c_str(), O_RDONLY)) < 0) {
- error << string_compose(_("Source: cannot open peakpath \"%1\" (%2)"), peakpath, strerror (errno)) << endmsg;
- return 0;
- }
-
- {
- Glib::Mutex::Lock lm (_lock);
- end = lseek (peakfile, 0, SEEK_END);
- }
-
- close (peakfile);
-
- return (end/sizeof(PeakData)) * frames_per_peak;
-}
-
diff --git a/libs/ardour/state_manager.cc b/libs/ardour/state_manager.cc
index bb24c8eb58..bcffe381c3 100644
--- a/libs/ardour/state_manager.cc
+++ b/libs/ardour/state_manager.cc
@@ -5,6 +5,7 @@
using namespace ARDOUR;
using namespace std;
+using namespace PBD;
bool StateManager::_allow_save = true;
sigc::signal<void,const char*> StateManager::SaveAllowed;
diff --git a/libs/ardour/stateful.cc b/libs/ardour/stateful.cc
index d08be38ecd..b8e301b273 100644
--- a/libs/ardour/stateful.cc
+++ b/libs/ardour/stateful.cc
@@ -27,6 +27,8 @@
#include "i18n.h"
+using namespace PBD;
+
Stateful::Stateful ()
{
_extra_xml = 0;
diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc
index 64964b29dd..c0e52279e1 100644
--- a/libs/ardour/tempo.cc
+++ b/libs/ardour/tempo.cc
@@ -35,6 +35,7 @@
using namespace std;
using namespace ARDOUR;
+using namespace PBD;
/* _default tempo is 4/4 qtr=120 */
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index 15d0c6be81..9adc7c72cd 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -42,6 +42,7 @@
using namespace ARDOUR;
using namespace std;
+using namespace PBD;
void
elapsed_time_to_str (char *buf, uint32_t seconds)
@@ -177,7 +178,7 @@ tokenize_fullpath (string fullpath, string& path, string& name)
int
touch_file (string path)
{
- int fd = open (path.c_str(), O_RDONLY|O_CREAT);
+ int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660);
if (fd >= 0) {
close (fd);
return 0;
diff --git a/libs/ardour/vst_plugin.cc b/libs/ardour/vst_plugin.cc
index 2f3653a16a..80c36dab95 100644
--- a/libs/ardour/vst_plugin.cc
+++ b/libs/ardour/vst_plugin.cc
@@ -54,6 +54,7 @@
#include <locale.h>
using namespace ARDOUR;
+using namespace PBD;
using std::min;
using std::max;