summaryrefslogtreecommitdiff
path: root/libs/ardour/test/audio_region_test.cc
blob: cd1986b19b0a7ba1a645b66f19256435fcce4cda (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
#include "ardour/playlist.h"
#include "ardour/region.h"
#include "ardour/audioregion.h"
#include "audio_region_test.h"
#include "test_globals.h"

CPPUNIT_TEST_SUITE_REGISTRATION (AudioRegionTest);

using namespace std;
using namespace ARDOUR;

void
AudioRegionTest::readTest ()
{
	int const N = 1024;
	
	Sample buf[N];
	Sample mbuf[N];
	float gbuf[N];

	int const P = 100;
	boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (_region[0]);

	/* Simple read: 256 frames from start of region, no fades */

	ar->set_position (P);
	ar->set_length (1024);

	ar->read_from_sources (ar->_sources, ar->_length, buf, P, 256, 0);
	check_staircase (buf, 0, 256);

	for (int i = 0; i < N; ++i) {
		buf[i] = 0;
	}

	/* Offset read: 256 frames from 128 frames into the region, no fades */
	ar->read_from_sources (ar->_sources, ar->_length, buf, P + 128, 256, 0);
	check_staircase (buf, 128, 256);

	/* Simple read with a fade-in: 256 frames from start of region, with fades */
	ar->set_default_fade_in ();
	CPPUNIT_ASSERT_EQUAL (double (64), ar->_fade_in->back()->when);

	for (int i = 0; i < N; ++i) {
		buf[i] = 0;
	}

	ar->read_at (buf, mbuf, gbuf, P, 256, 0);
	for (int i = 0; i < 64; ++i) {
		/* XXX: this isn't very accurate, but close enough for now; needs investigation */
		CPPUNIT_ASSERT_DOUBLES_EQUAL (float (i * i / 63.0), buf[i], 1e-4);
	}
	for (int i = 64; i < P; ++i) {
		CPPUNIT_ASSERT_EQUAL (i, int (buf[i]));
	}
	
	/* Offset read: 256 frames from 128 frames into the region, with fades
	   (though the fade should not affect it, as it is finished before the read starts)
	*/

	for (int i = 0; i < N; ++i) {
		buf[i] = 0;
	}
	
	ar->read_at (buf, mbuf, gbuf, P + 128, 256, 0);
	check_staircase (buf, 128, 256);
}

void
AudioRegionTest::check_staircase (Sample* b, int offset, int N)
{
	for (int i = 0; i < N; ++i) {
		int const j = i + offset;
		CPPUNIT_ASSERT_EQUAL (j, int (b[i]));
	}
}