summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/export_file_io.h
blob: e0b1c95323db5c3c87642a522de8bafa00ed4bd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
    Copyright (C) 2008 Paul Davis
    Author: Sakari Bergen

    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_export_file_io_h__
#define __ardour_export_file_io_h__

#include <sndfile.h>

#include <ardour/graph.h>
#include <ardour/types.h>
#include <ardour/ardour.h>

namespace ARDOUR
{

/// Common part for all export file writers
class ExportFileWriter
{
  public:
	ExportFileWriter (string filename) : _filename (filename) {}
	virtual ~ExportFileWriter () {}
	
	string filename () const { return _filename; }
	nframes_t position () const { return _position; }
	
	void set_position (nframes_t position) { _position = position; }
	
  protected:
	string _filename;
	nframes_t _position;
};

/// Common interface for templated libsndfile writers
class SndfileWriterBase : public ExportFileWriter
{
  public:
	SndfileWriterBase (int channels, nframes_t samplerate, int format, string const & path);
	virtual ~SndfileWriterBase ();

	SNDFILE * get_sndfile () const { return sndfile; }

  protected:
	SF_INFO        sf_info;
	SNDFILE *      sndfile;
};


/// Template parameter specific parts of sndfile writer
template <typename T>
class SndfileWriter : public SndfileWriterBase, public GraphSink<T>
{
  public:
	SndfileWriter (int channels, nframes_t samplerate, int format, string const & path);
	virtual ~SndfileWriter () {}
	
	nframes_t write (T * data, nframes_t frames);
	
  protected:
	sf_count_t (*write_func)(SNDFILE *, const T *, sf_count_t);

  private:
	void init (); // Inits write function
};

/// Writes and reads a RAW tempfile (file aquired with tmpfile())
class ExportTempFile : public SndfileWriter<float>, public GraphSource<float>
{
  public:
	ExportTempFile (uint32_t channels, nframes_t samplerate);
	~ExportTempFile () {}
	
	/// Causes the file to be read from the beginning again
	void reset_read () { reading = false; }
	nframes_t read (float * data, nframes_t frames);
	
	/* Silence management */
	
	nframes_t trim_beginning (bool yn = true);
	nframes_t trim_end (bool yn = true);
	
	void set_silence_beginning (nframes_t frames);
	void set_silence_end (nframes_t frames);

  private:
	/* File access */
	
	sf_count_t get_length ();
	sf_count_t get_position ();
	sf_count_t get_read_position (); // get position seems to default to the write pointer
	sf_count_t locate_to (nframes_t frames);
	sf_count_t _read (float * data, nframes_t frames);
	
	uint32_t channels;
	bool reading;
	
	/* Silence related */
	
	/* start and end are used by read() */
	
	nframes_t start;
	nframes_t end;
	
	/* these are the silence processing results and state */
	
	void process_beginning ();
	void process_end ();
	
	bool beginning_processed;
	bool end_processed;
	
	nframes_t silent_frames_beginning;
	nframes_t silent_frames_end;
	
	/* Silence to add to start and end */
	
	nframes_t silence_beginning;
	nframes_t silence_end;
	
	/* Takes care that the end postion gets set at some stage */
	
	bool end_set;
	
};

} // namespace ARDOUR

#endif /* __ardour_export_file_io_h__ */