diff options
author | Hans Fugal <hans@fugal.net> | 2006-06-22 23:40:55 +0000 |
---|---|---|
committer | Hans Fugal <hans@fugal.net> | 2006-06-22 23:40:55 +0000 |
commit | 7ff370e79895d7eb293e7214689b791bd98415fb (patch) | |
tree | d36f88880be2925593984ee43e73283af48a0119 /libs/ardour | |
parent | fd742b30fa1071c44d053cf4676149641f977a35 (diff) |
Merging from trunk
git-svn-id: svn://localhost/ardour2/branches/undo@638 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
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*>(®ion->source (n)); + (*chan).write_source = dynamic_cast<AudioFileSource*>(®ion->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; |