summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/buffer_set.h
blob: 179985879466d2839f720ff878e6c8d0fdf47e5b (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
/*
    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_buffer_set_h__
#define __ardour_buffer_set_h__

#include <vector>
#include <ardour/buffer.h>
#include <ardour/chan_count.h>
#include <ardour/data_type.h>
#include <ardour/port_set.h>

namespace ARDOUR {


/** A set of buffers of various types.
 *
 * These are mainly accessed from Session and passed around as scratch buffers
 * (eg as parameters to run() methods) to do in-place signal processing.
 *
 * There are two types of counts associated with a BufferSet - available,
 * and the 'use count'.  Available is the actual number of allocated buffers
 * (and so is the maximum acceptable value for the use counts).
 *
 * The use counts are how things determine the form of their input and inform
 * others the form of their output (eg what they did to the BufferSet).
 * Setting the use counts is realtime safe.
 */
class BufferSet
{
public:
	BufferSet(const PortSet& ports);
	BufferSet();
	~BufferSet();

	void clear();
	
	void ensure_buffers(const ChanCount& chan_count, size_t buffer_capacity);
	void ensure_buffers(size_t num_buffers, DataType type, size_t buffer_capacity);

	// FIXME: add these
	//const ChanCount& available() const { return _count; }
	//ChanCount&       available()       { return _count; }

	const ChanCount& count() const { return _count; }
	ChanCount&       count()       { return _count; }

	size_t available_buffers(DataType type) const;
	size_t buffer_capacity(DataType type) const;

	Buffer& buffer(DataType type, size_t i)
	{
		assert(i <= _count.get(type));
		return *_buffers[type.to_index()][i];
	}

	AudioBuffer& audio_buffer(size_t i)
	{
		return (AudioBuffer&)buffer(DataType::AUDIO, i);
	}
	#if 0
	/** See PortInsert::run for an example of usage */
	class IndexSet {
	public:
		IndexSet() { reset(); }
		
		void reset() { _is[0] = 0; _is[1] = 0; }

		size_t index(DataType type)     { return _is[type.to_index()]; }
		void   increment(DataType type) { _is[type.to_index()] += 1; }

	private:
		int _is[2];
	};
	#endif
	
	const ChanCount& chan_count() const { return _count; }
	
private:
	typedef std::vector<Buffer*> BufferVec;

	/// Vector of vectors, indexed by DataType::to_index()
	std::vector<BufferVec> _buffers;

	/// Use counts (there may be more actual buffers than this)
	ChanCount _count;

	/// Whether we (don't) 'own' the contained buffers (are a mirror of a PortSet)
	bool _is_mirror;
};


} // namespace ARDOUR

#endif // __ardour_buffer_set_h__