-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaudiosegmenter.h
84 lines (71 loc) · 3.62 KB
/
audiosegmenter.h
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
#ifndef AUDIOWINDOWER_H
#define AUDIOWINDOWER_H
#include <QObject>
#include <QVector>
#include "pe_config.h"
/*!
* \brief Třída AudioSegmenter
*
* Třída obsahuje kruhový buffer a nad ním definované metody, které umožňují zadaný akustický signál rozkládat na segmenty
* o dané velikosti a překryvu. Jediným varovaním je, že velikost bufferu je dána již při konstrukci objektu třídy a při
* vložení většího množství dat může aplikace skončit chybou SIGSEGV. S velikostí bufferu tedy nebuďte skromní.
*/
class AudioSegmenter : public QObject {
Q_OBJECT
public:
/*!
* \brief AudioSegmenter Konstruktor třídy.
* \param segmentSize Velikost segmentů.
* \param overlap Překryv segmentů.
* \param bufferSize Velikost pracovního bufferu. Pozor! Při zvolení malé velikosti může dojít k přetečení => SIGSEGV.
* \param parent Ukazatel na rodiče objektu, který lze dle notace Qt využít k automatické destrukci objektu.
*/
explicit AudioSegmenter(int segmentSize, int overlap, int bufferSize, QObject *parent = nullptr);
/*!
* Destruktor třídy.
*/
~AudioSegmenter();
/*!
* \brief writeAudio Metoda, která zapíše vstupní data do bufferu. Při zadání většího množství dat než se do bufferu vejde
* metoda emituje chybový signál a neprovede žádnou další akci.
* \param data Reference na vektor vstupních dat.
*/
void writeAudio(const QVector<sample>& data);
/*!
* \brief hasNextSegment Metoda, která zjistí, zda je v bufferu připraven alespoň jeden CELÝ segment. Zda je v bufferu alespoň
* část segmentu řekne metoda AudioSegmenter::isEmpty().
* \return True, pokud je v bufferu připraven CELÝ segment, jinak false.
*/
bool hasNextSegment();
/*!
* \brief nextSegment Metoda, která z bufferu extrahuje jeden segment. Pokud v bufferu není celý segment, extrahuje dostupná data
* a doloží je nulami na požadovanou velikost segmentu. V případě prázdného bufferu vrátí prázdný vektor.
* \return Vektor obsahují vzorky jednoho extrahovaného segmentu.
*/
QVector<sample> nextSegment();
/*!
* \brief isEmpty Metoda zjistí, zda jdou v bufferu dostupná nějaká data. Nemusí to být celý segment.
* \return True, pokud buffer obsahuje nějaká data (i třeba neúplný segment), jinak false.
*/
bool isEmpty();
private:
sample *m_buffer; //!< Buffer obsahující data.
int m_bufferSize; //!< Velikost bufferu.
int m_first; //!< Index prvního prvku aktuálně plněného segmentu.
int m_next; //!< Index prvního nezapsaného prvku, tj. index posledního prvku zapsaného do bufferu + 1.
int m_segmentSize; //!< Velikost vytvářených oken.
int m_overlapSupp; //!< Počet prvků tvořící první část výsledného segmentu (m_segmentSize - overlap).
/*!
* \brief flush Metoda z bufferu extrahuje zbývající data, která doloží nulami na požadovanou velikost segmentu a vyprázdní
* buffer. Tato metoda je vnitřně volána metodou AudioSegmenter::nextSegment.
* \return Vektor obsahující zvývající vzorky bufferu doložené nulami.
*/
QVector<sample> flush();
signals:
/*!
* \brief error Signál, který informuje o chybovém stavu. Tento signál je spíše informativní povahy.
* \param message Obsah chybového hlášení.
*/
void error(const QString& message);
};
#endif