-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVOCRipper.cpp
More file actions
78 lines (63 loc) · 2.14 KB
/
VOCRipper.cpp
File metadata and controls
78 lines (63 loc) · 2.14 KB
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
/***********************************************************************
* Copyright 2007-2010 Michael Drueing <[email protected]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License or (at your option) version 3 or any later version
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
***********************************************************************/
#include <cstring>
#include "VOCRipper.h"
const char *VOCRipper::s_name = "Creative VOC Ripper v1.0";
const HeaderStruct VOCRipper::s_headers[] = {
HS("Creative Voice File\x1a", 20)
HS_END
};
#pragma pack(push, 1)
struct VOCHeader
{
char ID[20]; // the ID
unsigned short dataOffset;
unsigned short ver;
unsigned short ver2;
};
#pragma pack(pop)
bool VOCRipper::checkLocation(unsigned char *pos, const HeaderStruct * /*header*/, FoundStruct *found)
{
VOCHeader *hdr = (VOCHeader *)pos;
unsigned int blockLength;
unsigned char *pos2;
unsigned char blockType;
// check simple checksum
if ((~hdr->ver) + 0x1234 != hdr->ver2)
return false;
// scan through all data blocks until we find the terminator block
pos2 = pos + hdr->dataOffset;
blockType = *pos2;
while ((blockType != 0) && (pos2 + 2 < m_start + m_length))
{
pos2++;
// first: read 3 bytes blocklength and skip those
blockLength = (unsigned int)(pos2[0]) | (unsigned int)(pos2[1] << 8) | (unsigned int)(pos2[2] << 16);
pos2 += 3;
// skip length of block
pos2 += blockLength;
blockType = *pos2;
}
// check to see if we ran past the end of the file
if (pos2 >= m_start + m_length)
return false;
found->criterium = CRIT_STRONG;
strcpy(found->extension, "voc");
found->startoffset = pos;
found->length = pos2 - pos + 1;
return true;
}