summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/filesource.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour/filesource.h')
-rw-r--r--libs/ardour/ardour/filesource.h163
1 files changed, 163 insertions, 0 deletions
diff --git a/libs/ardour/ardour/filesource.h b/libs/ardour/ardour/filesource.h
new file mode 100644
index 0000000000..2c24d87793
--- /dev/null
+++ b/libs/ardour/ardour/filesource.h
@@ -0,0 +1,163 @@
+/*
+ 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);
+ FileSource (const XMLNode&, jack_nframes_t rate);
+ ~FileSource ();
+
+ jack_nframes_t length() const { return _length; }
+ jack_nframes_t read (Sample *dst, jack_nframes_t start, jack_nframes_t cnt) const;
+ jack_nframes_t write (Sample *src, jack_nframes_t cnt);
+ void mark_for_remove();
+ string peak_path(string audio_path);
+ string old_peak_path(string audio_path);
+ string path() const { return _path; }
+
+ 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);
+
+ private:
+ int fd;
+ string _path;
+ bool remove_at_unref;
+ bool is_bwf;
+ off64_t data_offset;
+ string _take_id;
+
+ 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 {
+ 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;
+ } 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) 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);
+};
+
+}
+
+#endif /* __playlist_file_buffer_h__ */