24#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
25#define right Qt::right
56const quint32 CKID_RIFF = 0x46464952;
57const quint32 CKID_LIST = 0x5453494c;
58const quint32 CKID_INFO = 0x4f464e49;
59const quint32 CKID_RMID = 0x44494d52;
60const quint32 CKID_data = 0x61746164;
61const quint32 CKID_DISP = 0x50534944;
62const quint32 CKID_DLS = 0x20534C44;
85 QFile file(m_fileName = fileName);
86 auto ok = file.open(QIODevice::ReadOnly);
88 QDataStream ds(&file);
92 qCritical() <<
"cannot open file" << fileName;
105 m_stream->setByteOrder(QDataStream::LittleEndian);
110QString Rmidi::toString(quint32 ckid)
112 QByteArray data(
reinterpret_cast<char *
>(&ckid),
sizeof(quint32));
113 return QString::fromLatin1(data);
116QByteArray Rmidi::readByteArray(
int size)
119 char *buffer =
new char[size];
120 m_stream->readRawData(buffer, size);
121 QByteArray ba(buffer);
126void Rmidi::skip(quint32 cktype,
int size)
130 m_stream->skipRawData(size);
133quint32 Rmidi::readExpectedChunk(quint32 cktype)
135 quint32 chunkType, len = 0;
136 *m_stream >> chunkType;
137 if (chunkType == cktype) {
154quint32 Rmidi::readChunk(quint32& chunkType)
157 *m_stream >> chunkType;
167quint32 Rmidi::readChunkID()
170 *m_stream >> chunkID;
177void Rmidi::processINFO(
int size)
182 while ((size > 0) && !m_stream->atEnd()) {
183 length = readChunk(chunkID);
186 QString cktype = toString(chunkID);
187 QByteArray data = readByteArray(length);
192void Rmidi::processList(
int size)
196 if (m_stream->atEnd())
return;
197 chunkID = readChunkID();
208void Rmidi::processRMID(
int size)
213 while ((size > 0) && !m_stream->atEnd()) {
214 length = readChunk(chunkID);
218 processData(
"RMID", length);
224 skip(chunkID, length);
230 skip(chunkID, length);
236void Rmidi::processRIFF(
int size)
238 quint32 chunkID = readChunkID();
239 quint32 length = size - 4;
247 if (m_stream->device() !=
nullptr && m_stream->device()->pos() >= 12) {
248 m_stream->device()->seek(m_stream->device()->pos() - 12);
249 processData(
"DLS", length + 12);
251 skip(chunkID, length);
255 qWarning() <<
"Unsupported format";
256 skip(chunkID, length);
260void Rmidi::processData(
const QString& dataType,
int size)
263 QByteArray memdata(size,
'\0');
264 m_stream->readRawData(memdata.data(), size);
271 quint32 length = readExpectedChunk(CKID_RIFF);
The QObject class is the base class of all Qt objects.
Rmidi(QObject *parent=nullptr)
Constructor.
virtual ~Rmidi()
Destructor.
void readFromStream(QDataStream *ds)
Reads a stream.
void signalRiffData(const QString &dataType, const QByteArray &data)
signalRiffData is emitted for each RMID data element
void signalRiffInfo(const QString &infoType, const QByteArray &info)
signalRMidInfo is emitted for each RIFF INFO element
void readFromFile(QString fileName)
Reads a stream from a disk file.