-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathwavfilehandler.cpp
77 lines (64 loc) · 2.42 KB
/
wavfilehandler.cpp
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
#include "wavfilehandler.h"
#include <iostream>
#include "constants.h"
#include <QDebug>
bool WavFileHandler::loadWave(std::string fileName, wave_t* wavePtr)
{
FILE* fp = NULL;
fp = std::fopen(std::string(fileName).c_str(), "rb");
if (fp == NULL)
{
return endOnError("FileHandler error: File " + fileName + " not found.\n");
}
char type[4];
std::fread(type, sizeof(char), 4, fp);
if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F')
{
return endOnError("FileHandler error: RIFF header missing or invalid.\n");
}
std::fread(&wavePtr->size, sizeof(uint32_t), 1, fp);
std::fread(type, sizeof(char), 4, fp);
if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E')
{
return endOnError("FileHandler error: WAVE header missing or invalid.\n");
}
std::fread(type, sizeof(char), 4, fp);
if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ')
{
return endOnError("FileHandler error: fmt header missing or invalid.\n");
}
std::fread(&wavePtr->chunkSize, sizeof(uint32_t), 1, fp);
std::fread(&wavePtr->formatType, sizeof(short), 1, fp);
std::fread(&wavePtr->channels, sizeof(short), 1, fp);
std::fread(&wavePtr->sampleRate, sizeof(uint32_t), 1, fp);
std::fread(&wavePtr->avgBytesPerSec, sizeof(uint32_t), 1, fp);
std::fread(&wavePtr->bytesPerSample, sizeof(short), 1, fp);
std::fread(&wavePtr->bitsPerSample, sizeof(short), 1, fp);
std::fread(type, sizeof(char), 4, fp);
if (type[0] != 'd' || type[1] != 'a' || type[2] != 't' || type[3] != 'a')
{
return endOnError("FileHandler error: data header missing or invalid.\n");
}
std::fread(&wavePtr->dataSize, sizeof(uint32_t), 1, fp);
wavePtr->buffer = new unsigned char[wavePtr->dataSize];
uint32_t result = std::fread(wavePtr->buffer, sizeof(char), wavePtr->dataSize, fp);
if (result != wavePtr->dataSize)
{
return endOnError("FileHandler error: fread result mismatch.\n");
}
if (ferror(fp))
{
return endOnError("FileHandler error: fstream error.");
}
if (wavePtr->buffer == NULL)
{
return endOnError("FileHandler error: Wave Data pointer is NULL.\n");
}
std::fclose(fp);
return true;
}
bool WavFileHandler::endOnError(std::string errmsg)
{
qDebug() << QString::fromStdString(errmsg);
return false;
}