c@225
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
c@225
|
2
|
c@225
|
3 /*
|
c@225
|
4 QM DSP Library
|
c@225
|
5
|
c@225
|
6 Centre for Digital Music, Queen Mary, University of London.
|
c@309
|
7 This file 2005-2006 Christian Landone.
|
c@309
|
8
|
c@309
|
9 This program is free software; you can redistribute it and/or
|
c@309
|
10 modify it under the terms of the GNU General Public License as
|
c@309
|
11 published by the Free Software Foundation; either version 2 of the
|
c@309
|
12 License, or (at your option) any later version. See the file
|
c@309
|
13 COPYING included with this distribution for more information.
|
c@225
|
14 */
|
c@225
|
15
|
c@225
|
16 #include "Framer.h"
|
c@225
|
17
|
cannam@502
|
18 #include <limits.h>
|
c@225
|
19
|
cannam@502
|
20 Framer::Framer() :
|
cannam@502
|
21 m_sampleLen(0),
|
cannam@502
|
22 m_framesRead(0),
|
cannam@502
|
23 m_srcBuffer(0),
|
cannam@502
|
24 m_dataFrame(0),
|
cannam@502
|
25 m_strideFrame(0),
|
cannam@502
|
26 m_frameLength(0),
|
cannam@502
|
27 m_stepSize(0),
|
cannam@502
|
28 m_maxFrames(0),
|
cannam@502
|
29 m_srcIndex(0)
|
c@225
|
30 {
|
c@225
|
31 }
|
c@225
|
32
|
c@225
|
33 Framer::~Framer()
|
c@225
|
34 {
|
cannam@502
|
35 delete[] m_dataFrame;
|
cannam@502
|
36 delete[] m_strideFrame;
|
c@225
|
37 }
|
c@225
|
38
|
cannam@502
|
39 void Framer::configure(int frameLength, int hop)
|
c@225
|
40 {
|
c@225
|
41 m_frameLength = frameLength;
|
c@225
|
42 m_stepSize = hop;
|
c@225
|
43
|
c@225
|
44 resetCounters();
|
c@225
|
45
|
cannam@502
|
46 delete[] m_dataFrame;
|
c@225
|
47 m_dataFrame = new double[ m_frameLength ];
|
c@225
|
48
|
cannam@502
|
49 delete [] m_strideFrame;
|
c@225
|
50 m_strideFrame = new double[ m_stepSize ];
|
c@225
|
51 }
|
c@225
|
52
|
c@225
|
53 void Framer::getFrame(double *dst)
|
c@225
|
54 {
|
cannam@502
|
55 if ((m_srcIndex + int64_t(m_frameLength)) < m_sampleLen) {
|
c@225
|
56
|
cannam@502
|
57 for (int i = 0; i < m_frameLength; i++) {
|
cannam@502
|
58 dst[i] = m_srcBuffer[m_srcIndex++];
|
cannam@502
|
59 }
|
cannam@502
|
60 m_srcIndex -= (m_frameLength - m_stepSize);
|
c@225
|
61
|
cannam@502
|
62 } else { // m_srcIndex is within m_frameLength of m_sampleLen
|
c@225
|
63
|
cannam@502
|
64 int rem = int(m_sampleLen - m_srcIndex);
|
cannam@502
|
65 int zero = m_frameLength - rem;
|
cannam@483
|
66
|
cannam@502
|
67 for (int i = 0; i < rem; i++) {
|
cannam@502
|
68 dst[i] = m_srcBuffer[m_srcIndex++];
|
cannam@483
|
69 }
|
cannam@483
|
70
|
cannam@502
|
71 for (int i = 0; i < zero; i++ ) {
|
cannam@502
|
72 dst[rem + i] = 0.0;
|
cannam@483
|
73 }
|
cannam@483
|
74
|
cannam@502
|
75 m_srcIndex -= (rem - m_stepSize);
|
c@225
|
76 }
|
c@225
|
77
|
c@225
|
78 m_framesRead++;
|
c@225
|
79 }
|
c@225
|
80
|
c@225
|
81 void Framer::resetCounters()
|
c@225
|
82 {
|
c@225
|
83 m_framesRead = 0;
|
cannam@502
|
84 m_srcIndex = 0;
|
c@225
|
85 }
|
c@225
|
86
|
cannam@502
|
87 int Framer::getMaxNoFrames()
|
c@225
|
88 {
|
c@225
|
89 return m_maxFrames;
|
c@225
|
90 }
|
c@225
|
91
|
cannam@502
|
92 void Framer::setSource(double *src, int64_t length)
|
c@225
|
93 {
|
c@225
|
94 m_srcBuffer = src;
|
cannam@502
|
95 m_sampleLen = length;
|
c@225
|
96
|
cannam@502
|
97 int64_t maxFrames = length / int64_t(m_stepSize);
|
cannam@502
|
98 if (maxFrames * int64_t(m_stepSize) < length) {
|
cannam@502
|
99 ++maxFrames;
|
cannam@502
|
100 }
|
cannam@502
|
101 if (maxFrames > INT_MAX) maxFrames = INT_MAX;
|
cannam@502
|
102 m_maxFrames = maxFrames;
|
c@225
|
103 }
|